From cbcd4e7571d9933ddb30eeb02719dc15de61e82e Mon Sep 17 00:00:00 2001 From: linonetwo Date: Mon, 27 Apr 2026 08:54:56 +0800 Subject: [PATCH] fix(e2e): inline executeInMainWindow wrapper to fix TypeScript compilation in workspaceGroup.ts --- features/stepDefinitions/wiki.ts | 2 +- features/stepDefinitions/workspaceGroup.ts | 97 ++++++++++------------ 2 files changed, 44 insertions(+), 55 deletions(-) diff --git a/features/stepDefinitions/wiki.ts b/features/stepDefinitions/wiki.ts index ce56dc18..109c14c4 100644 --- a/features/stepDefinitions/wiki.ts +++ b/features/stepDefinitions/wiki.ts @@ -1033,7 +1033,7 @@ When('I create a new wiki workspace with name {string}', async function(this: Ap await backOff( async () => { - const workspaces = await this.app!.evaluate(async ({ BrowserWindow }, name: string) => { + const workspaces = await this.app!.evaluate(async ({ BrowserWindow }, _name: string) => { const windows = BrowserWindow.getAllWindows(); const mainWindow = windows.find(win => !win.isDestroyed() && win.webContents && win.webContents.getURL().includes('index.html')); diff --git a/features/stepDefinitions/workspaceGroup.ts b/features/stepDefinitions/workspaceGroup.ts index 27dfdd9b..fd695c82 100644 --- a/features/stepDefinitions/workspaceGroup.ts +++ b/features/stepDefinitions/workspaceGroup.ts @@ -2,6 +2,9 @@ import { DataTable, Given, Then, When } from '@cucumber/cucumber'; import { backOff } from 'exponential-backoff'; import type { IWorkspaceGroup } from '../../src/services/workspaces/interface'; +// Pull in renderer window type declarations so Playwright page.evaluate callbacks +// can access window.service with proper typing. +import type {} from '../../src/preload/index'; import type { ApplicationWorld } from './application'; const BACKOFF_OPTIONS = { @@ -19,22 +22,14 @@ interface ITestWorkspace { pageType?: string | null; } -async function executeInMainWindow(world: ApplicationWorld, pageFunction: (...arguments_: any[]) => any, argument?: any): Promise { +async function getAllWikiWorkspaces(world: ApplicationWorld): Promise { if (!world.currentWindow) { throw new Error('Current window not set'); } - return await world.currentWindow.evaluate(pageFunction, argument); -} - -async function getAllWikiWorkspaces(world: ApplicationWorld): Promise { - return await executeInMainWindow( - world, - async () => { - const all = await window.service.workspace.getWorkspacesAsList(); - return all.filter(workspace => !workspace.pageType) as ITestWorkspace[]; - }, - undefined, - ); + return await world.currentWindow.evaluate(async () => { + const all = await window.service.workspace.getWorkspacesAsList(); + return all.filter(workspace => !workspace.pageType) as ITestWorkspace[]; + }); } async function getWorkspaceByName(world: ApplicationWorld, workspaceName: string): Promise { @@ -50,19 +45,17 @@ async function getWorkspaceByName(world: ApplicationWorld, workspaceName: string } async function getGroups(world: ApplicationWorld): Promise { - return await executeInMainWindow( - world, - async () => window.service.workspace.getGroupsAsList(), - undefined, - ); + if (!world.currentWindow) { + throw new Error('Current window not set'); + } + return await world.currentWindow.evaluate(async () => window.service.workspace.getGroupsAsList()); } async function getGroupById(world: ApplicationWorld, groupId: string): Promise { - return await executeInMainWindow( - world, - async (id) => window.service.workspace.getGroup(id), - groupId, - ); + if (!world.currentWindow) { + throw new Error('Current window not set'); + } + return await world.currentWindow.evaluate(async (id) => window.service.workspace.getGroup(id), groupId); } async function createGroup(world: ApplicationWorld, groupName: string): Promise { @@ -74,17 +67,25 @@ async function createGroup(world: ApplicationWorld, groupName: string): Promise< collapsed: false, }; - await executeInMainWindow( - world, - async (group: IWorkspaceGroup) => { - await window.service.workspace.setGroup(group.id, group); - }, - newGroup, - ); + if (!world.currentWindow) { + throw new Error('Current window not set'); + } + await world.currentWindow.evaluate(async (group: IWorkspaceGroup) => { + await window.service.workspace.setGroup(group.id, group); + }, newGroup); return newGroup; } +async function moveWorkspaceToGroup(world: ApplicationWorld, workspaceId: string, groupId: string | null, autoDisband = true): Promise { + if (!world.currentWindow) { + throw new Error('Current window not set'); + } + await world.currentWindow.evaluate(async ({ workspaceId: id, groupId: gid, autoDisband: disband }: { workspaceId: string; groupId: string | null; autoDisband: boolean }) => { + await window.service.workspace.moveWorkspaceToGroup(id, gid, disband); + }, { workspaceId, groupId, autoDisband }); +} + async function waitForWorkspaceGroupId(world: ApplicationWorld, workspaceName: string, expectedGroupId: string | null): Promise { await backOff(async () => { const workspace = await getWorkspaceByName(world, workspaceName); @@ -95,16 +96,6 @@ async function waitForWorkspaceGroupId(world: ApplicationWorld, workspaceName: s }, BACKOFF_OPTIONS); } -async function moveWorkspaceToGroup(world: ApplicationWorld, workspaceId: string, groupId: string | null, autoDisband = true): Promise { - await executeInMainWindow( - world, - async ({ workspaceId: id, groupId: gid, autoDisband: disband }: { workspaceId: string; groupId: string | null; autoDisband: boolean }) => { - await window.service.workspace.moveWorkspaceToGroup(id, gid, disband); - }, - { workspaceId, groupId, autoDisband }, - ); -} - async function waitForGroupVisibility(world: ApplicationWorld, groupId: string): Promise { await backOff(async () => { if (!world.currentWindow) { @@ -587,13 +578,12 @@ When('I collapse workspace group {string}', async function(this: ApplicationWorl throw new Error(`Group "${groupName}" not found`); } - await executeInMainWindow( - this, - async (g: IWorkspaceGroup) => { - await window.service.workspace.setGroup(g.id, { ...g, collapsed: true }); - }, - group, - ); + if (!this.currentWindow) { + throw new Error('Current window not set'); + } + await this.currentWindow.evaluate(async (g: IWorkspaceGroup) => { + await window.service.workspace.setGroup(g.id, { ...g, collapsed: true }); + }, group); // Wait for Collapse unmountOnExit to fully remove children from DOM await this.currentWindow?.waitForTimeout(400); @@ -606,13 +596,12 @@ When('I expand workspace group {string}', async function(this: ApplicationWorld, throw new Error(`Group "${groupName}" not found`); } - await executeInMainWindow( - this, - async (g: IWorkspaceGroup) => { - await window.service.workspace.setGroup(g.id, { ...g, collapsed: false }); - }, - group, - ); + if (!this.currentWindow) { + throw new Error('Current window not set'); + } + await this.currentWindow.evaluate(async (g: IWorkspaceGroup) => { + await window.service.workspace.setGroup(g.id, { ...g, collapsed: false }); + }, group); // Wait for the MUI Collapse animation to finish so that // overflow:hidden no longer clips pointer events on child elements.