import React from 'react'; import { Text } from 'react-native'; import { act, cleanup, render, screen } from '@testing-library/react-native'; import * as stateStore from '../../../state-store'; import { PortalWhileClosingView } from '../PortalWhileClosingView'; jest.mock('../../../state-store', () => { const actual = jest.requireActual('../../../state-store'); const createClosingPortalLayoutRegistrationId = jest.fn(() => 'registration-1'); return new Proxy(actual, { get(target, prop, receiver) { if (prop === 'createClosingPortalLayoutRegistrationId') { return createClosingPortalLayoutRegistrationId; } return Reflect.get(target, prop, receiver); }, }); }); const BASE_RECT = { h: 48, w: 120, x: 12, y: 24 }; const flushAnimationFrameQueue = () => { act(() => { jest.runAllTimers(); }); }; const TeleportStateProbe = ({ hostName, id, testID, }: { hostName: string; id: string; testID: string; }) => { const shouldTeleport = stateStore.useShouldTeleportToClosingPortal(hostName, id); return {shouldTeleport ? 'true' : 'false'}; }; const BlacklistRegistrar = ({ hostNames }: { hostNames: string[] }) => { stateStore.useClosingPortalHostBlacklist(hostNames); return null; }; describe('PortalWhileClosingView', () => { beforeEach(() => { jest.useFakeTimers(); act(() => { stateStore.finalizeCloseOverlay(); stateStore.overlayStore.next({ closing: false, closingPortalHostBlacklist: [], id: undefined, messageId: undefined, }); }); }); afterEach(() => { cleanup(); act(() => { stateStore.clearClosingPortalLayout('overlay-composer', 'registration-1'); stateStore.finalizeCloseOverlay(); stateStore.overlayStore.next({ closing: false, closingPortalHostBlacklist: [], id: undefined, messageId: undefined, }); }); jest.clearAllMocks(); jest.clearAllTimers(); jest.useRealTimers(); }); it('uses the real store to teleport once the overlay is closing and this host is active', () => { render( <> Composer , ); act(() => { stateStore.setClosingPortalLayout('overlay-composer', 'registration-1', BASE_RECT); }); expect(screen.getByTestId('teleport-state')).toHaveTextContent('false'); expect(screen.queryByTestId('portal-while-closing-placeholder-composer-portal')).toBeNull(); act(() => { stateStore.openOverlay('message-1'); stateStore.closeOverlay(); }); flushAnimationFrameQueue(); expect(screen.getByTestId('teleport-state')).toHaveTextContent('true'); expect(screen.getByTestId('portal-while-closing-placeholder-composer-portal')).toBeTruthy(); }); it('keeps the portal local when the host is blacklisted', () => { render( <> Composer , ); act(() => { stateStore.setClosingPortalLayout('overlay-composer', 'registration-1', BASE_RECT); stateStore.openOverlay('message-1'); stateStore.closeOverlay(); }); flushAnimationFrameQueue(); expect(screen.getByTestId('teleport-state')).toHaveTextContent('false'); expect(screen.queryByTestId('portal-while-closing-placeholder-composer-portal')).toBeNull(); }); it('clears its registration from the real store when it unmounts', () => { const { rerender } = render( <> Composer , ); act(() => { stateStore.setClosingPortalLayout('overlay-composer', 'registration-1', BASE_RECT); stateStore.openOverlay('message-1'); stateStore.closeOverlay(); }); flushAnimationFrameQueue(); expect(screen.getByTestId('teleport-state')).toHaveTextContent('true'); rerender( , ); expect(screen.getByTestId('teleport-state')).toHaveTextContent('false'); }); });