From b81f5cb91e2c9f2d5a5242632a559bf3d3e52ecd Mon Sep 17 00:00:00 2001 From: Henry Heino <46334387+personalizedrefrigerator@users.noreply.github.com> Date: Wed, 11 Jun 2025 14:42:06 -0700 Subject: [PATCH] Chore: Mobile: Increase test `waitFor` timeouts (#12475) --- .eslintignore | 1 + .gitignore | 1 + .../components/CameraView/CameraView.test.tsx | 2 +- packages/app-mobile/components/Dropdown.test.tsx | 2 +- .../components/EditorToolbar/EditorToolbar.test.tsx | 2 +- .../NoteBodyViewer/NoteBodyViewer.test.tsx | 2 +- .../components/NoteEditor/NoteEditor.test.tsx | 2 +- .../NoteEditor/hooks/useEditorCommandHandler.test.ts | 2 +- .../components/ScreenHeader/WarningBanner.test.tsx | 2 +- .../components/accessibility/AccessibleView.test.tsx | 2 +- .../NoteExportSection/NoteExportButton.test.tsx | 2 +- .../plugins/PluginStates.installed.test.tsx | 2 +- .../plugins/PluginStates.search.test.tsx | 2 +- .../app-mobile/components/screens/Note/Note.test.tsx | 2 +- .../components/screens/NoteRevisionViewer.test.tsx | 2 +- .../components/screens/Notes/NewNoteButton.test.tsx | 2 +- .../components/screens/ShareManager/index.test.tsx | 2 +- .../components/screens/ShareNoteDialog.test.tsx | 2 +- .../components/screens/encryption-config.test.tsx | 2 +- .../app-mobile/utils/testing/getWebViewWindowById.ts | 2 +- packages/app-mobile/utils/testing/testingLibrary.ts | 12 ++++++++++++ 21 files changed, 32 insertions(+), 18 deletions(-) create mode 100644 packages/app-mobile/utils/testing/testingLibrary.ts diff --git a/.eslintignore b/.eslintignore index 1947253cb8..efd9baf8d6 100644 --- a/.eslintignore +++ b/.eslintignore @@ -916,6 +916,7 @@ packages/app-mobile/utils/testing/createMockReduxStore.js packages/app-mobile/utils/testing/getWebViewDomById.js packages/app-mobile/utils/testing/getWebViewWindowById.js packages/app-mobile/utils/testing/setupGlobalStore.js +packages/app-mobile/utils/testing/testingLibrary.js packages/app-mobile/utils/types.js packages/app-mobile/web/serviceWorker.js packages/app-mobile/web/webpack.config.js diff --git a/.gitignore b/.gitignore index f5bb9040e9..859857ff57 100644 --- a/.gitignore +++ b/.gitignore @@ -891,6 +891,7 @@ packages/app-mobile/utils/testing/createMockReduxStore.js packages/app-mobile/utils/testing/getWebViewDomById.js packages/app-mobile/utils/testing/getWebViewWindowById.js packages/app-mobile/utils/testing/setupGlobalStore.js +packages/app-mobile/utils/testing/testingLibrary.js packages/app-mobile/utils/types.js packages/app-mobile/web/serviceWorker.js packages/app-mobile/web/webpack.config.js diff --git a/packages/app-mobile/components/CameraView/CameraView.test.tsx b/packages/app-mobile/components/CameraView/CameraView.test.tsx index 6f9119e4d9..733859986e 100644 --- a/packages/app-mobile/components/CameraView/CameraView.test.tsx +++ b/packages/app-mobile/components/CameraView/CameraView.test.tsx @@ -1,7 +1,7 @@ import * as React from 'react'; import CameraView from './CameraView'; import { CameraResult } from './types'; -import { fireEvent, render, screen } from '@testing-library/react-native'; +import { fireEvent, render, screen } from '../../utils/testing/testingLibrary'; import createMockReduxStore from '../../utils/testing/createMockReduxStore'; import TestProviderStack from '../testing/TestProviderStack'; diff --git a/packages/app-mobile/components/Dropdown.test.tsx b/packages/app-mobile/components/Dropdown.test.tsx index 8f0bc6114b..7fb585202a 100644 --- a/packages/app-mobile/components/Dropdown.test.tsx +++ b/packages/app-mobile/components/Dropdown.test.tsx @@ -2,7 +2,7 @@ import * as React from 'react'; import { Text } from 'react-native'; import { describe, it, expect, jest } from '@jest/globals'; -import { fireEvent, render, screen, waitFor } from '@testing-library/react-native'; +import { fireEvent, render, screen, waitFor } from '../utils/testing/testingLibrary'; import Dropdown, { DropdownListItem } from './Dropdown'; diff --git a/packages/app-mobile/components/EditorToolbar/EditorToolbar.test.tsx b/packages/app-mobile/components/EditorToolbar/EditorToolbar.test.tsx index 6f2c74a8d4..1c4b88efa9 100644 --- a/packages/app-mobile/components/EditorToolbar/EditorToolbar.test.tsx +++ b/packages/app-mobile/components/EditorToolbar/EditorToolbar.test.tsx @@ -1,5 +1,5 @@ import * as React from 'react'; -import { fireEvent, render, screen, waitFor } from '@testing-library/react-native'; +import { fireEvent, render, screen, waitFor } from '../../utils/testing/testingLibrary'; import { Store } from 'redux'; import { AppState } from '../../utils/types'; diff --git a/packages/app-mobile/components/NoteBodyViewer/NoteBodyViewer.test.tsx b/packages/app-mobile/components/NoteBodyViewer/NoteBodyViewer.test.tsx index e4f0142d13..92a1cd5d3b 100644 --- a/packages/app-mobile/components/NoteBodyViewer/NoteBodyViewer.test.tsx +++ b/packages/app-mobile/components/NoteBodyViewer/NoteBodyViewer.test.tsx @@ -1,7 +1,7 @@ import * as React from 'react'; import { describe, it, beforeEach } from '@jest/globals'; -import { render, screen, waitFor } from '@testing-library/react-native'; +import { render, screen, waitFor } from '../../utils/testing/testingLibrary'; import NoteBodyViewer from './NoteBodyViewer'; diff --git a/packages/app-mobile/components/NoteEditor/NoteEditor.test.tsx b/packages/app-mobile/components/NoteEditor/NoteEditor.test.tsx index 1a9e5b2656..ac97cc5fd4 100644 --- a/packages/app-mobile/components/NoteEditor/NoteEditor.test.tsx +++ b/packages/app-mobile/components/NoteEditor/NoteEditor.test.tsx @@ -1,7 +1,7 @@ import * as React from 'react'; import { describe, it, expect, beforeEach } from '@jest/globals'; -import { act, fireEvent, render, screen, waitFor } from '@testing-library/react-native'; +import { act, fireEvent, render, screen, waitFor } from '../../utils/testing/testingLibrary'; import NoteEditor from './NoteEditor'; import Setting from '@joplin/lib/models/Setting'; diff --git a/packages/app-mobile/components/NoteEditor/hooks/useEditorCommandHandler.test.ts b/packages/app-mobile/components/NoteEditor/hooks/useEditorCommandHandler.test.ts index 85b2dc1f54..7d1b4d34ee 100644 --- a/packages/app-mobile/components/NoteEditor/hooks/useEditorCommandHandler.test.ts +++ b/packages/app-mobile/components/NoteEditor/hooks/useEditorCommandHandler.test.ts @@ -4,7 +4,7 @@ import CommandService from '@joplin/lib/services/CommandService'; import useEditorCommandHandler from './useEditorCommandHandler'; import commandDeclarations from '../commandDeclarations'; import createTestEditorControl from '@joplin/editor/CodeMirror/testUtil/createEditorControl'; -import { renderHook } from '@testing-library/react-native'; +import { renderHook } from '../../../utils/testing/testingLibrary'; import { defaultState } from '@joplin/lib/reducer'; diff --git a/packages/app-mobile/components/ScreenHeader/WarningBanner.test.tsx b/packages/app-mobile/components/ScreenHeader/WarningBanner.test.tsx index e99134c4a2..0728eb6404 100644 --- a/packages/app-mobile/components/ScreenHeader/WarningBanner.test.tsx +++ b/packages/app-mobile/components/ScreenHeader/WarningBanner.test.tsx @@ -2,7 +2,7 @@ import * as React from 'react'; import { WarningBannerComponent } from './WarningBanner'; import Setting from '@joplin/lib/models/Setting'; import NavService from '@joplin/lib/services/NavService'; -import { render, screen, userEvent } from '@testing-library/react-native'; +import { render, screen, userEvent } from '../../utils/testing/testingLibrary'; import { ShareInvitation, ShareUserStatus } from '@joplin/lib/services/share/reducer'; import makeShareInvitation from '@joplin/lib/testing/share/makeMockShareInvitation'; diff --git a/packages/app-mobile/components/accessibility/AccessibleView.test.tsx b/packages/app-mobile/components/accessibility/AccessibleView.test.tsx index b62acca65f..3e041dcc47 100644 --- a/packages/app-mobile/components/accessibility/AccessibleView.test.tsx +++ b/packages/app-mobile/components/accessibility/AccessibleView.test.tsx @@ -1,6 +1,6 @@ import * as React from 'react'; import FocusControl from './FocusControl/FocusControl'; -import { render } from '@testing-library/react-native'; +import { render } from '../../utils/testing/testingLibrary'; import AccessibleView from './AccessibleView'; import { AccessibilityInfo } from 'react-native'; import ModalWrapper from './FocusControl/ModalWrapper'; diff --git a/packages/app-mobile/components/screens/ConfigScreen/NoteExportSection/NoteExportButton.test.tsx b/packages/app-mobile/components/screens/ConfigScreen/NoteExportSection/NoteExportButton.test.tsx index 2b9914d464..750a7d90aa 100644 --- a/packages/app-mobile/components/screens/ConfigScreen/NoteExportSection/NoteExportButton.test.tsx +++ b/packages/app-mobile/components/screens/ConfigScreen/NoteExportSection/NoteExportButton.test.tsx @@ -1,7 +1,7 @@ import * as React from 'react'; import { _ } from '@joplin/lib/locale'; -import { act, fireEvent, render, waitFor } from '@testing-library/react-native'; +import { act, fireEvent, render, waitFor } from '../../../../utils/testing/testingLibrary'; import { expect, describe, beforeEach, test, jest } from '@jest/globals'; import { createNTestNotes, setupDatabaseAndSynchronizer, switchClient } from '@joplin/lib/testing/test-utils'; import Folder from '@joplin/lib/models/Folder'; diff --git a/packages/app-mobile/components/screens/ConfigScreen/plugins/PluginStates.installed.test.tsx b/packages/app-mobile/components/screens/ConfigScreen/plugins/PluginStates.installed.test.tsx index 20448cde1a..03ba9120db 100644 --- a/packages/app-mobile/components/screens/ConfigScreen/plugins/PluginStates.installed.test.tsx +++ b/packages/app-mobile/components/screens/ConfigScreen/plugins/PluginStates.installed.test.tsx @@ -1,7 +1,7 @@ import * as React from 'react'; import { createTempDir, mockMobilePlatform, setupDatabaseAndSynchronizer, switchClient } from '@joplin/lib/testing/test-utils'; -import { act, fireEvent, render, screen, userEvent, waitFor } from '@testing-library/react-native'; +import { act, fireEvent, render, screen, userEvent, waitFor } from '../../../../utils/testing/testingLibrary'; import PluginService, { PluginSettings, defaultPluginSetting } from '@joplin/lib/services/plugins/PluginService'; import pluginServiceSetup from './testUtils/pluginServiceSetup'; diff --git a/packages/app-mobile/components/screens/ConfigScreen/plugins/PluginStates.search.test.tsx b/packages/app-mobile/components/screens/ConfigScreen/plugins/PluginStates.search.test.tsx index 351fc646a6..8f99a32e4f 100644 --- a/packages/app-mobile/components/screens/ConfigScreen/plugins/PluginStates.search.test.tsx +++ b/packages/app-mobile/components/screens/ConfigScreen/plugins/PluginStates.search.test.tsx @@ -1,7 +1,7 @@ import * as React from 'react'; import { mockMobilePlatform, setupDatabaseAndSynchronizer, switchClient } from '@joplin/lib/testing/test-utils'; -import { render, screen, userEvent, waitFor } from '@testing-library/react-native'; +import { render, screen, userEvent, waitFor } from '../../../../utils/testing/testingLibrary'; import pluginServiceSetup from './testUtils/pluginServiceSetup'; import createMockReduxStore from '../../../../utils/testing/createMockReduxStore'; diff --git a/packages/app-mobile/components/screens/Note/Note.test.tsx b/packages/app-mobile/components/screens/Note/Note.test.tsx index c1deec74b3..3ae4e4ba2e 100644 --- a/packages/app-mobile/components/screens/Note/Note.test.tsx +++ b/packages/app-mobile/components/screens/Note/Note.test.tsx @@ -1,7 +1,7 @@ import * as React from 'react'; import { describe, it, beforeEach } from '@jest/globals'; -import { act, fireEvent, render, screen, userEvent, waitFor } from '@testing-library/react-native'; +import { act, fireEvent, render, screen, userEvent, waitFor } from '../../../utils/testing/testingLibrary'; import NoteScreen from './Note'; import { setupDatabaseAndSynchronizer, switchClient, simulateReadOnlyShareEnv, supportDir, synchronizerStart, resourceFetcher, runWithFakeTimers } from '@joplin/lib/testing/test-utils'; diff --git a/packages/app-mobile/components/screens/NoteRevisionViewer.test.tsx b/packages/app-mobile/components/screens/NoteRevisionViewer.test.tsx index c79a2ed56a..0459c55b25 100644 --- a/packages/app-mobile/components/screens/NoteRevisionViewer.test.tsx +++ b/packages/app-mobile/components/screens/NoteRevisionViewer.test.tsx @@ -6,7 +6,7 @@ import NoteRevisionViewer from './NoteRevisionViewer'; import { setupDatabaseAndSynchronizer, switchClient, revisionService } from '@joplin/lib/testing/test-utils'; import createMockReduxStore from '../../utils/testing/createMockReduxStore'; import setupGlobalStore from '../../utils/testing/setupGlobalStore'; -import { fireEvent, render, screen, waitFor } from '@testing-library/react-native'; +import { fireEvent, render, screen, waitFor } from '../../utils/testing/testingLibrary'; import Note from '@joplin/lib/models/Note'; import { useMemo } from 'react'; import Revision from '@joplin/lib/models/Revision'; diff --git a/packages/app-mobile/components/screens/Notes/NewNoteButton.test.tsx b/packages/app-mobile/components/screens/Notes/NewNoteButton.test.tsx index 85938a1931..a0e85edaa2 100644 --- a/packages/app-mobile/components/screens/Notes/NewNoteButton.test.tsx +++ b/packages/app-mobile/components/screens/Notes/NewNoteButton.test.tsx @@ -5,7 +5,7 @@ import { AppState } from '../../../utils/types'; import { Store } from 'redux'; import createMockReduxStore from '../../../utils/testing/createMockReduxStore'; import setupGlobalStore from '../../../utils/testing/setupGlobalStore'; -import { act, render, screen, waitFor } from '@testing-library/react-native'; +import { act, render, screen, waitFor } from '../../../utils/testing/testingLibrary'; import { AccessibilityActionInfo } from 'react-native'; import { setupDatabaseAndSynchronizer } from '@joplin/lib/testing/test-utils'; import Folder from '@joplin/lib/models/Folder'; diff --git a/packages/app-mobile/components/screens/ShareManager/index.test.tsx b/packages/app-mobile/components/screens/ShareManager/index.test.tsx index 0dd67fa98d..094d42bba9 100644 --- a/packages/app-mobile/components/screens/ShareManager/index.test.tsx +++ b/packages/app-mobile/components/screens/ShareManager/index.test.tsx @@ -2,7 +2,7 @@ import * as React from 'react'; import { ShareManagerComponent } from './index'; import Setting from '@joplin/lib/models/Setting'; import mockShareService from '@joplin/lib/testing/share/mockShareService'; -import { act, render, screen, userEvent, waitFor } from '@testing-library/react-native'; +import { act, render, screen, userEvent, waitFor } from '../../../utils/testing/testingLibrary'; import { ShareInvitation, ShareUserStatus } from '@joplin/lib/services/share/reducer'; import { setupDatabaseAndSynchronizer, switchClient } from '@joplin/lib/testing/test-utils'; import ShareService from '@joplin/lib/services/share/ShareService'; diff --git a/packages/app-mobile/components/screens/ShareNoteDialog.test.tsx b/packages/app-mobile/components/screens/ShareNoteDialog.test.tsx index 1deeab67dd..a422fba3f1 100644 --- a/packages/app-mobile/components/screens/ShareNoteDialog.test.tsx +++ b/packages/app-mobile/components/screens/ShareNoteDialog.test.tsx @@ -8,7 +8,7 @@ import TestProviderStack from '../testing/TestProviderStack'; import ShareNoteDialog from './ShareNoteDialog'; import Note from '@joplin/lib/models/Note'; import mockShareService from '@joplin/lib/testing/share/mockShareService'; -import { fireEvent, render, screen, waitFor } from '@testing-library/react-native'; +import { fireEvent, render, screen, waitFor } from '../../utils/testing/testingLibrary'; import Folder from '@joplin/lib/models/Folder'; import ShareService from '@joplin/lib/services/share/ShareService'; diff --git a/packages/app-mobile/components/screens/encryption-config.test.tsx b/packages/app-mobile/components/screens/encryption-config.test.tsx index 3f31ac3cf5..0ab6c4ffac 100644 --- a/packages/app-mobile/components/screens/encryption-config.test.tsx +++ b/packages/app-mobile/components/screens/encryption-config.test.tsx @@ -7,7 +7,7 @@ import { loadEncryptionMasterKey, setupDatabaseAndSynchronizer, switchClient, sy import createMockReduxStore from '../../utils/testing/createMockReduxStore'; import setupGlobalStore from '../../utils/testing/setupGlobalStore'; import { getActiveMasterKeyId, setEncryptionEnabled, setMasterKeyEnabled } from '@joplin/lib/services/synchronizer/syncInfoUtils'; -import { act, render, screen } from '@testing-library/react-native'; +import { act, render, screen } from '../../utils/testing/testingLibrary'; interface WrapperProps { } diff --git a/packages/app-mobile/utils/testing/getWebViewWindowById.ts b/packages/app-mobile/utils/testing/getWebViewWindowById.ts index 97583eddae..3922fa8dfe 100644 --- a/packages/app-mobile/utils/testing/getWebViewWindowById.ts +++ b/packages/app-mobile/utils/testing/getWebViewWindowById.ts @@ -1,4 +1,4 @@ -import { screen, waitFor } from '@testing-library/react-native'; +import { screen, waitFor } from './testingLibrary'; const getWebViewWindowById = async (id: string): Promise => { const webviewContent = await screen.findByTestId(id); diff --git a/packages/app-mobile/utils/testing/testingLibrary.ts b/packages/app-mobile/utils/testing/testingLibrary.ts new file mode 100644 index 0000000000..bb8983542e --- /dev/null +++ b/packages/app-mobile/utils/testing/testingLibrary.ts @@ -0,0 +1,12 @@ +import * as testingLibrary from '@testing-library/react-native'; + +// This file wraps @testing-library/react-native to allow configuring it +// only if it's going to be used. Attempting to do this with a jest.mock +// fails with "Cannot add a hook after tests have started running. Hooks must be defined synchronously." +// Calling .configure for all tests causes jsdom-based tests to fail. +testingLibrary.configure({ + // The default timeout of 1_000 ms is often too low in CI. + asyncUtilTimeout: 5_000, +}); + +export * from '@testing-library/react-native';