import { renderHook } from "@testing-library/react-hooks"; import { MockJSONServer, TestWrapper } from "@test"; import { useOne } from "./useOne"; import { IRefineContextProvider } from "src/interfaces"; const mockRefineProvider: IRefineContextProvider = { hasDashboard: false, mutationMode: "pessimistic", warnWhenUnsavedChanges: false, syncWithLocation: false, undoableTimeout: 500, }; describe("useOne Hook", () => { it("with rest json server", async () => { const { result, waitFor } = renderHook( () => useOne({ resource: "posts", id: "1" }), { wrapper: TestWrapper({ dataProvider: MockJSONServer, resources: [{ name: "posts" }], }), }, ); await waitFor(() => { return result.current.isSuccess; }); const { status, data } = result.current; expect(status).toBe("success"); expect(data?.data.slug).toBe("ut-ad-et"); }); describe("useResourceSubscription", () => { it("useSubscription", async () => { const onSubscribeMock = jest.fn(); renderHook(() => useOne({ resource: "posts", id: "1" }), { wrapper: TestWrapper({ dataProvider: MockJSONServer, resources: [{ name: "posts" }], liveProvider: { unsubscribe: jest.fn(), subscribe: onSubscribeMock, }, refineProvider: { ...mockRefineProvider, liveMode: "auto", }, }), }); expect(onSubscribeMock).toBeCalled(); expect(onSubscribeMock).toHaveBeenCalledWith({ channel: "resources/posts", callback: expect.any(Function), params: { ids: ["1"] }, types: ["*"], }); }); it("liveMode = Off useSubscription", async () => { const onSubscribeMock = jest.fn(); renderHook(() => useOne({ resource: "posts", id: "1" }), { wrapper: TestWrapper({ dataProvider: MockJSONServer, resources: [{ name: "posts" }], liveProvider: { unsubscribe: jest.fn(), subscribe: onSubscribeMock, }, refineProvider: { ...mockRefineProvider, liveMode: "off", }, }), }); expect(onSubscribeMock).not.toBeCalled(); }); it("liveMode = Off and liveMode hook param auto", async () => { const onSubscribeMock = jest.fn(); renderHook( () => useOne({ resource: "posts", id: "1", liveMode: "auto" }), { wrapper: TestWrapper({ dataProvider: MockJSONServer, resources: [{ name: "posts" }], liveProvider: { unsubscribe: jest.fn(), subscribe: onSubscribeMock, }, refineProvider: { ...mockRefineProvider, liveMode: "off", }, }), }, ); expect(onSubscribeMock).toBeCalled(); }); it("unsubscribe call on unmount", async () => { const onSubscribeMock = jest.fn(() => true); const onUnsubscribeMock = jest.fn(); const { unmount } = renderHook( () => useOne({ resource: "posts", id: "1" }), { wrapper: TestWrapper({ dataProvider: MockJSONServer, resources: [{ name: "posts" }], liveProvider: { unsubscribe: onUnsubscribeMock, subscribe: onSubscribeMock, }, refineProvider: { ...mockRefineProvider, liveMode: "auto", }, }), }, ); expect(onSubscribeMock).toBeCalled(); unmount(); expect(onUnsubscribeMock).toBeCalledWith(true); expect(onUnsubscribeMock).toBeCalledTimes(1); }); }); });