import React from "react"; import { renderWithProviders } from "@applicaster/zapp-react-native-utils/testUtils"; import { getMenuPlugin, isBottomTabVisible, SIDE_MENU_PLUGIN_ID, } from "@applicaster/zapp-react-native-ui-components/Components/Screen/navigationHandler"; const mockUseMenuToggleContext = jest.fn(() => ({ toggleMenu: jest.fn(), setToggleMenu: jest.fn(), openMenu: jest.fn(), setOpenMenu: jest.fn(), closeMenu: jest.fn(), setCloseMenu: jest.fn(), })); jest.mock("../layoutHelpers", () => { const { View } = jest.requireActual("react-native"); const { isVideoOverlayVisible } = jest.requireActual("../layoutHelpers"); return { // eslint-disable-next-line react/display-name getNavigationPluginModule: () => (props) => ( ), isVideoOverlayVisible, }; }); jest.mock( "@applicaster/zapp-react-native-ui-components/Components/Transitioner", () => { const { View } = jest.requireActual("react-native"); return { // eslint-disable-next-line react/display-name Transitioner: (props) => , }; } ); jest.mock( "@applicaster/zapp-react-native-ui-components/Components/Screen", () => { const { View } = jest.requireActual("react-native"); return { // eslint-disable-next-line react/display-name Screen: (props) => , }; } ); jest.mock( "@applicaster/zapp-react-native-ui-components/Contexts/MenuToggleContext", () => ({ useMenuToggleContext: mockUseMenuToggleContext, }) ); const mockUseNavigation = jest.fn(); jest.mock( "@applicaster/zapp-react-native-utils/reactHooks/navigation/useNavigation", () => ({ useNavigation: mockUseNavigation, }) ); jest.mock( "@applicaster/zapp-react-native-utils/reactHooks/navigation/useGetBottomTabBarHeight", () => ({ useGetBottomTabBarHeight: jest.fn(() => 50), }) ); jest.mock( "@applicaster/zapp-react-native-utils/reactHooks/layout/useDimensions", () => ({ useDimensions: jest.fn(() => ({ width: 100, height: 100 })), }) ); jest.mock( "@applicaster/zapp-react-native-utils/reactHooks/screen/useScreenContext", () => ({ useNavbarState: jest.fn(() => ({ title: "Test Title" })), }) ); jest.mock("@applicaster/zapp-react-native-utils/localizationUtils", () => ({ useIsRTL: jest.fn(() => false), })); jest.mock( "@applicaster/zapp-react-native-ui-components/Components/VideoModal/ModalAnimation", () => ({ withModalAnimationProvider: jest.fn((Component) => Component), }) ); jest.mock( "@applicaster/zapp-react-native-ui-components/Components/VideoModal/ModalAnimation/useModalAnimationContext", () => ({ useModalAnimationContext: jest.fn(() => ({ isActiveGesture: false, })), }) ); jest.mock("@applicaster/zapp-react-native-utils/dimensionsProvider", () => ({ withDimensionsProvider: jest.fn((Component) => Component), })); jest.mock( "@applicaster/zapp-react-native-ui-components/Components/Screen/navigationHandler", () => ({ isMenuVisible: jest.fn(() => true), isBottomTabVisible: jest.fn(() => true), getMenuPlugin: jest.fn(() => ({ identifier: "test-plugin" })), SIDE_MENU_PLUGIN_ID: "quick_brick_side_menu", }) ); jest.mock( "@applicaster/zapp-react-dom-ui-components/Components/ZappHooksModal", () => { const { View } = jest.requireActual("react-native"); return { // eslint-disable-next-line react/display-name ZappHooksModal: (props) => , }; } ); jest.mock( "@applicaster/zapp-react-native-ui-components/Components/VideoModal", () => { const { View } = jest.requireActual("react-native"); return { // eslint-disable-next-line react/display-name VideoModal: (props) => , }; } ); jest.mock("@applicaster/zapp-react-native-utils/navigationUtils", () => ({ ...(jest.requireActual( "@applicaster/zapp-react-native-utils/navigationUtils" ) as jest.Mock), getNavigationProps: () => ({}), resolveNavigationPlugin: () => ({ identifier: "quick-brick-bottom-tabs", }), })); const { Layout } = require("../"); describe("Layout", () => { beforeAll(() => { mockUseNavigation.mockImplementation(() => ({ activeRiver: { navigations: [] }, videoModalState: { visible: false, mode: "MINIMIZED" }, isVideoModalDocked: false, currentRoute: "home", data: {}, })); }); beforeEach(() => { jest.clearAllMocks(); mockUseNavigation.mockImplementation(() => ({ activeRiver: { navigations: [] }, videoModalState: { visible: false, mode: "MINIMIZED" }, isVideoModalDocked: false, currentRoute: "home", data: {}, })); }); it("should match snapshot when appReady is true", () => { const { toJSON } = renderWithProviders(); expect(toJSON()).toMatchSnapshot(); }); it("should not render transitioner with screen when appReady is false", () => { const { queryByTestId } = renderWithProviders(, { appState: { appReady: false, appLaunched: true, }, }); expect(queryByTestId("transitioner")).toBeNull(); }); it("should render menu when showMenu is true", () => { const { queryByTestId } = renderWithProviders(); expect(queryByTestId("menu")).toBeTruthy(); }); it("should render VideoModal when visible & VideoModal is true", () => { mockUseNavigation.mockReturnValue({ activeRiver: { navigations: [] }, videoModalState: { visible: true, mode: "MINIMIZED" }, isVideoModalDocked: false, currentRoute: "home", data: {}, }); const { getByTestId } = renderWithProviders(); expect(getByTestId("videoModal")).toBeTruthy(); }); it("should render ZappHooksModal", () => { const { getByTestId } = renderWithProviders(); expect(getByTestId("zappHooksModal")).toBeTruthy(); }); it("padding should be non-0 when showMenu is true and isBottomTabsPlugin is true", () => { mockUseNavigation.mockReturnValueOnce({ activeRiver: { navigations: [{ identifier: "quick-brick-bottom-tabs" }] }, videoModalState: { visible: false, mode: "MINIMIZED" }, isVideoModalDocked: false, currentRoute: "home", data: {}, }); const { getByTestId } = renderWithProviders(); return expect( getByTestId("transitioner").props.contentStyle.paddingBottom ).toBe(50); }); it("transitioner should have contentStyle with specific styles", () => { const { getByTestId } = renderWithProviders(); expect(getByTestId("transitioner").props.contentStyle).toEqual({ height: "100%", paddingBottom: 50, opacity: 1, }); }); it("should render menu when Side Menu is active and VideoModal is FULLSCREEN", () => { (getMenuPlugin as jest.Mock).mockReturnValue({ identifier: SIDE_MENU_PLUGIN_ID, }); mockUseNavigation.mockReturnValue({ activeRiver: { navigations: [] }, videoModalState: { visible: true, mode: "FULLSCREEN" }, isVideoModalDocked: false, currentRoute: "home", data: {}, }); const { queryByTestId } = renderWithProviders(); expect(queryByTestId("menu")).toBeTruthy(); }); it("should NOT render menu when Bottom Tabs are active and VideoModal is FULLSCREEN", () => { (getMenuPlugin as jest.Mock).mockReturnValue({ identifier: "quick-brick-bottom-tabs", }); mockUseNavigation.mockReturnValue({ activeRiver: { navigations: [] }, videoModalState: { visible: true, mode: "FULLSCREEN" }, isVideoModalDocked: false, currentRoute: "home", data: {}, }); const { queryByTestId } = renderWithProviders(); expect(queryByTestId("menu")).toBeNull(); }); it("should not add padding when Side Menu is active", () => { (getMenuPlugin as jest.Mock).mockReturnValue({ identifier: SIDE_MENU_PLUGIN_ID, }); (isBottomTabVisible as jest.Mock).mockReturnValue(false); mockUseNavigation.mockReturnValue({ activeRiver: { navigations: [] }, videoModalState: { visible: false, mode: "MINIMIZED" }, isVideoModalDocked: false, currentRoute: "home", data: {}, }); const { getByTestId } = renderWithProviders(); expect(getByTestId("transitioner").props.contentStyle.paddingBottom).toBe( 0 ); }); });