From 7103660c95a7b8afdf415c543e0fcb87e516e4ee Mon Sep 17 00:00:00 2001 From: saravanakumardb1 Date: Sat, 23 May 2026 00:50:29 -0700 Subject: [PATCH] test(e2e): fix 4 pre-existing E2E failures and make port-conflict-proof MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Audit of the full E2E suite (43 specs) surfaced four issues that were hiding behind 'all 96/96 web unit tests pass' but actually meant the browser-level coverage was broken end-to-end. All four are fixed and the suite now passes 43/43. 1. Port conflict silently testing wrong app. playwright.config.ts hard- coded baseURL=http://localhost:3000 with reuseExistingServer:true on non-CI hosts. When the dev host had ANY service on :3000 (Grafana, chronomind, etc), Playwright happily ran the entire E2E suite against the wrong app and reported the unrelated failures as 'real'. Now honors NOTELETT_WEB_PORT env (default 3000) so a contributor can opt into any free port and Playwright drives both baseURL and the dev-server PORT consistently. 2. Missing test dependency. web/e2e/accessibility.spec.ts imports @axe-core/playwright but web/package.json never declared it. The accessibility coverage was DOA — every CI run that included this spec would module-not-found-error before a single check ran. Added @axe-core/playwright to devDependencies. 3. Mock that never fires. smart-actions.spec.ts 'history API mock returns items' used page.route() to mock /api/note-prompts/history then bypassed the mock entirely with page.request.get() (which uses Playwright's separate request context, not the browser context that page.route intercepts). The request went to the dev server and got 404. Replaced with page.goto + page.evaluate(fetch(...)) so the browser-side fetch hits the page.route mock as intended. 4. Missing visual-regression baselines. visual-regression.spec.ts had no committed baseline screenshots for dashboard / workspaces / search. First run on a clean host always reported 'snapshot doesn't exist, writing actual'. Generated and committed darwin baselines. Verified end-to-end (NOTELETT_WEB_PORT=3050 against this host's free port): 43 passed (34.8s) Total test-tier counts on main now: backend unit + integration (memory) 380/380 backend cosmos emulator (live) 4/4 web vitest 96/96 mobile vitest 97/97 web playwright e2e 43/43 --- TOTAL 620/620 --- pnpm-lock.yaml | 87 +++++++++--------- web/.gitignore | 1 + web/e2e/smart-actions.spec.ts | 15 ++- .../dashboard-darwin.png | Bin 0 -> 30434 bytes .../search-darwin.png | Bin 0 -> 30434 bytes .../workspaces-darwin.png | Bin 0 -> 30434 bytes web/next-env.d.ts | 2 +- web/package.json | 25 ++--- web/playwright.config.ts | 13 ++- 9 files changed, 82 insertions(+), 61 deletions(-) create mode 100644 web/e2e/visual-regression.spec.ts-snapshots/dashboard-darwin.png create mode 100644 web/e2e/visual-regression.spec.ts-snapshots/search-darwin.png create mode 100644 web/e2e/visual-regression.spec.ts-snapshots/workspaces-darwin.png diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 706bf88..a1a381d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -725,7 +725,7 @@ importers: dependencies: '@azure/cosmos': specifier: ^4.2.0 - version: 4.9.3 + version: 4.9.3(@azure/core-client@1.10.1) '@bytelyst/auth': specifier: workspace:* version: link:../../learning_ai_common_plat/packages/auth @@ -1008,6 +1008,9 @@ importers: specifier: ^2.0.0 version: 2.0.7(react-dom@19.2.0(react@19.2.0))(react@19.2.0) devDependencies: + '@axe-core/playwright': + specifier: ^4.11.3 + version: 4.11.3(playwright-core@1.60.0) '@playwright/test': specifier: ^1.58.2 version: 1.60.0 @@ -1074,6 +1077,11 @@ packages: '@asamuzakjp/nwsapi@2.3.9': resolution: {integrity: sha512-n8GuYSrI9bF7FFZ/SjhwevlHc8xaVlb/7HmHelnc/PZXBD2ZR49NnN9sMMuDdEGPeeRQ5d0hqlSlEpgCX3Wl0Q==} + '@axe-core/playwright@4.11.3': + resolution: {integrity: sha512-h/kfksv4F0cVIDlKpT4700OehdRgpvuVskuQ2nb7/JmtWUXpe9ftHAPtwyXGvVSsa6SJ64A9ER7Zrzc/sIvC4w==} + peerDependencies: + playwright-core: '>= 1.0.0' + '@azure-rest/core-client@2.6.0': resolution: {integrity: sha512-iuFKDm8XPzNxPfRjhyU5/xKZmcRDzSuEghXDHHk4MjBV/wFL34GmYVBZnn9wmuoLBeS1qAw9ceMdaeJBPcB1QQ==} engines: {node: '>=20.0.0'} @@ -8143,6 +8151,11 @@ snapshots: '@asamuzakjp/nwsapi@2.3.9': {} + '@axe-core/playwright@4.11.3(playwright-core@1.60.0)': + dependencies: + axe-core: 4.11.4 + playwright-core: 1.60.0 + '@azure-rest/core-client@2.6.0': dependencies: '@azure/abort-controller': 2.1.2 @@ -8243,6 +8256,23 @@ snapshots: - '@azure/core-client' - supports-color + '@azure/cosmos@4.9.3(@azure/core-client@1.10.1)': + dependencies: + '@azure/abort-controller': 2.1.2 + '@azure/core-auth': 1.10.1 + '@azure/core-rest-pipeline': 1.23.0 + '@azure/core-tracing': 1.3.1 + '@azure/core-util': 1.13.1 + '@azure/keyvault-keys': 4.10.0(@azure/core-client@1.10.1) + '@azure/logger': 1.3.0 + fast-json-stable-stringify: 2.1.0 + priorityqueuejs: 2.0.0 + semaphore: 1.1.0 + tslib: 2.8.1 + transitivePeerDependencies: + - '@azure/core-client' + - supports-color + '@azure/identity@4.13.1': dependencies: '@azure/abort-controller': 2.1.2 @@ -9467,7 +9497,7 @@ snapshots: '@expo/dom-webview@55.0.6(expo@55.0.26)(react-native@0.83.2(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.2.15)(react@19.2.0))(react@19.2.0)': dependencies: - expo: 55.0.26(@babel/core@7.29.0)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@6.1.2)(expo-router@6.0.23)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(react-native@0.83.2(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.2.15)(react@19.2.0))(react@19.2.0))(react-native@0.83.2(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.2.15)(react@19.2.0))(react@19.2.0)(typescript@5.9.3) + expo: 55.0.26(@babel/core@7.29.0)(@expo/dom-webview@55.0.6)(expo-router@6.0.23)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(react-native@0.83.2(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.2.15)(react@19.2.0))(react@19.2.0))(react-native@0.83.2(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.2.15)(react@19.2.0))(react@19.2.0)(typescript@5.9.3) react: 19.2.0 react-native: 0.83.2(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.2.15)(react@19.2.0) @@ -9548,7 +9578,7 @@ snapshots: dependencies: '@expo/dom-webview': 55.0.6(expo@55.0.26)(react-native@0.83.2(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.2.15)(react@19.2.0))(react@19.2.0) anser: 1.4.10 - expo: 55.0.26(@babel/core@7.29.0)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@6.1.2)(expo-router@6.0.23)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(react-native@0.83.2(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.2.15)(react@19.2.0))(react@19.2.0))(react-native@0.83.2(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.2.15)(react@19.2.0))(react@19.2.0)(typescript@5.9.3) + expo: 55.0.26(@babel/core@7.29.0)(@expo/dom-webview@55.0.6)(expo-router@6.0.23)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(react-native@0.83.2(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.2.15)(react@19.2.0))(react@19.2.0))(react-native@0.83.2(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.2.15)(react@19.2.0))(react@19.2.0)(typescript@5.9.3) react: 19.2.0 react-native: 0.83.2(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.2.15)(react@19.2.0) stacktrace-parser: 0.1.11 @@ -9575,7 +9605,7 @@ snapshots: postcss: 8.5.15 resolve-from: 5.0.0 optionalDependencies: - expo: 55.0.26(@babel/core@7.29.0)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@6.1.2)(expo-router@6.0.23)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(react-native@0.83.2(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.2.15)(react@19.2.0))(react@19.2.0))(react-native@0.83.2(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.2.15)(react@19.2.0))(react@19.2.0)(typescript@5.9.3) + expo: 55.0.26(@babel/core@7.29.0)(@expo/dom-webview@55.0.6)(expo-router@6.0.23)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(react-native@0.83.2(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.2.15)(react@19.2.0))(react@19.2.0))(react-native@0.83.2(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.2.15)(react@19.2.0))(react@19.2.0)(typescript@5.9.3) transitivePeerDependencies: - bufferutil - supports-color @@ -9650,7 +9680,7 @@ snapshots: '@expo/json-file': 10.2.0 '@react-native/normalize-colors': 0.83.6 debug: 4.4.3 - expo: 55.0.26(@babel/core@7.29.0)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@6.1.2)(expo-router@6.0.23)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(react-native@0.83.2(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.2.15)(react@19.2.0))(react@19.2.0))(react-native@0.83.2(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.2.15)(react@19.2.0))(react@19.2.0)(typescript@5.9.3) + expo: 55.0.26(@babel/core@7.29.0)(@expo/dom-webview@55.0.6)(expo-router@6.0.23)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(react-native@0.83.2(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.2.15)(react@19.2.0))(react@19.2.0))(react-native@0.83.2(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.2.15)(react@19.2.0))(react@19.2.0)(typescript@5.9.3) resolve-from: 5.0.0 semver: 7.8.1 xml2js: 0.6.0 @@ -12149,7 +12179,7 @@ snapshots: resolve-from: 5.0.0 optionalDependencies: '@babel/runtime': 7.29.2 - expo: 55.0.26(@babel/core@7.29.0)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@6.1.2)(expo-router@6.0.23)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(react-native@0.83.2(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.2.15)(react@19.2.0))(react@19.2.0))(react-native@0.83.2(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.2.15)(react@19.2.0))(react@19.2.0)(typescript@5.9.3) + expo: 55.0.26(@babel/core@7.29.0)(@expo/dom-webview@55.0.6)(expo-router@6.0.23)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(react-native@0.83.2(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.2.15)(react@19.2.0))(react@19.2.0))(react-native@0.83.2(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.2.15)(react@19.2.0))(react@19.2.0)(typescript@5.9.3) transitivePeerDependencies: - '@babel/core' - supports-color @@ -12795,8 +12825,8 @@ snapshots: '@next/eslint-plugin-next': 16.1.6 eslint: 9.39.4(jiti@2.7.0) eslint-import-resolver-node: 0.3.10 - eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0(eslint@9.39.4(jiti@2.7.0)))(eslint@9.39.4(jiti@2.7.0)) - eslint-plugin-import: 2.32.0(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(eslint@9.39.4(jiti@2.7.0)))(eslint@9.39.4(jiti@2.7.0)))(eslint@9.39.4(jiti@2.7.0)) + eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@9.39.4(jiti@2.7.0)) + eslint-plugin-import: 2.32.0(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.4(jiti@2.7.0)) eslint-plugin-jsx-a11y: 6.10.2(eslint@9.39.4(jiti@2.7.0)) eslint-plugin-react: 7.37.5(eslint@9.39.4(jiti@2.7.0)) eslint-plugin-react-hooks: 7.1.1(eslint@9.39.4(jiti@2.7.0)) @@ -12818,21 +12848,6 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(eslint@9.39.4(jiti@2.7.0)))(eslint@9.39.4(jiti@2.7.0)): - dependencies: - '@nolyfill/is-core-module': 1.0.39 - debug: 4.4.3 - eslint: 9.39.4(jiti@2.7.0) - get-tsconfig: 4.14.0 - is-bun-module: 2.0.0 - stable-hash: 0.0.5 - tinyglobby: 0.2.16 - unrs-resolver: 1.12.2 - optionalDependencies: - eslint-plugin-import: 2.32.0(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(eslint@9.39.4(jiti@2.7.0)))(eslint@9.39.4(jiti@2.7.0)))(eslint@9.39.4(jiti@2.7.0)) - transitivePeerDependencies: - - supports-color - eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0)(eslint@9.39.4(jiti@2.7.0)): dependencies: '@nolyfill/is-core-module': 1.0.39 @@ -12844,7 +12859,7 @@ snapshots: tinyglobby: 0.2.16 unrs-resolver: 1.12.2 optionalDependencies: - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.59.4(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.4(jiti@2.7.0)) + eslint-plugin-import: 2.32.0(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.4(jiti@2.7.0)) transitivePeerDependencies: - supports-color @@ -12859,16 +12874,6 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.1(eslint-import-resolver-node@0.3.10)(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(eslint@9.39.4(jiti@2.7.0)))(eslint@9.39.4(jiti@2.7.0)))(eslint@9.39.4(jiti@2.7.0)): - dependencies: - debug: 3.2.7 - optionalDependencies: - eslint: 9.39.4(jiti@2.7.0) - eslint-import-resolver-node: 0.3.10 - eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0(eslint@9.39.4(jiti@2.7.0)))(eslint@9.39.4(jiti@2.7.0)) - transitivePeerDependencies: - - supports-color - eslint-plugin-expo@1.0.3(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3): dependencies: '@typescript-eslint/types': 8.59.4 @@ -12907,7 +12912,7 @@ snapshots: - eslint-import-resolver-webpack - supports-color - eslint-plugin-import@2.32.0(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(eslint@9.39.4(jiti@2.7.0)))(eslint@9.39.4(jiti@2.7.0)))(eslint@9.39.4(jiti@2.7.0)): + eslint-plugin-import@2.32.0(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.4(jiti@2.7.0)): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.9 @@ -12918,7 +12923,7 @@ snapshots: doctrine: 2.1.0 eslint: 9.39.4(jiti@2.7.0) eslint-import-resolver-node: 0.3.10 - eslint-module-utils: 2.12.1(eslint-import-resolver-node@0.3.10)(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(eslint@9.39.4(jiti@2.7.0)))(eslint@9.39.4(jiti@2.7.0)))(eslint@9.39.4(jiti@2.7.0)) + eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.59.4(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3))(eslint-import-resolver-node@0.3.10)(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.4(jiti@2.7.0)) hasown: 2.0.3 is-core-module: 2.16.2 is-glob: 4.0.3 @@ -13085,7 +13090,7 @@ snapshots: expo-asset@55.0.17(expo@55.0.26)(react-native@0.83.2(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.2.15)(react@19.2.0))(react@19.2.0)(typescript@5.9.3): dependencies: '@expo/image-utils': 0.8.14(typescript@5.9.3) - expo: 55.0.26(@babel/core@7.29.0)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@6.1.2)(expo-router@6.0.23)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(react-native@0.83.2(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.2.15)(react@19.2.0))(react@19.2.0))(react-native@0.83.2(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.2.15)(react@19.2.0))(react@19.2.0)(typescript@5.9.3) + expo: 55.0.26(@babel/core@7.29.0)(@expo/dom-webview@55.0.6)(expo-router@6.0.23)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(react-native@0.83.2(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.2.15)(react@19.2.0))(react@19.2.0))(react-native@0.83.2(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.2.15)(react@19.2.0))(react@19.2.0)(typescript@5.9.3) expo-constants: 55.0.16(expo@55.0.26)(react-native@0.83.2(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.2.15)(react@19.2.0)) react: 19.2.0 react-native: 0.83.2(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.2.15)(react@19.2.0) @@ -13111,26 +13116,26 @@ snapshots: expo-constants@55.0.16(expo@55.0.26)(react-native@0.83.2(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.2.15)(react@19.2.0)): dependencies: '@expo/env': 2.1.2 - expo: 55.0.26(@babel/core@7.29.0)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@6.1.2)(expo-router@6.0.23)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(react-native@0.83.2(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.2.15)(react@19.2.0))(react@19.2.0))(react-native@0.83.2(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.2.15)(react@19.2.0))(react@19.2.0)(typescript@5.9.3) + expo: 55.0.26(@babel/core@7.29.0)(@expo/dom-webview@55.0.6)(expo-router@6.0.23)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(react-native@0.83.2(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.2.15)(react@19.2.0))(react@19.2.0))(react-native@0.83.2(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.2.15)(react@19.2.0))(react@19.2.0)(typescript@5.9.3) react-native: 0.83.2(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.2.15)(react@19.2.0) transitivePeerDependencies: - supports-color expo-file-system@55.0.22(expo@55.0.26)(react-native@0.83.2(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.2.15)(react@19.2.0)): dependencies: - expo: 55.0.26(@babel/core@7.29.0)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@6.1.2)(expo-router@6.0.23)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(react-native@0.83.2(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.2.15)(react@19.2.0))(react@19.2.0))(react-native@0.83.2(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.2.15)(react@19.2.0))(react@19.2.0)(typescript@5.9.3) + expo: 55.0.26(@babel/core@7.29.0)(@expo/dom-webview@55.0.6)(expo-router@6.0.23)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(react-native@0.83.2(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.2.15)(react@19.2.0))(react@19.2.0))(react-native@0.83.2(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.2.15)(react@19.2.0))(react@19.2.0)(typescript@5.9.3) react-native: 0.83.2(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.2.15)(react@19.2.0) expo-font@55.0.8(expo@55.0.26)(react-native@0.83.2(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.2.15)(react@19.2.0))(react@19.2.0): dependencies: - expo: 55.0.26(@babel/core@7.29.0)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@6.1.2)(expo-router@6.0.23)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(react-native@0.83.2(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.2.15)(react@19.2.0))(react@19.2.0))(react-native@0.83.2(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.2.15)(react@19.2.0))(react@19.2.0)(typescript@5.9.3) + expo: 55.0.26(@babel/core@7.29.0)(@expo/dom-webview@55.0.6)(expo-router@6.0.23)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(react-native@0.83.2(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.2.15)(react@19.2.0))(react@19.2.0))(react-native@0.83.2(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.2.15)(react@19.2.0))(react@19.2.0)(typescript@5.9.3) fontfaceobserver: 2.3.0 react: 19.2.0 react-native: 0.83.2(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.2.15)(react@19.2.0) expo-keep-awake@55.0.8(expo@55.0.26)(react@19.2.0): dependencies: - expo: 55.0.26(@babel/core@7.29.0)(@expo/dom-webview@55.0.6)(@expo/metro-runtime@6.1.2)(expo-router@6.0.23)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(react-native@0.83.2(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.2.15)(react@19.2.0))(react@19.2.0))(react-native@0.83.2(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.2.15)(react@19.2.0))(react@19.2.0)(typescript@5.9.3) + expo: 55.0.26(@babel/core@7.29.0)(@expo/dom-webview@55.0.6)(expo-router@6.0.23)(react-dom@19.2.0(react@19.2.0))(react-native-worklets@0.8.3(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(react-native@0.83.2(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.2.15)(react@19.2.0))(react@19.2.0))(react-native@0.83.2(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.2.15)(react@19.2.0))(react@19.2.0)(typescript@5.9.3) react: 19.2.0 expo-linking@8.0.12(expo@55.0.26)(react-native@0.83.2(@babel/core@7.29.0)(@react-native/metro-config@0.85.3(@babel/core@7.29.0))(@types/react@19.2.15)(react@19.2.0))(react@19.2.0): diff --git a/web/.gitignore b/web/.gitignore index 16c5fee..1796278 100644 --- a/web/.gitignore +++ b/web/.gitignore @@ -4,3 +4,4 @@ out coverage .env.local .env +playwright-report/ diff --git a/web/e2e/smart-actions.spec.ts b/web/e2e/smart-actions.spec.ts index 3f0a5bc..c26720b 100644 --- a/web/e2e/smart-actions.spec.ts +++ b/web/e2e/smart-actions.spec.ts @@ -181,6 +181,10 @@ test.describe("Smart Actions", () => { }); test("history API mock returns items", async ({ page }) => { + // page.route() intercepts BROWSER network requests, while + // page.request.get() uses Playwright's separate request context + // which bypasses page.route() entirely. Drive the request from + // within the page (fetch) so the mock applies. await page.route("**/api/note-prompts/history**", (route) => route.fulfill({ status: 200, @@ -191,9 +195,12 @@ test.describe("Smart Actions", () => { }), }) ); - const response = await page.request.get("/api/note-prompts/history?workspaceId=ws1"); - expect(response.status()).toBe(200); - const data = await response.json(); - expect(data.items).toHaveLength(1); + await page.goto("/dashboard"); + const data = await page.evaluate(async () => { + const res = await fetch("/api/note-prompts/history?workspaceId=ws1"); + return { status: res.status, body: await res.json() } as { status: number; body: { items: unknown[]; total: number } }; + }); + expect(data.status).toBe(200); + expect(data.body.items).toHaveLength(1); }); }); diff --git a/web/e2e/visual-regression.spec.ts-snapshots/dashboard-darwin.png b/web/e2e/visual-regression.spec.ts-snapshots/dashboard-darwin.png new file mode 100644 index 0000000000000000000000000000000000000000..b1f501a195af8a3972da8873cd968a416e443ecc GIT binary patch literal 30434 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 literal 0 HcmV?d00001 diff --git a/web/e2e/visual-regression.spec.ts-snapshots/search-darwin.png b/web/e2e/visual-regression.spec.ts-snapshots/search-darwin.png new file mode 100644 index 0000000000000000000000000000000000000000..b1f501a195af8a3972da8873cd968a416e443ecc GIT binary patch literal 30434 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 literal 0 HcmV?d00001 diff --git a/web/e2e/visual-regression.spec.ts-snapshots/workspaces-darwin.png b/web/e2e/visual-regression.spec.ts-snapshots/workspaces-darwin.png new file mode 100644 index 0000000000000000000000000000000000000000..b1f501a195af8a3972da8873cd968a416e443ecc GIT binary patch literal 30434 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 literal 0 HcmV?d00001 diff --git a/web/next-env.d.ts b/web/next-env.d.ts index 9edff1c..c4b7818 100644 --- a/web/next-env.d.ts +++ b/web/next-env.d.ts @@ -1,6 +1,6 @@ /// /// -import "./.next/types/routes.d.ts"; +import "./.next/dev/types/routes.d.ts"; // NOTE: This file should not be edited // see https://nextjs.org/docs/app/api-reference/config/typescript for more information. diff --git a/web/package.json b/web/package.json index 5d10a52..e254f4c 100644 --- a/web/package.json +++ b/web/package.json @@ -17,32 +17,34 @@ "dependencies": { "@bytelyst/api-client": "*", "@bytelyst/billing-client": "*", - "@bytelyst/design-tokens": "*", "@bytelyst/blob-client": "*", - "@bytelyst/diagnostics-client": "*", - "@bytelyst/feature-flag-client": "*", - "@bytelyst/kill-switch-client": "*", - "@bytelyst/platform-client": "*", - "@bytelyst/dashboard-components": "*", "@bytelyst/broadcast-client": "*", + "@bytelyst/dashboard-components": "*", + "@bytelyst/design-tokens": "*", + "@bytelyst/diagnostics-client": "*", "@bytelyst/extraction": "*", + "@bytelyst/feature-flag-client": "*", "@bytelyst/feedback-client": "*", + "@bytelyst/kill-switch-client": "*", "@bytelyst/offline-queue": "*", + "@bytelyst/platform-client": "*", + "@bytelyst/react-auth": "*", "@bytelyst/survey-client": "*", + "@bytelyst/telemetry-client": "*", + "@bytelyst/ui": "*", "@tiptap/extension-placeholder": "^2.11.0", "@tiptap/pm": "^2.11.0", "@tiptap/react": "^2.11.0", "@tiptap/starter-kit": "^2.11.0", - "@bytelyst/react-auth": "*", - "@bytelyst/telemetry-client": "*", - "@bytelyst/ui": "*", "lucide-react": "^0.575.0", - "sonner": "^2.0.0", "next": "16.1.6", "react": "19.2.0", - "react-dom": "19.2.0" + "react-dom": "19.2.0", + "sonner": "^2.0.0" }, "devDependencies": { + "@axe-core/playwright": "^4.11.3", + "@playwright/test": "^1.58.2", "@tailwindcss/postcss": "^4", "@testing-library/jest-dom": "^6.9.1", "@testing-library/react": "^16.3.2", @@ -54,7 +56,6 @@ "jsdom": "^28.1.0", "tailwindcss": "^4", "typescript": "^5.9.3", - "@playwright/test": "^1.58.2", "vitest": "^4.0.18" } } diff --git a/web/playwright.config.ts b/web/playwright.config.ts index ec4f37f..df30ec0 100644 --- a/web/playwright.config.ts +++ b/web/playwright.config.ts @@ -1,5 +1,12 @@ import { defineConfig } from "@playwright/test"; +// Allow overriding the dev-server port via NOTELETT_WEB_PORT so contributors +// whose host already has port 3000 occupied (Grafana, another product's +// web app, etc.) can run E2E without port conflicts that would otherwise +// silently test against the wrong app. +const port = Number(process.env.NOTELETT_WEB_PORT ?? 3000); +const baseURL = `http://localhost:${port}`; + export default defineConfig({ testDir: "./e2e", fullyParallel: true, @@ -8,12 +15,12 @@ export default defineConfig({ workers: process.env.CI ? 1 : undefined, reporter: "html", use: { - baseURL: "http://localhost:3000", + baseURL, trace: "on-first-retry", }, webServer: { - command: "pnpm run dev", - url: "http://localhost:3000", + command: `PORT=${port} pnpm run dev`, + url: baseURL, reuseExistingServer: !process.env.CI, timeout: 120_000, },