import React, { ReactNode } from "react"; import { Route } from "react-router-dom"; import { Button } from "antd"; import { render, TestWrapper, MockJSONServer, wait } from "@test"; import { Edit } from "./"; import { IAccessControlContext } from "../../../interfaces"; const renderEdit = ( edit: ReactNode, accessControlProvider?: IAccessControlContext, ) => { return render({edit}, { wrapper: TestWrapper({ dataProvider: MockJSONServer, resources: [{ name: "posts", route: "posts" }], routerInitialEntries: ["/posts/edit/1"], accessControlProvider, }), }); }; describe("Edit", () => { it("should render page successfuly", () => { const { container, queryByTestId } = renderEdit(); expect(queryByTestId("edit-list-button")).not.toBeNull(); expect(container).toBeTruthy(); }); it("should render default save button successfuly", () => { const { container, getByText } = renderEdit(); expect(container.querySelector("button")).toBeTruthy(); getByText("Save"); }); it("should render default save and delete buttons successfuly", () => { const { container, getByText } = renderEdit(); expect(container.querySelector("button")).toBeTruthy(); getByText("Save"); getByText("Delete"); }); it("should render optional buttons with actionButtons prop", () => { const { getByText, queryByTestId } = renderEdit( } />, ); getByText("New Save Button"); getByText("New Delete Button"); expect(queryByTestId("edit-delete-button")).toBeNull(); }); it("should render default title successfuly", () => { const { getByText } = renderEdit(); getByText("Edit Post"); }); it("should render with label instead of resource name successfully", () => { const { getByText } = render( , { wrapper: TestWrapper({ dataProvider: MockJSONServer, resources: [ { name: "posts", route: "posts", label: "test" }, ], routerInitialEntries: ["/posts/edit/1"], }), }, ); getByText("Edit Test"); }); it("should render optional title with title prop", () => { const { getByText } = renderEdit(); getByText("New Title"); }); it("should render optional mutationMode with mutationModeProp prop", () => { const container = renderEdit(); expect(container).toBeTruthy(); }); it("should render optional resource with resource prop", () => { const { getByText } = render( , { wrapper: TestWrapper({ dataProvider: MockJSONServer, resources: [{ name: "posts", route: "posts" }], routerInitialEntries: ["/custom"], }), }, ); getByText("Edit Post"); }); it("should render optional recordItemId with resource prop", () => { const { getByText, queryByTestId } = renderEdit( , ); getByText("Edit Post"); expect(queryByTestId("edit-list-button")).toBeNull(); }); describe("render delete button", () => { it("should render delete button ", () => { const { getByText, queryByTestId } = render( , { wrapper: TestWrapper({ dataProvider: MockJSONServer, resources: [ { name: "posts", route: "posts", canDelete: true }, ], routerInitialEntries: ["/posts/edit/1"], }), }, ); expect(queryByTestId("edit-delete-button")).not.toBeNull(); getByText("Edit Post"); }); it("should not render delete button on resource canDelete false", () => { const { getByText, queryByTestId } = render( , { wrapper: TestWrapper({ dataProvider: MockJSONServer, resources: [ { name: "posts", route: "posts", canDelete: false }, ], routerInitialEntries: ["/posts/edit/1"], }), }, ); expect(queryByTestId("edit-delete-button")).toBeNull(); getByText("Edit Post"); }); it("should not render delete button on resource canDelete true & canDelete props false on component", () => { const { queryByTestId } = render( , { wrapper: TestWrapper({ dataProvider: MockJSONServer, resources: [ { name: "posts", route: "posts", canDelete: true }, ], routerInitialEntries: ["/posts/edit/1"], }), }, ); expect(queryByTestId("edit-delete-button")).toBeNull(); }); it("should render delete button on resource canDelete false & canDelete props true on component", () => { const { queryByTestId } = render( , { wrapper: TestWrapper({ dataProvider: MockJSONServer, resources: [ { name: "posts", route: "posts", canDelete: false }, ], routerInitialEntries: ["/posts/edit/1"], }), }, ); expect(queryByTestId("edit-delete-button")).not.toBeNull(); }); it("should render delete button on resource canDelete false & deleteButtonProps props not null on component", () => { const { queryByTestId } = render( , { wrapper: TestWrapper({ dataProvider: MockJSONServer, resources: [ { name: "posts", route: "posts", canDelete: false }, ], routerInitialEntries: ["/posts/edit/1"], }), }, ); expect(queryByTestId("edit-delete-button")).not.toBeNull(); }); }); describe("accessibility of buttons by accessControlProvider", () => { it("should render disabled list button and not disabled delete button", async () => { const { queryByTestId } = renderEdit(, { can: ({ action }) => { switch (action) { case "list": return Promise.resolve({ can: true }); case "delete": default: return Promise.resolve({ can: false }); } }, }); await wait(() => expect(queryByTestId("edit-list-button")).not.toBeDisabled(), ); await wait(() => expect(queryByTestId("edit-delete-button")).toBeDisabled(), ); }); it("should render disabled list button and delete button", async () => { const { queryByTestId } = renderEdit(, { can: ({ action }) => { switch (action) { case "list": case "delete": return Promise.resolve({ can: false }); default: return Promise.resolve({ can: false }); } }, }); await wait(() => expect(queryByTestId("edit-list-button")).toBeDisabled(), ); await wait(() => expect(queryByTestId("edit-delete-button")).toBeDisabled(), ); }); }); });