import React from "react"; import { Route } from "react-router-dom"; import { fireEvent, render, TestWrapper, act, MockJSONServer, wait, } from "@test"; import { DeleteButton } from "./"; describe("Delete Button", () => { const deleteFunc = jest.fn(); it("should render button successfuly", () => { const { container, getByText } = render( deleteFunc()} />, { wrapper: TestWrapper({ resources: [{ name: "posts" }], }), }, ); expect(container).toBeTruthy(); getByText("Delete"); }); it("should render text by children", () => { const { container, getByText } = render( refine, { wrapper: TestWrapper({ resources: [{ name: "posts" }], }), }, ); expect(container).toBeTruthy(); getByText("refine"); }); it("should render without text show only icon", () => { const { container, queryByText } = render(, { wrapper: TestWrapper({ resources: [{ name: "posts" }], }), }); expect(container).toBeTruthy(); expect(queryByText("Delete")).not.toBeInTheDocument(); }); it("should be disabled when user not have access", async () => { const { container, getByText } = render( Delete, { wrapper: TestWrapper({ resources: [{ name: "posts" }], accessControlProvider: { can: () => Promise.resolve({ can: false }), }, }), }, ); expect(container).toBeTruthy(); await wait(() => expect(getByText("Delete").closest("button")).toBeDisabled(), ); }); it("should be disabled when recordId not allowed", async () => { const { container, getByText } = render( Delete, { wrapper: TestWrapper({ resources: [{ name: "posts" }], accessControlProvider: { can: ({ params }) => { if (params.id === "1") { return Promise.resolve({ can: false }); } return Promise.resolve({ can: true }); }, }, }), }, ); expect(container).toBeTruthy(); await wait(() => expect(getByText("Delete").closest("button")).toBeDisabled(), ); }); it("should skip access control", async () => { const { container, getByText } = render( Delete, { wrapper: TestWrapper({ resources: [{ name: "posts" }], accessControlProvider: { can: () => Promise.resolve({ can: false }), }, }), }, ); expect(container).toBeTruthy(); await wait(() => expect(getByText("Delete").closest("button")).not.toBeDisabled(), ); }); it("should render called function successfully if click the button", () => { const { getByText } = render( deleteFunc()} />, { wrapper: TestWrapper({ resources: [{ name: "posts" }], }), }, ); fireEvent.click(getByText("Delete")); expect(deleteFunc).toHaveBeenCalledTimes(1); }); describe("Delete Button popconfirm", () => { it("should render Popconfirm successfuly", () => { const { getByText, getAllByText } = render( deleteFunc()} />, { wrapper: TestWrapper({ resources: [{ name: "posts" }], }), }, ); fireEvent.click(getByText("Delete")); getByText("Are you sure?"); getByText("Cancel"); getAllByText("Delete"); }); it("should confirm Popconfirm successfuly", async () => { const deleteOneMock = jest.fn(); const { getByText, getAllByText } = render(, { wrapper: TestWrapper({ resources: [{ name: "posts" }], dataProvider: { ...MockJSONServer, deleteOne: deleteOneMock, }, }), }); await act(async () => { fireEvent.click(getByText("Delete")); }); getByText("Are you sure?"); getByText("Cancel"); const deleteButtons = getAllByText("Delete"); await act(async () => { fireEvent.click(deleteButtons[1]); }); expect(deleteOneMock).toBeCalledTimes(1); }); it("should confirm Popconfirm successfuly with recordItemId", async () => { const deleteOneMock = jest.fn(); const { getByText, getAllByText } = render( , { wrapper: TestWrapper({ resources: [{ name: "posts" }], dataProvider: { ...MockJSONServer, deleteOne: deleteOneMock, }, }), }, ); await act(async () => { fireEvent.click(getByText("Delete")); }); getByText("Are you sure?"); getByText("Cancel"); const deleteButtons = getAllByText("Delete"); await act(async () => { fireEvent.click(deleteButtons[1]); }); expect(deleteOneMock).toBeCalledTimes(1); }); it("should confirm Popconfirm successfuly with onSuccess", async () => { const deleteOneMock = jest.fn(); const onSuccessMock = jest.fn(); const { getByText, getAllByText } = render( , { wrapper: TestWrapper({ resources: [{ name: "posts" }], dataProvider: { ...MockJSONServer, deleteOne: deleteOneMock, }, }), }, ); await act(async () => { fireEvent.click(getByText("Delete")); }); getByText("Are you sure?"); getByText("Cancel"); const deleteButtons = getAllByText("Delete"); await act(async () => { fireEvent.click(deleteButtons[1]); }); expect(deleteOneMock).toBeCalledTimes(1); expect(onSuccessMock).toBeCalledTimes(1); }); }); it("should render with custom mutationMode", () => { const { getByText } = render( , { wrapper: TestWrapper({ resources: [{ name: "posts", route: "posts" }], routerInitialEntries: ["/posts"], }), }, ); fireEvent.click(getByText("Delete")); }); it("should render with custom resource", () => { const { getByText } = render( , { wrapper: TestWrapper({ resources: [ { name: "posts", route: "posts" }, { name: "categories", route: "categories" }, ], routerInitialEntries: ["/posts"], }), }, ); fireEvent.click(getByText("Delete")); }); });