From 29777b1ec7d86ef1ebb98770fb2b001b181f1f2a Mon Sep 17 00:00:00 2001 From: Bijin A B Date: Sat, 21 Mar 2026 21:20:15 +0530 Subject: [PATCH] chore: test fixes --- tests/utils/page/actions.ts | 3 +- .../create-workspace/create-workspace.spec.ts | 61 +++++++------------ .../default-workspace.spec.ts | 31 +++------- 3 files changed, 33 insertions(+), 62 deletions(-) diff --git a/tests/utils/page/actions.ts b/tests/utils/page/actions.ts index d962c06a5..d86a4e3e9 100644 --- a/tests/utils/page/actions.ts +++ b/tests/utils/page/actions.ts @@ -963,8 +963,9 @@ const clickResponseAction = async (page: Page, actionTestId: string) => { if (await actionButton.isVisible()) { await actionButton.click(); } else { - // Open the menu dropdown + // Open the menu dropdown (wait for response pane to fully render) const menu = page.getByTestId('response-actions-menu'); + await menu.waitFor({ state: 'visible', timeout: 15000 }); await menu.click(); // Click the corresponding menu item diff --git a/tests/workspace/create-workspace/create-workspace.spec.ts b/tests/workspace/create-workspace/create-workspace.spec.ts index 27e8291b5..28f019178 100644 --- a/tests/workspace/create-workspace/create-workspace.spec.ts +++ b/tests/workspace/create-workspace/create-workspace.spec.ts @@ -2,6 +2,7 @@ import path from 'path'; import fs from 'fs'; import yaml from 'js-yaml'; import { test, expect, closeElectronApp } from '../../../playwright'; +import { waitForReadyPage } from '../../utils/page'; type WorkspaceConfig = { opencollection?: string; @@ -28,8 +29,7 @@ test.describe('Create Workspace', () => { const wsLocation = await createTmpDir('ws-location-enter'); const app = await launchElectronApp({ initUserDataPath, templateVars: { wsLocation } }); - const page = await app.firstWindow(); - await page.locator('[data-app-state="loaded"]').waitFor({ timeout: 30000 }); + const page = await waitForReadyPage(app); await test.step('Click "Create workspace" from title bar dropdown', async () => { await page.locator('.workspace-name-container').click(); @@ -75,8 +75,7 @@ test.describe('Create Workspace', () => { const wsLocation = await createTmpDir('ws-location-check'); const app = await launchElectronApp({ initUserDataPath, templateVars: { wsLocation } }); - const page = await app.firstWindow(); - await page.locator('[data-app-state="loaded"]').waitFor({ timeout: 30000 }); + const page = await waitForReadyPage(app); await test.step('Click "Create workspace" and fill name', async () => { await page.locator('.workspace-name-container').click(); @@ -109,8 +108,7 @@ test.describe('Create Workspace', () => { const wsLocation = await createTmpDir('ws-location-outside'); const app = await launchElectronApp({ initUserDataPath, templateVars: { wsLocation } }); - const page = await app.firstWindow(); - await page.locator('[data-app-state="loaded"]').waitFor({ timeout: 30000 }); + const page = await waitForReadyPage(app); await test.step('Create workspace and fill name', async () => { await page.locator('.workspace-name-container').click(); @@ -139,8 +137,7 @@ test.describe('Create Workspace', () => { const wsLocation = await createTmpDir('ws-location-escape'); const app = await launchElectronApp({ initUserDataPath, templateVars: { wsLocation } }); - const page = await app.firstWindow(); - await page.locator('[data-app-state="loaded"]').waitFor({ timeout: 30000 }); + const page = await waitForReadyPage(app); await test.step('Start workspace creation', async () => { await page.locator('.workspace-name-container').click(); @@ -168,8 +165,7 @@ test.describe('Create Workspace', () => { const wsLocation = await createTmpDir('ws-location-x'); const app = await launchElectronApp({ initUserDataPath, templateVars: { wsLocation } }); - const page = await app.firstWindow(); - await page.locator('[data-app-state="loaded"]').waitFor({ timeout: 30000 }); + const page = await waitForReadyPage(app); await test.step('Start workspace creation', async () => { await page.locator('.workspace-name-container').click(); @@ -192,8 +188,7 @@ test.describe('Create Workspace', () => { const wsLocation = await createTmpDir('ws-location-outside-empty'); const app = await launchElectronApp({ initUserDataPath, templateVars: { wsLocation } }); - const page = await app.firstWindow(); - await page.locator('[data-app-state="loaded"]').waitFor({ timeout: 30000 }); + const page = await waitForReadyPage(app); await test.step('Start workspace creation and clear the name', async () => { await page.locator('.workspace-name-container').click(); @@ -221,8 +216,7 @@ test.describe('Create Workspace', () => { const customLocation = await createTmpDir('custom-ws-location'); const app = await launchElectronApp({ initUserDataPath, templateVars: { wsLocation } }); - const page = await app.firstWindow(); - await page.locator('[data-app-state="loaded"]').waitFor({ timeout: 30000 }); + const page = await waitForReadyPage(app); await test.step('Start inline creation and click settings icon to open advanced modal', async () => { await page.locator('.workspace-name-container').click(); @@ -296,8 +290,7 @@ test.describe('Create Workspace', () => { const wsLocation = await createTmpDir('ws-location-modal-default'); const app = await launchElectronApp({ initUserDataPath, templateVars: { wsLocation } }); - const page = await app.firstWindow(); - await page.locator('[data-app-state="loaded"]').waitFor({ timeout: 30000 }); + const page = await waitForReadyPage(app); await test.step('Start inline creation and open advanced modal', async () => { await page.locator('.workspace-name-container').click(); @@ -338,8 +331,7 @@ test.describe('Create Workspace', () => { const wsLocation = await createTmpDir('ws-location-modal-cancel'); const app = await launchElectronApp({ initUserDataPath, templateVars: { wsLocation } }); - const page = await app.firstWindow(); - await page.locator('[data-app-state="loaded"]').waitFor({ timeout: 30000 }); + const page = await waitForReadyPage(app); await test.step('Start inline creation and open advanced modal', async () => { await page.locator('.workspace-name-container').click(); @@ -366,8 +358,7 @@ test.describe('Create Workspace', () => { const wsLocation = await createTmpDir('ws-location-modal-empty'); const app = await launchElectronApp({ initUserDataPath, templateVars: { wsLocation } }); - const page = await app.firstWindow(); - await page.locator('[data-app-state="loaded"]').waitFor({ timeout: 30000 }); + const page = await waitForReadyPage(app); await test.step('Start inline creation and open advanced modal', async () => { await page.locator('.workspace-name-container').click(); @@ -438,8 +429,7 @@ test.describe('Create Workspace', () => { const wsLocation = await createTmpDir('ws-location-display'); const app = await launchElectronApp({ initUserDataPath, templateVars: { wsLocation } }); - const page = await app.firstWindow(); - await page.locator('[data-app-state="loaded"]').waitFor({ timeout: 30000 }); + const page = await waitForReadyPage(app); await test.step('Create a workspace with specific name', async () => { await page.locator('.workspace-name-container').click(); @@ -470,8 +460,7 @@ test.describe('Create Workspace', () => { // First launch: create workspace const app1 = await launchElectronApp({ userDataPath, initUserDataPath, templateVars: { wsLocation } }); - const page1 = await app1.firstWindow(); - await page1.locator('[data-app-state="loaded"]').waitFor({ timeout: 30000 }); + const page1 = await waitForReadyPage(app1); await test.step('Create workspace', async () => { await page1.locator('.workspace-name-container').click(); @@ -487,8 +476,7 @@ test.describe('Create Workspace', () => { // Second launch: verify name persists (reuse same userDataPath) const app2 = await launchElectronApp({ userDataPath }); - const page2 = await app2.firstWindow(); - await page2.locator('[data-app-state="loaded"]').waitFor({ timeout: 30000 }); + const page2 = await waitForReadyPage(app2); await test.step('Verify workspace name persisted', async () => { await page2.locator('.workspace-name-container').click(); @@ -505,8 +493,7 @@ test.describe('Create Workspace', () => { const wsLocation = await createTmpDir('ws-location-multiple'); const app = await launchElectronApp({ initUserDataPath, templateVars: { wsLocation } }); - const page = await app.firstWindow(); - await page.locator('[data-app-state="loaded"]').waitFor({ timeout: 30000 }); + const page = await waitForReadyPage(app); await test.step('Create first workspace', async () => { await page.locator('.workspace-name-container').click(); @@ -550,8 +537,7 @@ test.describe('Create Workspace', () => { const wsLocation = await createTmpDir('ws-location-cancel-retry'); const app = await launchElectronApp({ initUserDataPath, templateVars: { wsLocation } }); - const page = await app.firstWindow(); - await page.locator('[data-app-state="loaded"]').waitFor({ timeout: 30000 }); + const page = await waitForReadyPage(app); await test.step('Start creation and cancel with Escape', async () => { await page.locator('.workspace-name-container').click(); @@ -579,8 +565,7 @@ test.describe('Create Workspace', () => { const wsLocation = await createTmpDir('ws-location-special'); const app = await launchElectronApp({ initUserDataPath, templateVars: { wsLocation } }); - const page = await app.firstWindow(); - await page.locator('[data-app-state="loaded"]').waitFor({ timeout: 30000 }); + const page = await waitForReadyPage(app); await test.step('Create workspace with special characters in name', async () => { await page.locator('.workspace-name-container').click(); @@ -610,8 +595,7 @@ test.describe('Create Workspace', () => { const wsLocation = await createTmpDir('ws-location-empty'); const app = await launchElectronApp({ initUserDataPath, templateVars: { wsLocation } }); - const page = await app.firstWindow(); - await page.locator('[data-app-state="loaded"]').waitFor({ timeout: 30000 }); + const page = await waitForReadyPage(app); await test.step('Create workspace and clear name', async () => { await page.locator('.workspace-name-container').click(); @@ -639,8 +623,7 @@ test.describe('Create Workspace', () => { const wsLocation = await createTmpDir('ws-location-no-cog'); const app = await launchElectronApp({ initUserDataPath, templateVars: { wsLocation } }); - const page = await app.firstWindow(); - await page.locator('[data-app-state="loaded"]').waitFor({ timeout: 30000 }); + const page = await waitForReadyPage(app); await test.step('Create a workspace first', async () => { await page.locator('.workspace-name-container').click(); @@ -678,8 +661,7 @@ test.describe('Create Workspace', () => { const wsLocation = await createTmpDir('ws-location-switch'); const app = await launchElectronApp({ initUserDataPath, templateVars: { wsLocation } }); - const page = await app.firstWindow(); - await page.locator('[data-app-state="loaded"]').waitFor({ timeout: 30000 }); + const page = await waitForReadyPage(app); await test.step('Create a new workspace', async () => { await page.locator('.workspace-name-container').click(); @@ -715,8 +697,7 @@ test.describe('Create Workspace', () => { const wsLocation = await createTmpDir('ws-location-no-temp'); const app = await launchElectronApp({ initUserDataPath, templateVars: { wsLocation } }); - const page = await app.firstWindow(); - await page.locator('[data-app-state="loaded"]').waitFor({ timeout: 30000 }); + const page = await waitForReadyPage(app); await test.step('Start creation but do not confirm', async () => { await page.locator('.workspace-name-container').click(); diff --git a/tests/workspace/default-workspace/default-workspace.spec.ts b/tests/workspace/default-workspace/default-workspace.spec.ts index 8ca9044e1..cd92ea646 100644 --- a/tests/workspace/default-workspace/default-workspace.spec.ts +++ b/tests/workspace/default-workspace/default-workspace.spec.ts @@ -1,15 +1,14 @@ import path from 'path'; import fs from 'fs'; import { test, expect, closeElectronApp } from '../../../playwright'; +import { waitForReadyPage } from '../../utils/page'; test.describe('Default Workspace', () => { test.describe('First Launch', () => { test('should create default workspace with "My Workspace" name on first launch', async ({ launchElectronApp, createTmpDir }) => { const userDataPath = await createTmpDir('default-workspace-first-launch'); const app = await launchElectronApp({ userDataPath }); - const page = await app.firstWindow(); - - await page.locator('[data-app-state="loaded"]').waitFor({ timeout: 30000 }); + const page = await waitForReadyPage(app); // Verify the workspace name is "My Workspace" in the title bar const workspaceName = page.getByTestId('workspace-name'); @@ -25,16 +24,14 @@ test.describe('Default Workspace', () => { // First launch const app1 = await launchElectronApp({ userDataPath }); - const page1 = await app1.firstWindow(); - await page1.locator('[data-app-state="loaded"]').waitFor({ timeout: 30000 }); + const page1 = await waitForReadyPage(app1); await expect(page1.getByTestId('workspace-name')).toHaveText('My Workspace'); await closeElectronApp(app1); // Second launch - same workspace should be loaded const app2 = await launchElectronApp({ userDataPath }); - const page2 = await app2.firstWindow(); - await page2.locator('[data-app-state="loaded"]').waitFor({ timeout: 30000 }); + const page2 = await waitForReadyPage(app2); await expect(page2.getByTestId('workspace-name')).toHaveText('My Workspace'); await closeElectronApp(app2); @@ -63,8 +60,7 @@ test.describe('Default Workspace', () => { // Launch app - should create NEW workspace const app = await launchElectronApp({ userDataPath }); - const page = await app.firstWindow(); - await page.locator('[data-app-state="loaded"]').waitFor({ timeout: 30000 }); + const page = await waitForReadyPage(app); // Should show "My Workspace" await expect(page.getByTestId('workspace-name')).toHaveText('My Workspace'); @@ -100,8 +96,7 @@ test.describe('Default Workspace', () => { // Launch app - should create NEW workspace const app = await launchElectronApp({ userDataPath }); - const page = await app.firstWindow(); - await page.locator('[data-app-state="loaded"]').waitFor({ timeout: 30000 }); + const page = await waitForReadyPage(app); await expect(page.getByTestId('workspace-name')).toHaveText('My Workspace'); @@ -143,8 +138,7 @@ docs: '' // Launch app const app = await launchElectronApp({ userDataPath }); - const page = await app.firstWindow(); - await page.locator('[data-app-state="loaded"]').waitFor({ timeout: 30000 }); + const page = await waitForReadyPage(app); await expect(page.getByTestId('workspace-name')).toHaveText('My Workspace'); @@ -171,8 +165,7 @@ docs: '' // Launch app const app = await launchElectronApp({ userDataPath }); - const page = await app.firstWindow(); - await page.locator('[data-app-state="loaded"]').waitFor({ timeout: 30000 }); + const page = await waitForReadyPage(app); await expect(page.getByTestId('workspace-name')).toHaveText('My Workspace'); @@ -189,9 +182,7 @@ docs: '' test('should display default workspace in workspace dropdown', async ({ launchElectronApp, createTmpDir }) => { const userDataPath = await createTmpDir('default-workspace-ui-dropdown'); const app = await launchElectronApp({ userDataPath }); - const page = await app.firstWindow(); - - await page.locator('[data-app-state="loaded"]').waitFor({ timeout: 30000 }); + const page = await waitForReadyPage(app); // Click on workspace name to open dropdown await page.locator('.workspace-name-container').click(); @@ -206,9 +197,7 @@ docs: '' test('should not show pin button for default workspace', async ({ launchElectronApp, createTmpDir }) => { const userDataPath = await createTmpDir('default-workspace-ui-no-pin'); const app = await launchElectronApp({ userDataPath }); - const page = await app.firstWindow(); - - await page.locator('[data-app-state="loaded"]').waitFor({ timeout: 30000 }); + const page = await waitForReadyPage(app); await page.locator('.workspace-name-container').click();