import * as React from "react";
import { render, screen } from "@testing-library/react";
import { stub } from "sinon";
import { LaneData } from "../../../src/interfaces";
import LaneEditor from "../../../src/components/LaneEditor";
// Mock the LaneCustomListsEditor so we can verify that it is or isn't rendered. This serves as an
// example of how to do something analogous to Enzyme's shallow rendering, when we don't want/need
// to render the whole component tree down to HTML elements to test something. This technique is
// useful for testing components in isolation (unit testing), instead of the integration testing
// that RTL focuses on.
jest.mock("../../../src/components/LaneCustomListsEditor", () => ({
__esModule: true,
default: (props) =>
,
}));
const customListsData = [
{ id: 1, name: "list 1", entries: [], is_owner: true, is_shared: false },
];
const editLane = stub().returns(
new Promise((resolve) => resolve())
);
const deleteLane = stub().returns(
new Promise((resolve) => resolve())
);
const toggleLaneVisibility = stub();
function createLaneData(displayName: string, isAutomated: boolean): LaneData {
return {
id: 1,
display_name: displayName,
visible: true,
count: 5,
sublanes: [
{
id: 2,
display_name: `Sublane of ${displayName}`,
visible: true,
count: 3,
sublanes: [],
custom_list_ids: [1],
inherit_parent_restrictions: false,
},
],
// The absence/presence of custom list ids determines if a lane is automated or custom.
custom_list_ids: isAutomated ? [] : [1],
inherit_parent_restrictions: true,
};
}
describe("LaneEditor", () => {
describe("for a custom lane", () => {
const laneData = createLaneData("Custom Lane", false);
beforeEach(() => {
render(
);
});
it("renders a delete button", () => {
expect(screen.getByRole("button", { name: /delete/i })).not.toBeNull();
});
it("renders an inherit parent restrictions checkbox", () => {
expect(
screen.getByRole("checkbox", {
name: /inherit restrictions from parent/i,
})
).not.toBeNull();
});
it("renders a custom lists editor", () => {
expect(screen.getByTestId("LaneCustomListsEditor")).not.toBeNull();
});
});
describe("for an automated lane", () => {
const laneData = createLaneData("Automated Lane", true);
beforeEach(() => {
render(
);
});
it("does not render a delete button", () => {
expect(screen.queryByRole("button", { name: /delete/i })).toBeNull();
});
it("does not render an inherit parent restrictions checkbox", () => {
expect(
screen.queryByRole("checkbox", {
name: /inherit restrictions from parent/i,
})
).toBeNull();
});
it("does not render a custom lists editor", () => {
expect(screen.queryByTestId("LaneCustomListsEditor")).toBeNull();
});
it("renders an explanation that the lane contents can't be edited", () => {
expect(screen.getByText(/contents cannot be edited/i)).not.toBeNull();
});
});
it("doesn't render a custom lists editor while a lane is being loaded for editing", () => {
const laneData = null;
render(
);
expect(screen.queryByTestId("LaneCustomListsEditor")).toBeNull();
});
});