test(e2e): harden workspace collaboration coverage #17069
ci.yml
on: pull_request
Resolve runner profiles
13s
Matrix: playwright_critical
Matrix: playwright_visual
Matrix: ui_p0
Preflight
3m 43s
Workspace unit tests
1m 7s
Windows tools-pack payload tests
0s
Web workspace tests
0s
E2E Vitest
6m 17s
Runtime summary
4s
Annotations
18 errors, 4 warnings, and 7 notices
|
E2E Vitest
Process completed with exit code 1.
|
|
tests/collab/workspace-switch-and-billing.test.ts > workspace switching and scoped billing > clears a stale team pin and recovers to the personal workspace after membership removal:
e2e/lib/vitest/http.ts#L18
Error: HTTP 400 /api/workspace/active: {"error":"missing_workspace_member_id"}
β― requestJson lib/vitest/http.ts:18:11
β― tests/collab/workspace-switch-and-billing.test.ts:242:11
β― runToolsDevSuite lib/vitest/suite.ts:276:5
β― tests/collab/workspace-switch-and-billing.test.ts:237:7
|
|
tests/collab/workspace-switch-and-billing.test.ts > workspace switching and scoped billing > switches the local workspace and never authorizes personal or foreign billing scopes:
e2e/lib/vitest/http.ts#L18
Error: HTTP 400 /api/workspace/active: {"error":"missing_workspace_member_id"}
β― requestJson lib/vitest/http.ts:18:11
β― tests/collab/workspace-switch-and-billing.test.ts:148:28
β― runToolsDevSuite lib/vitest/suite.ts:276:5
β― tests/collab/workspace-switch-and-billing.test.ts:139:7
|
|
tests/collab/workspace-skill-resource-isolation.test.ts > workspace-scoped skill resources > [P0] import, mutation, team share, and unshare stay inside the owning workspace:
e2e/tests/collab/workspace-skill-resource-isolation.test.ts#L244
AssertionError: expected 404 to be 403 // Object.is equality
- Expected
+ Received
- 403
+ 404
β― tests/collab/workspace-skill-resource-isolation.test.ts:244:13
β― runToolsDevSuite lib/vitest/suite.ts:276:5
β― tests/collab/workspace-skill-resource-isolation.test.ts:193:7
|
|
tests/collab/workspace-invite-flow.test.ts > workspace invite create and acceptance handoff > creates invites with workspace scope, preserves partial outcomes, and consumes the accepted continuation:
e2e/lib/vitest/http.ts#L18
Error: HTTP 403 /api/workspace/context: {"error":"WORKSPACE_ACCESS_DENIED","message":"the requested workspace is not available to this member"}
β― requestJson lib/vitest/http.ts:18:11
β― tests/collab/workspace-invite-flow.test.ts:219:38
β― runToolsDevSuite lib/vitest/suite.ts:276:5
β― tests/collab/workspace-invite-flow.test.ts:202:11
β― runToolsDevSuite lib/vitest/suite.ts:276:5
β― tests/collab/workspace-invite-flow.test.ts:152:7
|
|
UI P0 (project-workspace)
Process completed with exit code 1.
|
|
[chromium] βΊ ui/workspace-multi-client-collab.test.ts:36:1 βΊ [P0] two isolated clients converge live content:
e2e/ui/workspace-multi-client-collab.test.ts#L557
1) [chromium] βΊ ui/workspace-multi-client-collab.test.ts:36:1 βΊ [P0] two isolated clients converge live content, presence, and owner unshare
Retry #1 βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Error: {"error":"missing_workspace_member_id"}
expect(received).toBeTruthy()
Received: false
555 | timeout: 15_000,
556 | });
> 557 | expect(response.ok(), await response.text()).toBeTruthy();
| ^
558 | await page.reload({ waitUntil: 'domcontentloaded' });
559 | await expect(page.getByText('Loading Open Designβ¦')).toHaveCount(0, {
560 | timeout: 60_000,
at openHomeAndPinWorkspace (/home/runner/work/open-design/open-design/e2e/ui/workspace-multi-client-collab.test.ts:557:48)
at /home/runner/work/open-design/open-design/e2e/ui/workspace-multi-client-collab.test.ts:72:5
|
|
[chromium] βΊ ui/workspace-multi-client-collab.test.ts:36:1 βΊ [P0] two isolated clients converge live content:
e2e/ui/workspace-multi-client-collab.test.ts#L557
1) [chromium] βΊ ui/workspace-multi-client-collab.test.ts:36:1 βΊ [P0] two isolated clients converge live content, presence, and owner unshare
Error: {"error":"missing_workspace_member_id"}
expect(received).toBeTruthy()
Received: false
555 | timeout: 15_000,
556 | });
> 557 | expect(response.ok(), await response.text()).toBeTruthy();
| ^
558 | await page.reload({ waitUntil: 'domcontentloaded' });
559 | await expect(page.getByText('Loading Open Designβ¦')).toHaveCount(0, {
560 | timeout: 60_000,
at openHomeAndPinWorkspace (/home/runner/work/open-design/open-design/e2e/ui/workspace-multi-client-collab.test.ts:557:48)
at /home/runner/work/open-design/open-design/e2e/ui/workspace-multi-client-collab.test.ts:72:5
|
|
UI P0 (entry-settings)
Process completed with exit code 1.
|
|
[chromium] βΊ ui/workspace-team-interactions.test.ts:939:1 βΊ [P0] inbound shared-project transfer shows syncing instead of a false empty project:
e2e/ui/workspace-team-interactions.test.ts#L1021
3) [chromium] βΊ ui/workspace-team-interactions.test.ts:939:1 βΊ [P0] inbound shared-project transfer shows syncing instead of a false empty project
Retry #1 βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Error: expect(locator).toBeVisible() failed
Locator: getByTestId('design-files-syncing')
Expected: visible
Timeout: 10000ms
Error: element(s) not found
Call log:
- Expect "toBeVisible" with timeout 10000ms
- waiting for getByTestId('design-files-syncing')
1019 | await expect(page.getByTestId('file-workspace')).toBeVisible({ timeout: T.long });
1020 | await page.getByTestId('design-files-tab').click();
> 1021 | await expect(page.getByTestId('design-files-syncing')).toBeVisible();
| ^
1022 | await expect(page.getByTestId('design-files-empty')).toHaveCount(0);
1023 | await expect(page.getByText('New sketch', { exact: true })).toHaveCount(0);
1024 | await expect.poll(() => pullAttempts).toBeGreaterThan(0);
at /home/runner/work/open-design/open-design/e2e/ui/workspace-team-interactions.test.ts:1021:58
|
|
[chromium] βΊ ui/workspace-team-interactions.test.ts:939:1 βΊ [P0] inbound shared-project transfer shows syncing instead of a false empty project:
e2e/ui/workspace-team-interactions.test.ts#L1021
3) [chromium] βΊ ui/workspace-team-interactions.test.ts:939:1 βΊ [P0] inbound shared-project transfer shows syncing instead of a false empty project
Error: expect(locator).toBeVisible() failed
Locator: getByTestId('design-files-syncing')
Expected: visible
Timeout: 10000ms
Error: element(s) not found
Call log:
- Expect "toBeVisible" with timeout 10000ms
- waiting for getByTestId('design-files-syncing')
1019 | await expect(page.getByTestId('file-workspace')).toBeVisible({ timeout: T.long });
1020 | await page.getByTestId('design-files-tab').click();
> 1021 | await expect(page.getByTestId('design-files-syncing')).toBeVisible();
| ^
1022 | await expect(page.getByTestId('design-files-empty')).toHaveCount(0);
1023 | await expect(page.getByText('New sketch', { exact: true })).toHaveCount(0);
1024 | await expect.poll(() => pullAttempts).toBeGreaterThan(0);
at /home/runner/work/open-design/open-design/e2e/ui/workspace-team-interactions.test.ts:1021:58
|
|
[chromium] βΊ ui/workspace-team-interactions.test.ts:615:1 βΊ [P0] an already-open move flow fails closed when the workspace locks before commit:
e2e/ui/workspace-team-interactions.test.ts#L655
2) [chromium] βΊ ui/workspace-team-interactions.test.ts:615:1 βΊ [P0] an already-open move flow fails closed when the workspace locks before commit
Retry #1 βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Error: locator.click: Test timeout of 120000ms exceeded.
Call log:
- waiting for locator('.recent-projects__card[data-project-id="ui-team-draft"]:visible').getByRole('button', { name: 'More actions' })
653 | });
654 | await expect(page.getByTestId('workspace-switcher')).toContainText('Locked Atlas Team');
> 655 | await card.getByRole('button', { name: 'More actions' }).click();
| ^
656 | await expect(card.getByRole('menu')).toHaveCount(0);
657 | });
658 |
at /home/runner/work/open-design/open-design/e2e/ui/workspace-team-interactions.test.ts:655:60
|
|
[chromium] βΊ ui/workspace-team-interactions.test.ts:615:1 βΊ [P0] an already-open move flow fails closed when the workspace locks before commit:
e2e/ui/workspace-team-interactions.test.ts#L0
2) [chromium] βΊ ui/workspace-team-interactions.test.ts:615:1 βΊ [P0] an already-open move flow fails closed when the workspace locks before commit
Retry #1 βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Test timeout of 120000ms exceeded.
|
|
[chromium] βΊ ui/workspace-team-interactions.test.ts:615:1 βΊ [P0] an already-open move flow fails closed when the workspace locks before commit:
e2e/ui/workspace-team-interactions.test.ts#L655
2) [chromium] βΊ ui/workspace-team-interactions.test.ts:615:1 βΊ [P0] an already-open move flow fails closed when the workspace locks before commit
Error: locator.click: Test timeout of 120000ms exceeded.
Call log:
- waiting for locator('.recent-projects__card[data-project-id="ui-team-draft"]:visible').getByRole('button', { name: 'More actions' })
653 | });
654 | await expect(page.getByTestId('workspace-switcher')).toContainText('Locked Atlas Team');
> 655 | await card.getByRole('button', { name: 'More actions' }).click();
| ^
656 | await expect(card.getByRole('menu')).toHaveCount(0);
657 | });
658 |
at /home/runner/work/open-design/open-design/e2e/ui/workspace-team-interactions.test.ts:655:60
|
|
[chromium] βΊ ui/workspace-team-interactions.test.ts:615:1 βΊ [P0] an already-open move flow fails closed when the workspace locks before commit:
e2e/ui/workspace-team-interactions.test.ts#L0
2) [chromium] βΊ ui/workspace-team-interactions.test.ts:615:1 βΊ [P0] an already-open move flow fails closed when the workspace locks before commit
Test timeout of 120000ms exceeded.
|
|
[chromium] βΊ ui/workspace-team-interactions.test.ts:148:1 βΊ [P0] workspace switcher changes identity:
e2e/ui/workspace-team-interactions.test.ts#L170
1) [chromium] βΊ ui/workspace-team-interactions.test.ts:148:1 βΊ [P0] workspace switcher changes identity, returns Home, and exposes team navigation
Retry #1 βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Error: expect(received).toEqual(expected) // deep equality
- Expected - 0
+ Received + 1
Array [
Object {
"workspaceId": "ui-ws-team",
+ "workspaceMemberId": "ui-wm-owner",
},
]
Call Log:
- Timeout 10000ms exceeded while waiting on the predicate
168 | await menu.getByRole('menuitem', { name: 'Atlas Team' }).click();
169 |
> 170 | await expect.poll(() => mocks.activeBodies).toEqual([
| ^
171 | { workspaceId: TEAM_OWNER.workspaceId },
172 | ]);
173 | await expect(page.getByTestId('workspace-switcher')).toContainText('Atlas Team');
at /home/runner/work/open-design/open-design/e2e/ui/workspace-team-interactions.test.ts:170:47
|
|
[chromium] βΊ ui/workspace-team-interactions.test.ts:148:1 βΊ [P0] workspace switcher changes identity:
e2e/ui/workspace-team-interactions.test.ts#L170
1) [chromium] βΊ ui/workspace-team-interactions.test.ts:148:1 βΊ [P0] workspace switcher changes identity, returns Home, and exposes team navigation
Error: expect(received).toEqual(expected) // deep equality
- Expected - 0
+ Received + 1
Array [
Object {
"workspaceId": "ui-ws-team",
+ "workspaceMemberId": "ui-wm-owner",
},
]
Call Log:
- Timeout 10000ms exceeded while waiting on the predicate
168 | await menu.getByRole('menuitem', { name: 'Atlas Team' }).click();
169 |
> 170 | await expect.poll(() => mocks.activeBodies).toEqual([
| ^
171 | { workspaceId: TEAM_OWNER.workspaceId },
172 | ]);
173 | await expect(page.getByTestId('workspace-switcher')).toContainText('Atlas Team');
at /home/runner/work/open-design/open-design/e2e/ui/workspace-team-interactions.test.ts:170:47
|
|
Validate workspace
Process completed with exit code 1.
|
|
Detect validation scopes
Node.js 20 is deprecated. The following actions target Node.js 20 but are being forced to run on Node.js 24: actions/upload-artifact@v4. For more information see: https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/
|
|
E2E Vitest
merge_group changed-file resolution failed; falling back to the full plan: Error: merge_group compare result reached GitHub's 300-file ceiling
|
|
E2E Vitest
merge_group changed-file resolution failed; falling back to the full plan: Error: Command failed: /opt/hostedtoolcache/node/24.18.0/x64/bin/node /tmp/scopes-test-ecPOJC/gh-stub.mjs api repos/nexu-io/open-design/compare/1111111111111111111111111111111111111111...2222222222222222222222222222222222222222
|
|
Slow Test:
e2e/[chromium] βΊ ui/amr-onboarding.test.ts#L0
e2e/[chromium] βΊ ui/amr-onboarding.test.ts took 5.4m
|
|
π Playwright Run Summary
3 skipped
17 passed (3.2m)
|
|
π Playwright Run Summary
18 passed (4.5m)
|
|
π Playwright Run Summary
4 passed (1.5m)
|
|
π Playwright Run Summary
22 passed (4.1m)
|
|
π Playwright Run Summary
29 passed (7.5m)
|
|
π Playwright Run Summary
1 failed
[chromium] βΊ ui/workspace-multi-client-collab.test.ts:36:1 βΊ [P0] two isolated clients converge live content, presence, and owner unshare
36 passed (10.3m)
|
|
π Playwright Run Summary
3 failed
[chromium] βΊ ui/workspace-team-interactions.test.ts:148:1 βΊ [P0] workspace switcher changes identity, returns Home, and exposes team navigation
[chromium] βΊ ui/workspace-team-interactions.test.ts:615:1 βΊ [P0] an already-open move flow fails closed when the workspace locks before commit
[chromium] βΊ ui/workspace-team-interactions.test.ts:939:1 βΊ [P0] inbound shared-project transfer shows syncing instead of a false empty project
1 skipped
67 passed (20.6m)
|
Artifacts
Produced during runtime
| Name | Size | Digest | |
|---|---|---|---|
|
handoff-report-visual-pr
|
438 Bytes |
sha256:1426358fcb2129e1da1e93070a2c2542e0768c8d890533c337cbe0d1c802b60d
|
|
|
ui-p0-ci-30744499723-entry-settings
|
62 MB |
sha256:0888793b810362084d798f41f067b45c79a15cb5d7c7c4a8ae85af96eb888a1c
|
|
|
ui-p0-ci-30744499723-project-runtime
|
268 KB |
sha256:98f1fc203c0e5bf588e49d558f16b76cb85a8691bf2b6e87d6ecfc12906d0260
|
|
|
ui-p0-ci-30744499723-project-runtime-domain
|
322 KB |
sha256:5b488c0b8576272b496d439482ca0f10dbf4faa0a6c3d8121621a926c2691587
|
|
|
ui-p0-ci-30744499723-project-workspace
|
10.9 MB |
sha256:15d8891444d81c8b434fd6207a2055276c13102b411b12b1a8b890e88d2be040
|
|
|
ui-p0-ci-30744499723-workspace-restoration
|
363 KB |
sha256:2cb210b707019fd3ef3ed03bf421297b7f8be2830fbabe5b55935736bbde7308
|
|
|
visual-pr-capture-6312-30744499723-entry-navigation
|
5.48 MB |
sha256:b4c2c2b3b69d3dde917f0d3f370b3136ac0013320023f181fe080a0974dd5f8d
|
|
|
visual-pr-capture-6312-30744499723-settings-workspace
|
3.16 MB |
sha256:a18f338a3d64c2720e15c452b6778216205a5b12b4ffa9e1298ee163f30088ca
|
|