Conversation
Add subtle row highlight when hovering the add-cue (+) button in the cue editor, clarifying which line the new cue will be attached to. Applied to both Vue 2 and Vue 3 clients for parity. Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
* Add comprehensive Playwright E2E test suite for V3 UI 148 serial tests across 14 spec files covering every user-facing workflow in the Vue 3 frontend: authentication, system config (shows, users, RBAC, settings, backups), all show-config tabs (acts/scenes, characters, stage/props, cues, microphone allocations, script editing, revisions, sessions), and live show operation. Includes GitHub Actions workflow, global setup/teardown that starts a clean backend server, Playwright config with chromium/firefox projects, and targeted fixes for BVN v-show DOM persistence, modal stacking, and MicAllocations onMounted timing. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * Fix CI failures: Prettier formatting, Vitest e2e exclusion, upload-artifact v4 - Run Prettier on 5 e2e spec files that had formatting violations - Exclude e2e/** from Vitest so Playwright spec files are not picked up by the unit test runner (test.describe.configure() is Playwright-only) - Upgrade actions/upload-artifact from v3 (deprecated) to v4 in the Playwright workflow Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * Fix CI: lazy-tab timeouts in spec 03, upgrade deprecated GHA actions - Add 10s timeouts to three toBeVisible() assertions in spec 03 that follow lazy BTabs switches (Users, Settings, Logs tabs in ConfigView) — default 5s wasn't enough on Ubuntu CI runners - Upgrade actions/checkout, setup-python, setup-node from v3/v4 to v4/v5/v4 to avoid Node.js 20 deprecation warnings and future breakage Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * Add README documentation for client-v3 and E2E test suite Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> --------- Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
The SHOW_CHANGED WS handler calls window.location.reload() after a show is loaded. On slow CI runners this reload arrives after the test 'creates and loads a show via Save and Load' has already completed, causing the subsequent 'opens New User modal' test to fail with 'Target page, context or browser has been closed' when the reload fires mid-click. Fix by listening for the load event before clicking 'Save and Load' so the test waits for the reload regardless of when SHOW_CHANGED arrives. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Client V3 Test Results23 tests 23 ✅ 0s ⏱️ Results for commit c4a3aaf. ♻️ This comment has been updated with latest results. |
Client Test Results128 tests 128 ✅ 0s ⏱️ Results for commit c4a3aaf. ♻️ This comment has been updated with latest results. |
Python Test Results 1 files 1 suites 1m 34s ⏱️ Results for commit c4a3aaf. ♻️ This comment has been updated with latest results. |
Playwright E2E Results (chromium)148 tests 148 ✅ 1m 20s ⏱️ Results for commit c4a3aaf. ♻️ This comment has been updated with latest results. |
Playwright E2E Results (firefox)148 tests 148 ✅ 1m 27s ⏱️ Results for commit c4a3aaf. ♻️ This comment has been updated with latest results. |
…e-login (#1086) * Fix JWT token uniqueness to prevent revoked token collision PyJWT tokens created within the same UTC second for the same user produce identical byte strings (same user_id, token_version, iat, exp). When a logout revoked token T1 and a subsequent re-login created T2 within the same second, T2 === T1 causing is_token_revoked() to return true and trigger WS_AUTH_ERROR → logout on the newly authenticated session. Fix: add a unique jti (UUID) claim to every created token so tokens are always distinct regardless of timing. Also fix revoke_token() which incorrectly read exp from the JWT *header* (where it doesn't exist → always -1), preventing expired tokens from ever being purged from the in-memory revocation dict. Now reads exp from the payload via an unverified decode. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * Fix python formatting --------- Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-authored-by: Copilot Autofix powered by AI <223894421+github-code-quality[bot]@users.noreply.github.com>
Updates the requirements on [sqlalchemy](https://github.com/sqlalchemy/sqlalchemy) to permit the latest version. - [Release notes](https://github.com/sqlalchemy/sqlalchemy/releases) - [Changelog](https://github.com/sqlalchemy/sqlalchemy/blob/main/CHANGES.rst) - [Commits](https://github.com/sqlalchemy/sqlalchemy/commits) --- updated-dependencies: - dependency-name: sqlalchemy dependency-version: 2.0.50 dependency-type: direct:production ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
* Add E2E retry support with SQLite snapshot/restore and bail-on-failure
Enables Playwright retries (3 attempts) for the E2E suite while preserving
the serial, state-dependent nature of the 14 specs. On retry, the backend
server is killed, both the SQLite DB and settings JSON are restored from
the last known-good snapshot, and the server is restarted before the spec
group re-runs. maxFailures: 1 ensures downstream specs are skipped
immediately once a spec exhausts all retries, preventing meaningless
results from running against incomplete state.
- Add e2e/db-snapshot.ts: snapshotState(), snapshotExists(),
restoreStateAndRestartServer()
- Export SERVER_PORT and waitForServer from global-setup.ts for reuse
- Set retries: 3 and maxFailures: 1 in playwright.config.ts
- Add beforeAll (restore on retry) and afterEach (snapshot on pass)
hooks to all 14 spec files
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* Fix no-empty-pattern lint errors in E2E retry hooks
Replace ({}, testInfo) with (_fixtures, testInfo) in the beforeAll/afterEach
hooks added to all 14 spec files. Empty destructuring patterns are
disallowed by the no-empty-pattern ESLint rule.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* Use test.info() instead of testInfo parameter in retry hooks
Playwright requires the first argument of beforeAll/afterEach to use
object destructuring syntax — a plain identifier causes a fixture
parser error. Using test.info() as a static accessor avoids the
parameter entirely, satisfying both Playwright and the no-empty-pattern
ESLint rule.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* Refactor retry hooks into registerRetryHooks() to eliminate duplication
Extract the beforeAll/afterEach retry logic from all 14 spec files into
a single registerRetryHooks() function in db-snapshot.ts. Each spec now
calls registerRetryHooks() instead of repeating the 10-line hook block,
reducing ~140 duplicated lines to one call site per spec.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
---------
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
…ry cascade (#1088) Two related issues: 1. In "can configure RBAC permissions for testuser", Firefox kept the "Revoked role from user" v-toast visible long enough to intercept pointer events to the modal's .btn-close, causing a 30s timeout. Fix: wait for .v-toast to detach before clicking the close button. 2. The original rolling-checkpoint snapshot strategy had a cascade bug: when test N passes (e.g. creates testuser) then test N+1 fails, the retry restores to the post-N snapshot and re-runs all tests — but test N hits its own prior side effect (duplicate username) and fails. Redesign: switch from rolling-checkpoint to spec-start snapshots. Each spec captures the DB state at its beginning (beforeAll, retry=0). On retry, restore from that spec-start so every test in the spec runs against a clean baseline with none of its own previous side effects. Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
|


No description provided.