import React from 'react'; import reactRouterDom from 'react-router-dom'; import { waitFor, act, screen, fireEvent } from '@testing-library/react'; import actions from '../../store/actions'; import configureStore from '../../store/store'; import { renderWithProvider } from '../../../test/jest'; import mockState from '../../../test/data/mock-state.json'; import { SECOND } from '../../../shared/constants/time'; import { useCopyToClipboard } from '../../hooks/useCopyToClipboard'; import DesktopPairingPage from '.'; const mockHideLoadingIndication = jest.fn(); const mockShowLoadingIndication = jest.fn(); jest.mock('../../store/actions', () => { return { hideLoadingIndication: () => mockHideLoadingIndication, showLoadingIndication: () => mockShowLoadingIndication, generateDesktopOtp: jest.fn(), }; }); jest.mock('../../hooks/useCopyToClipboard'); const mockedActions = actions; describe('Desktop Pairing page', () => { const mockHistoryPush = jest.fn(); const handleCopy = jest.fn(); function flushPromises() { // Wait for promises running in the non-async timer callback to complete. // From https://github.com/facebook/jest/issues/2157#issuecomment-897935688 return new Promise(jest.requireActual('timers').setImmediate); } beforeEach(() => { jest .spyOn(reactRouterDom, 'useHistory') .mockImplementation() .mockReturnValue({ push: mockHistoryPush }); useCopyToClipboard.mockReturnValue([false, handleCopy]); }); afterEach(() => { jest.resetAllMocks(); jest.clearAllMocks(); }); it('should render otp component', async () => { const otp = '123456'; mockedActions.generateDesktopOtp.mockResolvedValue(otp); const store = configureStore(mockState); let container = null; act(() => { container = renderWithProvider(, store).container; }); await waitFor(() => { expect(screen.getByTestId('desktop-pairing-otp-content')).toBeDefined(); }); expect(container).toMatchSnapshot(); }); it('should re-render otp component after 30s', async () => { jest.useFakeTimers(); const otp = '123456'; const newOtp = '654321'; const neverGeneratedOTP = '111222'; mockedActions.generateDesktopOtp .mockResolvedValueOnce(otp) .mockResolvedValueOnce(newOtp) .mockResolvedValueOnce(neverGeneratedOTP); const store = configureStore(mockState); act(() => { renderWithProvider(, store); }); // First render await waitFor(async () => { await flushPromises(); expect(screen.getByTestId('desktop-pairing-otp-content')).toBeDefined(); expect(screen.getByText(otp)).toBeDefined(); expect(mockedActions.generateDesktopOtp).toHaveBeenCalledTimes(1); }); // Advance timers 30s to trigger next OTP act(() => jest.advanceTimersByTime(30 * SECOND)); await waitFor(async () => { await flushPromises(); expect(screen.getByTestId('desktop-pairing-otp-content')).toBeDefined(); expect(screen.getByText(newOtp)).toBeDefined(); expect(mockedActions.generateDesktopOtp).toHaveBeenCalledTimes(2); }); // Advance timers 10s to test that OTP is still the same act(() => jest.advanceTimersByTime(10 * SECOND)); await waitFor(async () => { await flushPromises(); expect(screen.getByTestId('desktop-pairing-otp-content')).toBeDefined(); expect(screen.getByText(newOtp)).toBeDefined(); expect(mockedActions.generateDesktopOtp).toHaveBeenCalledTimes(2); }); jest.clearAllTimers(); jest.useRealTimers(); }); it('should copy otp value when content is clicked', async () => { const otp = '123456'; mockedActions.generateDesktopOtp.mockResolvedValue(otp); const store = configureStore(mockState); act(() => { renderWithProvider(, store); }); await waitFor(() => { expect(screen.getByTestId('desktop-pairing-otp-content')).toBeDefined(); expect(screen.getByText(otp)).toBeDefined(); }); act(() => { fireEvent.click(screen.getByTestId('desktop-pairing-otp-content')); }); await waitFor(() => { expect(handleCopy).toHaveBeenCalledWith(otp); }); }); it('should return to previews page when the done button is clicked', async () => { const otp = '123456'; const mostRecentOverviewPage = '/mostRecentOverviewPage'; mockedActions.generateDesktopOtp.mockResolvedValue(otp); const store = configureStore(mockState); act(() => { renderWithProvider(, store); }); await waitFor(() => { expect(screen.getByTestId('desktop-pairing-otp-content')).toBeDefined(); }); act(() => { fireEvent.click(screen.getByText('Done')); }); await waitFor(() => { expect(mockHistoryPush).toHaveBeenCalledTimes(1); expect(mockHistoryPush).toHaveBeenCalledWith(mostRecentOverviewPage); }); }); });