import * as React from "react";
import {
render,
renderIntoDocument,
fireEvent,
cleanup,
Simulate,
wait,
} from "react-testing-library";
import HierarchyList from "../components/HierarchyList";
import { generateCheckItems } from "./utils/hierarchyList";
import { elementsArray } from "./utils";
beforeEach(cleanup);
describe("Hierarchy List Component", () => {
test("01 - it renders", () => {
const items = generateCheckItems();
const rowClicked = jest.fn();
const { container } = render(
);
expect(container).not.toBeNull();
});
test("02 - check click call back called", () => {
const items = generateCheckItems();
const rowClicked = jest.fn();
const { container } = render(
);
const input = elementsArray(container, "input")[0];
expect(input).not.toBeNull();
Simulate.change(input);
expect(rowClicked).toHaveBeenCalled();
expect(rowClicked).toHaveBeenCalledWith(items[0]);
});
test("03 - Check items change with prop updates", () => {
const items = generateCheckItems();
const rowClicked = jest.fn();
const { rerender, container } = render(
);
const initialInputs = elementsArray(container, "input");
expect(initialInputs.every(input => !input.checked)).toBe(true);
rerender(
);
const inputs = elementsArray(container, "input");
expect(inputs.every(input => input.checked)).toBe(true);
});
test("04 - Click arrow show children", async () => {
let items = generateCheckItems();
while (items.every(i => !i.children.length)) {
items = generateCheckItems();
}
const rowClicked = jest.fn();
const { getByTestId } = render(
);
const withChildren = items.find(item => Boolean(item.children.length));
const row = getByTestId(withChildren.id);
Simulate.click(row);
await wait(() =>
expect(getByTestId(withChildren.children[0].id)).not.toBeNull()
);
expect(getByTestId(withChildren.children[0].id)).not.toBeNull();
});
test("05 - Hierarchy list snapshot", () => {
const items: CheckItem[] = [
{
id: "123",
name: "joe",
children: [],
},
{
id: "234",
name: "montana",
children: [
{
id: "236",
name: "john",
children: [],
},
],
},
];
const clicked = jest.fn();
const { container } = render(
);
expect(container).toMatchSnapshot();
});
});