fix(e2e): consolidate workspace drag scenarios and remove fixed waits

This commit is contained in:
linonetwo 2026-04-29 08:55:02 +08:00
parent 4b2b508cb2
commit 5981af7186
4 changed files with 50 additions and 177 deletions

View file

@ -542,11 +542,8 @@ When('I select {string} from MUI Select with test id {string}', async function(t
throw new Error(`Failed to click: ${JSON.stringify(clicked)}`);
}
// Wait a bit for the menu to appear
await currentWindow.waitForTimeout(500);
// Wait for the menu to appear
await currentWindow.waitForSelector('[role="listbox"]', { timeout: PLAYWRIGHT_SHORT_TIMEOUT });
await currentWindow.waitForSelector('[role="listbox"]', { state: 'visible', timeout: PLAYWRIGHT_SHORT_TIMEOUT });
// Try to click on the option with the specified value (data-value attribute)
// If not found, try to find by text content

View file

@ -57,6 +57,11 @@ async function getGroups(world: ApplicationWorld): Promise<IWorkspaceGroup[]> {
return await world.currentWindow.evaluate(async () => window.service.workspace.getGroupsAsList());
}
async function getGroupWorkspaces(world: ApplicationWorld, groupId: string): Promise<ITestWorkspace[]> {
const workspaces = await getAllWikiWorkspaces(world);
return workspaces.filter(workspace => workspace.groupId === groupId);
}
async function getSidebarOrderEntries(world: ApplicationWorld): Promise<IWorkspaceOrGroupOrderEntry[]> {
const [workspaces, groups] = await Promise.all([getAllWikiWorkspaces(world), getGroups(world)]);
return [
@ -73,13 +78,6 @@ async function getSidebarOrderEntries(world: ApplicationWorld): Promise<IWorkspa
].sort((left, right) => left.order - right.order);
}
async function getGroupById(world: ApplicationWorld, groupId: string): Promise<IWorkspaceGroup | undefined> {
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<IWorkspaceGroup> {
const groups = await getGroups(world);
const newGroup: IWorkspaceGroup = {
@ -131,6 +129,29 @@ async function waitForGroupVisibility(world: ApplicationWorld, groupId: string):
}, BACKOFF_OPTIONS);
}
async function waitForGroupedWorkspaceDomState(world: ApplicationWorld, groupId: string, shouldBeVisible: boolean): Promise<void> {
await backOff(async () => {
if (!world.currentWindow) {
throw new Error('Current window not set');
}
const groupedWorkspaces = await getGroupWorkspaces(world, groupId);
for (const workspace of groupedWorkspaces) {
const itemCount = await world.currentWindow.locator(`[data-testid="workspace-item-${workspace.id}"]`).count();
const topDropZoneCount = await world.currentWindow.locator(`[data-testid="workspace-drop-zone-${workspace.id}-top"]`).count();
if (shouldBeVisible && (itemCount === 0 || topDropZoneCount === 0)) {
throw new Error(`Grouped workspace "${workspace.name}" is not fully visible yet`);
}
if (!shouldBeVisible && (itemCount !== 0 || topDropZoneCount !== 0)) {
throw new Error(`Grouped workspace "${workspace.name}" is still visible`);
}
}
}, BACKOFF_OPTIONS);
}
async function dragLocatorToCoordinates(
world: ApplicationWorld,
sourceSelector: string,
@ -278,10 +299,6 @@ Given('workspace group {string} contains workspaces:', async function(this: Appl
}
}, BACKOFF_OPTIONS);
}
// Allow any deferred async side-effects (e.g. tidgi.config.json writes)
// to finish so that React state stabilises before the drag step starts.
await this.currentWindow?.waitForTimeout(3000);
});
When('I drag workspace {string} onto workspace {string}', async function(this: ApplicationWorld, sourceWorkspaceName: string, targetWorkspaceName: string) {
@ -382,15 +399,6 @@ When('I drag workspace {string} onto the header of its current group', async fun
);
});
When('I remove workspace {string} from its group without auto-disband', async function(this: ApplicationWorld, workspaceName: string) {
const workspace = await getWorkspaceByName(this, workspaceName);
if (!workspace.groupId) {
throw new Error(`Workspace "${workspaceName}" is not currently grouped`);
}
await moveWorkspaceToGroup(this, workspace.id, null, false);
});
Then('workspaces {string} and {string} should share a group', async function(this: ApplicationWorld, firstWorkspaceName: string, secondWorkspaceName: string) {
await backOff(async () => {
const [firstWorkspace, secondWorkspace] = await Promise.all([
@ -417,20 +425,6 @@ Then('workspace {string} should be in a group', async function(this: Application
}, BACKOFF_OPTIONS);
});
Then('the group containing workspace {string} should contain {int} workspaces', async function(this: ApplicationWorld, workspaceName: string, expectedCount: number) {
await backOff(async () => {
const workspace = await getWorkspaceByName(this, workspaceName);
if (!workspace.groupId) {
throw new Error(`Workspace "${workspaceName}" is not in a group`);
}
const groupedWorkspaces = (await getAllWikiWorkspaces(this)).filter(candidate => candidate.groupId === workspace.groupId);
if (groupedWorkspaces.length !== expectedCount) {
throw new Error(`Expected ${expectedCount} workspaces in group ${workspace.groupId}, found ${groupedWorkspaces.length}`);
}
}, BACKOFF_OPTIONS);
});
Then('there should be {int} workspace groups', async function(this: ApplicationWorld, expectedCount: number) {
await backOff(async () => {
const groups = await getGroups(this);
@ -440,20 +434,6 @@ Then('there should be {int} workspace groups', async function(this: ApplicationW
}, BACKOFF_OPTIONS);
});
Then('the group containing workspace {string} should still exist', async function(this: ApplicationWorld, workspaceName: string) {
await backOff(async () => {
const workspace = await getWorkspaceByName(this, workspaceName);
if (!workspace.groupId) {
throw new Error(`Workspace "${workspaceName}" is not in a group`);
}
const group = await getGroupById(this, workspace.groupId);
if (!group) {
throw new Error(`Group ${workspace.groupId} no longer exists`);
}
}, BACKOFF_OPTIONS);
});
Then('workspace {string} should appear before workspace {string}', async function(this: ApplicationWorld, firstWorkspaceName: string, secondWorkspaceName: string) {
await backOff(async () => {
const [firstWorkspace, secondWorkspace] = await Promise.all([
@ -502,15 +482,6 @@ Then('workspace {string} should show {string} drag intent', async function(this:
}, BACKOFF_OPTIONS);
});
When('I press the Escape key', async function(this: ApplicationWorld) {
if (!this.currentWindow) {
throw new Error('Current window not set');
}
await this.currentWindow.keyboard.press('Escape');
await this.currentWindow.waitForTimeout(100);
});
When('I collapse workspace group {string}', async function(this: ApplicationWorld, groupName: string) {
const groups = await getGroups(this);
const group = groups.find(g => g.name === groupName);
@ -525,8 +496,7 @@ When('I collapse workspace group {string}', async function(this: ApplicationWorl
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);
await waitForGroupedWorkspaceDomState(this, group.id, false);
});
When('I expand workspace group {string}', async function(this: ApplicationWorld, groupName: string) {
@ -543,11 +513,8 @@ When('I expand workspace group {string}', async function(this: ApplicationWorld,
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.
// timeout='auto' can take 300-500ms for small lists; 2000ms ensures completion
// even on slower CI runners.
await this.currentWindow?.waitForTimeout(2000);
await waitForGroupVisibility(this, group.id);
await waitForGroupedWorkspaceDomState(this, group.id, true);
});
When('I drag group header {string} onto group header {string}', async function(this: ApplicationWorld, sourceGroupName: string, targetGroupName: string) {

View file

@ -95,7 +95,6 @@ Feature: Workspace Configuration Sync
When I update workspace "wiki" settings:
| property | value |
| name | LocalWiki |
When I wait for 2 seconds for "potential config write"
# Step 4: Verify tidgi.config.json was NOT overwritten by the local-only workspace
Then file "wiki/tidgi.config.json" should contain JSON with:
@ -109,7 +108,6 @@ Feature: Workspace Configuration Sync
When I update workspace "LocalWiki" settings:
| property | value |
| readOnlyMode | true |
When I wait for 2 seconds for "potential config write"
# Step 7: Verify read-only config did NOT leak into tidgi.config.json
Then file "wiki/tidgi.config.json" should contain JSON with:
@ -159,7 +157,6 @@ Feature: Workspace Configuration Sync
| property | value |
| name | BlogDeploy |
| readOnlyMode | true |
When I wait for 2 seconds for "potential config write"
# Step 3: Verify tidgi.config.json does NOT contain the readOnlyMode from the non-synced workspace
# (Default wiki may have created tidgi.config.json, but the non-synced workspace must not modify it)

View file

@ -10,14 +10,6 @@ Feature: Workspace Grouping
And I wait for the page to load completely
And the browser view should be loaded and visible
Scenario: Create a group by dragging one ungrouped workspace onto another
When I create a new wiki workspace with name "Group Drag Alpha"
And I create a new wiki workspace with name "Group Drag Beta"
And I drag workspace "Group Drag Alpha" onto workspace "Group Drag Beta"
Then workspaces "Group Drag Alpha" and "Group Drag Beta" should share a group
And the group containing workspace "Group Drag Alpha" should contain 2 workspaces
And there should be 1 workspace groups
Scenario: Dragging a workspace onto its own group header removes it from the group
When I create a new wiki workspace with name "Ungroup Drag Beta"
And I create a new wiki workspace with name "Ungroup Drag Gamma"
@ -27,20 +19,6 @@ Feature: Workspace Grouping
When I drag workspace "Ungroup Drag Beta" onto the header of its current group
Then workspace "Ungroup Drag Beta" should be ungrouped
And workspace "Ungroup Drag Gamma" should be in a group
And the group containing workspace "Ungroup Drag Gamma" should contain 1 workspaces
And there should be 1 workspace groups
Scenario: Removing one workspace without auto-disband keeps a two-item group alive
When I create a new wiki workspace with name "Context Path Beta"
And I create a new wiki workspace with name "Context Path Gamma"
Given workspace group "Context Path Group" contains workspaces:
| Context Path Beta |
| Context Path Gamma |
When I remove workspace "Context Path Beta" from its group without auto-disband
Then workspace "Context Path Beta" should be ungrouped
And workspace "Context Path Gamma" should be in a group
And the group containing workspace "Context Path Gamma" should contain 1 workspaces
And there should be 1 workspace groups
Scenario: Removing the last workspace deletes the empty group
When I create a new wiki workspace with name "Last Workspace Gamma"
@ -50,116 +28,56 @@ Feature: Workspace Grouping
Then workspace "Last Workspace Gamma" should be ungrouped
And there should be 0 workspace groups
Scenario: Dragging to top zone reorders before without grouping
Scenario: Dragging across top, bottom, and center zones covers grouped and ungrouped targets
When I create a new wiki workspace with name "Zone Test Alpha"
And I create a new wiki workspace with name "Zone Test Beta"
And I create a new wiki workspace with name "Zone Test Gamma"
And I create a new wiki workspace with name "Zone Test Delta"
When I drag workspace "Zone Test Gamma" to the top zone of workspace "Zone Test Alpha"
Then workspace "Zone Test Gamma" should be ungrouped
And workspace "Zone Test Alpha" should be ungrouped
And workspace "Zone Test Gamma" should appear before workspace "Zone Test Alpha"
Scenario: Dragging to bottom zone reorders after without grouping
When I create a new wiki workspace with name "Zone Bottom Alpha"
And I create a new wiki workspace with name "Zone Bottom Beta"
And I create a new wiki workspace with name "Zone Bottom Gamma"
When I drag workspace "Zone Bottom Alpha" to the bottom zone of workspace "Zone Bottom Gamma"
Then workspace "Zone Bottom Alpha" should be ungrouped
And workspace "Zone Bottom Gamma" should be ungrouped
And workspace "Zone Bottom Alpha" should appear after workspace "Zone Bottom Gamma"
Scenario: Dragging to center zone creates a group
When I create a new wiki workspace with name "Zone Center Alpha"
And I create a new wiki workspace with name "Zone Center Beta"
When I drag workspace "Zone Center Alpha" onto workspace "Zone Center Beta"
Then workspaces "Zone Center Alpha" and "Zone Center Beta" should share a group
And the group containing workspace "Zone Center Alpha" should contain 2 workspaces
When I drag workspace "Zone Test Gamma" to the bottom zone of workspace "Zone Test Beta"
Then workspace "Zone Test Gamma" should appear after workspace "Zone Test Beta"
When I drag workspace "Zone Test Alpha" onto workspace "Zone Test Beta"
Then workspaces "Zone Test Alpha" and "Zone Test Beta" should share a group
When I drag workspace "Zone Test Delta" to the top zone of workspace "Zone Test Alpha"
Then workspace "Zone Test Delta" should appear before workspace "Zone Test Alpha"
And workspaces "Zone Test Alpha" and "Zone Test Beta" should share a group
Scenario: Canceling a drag with Escape key leaves workspaces unchanged
When I create a new wiki workspace with name "Cancel Drag Alpha"
And I create a new wiki workspace with name "Cancel Drag Beta"
And I hover workspace "Cancel Drag Alpha" over workspace "Cancel Drag Beta"
And I press the Escape key
And I press "Escape" key
Then workspace "Cancel Drag Alpha" should be ungrouped
And workspace "Cancel Drag Beta" should be ungrouped
Scenario: Dragging a workspace from a collapsed group
When I create a new wiki workspace with name "Collapsed Group Alpha"
And I create a new wiki workspace with name "Collapsed Group Beta"
And I create a new wiki workspace with name "Collapsed Group Gamma"
Given workspace group "Collapsed Test Group" contains workspaces:
| Collapsed Group Alpha |
| Collapsed Group Beta |
When I collapse workspace group "Collapsed Test Group"
And I expand workspace group "Collapsed Test Group"
And I drag workspace "Collapsed Group Alpha" onto workspace "Collapsed Group Gamma"
Then workspaces "Collapsed Group Alpha" and "Collapsed Group Gamma" should share a group
And workspace "Collapsed Group Beta" should be in a group
Scenario: Dragging workspace between different groups
Scenario: Dragging workspace between different groups after collapsing and re-expanding the source group
When I create a new wiki workspace with name "Cross Group Alpha"
And I create a new wiki workspace with name "Cross Group Beta"
And I create a new wiki workspace with name "Cross Group Gamma"
And I create a new wiki workspace with name "Cross Group Delta"
Given workspace group "Cross Group A" contains workspaces:
| Cross Group Alpha |
| Cross Group Beta |
Given workspace group "Cross Group B" contains workspaces:
| Cross Group Gamma |
| Cross Group Delta |
When I drag workspace "Cross Group Alpha" onto workspace "Cross Group Gamma"
When I collapse workspace group "Cross Group A"
And I expand workspace group "Cross Group A"
And I drag workspace "Cross Group Alpha" onto workspace "Cross Group Gamma"
Then workspaces "Cross Group Alpha" and "Cross Group Gamma" should share a group
And workspace "Cross Group Beta" should be in a group
And the group containing workspace "Cross Group Beta" should contain 1 workspaces
And the group containing workspace "Cross Group Gamma" should contain 3 workspaces
Scenario: Reordering workspaces within the same group
When I create a new wiki workspace with name "Same Group Alpha"
And I create a new wiki workspace with name "Same Group Beta"
And I create a new wiki workspace with name "Same Group Gamma"
Given workspace group "Same Group Test" contains workspaces:
| Same Group Alpha |
| Same Group Beta |
| Same Group Gamma |
When I drag workspace "Same Group Gamma" to the top zone of workspace "Same Group Alpha"
Then workspace "Same Group Gamma" should appear before workspace "Same Group Alpha"
And workspace "Same Group Alpha" should appear before workspace "Same Group Beta"
And workspaces "Same Group Alpha" and "Same Group Gamma" should share a group
Scenario: Reordering group headers
Scenario: Reordering group headers and positioning before ungrouped workspaces
When I create a new wiki workspace with name "Group Order Alpha"
And I create a new wiki workspace with name "Group Order Beta"
And I create a new wiki workspace with name "Group Order Gamma"
And I create a new wiki workspace with name "Group Order Delta"
Given workspace group "Group Order A" contains workspaces:
| Group Order Alpha |
| Group Order Beta |
Given workspace group "Group Order B" contains workspaces:
| Group Order Gamma |
| Group Order Delta |
| Group Order Beta |
When I drag group header "Group Order B" onto group header "Group Order A"
Then group "Group Order B" should appear before group "Group Order A"
Scenario: Reordering group header before an ungrouped workspace
When I create a new wiki workspace with name "Mixed Order Alpha"
And I create a new wiki workspace with name "Mixed Order Beta"
And I create a new wiki workspace with name "Mixed Order Gamma"
Given workspace group "Mixed Order Group" contains workspaces:
| Mixed Order Gamma |
When I drag group header "Mixed Order Group" onto workspace "Mixed Order Alpha"
Then group "Mixed Order Group" should appear before workspace "Mixed Order Alpha"
Scenario: Dragging ungrouped workspace to zone of grouped workspace
When I create a new wiki workspace with name "Zone Grouped Alpha"
And I create a new wiki workspace with name "Zone Grouped Beta"
And I create a new wiki workspace with name "Zone Grouped Gamma"
Given workspace group "Zone Grouped Test" contains workspaces:
| Zone Grouped Alpha |
| Zone Grouped Beta |
When I drag workspace "Zone Grouped Gamma" to the top zone of workspace "Zone Grouped Alpha"
Then workspace "Zone Grouped Gamma" should be ungrouped
And workspace "Zone Grouped Gamma" should appear before workspace "Zone Grouped Alpha"
And workspaces "Zone Grouped Alpha" and "Zone Grouped Beta" should share a group
When I drag group header "Group Order A" onto workspace "Group Order Gamma"
Then group "Group Order A" should appear before workspace "Group Order Gamma"
Scenario: Hovering a workspace over another shows combine intent on the target
When I create a new wiki workspace with name "Hover Highlight Alpha"
@ -167,9 +85,3 @@ Feature: Workspace Grouping
And I hover workspace "Hover Highlight Alpha" over workspace "Hover Highlight Beta"
Then workspace "Hover Highlight Beta" should show "group" drag intent
And I release the mouse
Scenario: Preferences search finds workspace group management
When I click on a "settings button" element with selector "#open-preferences-button"
And I switch to "preferences" window
And I type "workspace group" in "search input" element with selector "[data-testid='preferences-search-input'] input"
Then I should see a "workspace group management" element with selector "[data-testid='create-group-button']"