import React, { ReactNode } from "react"; import { Route } from "react-router-dom"; import { Button } from "antd"; import { render, TestWrapper, MockJSONServer, wait } from "@test"; import { IAccessControlContext } from "../../../interfaces"; import { Show } from "./index"; const renderShow = ( show: ReactNode, accessControlProvider?: IAccessControlContext, ) => { return render({show}, { wrapper: TestWrapper({ dataProvider: MockJSONServer, resources: [{ name: "posts", route: "posts" }], routerInitialEntries: ["/posts/show/1"], accessControlProvider, }), }); }; describe("Show", () => { it("should render page successfuly", () => { const { container } = renderShow(); expect(container).toBeTruthy(); }); it("should render default list and refresh buttons successfuly", async () => { const { container, getByText } = renderShow(); expect(container.querySelector("button")).toBeTruthy(); getByText("Posts"); getByText("Refresh"); }); it("should render optional edit and delete buttons successfuly", async () => { const { container, getByText } = renderShow(); expect(container.querySelector("button")).toBeTruthy(); getByText("Edit"); getByText("Delete"); }); it("depending on the accessControlProvider it should get the buttons successfully", async () => { const { getByText, queryByTestId } = renderShow( , { can: ({ action }) => { switch (action) { case "edit": case "list": return Promise.resolve({ can: true }); case "delete": default: return Promise.resolve({ can: false }); } }, }, ); expect(getByText("Edit").closest("button")).not.toBeDisabled(); expect(getByText("Posts").closest("button")).not.toBeDisabled(); await wait(() => expect(queryByTestId("show-delete-button")).toBeDisabled(), ); }); it("should render optional buttons with actionButtons prop", async () => { const { findByText } = renderShow( } />, ); await findByText("New Save Button"); await findByText("New Delete Button"); }); it("should render default title successfuly", () => { const { getByText } = renderShow(); getByText("Show 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/show/1"], }), }, ); getByText("Show Test"); }); it("should render optional title with title prop", () => { const { getByText } = renderShow(); getByText("Test Title"); }); it("should render optional resource with resource prop", () => { const { getByText } = render( , { wrapper: TestWrapper({ dataProvider: MockJSONServer, resources: [{ name: "posts", route: "posts" }], routerInitialEntries: ["/custom"], }), }, ); getByText("Show Post"); }); it("should render optional recordItemId with resource prop, not render list button", () => { const { getByText, queryByTestId } = renderShow( , ); getByText("Show Post"); expect(queryByTestId("show-list-button")).toBeNull(); }); describe("render edit button", () => { it("should render edit button", () => { const { getByText, queryByTestId } = render( , { wrapper: TestWrapper({ dataProvider: MockJSONServer, resources: [ { name: "posts", route: "posts", canEdit: true }, ], routerInitialEntries: ["/posts/show/1"], }), }, ); expect(queryByTestId("show-edit-button")).not.toBeNull(); getByText("Show Post"); }); it("should not render edit button on resource canEdit false", () => { const { getByText, queryByTestId } = render( , { wrapper: TestWrapper({ dataProvider: MockJSONServer, resources: [ { name: "posts", route: "posts", canEdit: false }, ], routerInitialEntries: ["/posts/show/1"], }), }, ); expect(queryByTestId("show-edit-button")).toBeNull(); getByText("Show Post"); }); it("should not render edit button on resource canEdit true & canEdit props false on component", () => { const { queryByTestId } = render( , { wrapper: TestWrapper({ dataProvider: MockJSONServer, resources: [ { name: "posts", route: "posts", canEdit: true }, ], routerInitialEntries: ["/posts/show/1"], }), }, ); expect(queryByTestId("show-edit-button")).toBeNull(); }); it("should render edit button on resource canEdit false & canEdit props true on component", () => { const { queryByTestId } = render( , { wrapper: TestWrapper({ dataProvider: MockJSONServer, resources: [ { name: "posts", route: "posts", canEdit: false }, ], routerInitialEntries: ["/posts/show/1"], }), }, ); expect(queryByTestId("show-edit-button")).not.toBeNull(); }); it("should render edit button with recordItemId prop", () => { const { getByText, queryByTestId } = render( , { wrapper: TestWrapper({ dataProvider: MockJSONServer, resources: [ { name: "posts", route: "posts", canEdit: true }, ], routerInitialEntries: ["/posts/show/1"], }), }, ); expect(queryByTestId("show-edit-button")).not.toBeNull(); getByText("Show Post"); }); }); describe("render delete button", () => { it("should render delete button", () => { const { queryByTestId } = render( , { wrapper: TestWrapper({ dataProvider: MockJSONServer, resources: [ { name: "posts", route: "posts", canDelete: true }, ], routerInitialEntries: ["/posts/show/1"], }), }, ); expect(queryByTestId("show-delete-button")).not.toBeNull(); }); it("should not render delete button on resource canDelete false", () => { const { queryByTestId } = render( , { wrapper: TestWrapper({ dataProvider: MockJSONServer, resources: [ { name: "posts", route: "posts", canDelete: false }, ], routerInitialEntries: ["/posts/show/1"], }), }, ); expect(queryByTestId("show-delete-button")).toBeNull(); }); 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/show/1"], }), }, ); expect(queryByTestId("show-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/show/1"], }), }, ); expect(queryByTestId("show-delete-button")).not.toBeNull(); }); it("should render delete button with recordItemId prop", () => { const { queryByTestId } = render( , { wrapper: TestWrapper({ dataProvider: MockJSONServer, resources: [ { name: "posts", route: "posts", canDelete: true }, ], routerInitialEntries: ["/posts/show/1"], }), }, ); expect(queryByTestId("show-delete-button")).not.toBeNull(); }); }); });