From dc786e81787738ef3de244b79e16e66bec97da1b Mon Sep 17 00:00:00 2001 From: Henry Heino <46334387+personalizedrefrigerator@users.noreply.github.com> Date: Mon, 19 May 2025 14:59:31 -0700 Subject: [PATCH] Chore: Desktop: Fix `electronApp.evaluate`-related test failure (#12216) --- .eslintignore | 1 + .gitignore | 1 + .../util/evaluateWithRetry.ts | 24 +++++++++++++++++++ .../integration-tests/util/setDarkMode.ts | 3 ++- .../integration-tests/util/test.ts | 5 ++-- 5 files changed, 31 insertions(+), 3 deletions(-) create mode 100644 packages/app-desktop/integration-tests/util/evaluateWithRetry.ts diff --git a/.eslintignore b/.eslintignore index 06cf768141..c76dac0a49 100644 --- a/.eslintignore +++ b/.eslintignore @@ -535,6 +535,7 @@ packages/app-desktop/integration-tests/sidebar.spec.js packages/app-desktop/integration-tests/simpleBackup.spec.js packages/app-desktop/integration-tests/util/activateMainMenuItem.js packages/app-desktop/integration-tests/util/createStartupArgs.js +packages/app-desktop/integration-tests/util/evaluateWithRetry.js packages/app-desktop/integration-tests/util/extendedExpect.js packages/app-desktop/integration-tests/util/getImageSourceSize.js packages/app-desktop/integration-tests/util/getMainWindow.js diff --git a/.gitignore b/.gitignore index b4bdc1a505..06439bac2e 100644 --- a/.gitignore +++ b/.gitignore @@ -509,6 +509,7 @@ packages/app-desktop/integration-tests/sidebar.spec.js packages/app-desktop/integration-tests/simpleBackup.spec.js packages/app-desktop/integration-tests/util/activateMainMenuItem.js packages/app-desktop/integration-tests/util/createStartupArgs.js +packages/app-desktop/integration-tests/util/evaluateWithRetry.js packages/app-desktop/integration-tests/util/extendedExpect.js packages/app-desktop/integration-tests/util/getImageSourceSize.js packages/app-desktop/integration-tests/util/getMainWindow.js diff --git a/packages/app-desktop/integration-tests/util/evaluateWithRetry.ts b/packages/app-desktop/integration-tests/util/evaluateWithRetry.ts new file mode 100644 index 0000000000..eb72bc9106 --- /dev/null +++ b/packages/app-desktop/integration-tests/util/evaluateWithRetry.ts @@ -0,0 +1,24 @@ + +import { ElectronApplication } from '@playwright/test'; +import type { PageFunctionOn } from 'playwright-core/types/structs'; +import type * as ElectronType from 'electron'; + +const evaluateWithRetry = async ( + app: ElectronApplication, + pageFunction: PageFunctionOn, + arg: Arg, +) => { + let lastError; + const maxRetries = 3; + for (let retryIndex = 0; retryIndex < maxRetries; retryIndex ++) { + try { + return await app.evaluate(pageFunction, arg); + } catch (error) { + console.error('app.evaluate failed:', error, `Retrying... ${retryIndex}/${maxRetries}`); + lastError = error; + } + } + throw lastError; +}; + +export default evaluateWithRetry; diff --git a/packages/app-desktop/integration-tests/util/setDarkMode.ts b/packages/app-desktop/integration-tests/util/setDarkMode.ts index a12ec57e5c..cf1ff81b5c 100644 --- a/packages/app-desktop/integration-tests/util/setDarkMode.ts +++ b/packages/app-desktop/integration-tests/util/setDarkMode.ts @@ -1,7 +1,8 @@ import { ElectronApplication } from '@playwright/test'; +import evaluateWithRetry from './evaluateWithRetry'; const setDarkMode = (app: ElectronApplication, darkMode: boolean) => { - return app.evaluate(({ nativeTheme }, darkMode) => { + return evaluateWithRetry(app, ({ nativeTheme }, darkMode) => { nativeTheme.themeSource = darkMode ? 'dark' : 'light'; }, darkMode); }; diff --git a/packages/app-desktop/integration-tests/util/test.ts b/packages/app-desktop/integration-tests/util/test.ts index 3659cff7e8..79e77d8566 100644 --- a/packages/app-desktop/integration-tests/util/test.ts +++ b/packages/app-desktop/integration-tests/util/test.ts @@ -5,6 +5,7 @@ import uuid from '@joplin/lib/uuid'; import createStartupArgs from './createStartupArgs'; import getMainWindow from './getMainWindow'; import setDarkMode from './setDarkMode'; +import evaluateWithRetry from './evaluateWithRetry'; type StartWithPluginsResult = { app: ElectronApplication; mainWindow: Page }; @@ -32,8 +33,8 @@ const initializeMainWindow = async (electronApp: ElectronApplication) => { return mainWindow; }; -const waitForMainMessage = (electronApp: ElectronApplication, messageId: string) => { - return electronApp.evaluate(({ ipcMain }, messageId) => { +const waitForMainMessage = async (electronApp: ElectronApplication, messageId: string) => { + return evaluateWithRetry(electronApp, ({ ipcMain }, messageId) => { return new Promise(resolve => { ipcMain.once(messageId, () => resolve()); });