From e049dfff4ea3c6028d1adbd84d521cb4a62fec01 Mon Sep 17 00:00:00 2001 From: Matthew Valancy Date: Thu, 18 Jun 2026 15:36:15 -0700 Subject: [PATCH] TEST-UNIFY-3: reorganize specs into domain folders + rewrite playwright config (Phase 3) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Clean tree: tests/e2e/{smoke,auth,graph,ui,a11y,mobile,responsive,api,admin,reports}/, tests/diagnostics/{layout,interactions,hierarchy,inspector,physics,perf,ui}/, and infra specs to tests/integration/. Specs renamed for clarity (login-focus→auth/ passwordless-focus, copy-id→graph/node-inspector-copyid, visual-vlm→reports/ vlm-evaluation, etc.). Config + refs: - playwright.config.ts: default project testIgnore → '**/reports/**' (capture-heavy report specs run in their own projects; integration/ is outside testDir); vlm testMatch → vlm-evaluation.spec.ts. showcase/matrix/matrix-setup testMatch match by filename (unchanged). - repointed test:smoke + test:e2e:visual, the unified sequence manifest, and CI ci.yml living-graph path to the new locations. Caught + fixed the plan's #1 risk: moving specs into subfolders changed their depth, so the Phase-2 '../lib/' imports broke (depth-2 specs need '../../lib/') — the verification showed 0 tests / collection errors; fixed 37 files; re-verified. Verified: per-project playwright --list all 0 collection errors (default 117, perf 3, geometry 18, showcase 5, vlm 1, matrix 109, matrix-setup 1); reports specs excluded from the default project; THE GATE 5/5; unified smoke profile 212✓. Co-Authored-By: Claude Opus 4.8 (1M context) --- .github/workflows/ci.yml | 2 +- package.json | 4 ++-- playwright.config.ts | 8 ++++---- .../diagnostics/{ => hierarchy}/explorer-tree.spec.ts | 2 +- .../navigation.spec.ts} | 2 +- .../diagnostics/{ => inspector}/node-inspector.spec.ts | 2 +- .../core-matrix.spec.ts} | 2 +- .../relationship-audit.spec.ts} | 4 ++-- .../geometry.spec.ts} | 4 ++-- tests/diagnostics/{ => layout}/graph-balance.spec.ts | 2 +- .../diagnostics/{ => perf}/large-graph-profile.spec.ts | 2 +- .../{physics-settle.spec.ts => physics/settle.spec.ts} | 2 +- tests/diagnostics/{ => ui}/captcha-layout.spec.ts | 0 .../legibility-floor.spec.ts} | 2 +- tests/diagnostics/{ => ui}/minimap-zoom.spec.ts | 2 +- .../tls-banner.spec.ts} | 2 +- .../{a11y-focus.spec.ts => a11y/modal-focus.spec.ts} | 2 +- .../database-tab.spec.ts} | 2 +- tests/e2e/{ => admin}/oauth-provider-config.spec.ts | 2 +- tests/e2e/{api-health.spec.ts => api/health.spec.ts} | 2 +- tests/e2e/{ => auth}/form-validation.spec.ts | 2 +- .../passwordless-focus.spec.ts} | 2 +- .../responsive-layout.spec.ts} | 2 +- tests/e2e/{ => graph}/camera.spec.ts | 2 +- .../living-graph-effects.spec.ts} | 2 +- .../node-inspector-copyid.spec.ts} | 2 +- tests/e2e/{ => graph}/node-quick-edit.spec.ts | 2 +- tests/e2e/{ => graph}/relationship-flip.spec.ts | 2 +- .../accessibility-audit.spec.ts} | 4 ++-- .../dialog-positioning.spec.ts} | 4 ++-- .../experience.spec.ts} | 2 +- .../view-navigation.spec.ts} | 2 +- tests/e2e/{ => reports}/VISUAL_REGRESSION_README.md | 0 tests/e2e/{ => reports}/feature-matrix.spec.ts | 4 ++-- tests/e2e/{ => reports}/matrix.setup.ts | 2 +- tests/e2e/{ => reports}/showcase.spec.ts | 2 +- .../visual-regression.spec.ts} | 0 .../vlm-evaluation.spec.ts} | 10 +++++----- .../viewports.spec.ts} | 2 +- tests/e2e/{ => smoke}/basic-workflow.spec.ts | 2 +- tests/e2e/{ => smoke}/user-smoke.spec.ts | 2 +- tests/e2e/{ => ui}/overlay-dismissal.spec.ts | 2 +- tests/e2e/{ => ui}/z-order.spec.ts | 6 +++--- .../installation-validation.spec.ts | 0 tests/{e2e => integration}/tls-integration.spec.ts | 0 tests/sequences/unified.config.mjs | 6 +++--- 46 files changed, 58 insertions(+), 58 deletions(-) rename tests/diagnostics/{ => hierarchy}/explorer-tree.spec.ts (96%) rename tests/diagnostics/{hierarchy-navigation.spec.ts => hierarchy/navigation.spec.ts} (98%) rename tests/diagnostics/{ => inspector}/node-inspector.spec.ts (98%) rename tests/diagnostics/{core-interactions.spec.ts => interactions/core-matrix.spec.ts} (99%) rename tests/diagnostics/{interaction-audit.spec.ts => interactions/relationship-audit.spec.ts} (98%) rename tests/diagnostics/{graph-geometry.spec.ts => layout/geometry.spec.ts} (99%) rename tests/diagnostics/{ => layout}/graph-balance.spec.ts (98%) rename tests/diagnostics/{ => perf}/large-graph-profile.spec.ts (99%) rename tests/diagnostics/{physics-settle.spec.ts => physics/settle.spec.ts} (98%) rename tests/diagnostics/{ => ui}/captcha-layout.spec.ts (100%) rename tests/diagnostics/{node-expand-legibility.spec.ts => ui/legibility-floor.spec.ts} (99%) rename tests/diagnostics/{ => ui}/minimap-zoom.spec.ts (97%) rename tests/diagnostics/{insecure-connection-banner.spec.ts => ui/tls-banner.spec.ts} (98%) rename tests/e2e/{a11y-focus.spec.ts => a11y/modal-focus.spec.ts} (98%) rename tests/e2e/{admin-database-tab.spec.ts => admin/database-tab.spec.ts} (98%) rename tests/e2e/{ => admin}/oauth-provider-config.spec.ts (98%) rename tests/e2e/{api-health.spec.ts => api/health.spec.ts} (97%) rename tests/e2e/{ => auth}/form-validation.spec.ts (99%) rename tests/e2e/{login-focus.spec.ts => auth/passwordless-focus.spec.ts} (97%) rename tests/e2e/{signup-fit.spec.ts => auth/responsive-layout.spec.ts} (98%) rename tests/e2e/{ => graph}/camera.spec.ts (99%) rename tests/e2e/{living-graph.spec.ts => graph/living-graph-effects.spec.ts} (99%) rename tests/e2e/{copy-id.spec.ts => graph/node-inspector-copyid.spec.ts} (95%) rename tests/e2e/{ => graph}/node-quick-edit.spec.ts (98%) rename tests/e2e/{ => graph}/relationship-flip.spec.ts (99%) rename tests/e2e/{mobile-audit.spec.ts => mobile/accessibility-audit.spec.ts} (95%) rename tests/e2e/{mobile-dialogs.spec.ts => mobile/dialog-positioning.spec.ts} (94%) rename tests/e2e/{mobile-experience.spec.ts => mobile/experience.spec.ts} (98%) rename tests/e2e/{mobile-views.spec.ts => mobile/view-navigation.spec.ts} (98%) rename tests/e2e/{ => reports}/VISUAL_REGRESSION_README.md (100%) rename tests/e2e/{ => reports}/feature-matrix.spec.ts (98%) rename tests/e2e/{ => reports}/matrix.setup.ts (90%) rename tests/e2e/{ => reports}/showcase.spec.ts (99%) rename tests/e2e/{visual-regression-suite.spec.ts => reports/visual-regression.spec.ts} (100%) rename tests/e2e/{visual-vlm.spec.ts => reports/vlm-evaluation.spec.ts} (96%) rename tests/e2e/{responsive.spec.ts => responsive/viewports.spec.ts} (97%) rename tests/e2e/{ => smoke}/basic-workflow.spec.ts (99%) rename tests/e2e/{ => smoke}/user-smoke.spec.ts (99%) rename tests/e2e/{ => ui}/overlay-dismissal.spec.ts (99%) rename tests/e2e/{ => ui}/z-order.spec.ts (98%) rename tests/{e2e => integration}/installation-validation.spec.ts (100%) rename tests/{e2e => integration}/tls-integration.spec.ts (100%) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 7ae18c80..8d79392c 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -189,7 +189,7 @@ jobs: TEST_URL: http://localhost:3127 CI: true - name: Living-graph effects render (LIVE-*) - run: npx playwright test tests/e2e/living-graph.spec.ts --project="GraphDone-Core/dev-neo4j/chromium" --reporter=line + run: npx playwright test tests/e2e/graph/living-graph-effects.spec.ts --project="GraphDone-Core/dev-neo4j/chromium" --reporter=line env: TEST_URL: http://localhost:3127 CI: true diff --git a/package.json b/package.json index d070c4bb..ac8fbda0 100644 --- a/package.json +++ b/package.json @@ -17,7 +17,7 @@ "test:coverage": "turbo run test:coverage", "test:e2e": "playwright test", "test:e2e:core": "playwright test --grep=\"@core\"", - "test:e2e:visual": "playwright test tests/e2e/visual-regression-suite.spec.ts", + "test:e2e:visual": "playwright test tests/e2e/reports/visual-regression.spec.ts", "test:e2e:ui": "playwright test --ui", "test:e2e:debug": "playwright test --debug", "test:all": "npm run test:unit && npm run test:e2e", @@ -37,7 +37,7 @@ "db:seed": "cd packages/server && npm run db:seed", "docker:dev": "docker compose -f deployment/docker-compose.dev.yml up", "docker:prod": "docker compose -f deployment/docker-compose.yml up", - "test:smoke": "playwright test tests/e2e/user-smoke.spec.ts --reporter=line", + "test:smoke": "playwright test tests/e2e/smoke/user-smoke.spec.ts --reporter=line", "test:mobile": "playwright test --grep \"@mobile|@audit\" --project=\"GraphDone-Core/dev-neo4j/chromium\" --reporter=line", "report:showcase": "playwright test --project=showcase && node tests/generate-showcase-report.mjs", "report:matrix": "playwright test --project=matrix --reporter=line,html && node tests/generate-matrix-report.mjs", diff --git a/playwright.config.ts b/playwright.config.ts index 236434ce..7ace5769 100644 --- a/playwright.config.ts +++ b/playwright.config.ts @@ -38,10 +38,10 @@ export default defineConfig({ projects: [ { name: 'GraphDone-Core/dev-neo4j/chromium', - // The showcase tour and the local-VLM visual eval run in their own - // capture-heavy projects below; keep them out of the default (fast) + // Capture-heavy, report-only specs live under tests/e2e/reports/ and run in + // their own projects below; keep that whole folder out of the default (fast) // project so the smoke gate stays quick. - testIgnore: [/showcase\.spec\.ts/, /visual-vlm\.spec\.ts/, /feature-matrix\.spec\.ts/, /matrix\.setup\.ts/], + testIgnore: '**/reports/**', use: { ...devices['Desktop Chrome'] }, }, @@ -103,7 +103,7 @@ export default defineConfig({ { name: 'vlm', testDir: './tests/e2e', - testMatch: /visual-vlm\.spec\.ts/, + testMatch: /vlm-evaluation\.spec\.ts/, use: { ...devices['Desktop Chrome'], screenshot: 'on' }, }, diff --git a/tests/diagnostics/explorer-tree.spec.ts b/tests/diagnostics/hierarchy/explorer-tree.spec.ts similarity index 96% rename from tests/diagnostics/explorer-tree.spec.ts rename to tests/diagnostics/hierarchy/explorer-tree.spec.ts index afc4fee1..36dad1aa 100644 --- a/tests/diagnostics/explorer-tree.spec.ts +++ b/tests/diagnostics/hierarchy/explorer-tree.spec.ts @@ -1,5 +1,5 @@ import { test, expect } from '@playwright/test'; -import { login, TEST_USERS } from '../lib/auth'; +import { login, TEST_USERS } from '../../lib/auth'; /** * Project-explorer hierarchy: the graph selector expands a parent graph diff --git a/tests/diagnostics/hierarchy-navigation.spec.ts b/tests/diagnostics/hierarchy/navigation.spec.ts similarity index 98% rename from tests/diagnostics/hierarchy-navigation.spec.ts rename to tests/diagnostics/hierarchy/navigation.spec.ts index 986e7167..5b9902c2 100644 --- a/tests/diagnostics/hierarchy-navigation.spec.ts +++ b/tests/diagnostics/hierarchy/navigation.spec.ts @@ -1,7 +1,7 @@ import { test, expect, Page } from '@playwright/test'; import * as fs from 'fs'; import * as path from 'path'; -import { login, TEST_USERS } from '../lib/auth'; +import { login, TEST_USERS } from '../../lib/auth'; /** * Altium-style "graphs of graphs" navigation: from the System Overview, a diff --git a/tests/diagnostics/node-inspector.spec.ts b/tests/diagnostics/inspector/node-inspector.spec.ts similarity index 98% rename from tests/diagnostics/node-inspector.spec.ts rename to tests/diagnostics/inspector/node-inspector.spec.ts index 0e3b902f..415ac718 100644 --- a/tests/diagnostics/node-inspector.spec.ts +++ b/tests/diagnostics/inspector/node-inspector.spec.ts @@ -1,5 +1,5 @@ import { test, expect, Page } from '@playwright/test'; -import { login, TEST_USERS } from '../lib/auth'; +import { login, TEST_USERS } from '../../lib/auth'; /** * Docked inspector: selecting a node opens it; Contents renders its description diff --git a/tests/diagnostics/core-interactions.spec.ts b/tests/diagnostics/interactions/core-matrix.spec.ts similarity index 99% rename from tests/diagnostics/core-interactions.spec.ts rename to tests/diagnostics/interactions/core-matrix.spec.ts index 223a5d70..47de5a8a 100644 --- a/tests/diagnostics/core-interactions.spec.ts +++ b/tests/diagnostics/interactions/core-matrix.spec.ts @@ -1,5 +1,5 @@ import { test, expect, Page } from '@playwright/test'; -import { login, TEST_USERS } from '../lib/auth'; +import { login, TEST_USERS } from '../../lib/auth'; /** * CORE INTERACTION MATRIX — the "basic user checks" every build must pass. diff --git a/tests/diagnostics/interaction-audit.spec.ts b/tests/diagnostics/interactions/relationship-audit.spec.ts similarity index 98% rename from tests/diagnostics/interaction-audit.spec.ts rename to tests/diagnostics/interactions/relationship-audit.spec.ts index 8d061594..8708cd93 100644 --- a/tests/diagnostics/interaction-audit.spec.ts +++ b/tests/diagnostics/interactions/relationship-audit.spec.ts @@ -1,8 +1,8 @@ import { test, expect, Page } from '@playwright/test'; import * as fs from 'fs'; import * as path from 'path'; -import { login, TEST_USERS } from '../lib/auth'; -import { sweepTestData, TEST_GRAPH_PREFIX } from '../lib/dbHealing'; +import { login, TEST_USERS } from '../../lib/auth'; +import { sweepTestData, TEST_GRAPH_PREFIX } from '../../lib/dbHealing'; /** * Basic-interaction audit — walks the everyday graph interactions a user does diff --git a/tests/diagnostics/graph-geometry.spec.ts b/tests/diagnostics/layout/geometry.spec.ts similarity index 99% rename from tests/diagnostics/graph-geometry.spec.ts rename to tests/diagnostics/layout/geometry.spec.ts index f4f9af68..992fc554 100644 --- a/tests/diagnostics/graph-geometry.spec.ts +++ b/tests/diagnostics/layout/geometry.spec.ts @@ -1,8 +1,8 @@ import { test, expect, Page } from '@playwright/test'; import * as fs from 'fs'; import * as path from 'path'; -import { login, TEST_USERS } from '../lib/auth'; -import { sweepTestData, TEST_GRAPH_PREFIX } from '../lib/dbHealing'; +import { login, TEST_USERS } from '../../lib/auth'; +import { sweepTestData, TEST_GRAPH_PREFIX } from '../../lib/dbHealing'; /** * Graph-geometry diagnostic — measures node/edge/label geometry from the REAL diff --git a/tests/diagnostics/graph-balance.spec.ts b/tests/diagnostics/layout/graph-balance.spec.ts similarity index 98% rename from tests/diagnostics/graph-balance.spec.ts rename to tests/diagnostics/layout/graph-balance.spec.ts index 30d01532..880a2201 100644 --- a/tests/diagnostics/graph-balance.spec.ts +++ b/tests/diagnostics/layout/graph-balance.spec.ts @@ -1,5 +1,5 @@ import { test, expect } from '@playwright/test'; -import { login, TEST_USERS, getBaseURL } from '../lib/auth'; +import { login, TEST_USERS, getBaseURL } from '../../lib/auth'; import { execFileSync } from 'node:child_process'; import { mkdirSync } from 'node:fs'; import * as path from 'node:path'; diff --git a/tests/diagnostics/large-graph-profile.spec.ts b/tests/diagnostics/perf/large-graph-profile.spec.ts similarity index 99% rename from tests/diagnostics/large-graph-profile.spec.ts rename to tests/diagnostics/perf/large-graph-profile.spec.ts index fde3f8e4..5373548e 100644 --- a/tests/diagnostics/large-graph-profile.spec.ts +++ b/tests/diagnostics/perf/large-graph-profile.spec.ts @@ -1,7 +1,7 @@ import { test, expect, Page } from '@playwright/test'; import * as fs from 'fs'; import * as path from 'path'; -import { login, TEST_USERS } from '../lib/auth'; +import { login, TEST_USERS } from '../../lib/auth'; /** * BASELINE profiler for the Compute Core (1000-node) example graph the user diff --git a/tests/diagnostics/physics-settle.spec.ts b/tests/diagnostics/physics/settle.spec.ts similarity index 98% rename from tests/diagnostics/physics-settle.spec.ts rename to tests/diagnostics/physics/settle.spec.ts index b99f1356..6f76f2b2 100644 --- a/tests/diagnostics/physics-settle.spec.ts +++ b/tests/diagnostics/physics/settle.spec.ts @@ -1,7 +1,7 @@ import { test, expect, Page } from '@playwright/test'; import * as fs from 'fs'; import * as path from 'path'; -import { login, TEST_USERS } from '../lib/auth'; +import { login, TEST_USERS } from '../../lib/auth'; /** * Physics-lifecycle diagnostic — proves the one-shot model: a graph settles, diff --git a/tests/diagnostics/captcha-layout.spec.ts b/tests/diagnostics/ui/captcha-layout.spec.ts similarity index 100% rename from tests/diagnostics/captcha-layout.spec.ts rename to tests/diagnostics/ui/captcha-layout.spec.ts diff --git a/tests/diagnostics/node-expand-legibility.spec.ts b/tests/diagnostics/ui/legibility-floor.spec.ts similarity index 99% rename from tests/diagnostics/node-expand-legibility.spec.ts rename to tests/diagnostics/ui/legibility-floor.spec.ts index ed5d911a..dfdb4816 100644 --- a/tests/diagnostics/node-expand-legibility.spec.ts +++ b/tests/diagnostics/ui/legibility-floor.spec.ts @@ -1,5 +1,5 @@ import { test, expect, Page } from '@playwright/test'; -import { login, TEST_USERS } from '../lib/auth'; +import { login, TEST_USERS } from '../../lib/auth'; /** * PR-3 (expand-in-place) + PR-4 (zoom-decoupled legibility floor). diff --git a/tests/diagnostics/minimap-zoom.spec.ts b/tests/diagnostics/ui/minimap-zoom.spec.ts similarity index 97% rename from tests/diagnostics/minimap-zoom.spec.ts rename to tests/diagnostics/ui/minimap-zoom.spec.ts index 11beacfd..cf9ca260 100644 --- a/tests/diagnostics/minimap-zoom.spec.ts +++ b/tests/diagnostics/ui/minimap-zoom.spec.ts @@ -1,5 +1,5 @@ import { test, expect, Page } from '@playwright/test'; -import { login, TEST_USERS } from '../lib/auth'; +import { login, TEST_USERS } from '../../lib/auth'; /** * Minimap wheel/pinch zoom: a wheel over the minimap zooms the MAIN view diff --git a/tests/diagnostics/insecure-connection-banner.spec.ts b/tests/diagnostics/ui/tls-banner.spec.ts similarity index 98% rename from tests/diagnostics/insecure-connection-banner.spec.ts rename to tests/diagnostics/ui/tls-banner.spec.ts index a4d0cade..31581fbb 100644 --- a/tests/diagnostics/insecure-connection-banner.spec.ts +++ b/tests/diagnostics/ui/tls-banner.spec.ts @@ -1,7 +1,7 @@ import { test, expect, Page } from '@playwright/test'; import * as fs from 'fs'; import * as path from 'path'; -import { login, TEST_USERS } from '../lib/auth'; +import { login, TEST_USERS } from '../../lib/auth'; /** * The insecure-connection (HTTP) warning must integrate cleanly: a slim strip diff --git a/tests/e2e/a11y-focus.spec.ts b/tests/e2e/a11y/modal-focus.spec.ts similarity index 98% rename from tests/e2e/a11y-focus.spec.ts rename to tests/e2e/a11y/modal-focus.spec.ts index 3980f95f..d9bf2484 100644 --- a/tests/e2e/a11y-focus.spec.ts +++ b/tests/e2e/a11y/modal-focus.spec.ts @@ -1,5 +1,5 @@ import { test, expect, Page } from '@playwright/test'; -import { login, TEST_USERS, getBaseURL } from '../lib/auth'; +import { login, TEST_USERS, getBaseURL } from '../../lib/auth'; /** * Modal accessibility / keyboard-focus gate (@a11y). Asserts the contract added diff --git a/tests/e2e/admin-database-tab.spec.ts b/tests/e2e/admin/database-tab.spec.ts similarity index 98% rename from tests/e2e/admin-database-tab.spec.ts rename to tests/e2e/admin/database-tab.spec.ts index 10186c99..18ee76a2 100644 --- a/tests/e2e/admin-database-tab.spec.ts +++ b/tests/e2e/admin/database-tab.spec.ts @@ -1,5 +1,5 @@ import { test, expect } from '@playwright/test'; -import { login, TEST_USERS, getBaseURL } from '../lib/auth'; +import { login, TEST_USERS, getBaseURL } from '../../lib/auth'; test.describe('Admin Database Tab', () => { test.beforeEach(async ({ page }) => { diff --git a/tests/e2e/oauth-provider-config.spec.ts b/tests/e2e/admin/oauth-provider-config.spec.ts similarity index 98% rename from tests/e2e/oauth-provider-config.spec.ts rename to tests/e2e/admin/oauth-provider-config.spec.ts index 648a6742..0e6f4961 100644 --- a/tests/e2e/oauth-provider-config.spec.ts +++ b/tests/e2e/admin/oauth-provider-config.spec.ts @@ -1,5 +1,5 @@ import { test, expect } from '@playwright/test'; -import { login, TEST_USERS, getBaseURL } from '../lib/auth'; +import { login, TEST_USERS, getBaseURL } from '../../lib/auth'; test.describe('OAuth Provider Configuration (Admin Panel)', () => { test.beforeEach(async ({ page }) => { diff --git a/tests/e2e/api-health.spec.ts b/tests/e2e/api/health.spec.ts similarity index 97% rename from tests/e2e/api-health.spec.ts rename to tests/e2e/api/health.spec.ts index 4abea61e..87bbd5d6 100644 --- a/tests/e2e/api-health.spec.ts +++ b/tests/e2e/api/health.spec.ts @@ -1,5 +1,5 @@ import { test, expect } from '@playwright/test'; -import { HEALTH_URL, gqlRequest, apiLogin } from '../lib/api'; +import { HEALTH_URL, gqlRequest, apiLogin } from '../../lib/api'; // API health checks, deployment-agnostic: every URL derives from TEST_URL // (nginx route layout in production, Vite proxy in dev) and data queries diff --git a/tests/e2e/form-validation.spec.ts b/tests/e2e/auth/form-validation.spec.ts similarity index 99% rename from tests/e2e/form-validation.spec.ts rename to tests/e2e/auth/form-validation.spec.ts index 7abbed1e..12883d28 100644 --- a/tests/e2e/form-validation.spec.ts +++ b/tests/e2e/auth/form-validation.spec.ts @@ -1,5 +1,5 @@ import { test, expect, Page } from '@playwright/test'; -import { login, TEST_USERS, getBaseURL } from '../lib/auth'; +import { login, TEST_USERS, getBaseURL } from '../../lib/auth'; /** * Form-validation gate (@validation). Exercises the client-side validation diff --git a/tests/e2e/login-focus.spec.ts b/tests/e2e/auth/passwordless-focus.spec.ts similarity index 97% rename from tests/e2e/login-focus.spec.ts rename to tests/e2e/auth/passwordless-focus.spec.ts index 8fd1154e..fee99ba2 100644 --- a/tests/e2e/login-focus.spec.ts +++ b/tests/e2e/auth/passwordless-focus.spec.ts @@ -1,5 +1,5 @@ import { test, expect } from '@playwright/test'; -import { getBaseURL } from '../lib/auth'; +import { getBaseURL } from '../../lib/auth'; /** * Passwordless sign-in focus order (@loginfocus). When the user switches to the diff --git a/tests/e2e/signup-fit.spec.ts b/tests/e2e/auth/responsive-layout.spec.ts similarity index 98% rename from tests/e2e/signup-fit.spec.ts rename to tests/e2e/auth/responsive-layout.spec.ts index 03815498..ee6d58e3 100644 --- a/tests/e2e/signup-fit.spec.ts +++ b/tests/e2e/auth/responsive-layout.spec.ts @@ -1,5 +1,5 @@ import { test, expect } from '@playwright/test'; -import { getBaseURL } from '../lib/auth'; +import { getBaseURL } from '../../lib/auth'; /** * Responsive "fit the window" religion (@signup-fit): on a large screen the diff --git a/tests/e2e/camera.spec.ts b/tests/e2e/graph/camera.spec.ts similarity index 99% rename from tests/e2e/camera.spec.ts rename to tests/e2e/graph/camera.spec.ts index 64236514..2f5eb85f 100644 --- a/tests/e2e/camera.spec.ts +++ b/tests/e2e/graph/camera.spec.ts @@ -1,5 +1,5 @@ import { test, expect, Page } from '@playwright/test'; -import { login, TEST_USERS, getBaseURL } from '../lib/auth'; +import { login, TEST_USERS, getBaseURL } from '../../lib/auth'; /** * Camera framing + persistence (@camera). diff --git a/tests/e2e/living-graph.spec.ts b/tests/e2e/graph/living-graph-effects.spec.ts similarity index 99% rename from tests/e2e/living-graph.spec.ts rename to tests/e2e/graph/living-graph-effects.spec.ts index fcf5486f..0ca0478d 100644 --- a/tests/e2e/living-graph.spec.ts +++ b/tests/e2e/graph/living-graph-effects.spec.ts @@ -1,5 +1,5 @@ import { test, expect, Page } from '@playwright/test'; -import { login, TEST_USERS } from '../lib/auth'; +import { login, TEST_USERS } from '../../lib/auth'; /** * The living graph is the product's differentiator (breathing, glow, energy diff --git a/tests/e2e/copy-id.spec.ts b/tests/e2e/graph/node-inspector-copyid.spec.ts similarity index 95% rename from tests/e2e/copy-id.spec.ts rename to tests/e2e/graph/node-inspector-copyid.spec.ts index 1bd8d9a8..d935704a 100644 --- a/tests/e2e/copy-id.spec.ts +++ b/tests/e2e/graph/node-inspector-copyid.spec.ts @@ -1,5 +1,5 @@ import { test, expect } from '@playwright/test'; -import { login, TEST_USERS, getBaseURL } from '../lib/auth'; +import { login, TEST_USERS, getBaseURL } from '../../lib/auth'; /** * Click-to-copy node id (@copyid, #23): the node inspector shows a short id chip; diff --git a/tests/e2e/node-quick-edit.spec.ts b/tests/e2e/graph/node-quick-edit.spec.ts similarity index 98% rename from tests/e2e/node-quick-edit.spec.ts rename to tests/e2e/graph/node-quick-edit.spec.ts index f5b0f405..c54f393d 100644 --- a/tests/e2e/node-quick-edit.spec.ts +++ b/tests/e2e/graph/node-quick-edit.spec.ts @@ -1,5 +1,5 @@ import { test, expect, Page } from '@playwright/test'; -import { login, TEST_USERS, getBaseURL } from '../lib/auth'; +import { login, TEST_USERS, getBaseURL } from '../../lib/auth'; /** * In-context node quick-edit (@quickedit, #87): double-clicking a node opens a diff --git a/tests/e2e/relationship-flip.spec.ts b/tests/e2e/graph/relationship-flip.spec.ts similarity index 99% rename from tests/e2e/relationship-flip.spec.ts rename to tests/e2e/graph/relationship-flip.spec.ts index f28123d9..30d129e6 100644 --- a/tests/e2e/relationship-flip.spec.ts +++ b/tests/e2e/graph/relationship-flip.spec.ts @@ -1,5 +1,5 @@ import { test, expect } from '@playwright/test'; -import { login, TEST_USERS, navigateToWorkspace } from '../lib/auth'; +import { login, TEST_USERS, navigateToWorkspace } from '../../lib/auth'; test.describe('Relationship Flip Functionality', () => { test.beforeEach(async ({ page }) => { diff --git a/tests/e2e/mobile-audit.spec.ts b/tests/e2e/mobile/accessibility-audit.spec.ts similarity index 95% rename from tests/e2e/mobile-audit.spec.ts rename to tests/e2e/mobile/accessibility-audit.spec.ts index c879dcfb..db2ff3c1 100644 --- a/tests/e2e/mobile-audit.spec.ts +++ b/tests/e2e/mobile/accessibility-audit.spec.ts @@ -1,6 +1,6 @@ import { test, expect } from '@playwright/test'; -import { login, TEST_USERS, getBaseURL } from '../lib/auth'; -import { auditLayout, auditContrast } from '../lib/mobileAudit'; +import { login, TEST_USERS, getBaseURL } from '../../lib/auth'; +import { auditLayout, auditContrast } from '../../lib/mobileAudit'; /** * Automated mobile sweep — runs the layout + contrast auditors against EVERY diff --git a/tests/e2e/mobile-dialogs.spec.ts b/tests/e2e/mobile/dialog-positioning.spec.ts similarity index 94% rename from tests/e2e/mobile-dialogs.spec.ts rename to tests/e2e/mobile/dialog-positioning.spec.ts index 38ee38f7..4c3fd968 100644 --- a/tests/e2e/mobile-dialogs.spec.ts +++ b/tests/e2e/mobile/dialog-positioning.spec.ts @@ -1,6 +1,6 @@ import { test, expect } from '@playwright/test'; -import { login, TEST_USERS, getBaseURL } from '../lib/auth'; -import { auditDialog } from '../lib/mobileAudit'; +import { login, TEST_USERS, getBaseURL } from '../../lib/auth'; +import { auditDialog } from '../../lib/mobileAudit'; /** * Automated dialog sweep — opens the modals a phone user actually hits and diff --git a/tests/e2e/mobile-experience.spec.ts b/tests/e2e/mobile/experience.spec.ts similarity index 98% rename from tests/e2e/mobile-experience.spec.ts rename to tests/e2e/mobile/experience.spec.ts index ac8b6a25..47bf27fd 100644 --- a/tests/e2e/mobile-experience.spec.ts +++ b/tests/e2e/mobile/experience.spec.ts @@ -1,5 +1,5 @@ import { test, expect } from '@playwright/test'; -import { login, TEST_USERS } from '../lib/auth'; +import { login, TEST_USERS } from '../../lib/auth'; /** * Mobile experience contract. A phone-sized screen should land on a readable diff --git a/tests/e2e/mobile-views.spec.ts b/tests/e2e/mobile/view-navigation.spec.ts similarity index 98% rename from tests/e2e/mobile-views.spec.ts rename to tests/e2e/mobile/view-navigation.spec.ts index 0b6092b9..ee6eaa09 100644 --- a/tests/e2e/mobile-views.spec.ts +++ b/tests/e2e/mobile/view-navigation.spec.ts @@ -1,5 +1,5 @@ import { test, expect, Page } from '@playwright/test'; -import { login, TEST_USERS } from '../lib/auth'; +import { login, TEST_USERS } from '../../lib/auth'; /** * Mobile usability of the non-graph views. On a phone a user should be able to diff --git a/tests/e2e/VISUAL_REGRESSION_README.md b/tests/e2e/reports/VISUAL_REGRESSION_README.md similarity index 100% rename from tests/e2e/VISUAL_REGRESSION_README.md rename to tests/e2e/reports/VISUAL_REGRESSION_README.md diff --git a/tests/e2e/feature-matrix.spec.ts b/tests/e2e/reports/feature-matrix.spec.ts similarity index 98% rename from tests/e2e/feature-matrix.spec.ts rename to tests/e2e/reports/feature-matrix.spec.ts index db0d7307..f60a1dec 100644 --- a/tests/e2e/feature-matrix.spec.ts +++ b/tests/e2e/reports/feature-matrix.spec.ts @@ -1,8 +1,8 @@ import { test, expect, Page, TestInfo } from '@playwright/test'; import * as fs from 'fs'; import * as path from 'path'; -import { getBaseURL } from '../lib/auth'; -import { auditLayout, auditContrast } from '../lib/mobileAudit'; +import { getBaseURL } from '../../lib/auth'; +import { auditLayout, auditContrast } from '../../lib/mobileAudit'; const SHOT_ROOT = path.resolve(process.cwd(), 'test-artifacts/matrix'); diff --git a/tests/e2e/matrix.setup.ts b/tests/e2e/reports/matrix.setup.ts similarity index 90% rename from tests/e2e/matrix.setup.ts rename to tests/e2e/reports/matrix.setup.ts index a1137a33..79ae97bc 100644 --- a/tests/e2e/matrix.setup.ts +++ b/tests/e2e/reports/matrix.setup.ts @@ -1,5 +1,5 @@ import { test as setup } from '@playwright/test'; -import { login, TEST_USERS } from '../lib/auth'; +import { login, TEST_USERS } from '../../lib/auth'; // One real login for the whole matrix run; every feature-matrix test reuses this // storage state so the ~100-cell resolution×feature sweep doesn't re-login each diff --git a/tests/e2e/showcase.spec.ts b/tests/e2e/reports/showcase.spec.ts similarity index 99% rename from tests/e2e/showcase.spec.ts rename to tests/e2e/reports/showcase.spec.ts index 5fddbf16..87d5a4f1 100644 --- a/tests/e2e/showcase.spec.ts +++ b/tests/e2e/reports/showcase.spec.ts @@ -1,5 +1,5 @@ import { test, expect, Page } from '@playwright/test'; -import { login, TEST_USERS } from '../lib/auth'; +import { login, TEST_USERS } from '../../lib/auth'; import * as fs from 'fs'; import * as path from 'path'; diff --git a/tests/e2e/visual-regression-suite.spec.ts b/tests/e2e/reports/visual-regression.spec.ts similarity index 100% rename from tests/e2e/visual-regression-suite.spec.ts rename to tests/e2e/reports/visual-regression.spec.ts diff --git a/tests/e2e/visual-vlm.spec.ts b/tests/e2e/reports/vlm-evaluation.spec.ts similarity index 96% rename from tests/e2e/visual-vlm.spec.ts rename to tests/e2e/reports/vlm-evaluation.spec.ts index b35e379e..d9112178 100644 --- a/tests/e2e/visual-vlm.spec.ts +++ b/tests/e2e/reports/vlm-evaluation.spec.ts @@ -1,11 +1,11 @@ import { test, expect, Page } from '@playwright/test'; import * as fs from 'fs'; import * as path from 'path'; -import { login, TEST_USERS } from '../lib/auth'; -import { seedLargeGraph, deleteGraphDeep } from '../lib/seedGraph'; -import { sweepTestData, TEST_GRAPH_PREFIX } from '../lib/dbHealing'; -import '../lib/testEnv'; -import { isVlmAvailable, evaluateBatch, PERSONAS, personaByKey } from '../lib/vlm'; +import { login, TEST_USERS } from '../../lib/auth'; +import { seedLargeGraph, deleteGraphDeep } from '../../lib/seedGraph'; +import { sweepTestData, TEST_GRAPH_PREFIX } from '../../lib/dbHealing'; +import '../../lib/testEnv'; +import { isVlmAvailable, evaluateBatch, PERSONAS, personaByKey } from '../../lib/vlm'; /** * Local-VLM visual evaluation. Captures key user-facing states, then asks a diff --git a/tests/e2e/responsive.spec.ts b/tests/e2e/responsive/viewports.spec.ts similarity index 97% rename from tests/e2e/responsive.spec.ts rename to tests/e2e/responsive/viewports.spec.ts index 5508b05d..2d6f2779 100644 --- a/tests/e2e/responsive.spec.ts +++ b/tests/e2e/responsive/viewports.spec.ts @@ -1,5 +1,5 @@ import { test, expect, Page } from '@playwright/test'; -import { login, TEST_USERS } from '../lib/auth'; +import { login, TEST_USERS } from '../../lib/auth'; // RESP-5 (docs/USER_STORIES.md): the core flow must work on phone, tablet and // desktop viewports, with no horizontal scroll and visible primary navigation. diff --git a/tests/e2e/basic-workflow.spec.ts b/tests/e2e/smoke/basic-workflow.spec.ts similarity index 99% rename from tests/e2e/basic-workflow.spec.ts rename to tests/e2e/smoke/basic-workflow.spec.ts index 95a79daf..0a4f84f9 100644 --- a/tests/e2e/basic-workflow.spec.ts +++ b/tests/e2e/smoke/basic-workflow.spec.ts @@ -1,5 +1,5 @@ import { test, expect } from '@playwright/test'; -import { login, TEST_USERS } from '../lib/auth'; +import { login, TEST_USERS } from '../../lib/auth'; test.describe('Basic User Workflow', () => { test('should complete full user journey: login → select/create graph → create node → verify node appears without refresh', async ({ page }) => { diff --git a/tests/e2e/user-smoke.spec.ts b/tests/e2e/smoke/user-smoke.spec.ts similarity index 99% rename from tests/e2e/user-smoke.spec.ts rename to tests/e2e/smoke/user-smoke.spec.ts index 9919e283..bcd7342e 100644 --- a/tests/e2e/user-smoke.spec.ts +++ b/tests/e2e/smoke/user-smoke.spec.ts @@ -1,5 +1,5 @@ import { test, expect } from '@playwright/test'; -import { login, TEST_USERS } from '../lib/auth'; +import { login, TEST_USERS } from '../../lib/auth'; /** * THE GATE. This spec sees the app exactly as a user does — if it fails, diff --git a/tests/e2e/overlay-dismissal.spec.ts b/tests/e2e/ui/overlay-dismissal.spec.ts similarity index 99% rename from tests/e2e/overlay-dismissal.spec.ts rename to tests/e2e/ui/overlay-dismissal.spec.ts index 648c2b7b..a4a8132f 100644 --- a/tests/e2e/overlay-dismissal.spec.ts +++ b/tests/e2e/ui/overlay-dismissal.spec.ts @@ -1,5 +1,5 @@ import { test, expect, Page } from '@playwright/test'; -import { login, TEST_USERS, getBaseURL } from '../lib/auth'; +import { login, TEST_USERS, getBaseURL } from '../../lib/auth'; /** * Overlay dismissal gate (@dismissal). Verifies the dialog-manager "friction diff --git a/tests/e2e/z-order.spec.ts b/tests/e2e/ui/z-order.spec.ts similarity index 98% rename from tests/e2e/z-order.spec.ts rename to tests/e2e/ui/z-order.spec.ts index 661bcddc..da32d909 100644 --- a/tests/e2e/z-order.spec.ts +++ b/tests/e2e/ui/z-order.spec.ts @@ -1,7 +1,7 @@ import { test, expect, Page } from '@playwright/test'; -import { login, TEST_USERS, getBaseURL } from '../lib/auth'; -import { auditOnTop } from '../lib/zorder'; -import { auditDialog } from '../lib/mobileAudit'; +import { login, TEST_USERS, getBaseURL } from '../../lib/auth'; +import { auditOnTop } from '../../lib/zorder'; +import { auditDialog } from '../../lib/mobileAudit'; /** * Z-order / stacking gate. Opens every floating overlay in the app (dropdowns, diff --git a/tests/e2e/installation-validation.spec.ts b/tests/integration/installation-validation.spec.ts similarity index 100% rename from tests/e2e/installation-validation.spec.ts rename to tests/integration/installation-validation.spec.ts diff --git a/tests/e2e/tls-integration.spec.ts b/tests/integration/tls-integration.spec.ts similarity index 100% rename from tests/e2e/tls-integration.spec.ts rename to tests/integration/tls-integration.spec.ts diff --git a/tests/sequences/unified.config.mjs b/tests/sequences/unified.config.mjs index 56105de5..589971d8 100644 --- a/tests/sequences/unified.config.mjs +++ b/tests/sequences/unified.config.mjs @@ -14,9 +14,9 @@ const PW = 'GraphDone-Core/dev-neo4j/chromium'; export const SEQUENCES = { 'unit-web': { adapter: 'vitest', title: 'Web unit tests', cwd: 'packages/web', blocking: true }, - 'smoke': { adapter: 'playwright', title: 'Smoke gate (THE GATE)', args: ['tests/e2e/user-smoke.spec.ts', `--project=${PW}`], blocking: true }, - 'e2e-auth': { adapter: 'playwright', title: 'Auth e2e — passwordless focus', args: ['tests/e2e/login-focus.spec.ts', `--project=${PW}`], blocking: true }, - 'e2e-graph': { adapter: 'playwright', title: 'Graph e2e — camera', args: ['tests/e2e/camera.spec.ts', `--project=${PW}`], blocking: true }, + 'smoke': { adapter: 'playwright', title: 'Smoke gate (THE GATE)', args: ['tests/e2e/smoke/user-smoke.spec.ts', `--project=${PW}`], blocking: true }, + 'e2e-auth': { adapter: 'playwright', title: 'Auth e2e — passwordless focus', args: ['tests/e2e/auth/passwordless-focus.spec.ts', `--project=${PW}`], blocking: true }, + 'e2e-graph': { adapter: 'playwright', title: 'Graph e2e — camera', args: ['tests/e2e/graph/camera.spec.ts', `--project=${PW}`], blocking: true }, 'mobile': { adapter: 'playwright', title: 'Mobile audit', args: ['--grep', '@mobile|@audit', `--project=${PW}`], blocking: false }, 'showcase': { adapter: 'playwright', title: 'Showcase — video + screenshots', args: ['--project=showcase'], blocking: false }, };