import React from "react";
import { shallow } from "enzyme";
import {
CountryDropdown,
CountryItem,
Dropdown,
DropdownGroup,
findSelectedDisplay,
Item,
} from "../components/util/GameCreationForm/Dropdown";
jest.mock("../domain/flagLookup");
import flagLookup from "../domain/flagLookup";
describe("DropdownGroup", () => {
it("renders with no dropdowns", () => {
const rendered = shallow();
expect(rendered).toMatchSnapshot();
});
it("renders with dropdowns", () => {
const rendered = shallow(
);
expect(rendered).toMatchSnapshot();
});
it("can have a dropdown opened", () => {
const rendered = shallow(
);
rendered.find("Dropdown").at(1).prop("onClick")();
expect(rendered).toMatchSnapshot();
});
it("can have a dropdown closed after opening", () => {
const rendered = shallow(
);
rendered.find("Dropdown").at(1).prop("onClick")();
rendered.find("Dropdown").at(1).prop("onClick")();
expect(rendered).toMatchSnapshot();
});
it("selecting a dropdown re-closes it", () => {
const onSelect = jest.fn();
const rendered = shallow(
);
rendered.find("Dropdown").at(1).prop("onClick")();
rendered.find("Dropdown").at(1).prop("onSelect")("test");
expect(rendered).toMatchSnapshot();
expect(onSelect).toHaveBeenCalledWith("test");
});
});
describe("Dropdown", () => {
it("renders closed", () => {
const onSelect = jest.fn();
const onClick = jest.fn();
const rendered = shallow();
expect(rendered).toMatchSnapshot();
});
it("renders with no items", () => {
const onSelect = jest.fn();
const onClick = jest.fn();
const rendered = shallow();
expect(rendered).toMatchSnapshot();
});
it("renders with items", () => {
const onSelect = jest.fn();
const onClick = jest.fn();
const rendered = shallow(
);
expect(rendered).toMatchSnapshot();
});
it("can be clicked", () => {
const onSelect = jest.fn();
const onClick = jest.fn();
const rendered = shallow(
);
rendered.find("div.button").first().simulate("click");
expect(onClick).toHaveBeenCalled();
});
it("can be selected with Enter", () => {
const onSelect = jest.fn();
const onClick = jest.fn();
const rendered = shallow(
);
rendered.find("div.button").first().simulate("keydown", { key: "Enter" });
expect(onClick).toHaveBeenCalled();
});
it("cannot be selected with other keydowns", () => {
const onSelect = jest.fn();
const onClick = jest.fn();
const rendered = shallow(
);
rendered.find("div.button").first().simulate("keydown", { key: "Escape" });
expect(onClick).not.toHaveBeenCalled();
});
it("responds to item selection", () => {
const onSelect = jest.fn();
const onClick = jest.fn();
const rendered = shallow(
);
rendered.find("Item").first().prop("onSelect")("value", "display");
expect(onSelect).toHaveBeenCalledWith("value");
expect(rendered).toMatchSnapshot();
});
describe("findSelectedDisplay", () => {
it("returns null when nothing is selected", () => {
expect(findSelectedDisplay()).toBeNull();
});
it("extracts the display of the selected element", () => {
expect(
findSelectedDisplay("two", [
,
,
,
])
).toBe("2");
});
it("extracts the value of the selected element if there is no display", () => {
expect(
findSelectedDisplay("two", [
,
,
,
])
).toBe("two");
});
it("returns null if there is no matching element", () => {
expect(
findSelectedDisplay("four", [
,
,
,
])
).toBeNull();
});
it("returns the first display found if there is more than one matching element", () => {
expect(
findSelectedDisplay("two", [
,
,
,
,
])
).toBe("2");
});
});
});
describe("CountryItem", () => {
it("renders", () => {
flagLookup.mockReturnValue("flag");
const rendered = shallow(
);
expect(rendered).toMatchSnapshot();
expect(flagLookup).toHaveBeenCalledWith("test-code");
});
it("responds to click", () => {
flagLookup.mockReturnValue("flag");
const onSelect = jest.fn();
const rendered = shallow(
);
rendered.simulate("click");
expect(onSelect).toHaveBeenCalledWith("test-code");
});
it("responds to keydown Enter", () => {
flagLookup.mockReturnValue("flag");
const onSelect = jest.fn();
const rendered = shallow(
);
rendered.simulate("keydown", { key: "Enter" });
expect(onSelect).toHaveBeenCalledWith("test-code");
});
it("responds to click", () => {
flagLookup.mockReturnValue("flag");
const onSelect = jest.fn();
const rendered = shallow(
);
rendered.simulate("keydown", { key: "Escape" });
expect(onSelect).not.toHaveBeenCalled();
});
});
describe("CountryDropdown", () => {
it("renders closed", () => {
flagLookup.mockReturnValue("flag");
const countryLookup = jest.fn();
const selected = "selected";
const onSelect = jest.fn();
const onClick = jest.fn();
const rendered = shallow(
);
expect(rendered).toMatchSnapshot();
});
it("renders", () => {
flagLookup.mockReturnValue("flag");
const countryLookup = jest.fn();
const selected = "selected";
const onSelect = jest.fn();
const onClick = jest.fn();
const rendered = shallow(
);
expect(rendered).toMatchSnapshot();
});
it("renders with countries", () => {
flagLookup.mockReturnValue("flag");
const countryLookup = jest.fn();
countryLookup.mockReturnValue([
{ item: { country: "c1", alpha2: "a21" } },
{ item: { country: "c2", alpha2: "a22" } },
{ item: { country: "c3", alpha2: "a23" } },
]);
const selected = "selected";
const onSelect = jest.fn();
const onClick = jest.fn();
const rendered = shallow(
);
expect(rendered).toMatchSnapshot();
});
it("can be clicked", () => {
flagLookup.mockReturnValue("flag");
const countryLookup = jest.fn();
countryLookup.mockReturnValue([
{ item: { country: "c1", alpha2: "a21" } },
{ item: { country: "c2", alpha2: "a22" } },
{ item: { country: "c3", alpha2: "a23" } },
]);
const selected = "selected";
const onSelect = jest.fn();
const onClick = jest.fn();
const rendered = shallow(
);
rendered.find("div.button").first().simulate("click");
expect(onClick).toHaveBeenCalled();
});
it("can be selected with Enter", () => {
flagLookup.mockReturnValue("flag");
const countryLookup = jest.fn();
countryLookup.mockReturnValue([
{ item: { country: "c1", alpha2: "a21" } },
{ item: { country: "c2", alpha2: "a22" } },
{ item: { country: "c3", alpha2: "a23" } },
]);
const selected = "selected";
const onSelect = jest.fn();
const onClick = jest.fn();
const rendered = shallow(
);
rendered.find("div.button").first().simulate("keydown", { key: "Enter" });
expect(onClick).toHaveBeenCalled();
});
it("cannot be selected with other keydowns", () => {
flagLookup.mockReturnValue("flag");
const countryLookup = jest.fn();
countryLookup.mockReturnValue([
{ item: { country: "c1", alpha2: "a21" } },
{ item: { country: "c2", alpha2: "a22" } },
{ item: { country: "c3", alpha2: "a23" } },
]);
const selected = "selected";
const onSelect = jest.fn();
const onClick = jest.fn();
const rendered = shallow(
);
rendered.find("div.button").first().simulate("keydown", { key: "Escape" });
expect(onClick).not.toHaveBeenCalled();
});
it("can have a country selected", () => {
flagLookup.mockReturnValue("flag");
const countryLookup = jest.fn();
countryLookup.mockReturnValue([
{ item: { country: "c1", alpha2: "a21" } },
{ item: { country: "c2", alpha2: "a22" } },
{ item: { country: "c3", alpha2: "a23" } },
]);
const selected = "selected";
const onSelect = jest.fn();
const onClick = jest.fn();
const rendered = shallow(
);
rendered.find("CountryItem").first().prop("onSelect")();
expect(onSelect).toHaveBeenCalled();
});
it("selects country based on searchbox", () => {
flagLookup.mockReturnValue("flag");
const countryLookup = jest.fn();
countryLookup.mockReturnValue([
{ item: { country: "c1", alpha2: "a21" } },
{ item: { country: "c2", alpha2: "a22" } },
{ item: { country: "c3", alpha2: "a23" } },
]);
const selected = "selected";
const onSelect = jest.fn();
const onClick = jest.fn();
const rendered = shallow(
);
rendered
.find("input")
.first()
.simulate("change", { target: { value: "changed" } });
expect(countryLookup).toHaveBeenCalledWith("changed");
});
it("can have first option selected with Enter", () => {
flagLookup.mockReturnValue("flag");
const countryLookup = jest.fn();
countryLookup.mockReturnValue([
{ item: { country: "c1", alpha2: "a21" } },
{ item: { country: "c2", alpha2: "a22" } },
{ item: { country: "c3", alpha2: "a23" } },
]);
const selected = "selected";
const onSelect = jest.fn();
const onClick = jest.fn();
const rendered = shallow(
);
rendered.find("input").first().simulate("keydown", { key: "Enter" });
expect(onSelect).toHaveBeenCalledWith("a21");
});
it("can have previously selected option selected with Escape", () => {
flagLookup.mockReturnValue("flag");
const countryLookup = jest.fn();
countryLookup.mockReturnValue([
{ item: { country: "c1", alpha2: "a21" } },
{ item: { country: "c2", alpha2: "a22" } },
{ item: { country: "c3", alpha2: "a23" } },
]);
const selected = "selected";
const onSelect = jest.fn();
const onClick = jest.fn();
const rendered = shallow(
);
rendered.find("input").first().simulate("keydown", { key: "Escape" });
expect(onSelect).toHaveBeenCalledWith("selected");
});
it("does not select from other keydowns", () => {
flagLookup.mockReturnValue("flag");
const countryLookup = jest.fn();
countryLookup.mockReturnValue([
{ item: { country: "c1", alpha2: "a21" } },
{ item: { country: "c2", alpha2: "a22" } },
{ item: { country: "c3", alpha2: "a23" } },
]);
const selected = "selected";
const onSelect = jest.fn();
const onClick = jest.fn();
const rendered = shallow(
);
rendered.find("input").first().simulate("keydown", { key: "Tab" });
expect(onSelect).not.toHaveBeenCalled();
});
});
describe("Item", () => {
it("renders with no text", () => {
const onSelect = jest.fn();
const display = "display";
const value = "value";
const rendered = shallow( );
expect(rendered).toMatchSnapshot();
});
it("responds to click", () => {
const onSelect = jest.fn();
const display = "display";
const value = "value";
const rendered = shallow( );
rendered.simulate("click");
expect(onSelect).toHaveBeenCalledWith(value, display);
});
it("responds to enter", () => {
const onSelect = jest.fn();
const display = "display";
const value = "value";
const rendered = shallow( );
rendered.simulate("keydown", { key: "Enter" });
expect(onSelect).toHaveBeenCalledWith(value, display);
});
it("does not respond to other keydowns", () => {
const onSelect = jest.fn();
const display = "display";
const value = "value";
const rendered = shallow( );
rendered.simulate("keydown", { key: "Escape" });
expect(onSelect).not.toHaveBeenCalled();
});
it("responds to click with value when no display", () => {
const onSelect = jest.fn();
const value = "value";
const rendered = shallow( );
rendered.simulate("click");
expect(onSelect).toHaveBeenCalledWith(value, value);
});
it("responds to click with children when no display or value", () => {
const onSelect = jest.fn();
const child =
child
;
const rendered = shallow(- {child}
);
rendered.simulate("click");
expect(onSelect).toHaveBeenCalledWith(child, child);
});
});