import { renderHook } from "@testing-library/react-native"; import { useCurrentScreenIsHook } from "../useCurrentScreenIsHook"; import { useNavigation } from "@applicaster/zapp-react-native-utils/reactHooks"; import { last } from "@applicaster/zapp-react-native-utils/utils"; import { toBooleanWithDefaultFalse } from "@applicaster/zapp-react-native-utils/booleanUtils"; jest.mock("@applicaster/zapp-react-native-utils/reactHooks"); jest.mock("@applicaster/zapp-react-native-utils/utils"); jest.mock("@applicaster/zapp-react-native-utils/booleanUtils"); const mockUseNavigation = useNavigation as jest.Mock; const mockLast = last as jest.Mock; const mockToBoolean = toBooleanWithDefaultFalse as jest.Mock; describe("useCurrentScreenIsHook", () => { beforeEach(() => { jest.clearAllMocks(); // sensible defaults mockUseNavigation.mockReturnValue({ mainStack: [] }); mockLast.mockReturnValue(undefined); mockToBoolean.mockReturnValue(false); }); it("returns true when last route includes 'hook'", () => { const stack = [{ route: "some-hook-screen" }]; mockUseNavigation.mockReturnValue({ mainStack: stack }); mockLast.mockReturnValue(stack[0]); mockToBoolean.mockReturnValue(true); const { result } = renderHook(() => useCurrentScreenIsHook()); expect(mockLast).toHaveBeenCalledWith(stack); expect(mockToBoolean).toHaveBeenCalledWith(true); expect(result.current).toBe(true); }); it("returns false when last route does not include 'hook'", () => { const stack = [{ route: "home-screen" }]; mockUseNavigation.mockReturnValue({ mainStack: stack }); mockLast.mockReturnValue(stack[0]); mockToBoolean.mockReturnValue(false); const { result } = renderHook(() => useCurrentScreenIsHook()); expect(mockToBoolean).toHaveBeenCalledWith(false); expect(result.current).toBe(false); }); it("returns false when route is undefined", () => { const stack = [{}]; mockUseNavigation.mockReturnValue({ mainStack: stack }); mockLast.mockReturnValue(stack[0]); mockToBoolean.mockReturnValue(false); const { result } = renderHook(() => useCurrentScreenIsHook()); expect(mockToBoolean).toHaveBeenCalledWith(undefined); expect(result.current).toBe(false); }); it("returns false when last(mainStack) is undefined (empty stack)", () => { mockUseNavigation.mockReturnValue({ mainStack: [] }); mockLast.mockReturnValue(undefined); mockToBoolean.mockReturnValue(false); const { result } = renderHook(() => useCurrentScreenIsHook()); expect(mockLast).toHaveBeenCalledWith([]); expect(mockToBoolean).toHaveBeenCalledWith(undefined); expect(result.current).toBe(false); }); it("uses default empty array when mainStack is undefined", () => { mockUseNavigation.mockReturnValue({}); mockLast.mockReturnValue(undefined); mockToBoolean.mockReturnValue(false); const { result } = renderHook(() => useCurrentScreenIsHook()); expect(mockLast).toHaveBeenCalledWith([]); expect(result.current).toBe(false); }); it("passes correct boolean result from includes('hook')", () => { const stack = [{ route: "hook" }]; mockUseNavigation.mockReturnValue({ mainStack: stack }); mockLast.mockReturnValue(stack[0]); // simulate actual includes result flowing through mockToBoolean.mockImplementation((val) => Boolean(val)); const { result } = renderHook(() => useCurrentScreenIsHook()); expect(mockToBoolean).toHaveBeenCalledWith(true); expect(result.current).toBe(true); }); });