chore: dev-stack switches, shared e2e harness, and desktop shell rules
- `LIVE_RELOAD=false npm run dev` keeps the renderer alive across a machine suspend; the reload client otherwise destroys the session under test. - `dev-peer.sh` plus a separate userdata dir runs a second local peer. - `tools/voice-probe.js` samples peer state and RTP counters from a live window, persisting to localStorage so a renderer reload cannot erase it. - e2e helpers for voice pairs, peer-role election, and a TURN relay. - Electron single-instance and dev-client-load decisions move into rules files with colocated specs.
This commit is contained in:
@@ -0,0 +1,19 @@
|
||||
# E2E summary
|
||||
|
||||
- Run: 2026-08-12T10:58:08Z → 2026-08-12T11:11:34Z UTC
|
||||
- **65 passed / 0 failed / 0 flaky / 0 timeouts**
|
||||
- Wall: ~13.4 min
|
||||
|
||||
## Errors
|
||||
|
||||
None.
|
||||
|
||||
## Soft signals (passed but slow)
|
||||
|
||||
- 128.2s — `voice/mixed-signal-config-voice.spec.ts` — 8 users with different signal configs can voice, mute, deafen, and chat concurrently
|
||||
- 125.1s — `voice/multi-signal-eight-user-voice.spec.ts` — keeps 8 users on 2 signal apis while voice, mute, and deafen stay consistent for 20+ seconds
|
||||
- 53.4s — `auth/user-session-data-isolation.spec.ts` — gives a new user a blank slate and restores only that user local data after account switches
|
||||
- 33.7s — `chat/chat-message-features.spec.ts` — shows per-server channel lists on first saved-server click
|
||||
- 30.3s — `chat/multi-client-chat-sync.spec.ts` — syncs messages between same-user devices and late-joining users after offline gaps
|
||||
|
||||
See `README.md` for full duration table.
|
||||
@@ -0,0 +1,152 @@
|
||||
# E2E Playwright run — emergency-fix baseline
|
||||
|
||||
- **Started (UTC):** 2026-08-12T10:58:08Z
|
||||
- **Finished (UTC):** 2026-08-12T11:11:34Z
|
||||
- **Wall duration:** 804.6s (~13.4 min)
|
||||
- **Command:** `npm run test:e2e -- --reporter=list --reporter=json`
|
||||
- **Result:** 65 passed, 0 failed, 0 flaky, 0 skipped
|
||||
|
||||
## Verdict
|
||||
|
||||
**No hard errors.** The suite completed green: 65/65 expected, 0 unexpected, 0 timeouts, 0 flakes.
|
||||
|
||||
There is nothing to triage as a failing assertion in this run. Slow cases below are the only signals worth watching if “timeouts shouldn’t happen / app should be fast.”
|
||||
|
||||
## Errors / failures
|
||||
|
||||
_None in this run._
|
||||
|
||||
Stale note: `test-results/.last-run.json` and `test-results/html-report/` still show an old July failure; this run overrode reporters with list+json and did not refresh those artifacts.
|
||||
|
||||
## Slow tests (≥30s) — soft concern
|
||||
|
||||
| Duration | File | Test |
|
||||
| --- | --- | --- |
|
||||
| 128.2s | `voice/mixed-signal-config-voice.spec.ts` | 8 users with different signal configs can voice, mute, deafen, and chat concurrently |
|
||||
| 125.1s | `voice/multi-signal-eight-user-voice.spec.ts` | keeps 8 users on 2 signal apis while voice, mute, and deafen stay consistent for 20+ seconds |
|
||||
| 53.4s | `auth/user-session-data-isolation.spec.ts` | gives a new user a blank slate and restores only that user local data after account switches |
|
||||
| 33.7s | `chat/chat-message-features.spec.ts` | shows per-server channel lists on first saved-server click |
|
||||
| 30.3s | `chat/multi-client-chat-sync.spec.ts` | syncs messages between same-user devices and late-joining users after offline gaps |
|
||||
|
||||
These passed, but they are the closest thing to “timeout risk” in a green suite. Multi-user voice specs dominate wall time.
|
||||
|
||||
## Per-file totals
|
||||
|
||||
| File | Tests | Total | Max |
|
||||
| --- | ---: | ---: | ---: |
|
||||
| `voice/mixed-signal-config-voice.spec.ts` | 1 | 128.2s | 128.2s |
|
||||
| `voice/multi-signal-eight-user-voice.spec.ts` | 1 | 125.1s | 125.1s |
|
||||
| `chat/chat-message-features.spec.ts` | 9 | 84.2s | 33.7s |
|
||||
| `auth/user-session-data-isolation.spec.ts` | 2 | 73.2s | 53.4s |
|
||||
| `screen-share/screen-share.spec.ts` | 3 | 49.8s | 23.4s |
|
||||
| `voice/direct-call.spec.ts` | 3 | 31.8s | 17.5s |
|
||||
| `chat/multi-client-chat-sync.spec.ts` | 1 | 30.3s | 30.3s |
|
||||
| `plugins/plugin-api-two-users.spec.ts` | 1 | 27.4s | 27.4s |
|
||||
| `chat/notifications.spec.ts` | 2 | 25.6s | 20.9s |
|
||||
| `voice/data-channel-recovery.spec.ts` | 2 | 22.1s | 12.1s |
|
||||
| `chat/profile-avatar-sync.spec.ts` | 2 | 21.5s | 11.9s |
|
||||
| `settings/connectivity-warning.spec.ts` | 1 | 21.3s | 21.3s |
|
||||
| `voice/voice-full-journey.spec.ts` | 1 | 21.1s | 21.1s |
|
||||
| `chat/server-icon-sync.spec.ts` | 1 | 14.2s | 14.2s |
|
||||
| `chat/dm-flow.spec.ts` | 3 | 11.8s | 4.0s |
|
||||
| `settings/stun-turn-fallback.spec.ts` | 1 | 11.5s | 11.5s |
|
||||
| `auth/login-return-url.spec.ts` | 3 | 9.4s | 3.5s |
|
||||
| `voice/dm-header-call-ring.spec.ts` | 2 | 9.1s | 4.8s |
|
||||
| `auth/multi-device-session.spec.ts` | 1 | 8.6s | 8.6s |
|
||||
| `chat/multi-device-attachment-sharing.spec.ts` | 2 | 8.6s | 4.3s |
|
||||
| `voice/voice-mute-state-reset.spec.ts` | 1 | 6.9s | 6.9s |
|
||||
| `servers/server-discovery-default.spec.ts` | 2 | 6.3s | 3.1s |
|
||||
| `settings/ice-server-settings.spec.ts` | 2 | 6.2s | 3.9s |
|
||||
| `chat/large-generic-file-transfer.spec.ts` | 1 | 5.7s | 5.7s |
|
||||
| `plugins/plugin-manager-ui.spec.ts` | 1 | 4.6s | 4.6s |
|
||||
| `chat/custom-emoji-user-binding.spec.ts` | 1 | 3.9s | 3.9s |
|
||||
| `auth/multi-signal-server-auth.spec.ts` | 1 | 3.8s | 3.8s |
|
||||
| `auth/offline-signal-server-no-login-loop.spec.ts` | 1 | 3.7s | 3.7s |
|
||||
| `chat/local-attachment-persistence.spec.ts` | 1 | 2.8s | 2.8s |
|
||||
| `chat/attachment-only-message-grouping.spec.ts` | 1 | 2.5s | 2.5s |
|
||||
| `mobile/mobile-login-on-startup.spec.ts` | 2 | 2.4s | 1.2s |
|
||||
| `chat/multi-image-gallery.spec.ts` | 1 | 2.3s | 2.3s |
|
||||
| `plugins/plugin-support-api.spec.ts` | 1 | 1.9s | 1.9s |
|
||||
| `mobile/mobile-settings-logout.spec.ts` | 1 | 1.7s | 1.7s |
|
||||
| `mobile/android-app-icon.spec.ts` | 6 | 0.0s | 0.0s |
|
||||
|
||||
## All tests by duration
|
||||
|
||||
| Duration | Status | File | Test |
|
||||
| --- | --- | --- | --- |
|
||||
| 128.2s | passed | `voice/mixed-signal-config-voice.spec.ts` | 8 users with different signal configs can voice, mute, deafen, and chat concurrently |
|
||||
| 125.1s | passed | `voice/multi-signal-eight-user-voice.spec.ts` | keeps 8 users on 2 signal apis while voice, mute, and deafen stay consistent for 20+ seconds |
|
||||
| 53.4s | passed | `auth/user-session-data-isolation.spec.ts` | gives a new user a blank slate and restores only that user local data after account switches |
|
||||
| 33.7s | passed | `chat/chat-message-features.spec.ts` | shows per-server channel lists on first saved-server click |
|
||||
| 30.3s | passed | `chat/multi-client-chat-sync.spec.ts` | syncs messages between same-user devices and late-joining users after offline gaps |
|
||||
| 27.4s | passed | `plugins/plugin-api-two-users.spec.ts` | runs chat, embed, soundboard, and profile APIs between two users |
|
||||
| 23.4s | passed | `screen-share/screen-share.spec.ts` | screen share connection stays stable for 10+ seconds |
|
||||
| 21.3s | passed | `settings/connectivity-warning.spec.ts` | shows warning icon when a peer loses all connections |
|
||||
| 21.1s | passed | `voice/voice-full-journey.spec.ts` | two users register, create server, join voice, and stay connected 10+ seconds with audio |
|
||||
| 20.9s | passed | `chat/notifications.spec.ts` | keeps unread badges visible when a muted channel suppresses desktop popups |
|
||||
| 19.7s | passed | `auth/user-session-data-isolation.spec.ts` | preserves a user saved rooms and local history across app restarts |
|
||||
| 19.6s | passed | `chat/chat-message-features.spec.ts` | syncs messages in a newly created text channel |
|
||||
| 17.5s | passed | `voice/direct-call.spec.ts` | two users can ring, answer, chat, see self voice indicators, and exchange audio |
|
||||
| 15.4s | passed | `screen-share/screen-share.spec.ts` | single user screen share: video and audio flow to receiver, voice audio continues |
|
||||
| 14.2s | passed | `chat/server-icon-sync.spec.ts` | loads the chat-server image for online, late-joining, restarted, and discovery users |
|
||||
| 12.1s | passed | `voice/data-channel-recovery.spec.ts` | heals a three-user voice mesh when one client loses every data channel |
|
||||
| 11.9s | passed | `chat/profile-avatar-sync.spec.ts` | syncs display name and description changes for online and late-joining users and persists after restart |
|
||||
| 11.5s | passed | `settings/stun-turn-fallback.spec.ts` | users with different ICE configs can voice chat together |
|
||||
| 11.1s | passed | `screen-share/screen-share.spec.ts` | multiple users screen share simultaneously |
|
||||
| 10.0s | passed | `voice/data-channel-recovery.spec.ts` | keeps two users hearing each other after a data-channel error and close |
|
||||
| 9.6s | passed | `chat/profile-avatar-sync.spec.ts` | syncs avatar changes for online and late-joining users and persists after restart |
|
||||
| 8.9s | passed | `voice/direct-call.spec.ts` | keeps private-call audio flowing after the data channel closes |
|
||||
| 8.6s | passed | `auth/multi-device-session.spec.ts` | covers identity, chat sync, typing exclusion, and voice exclusivity |
|
||||
| 6.9s | passed | `voice/voice-mute-state-reset.spec.ts` | clears stale mute state after abrupt disconnect and voice rejoin |
|
||||
| 5.7s | passed | `chat/large-generic-file-transfer.spec.ts` | browser receiver can request and download a generic file above the auto-save cap |
|
||||
| 5.5s | passed | `chat/chat-message-features.spec.ts` | edits and removes messages for both users |
|
||||
| 5.3s | passed | `voice/direct-call.spec.ts` | missing and ended private calls do not leave stale call controls behind |
|
||||
| 4.8s | passed | `voice/dm-header-call-ring.spec.ts` | callee homed on another signal server is notified when called via their provisioned actor id |
|
||||
| 4.8s | passed | `chat/notifications.spec.ts` | shows desktop notifications and unread badges for inactive channels |
|
||||
| 4.6s | passed | `chat/chat-message-features.spec.ts` | sends KLIPY GIF messages with mocked API responses |
|
||||
| 4.6s | passed | `plugins/plugin-manager-ui.spec.ts` | installs, grants, activates, and logs an all-API test plugin |
|
||||
| 4.4s | passed | `chat/chat-message-features.spec.ts` | syncs image and file attachments between users |
|
||||
| 4.4s | passed | `chat/chat-message-features.spec.ts` | syncs multi-chunk image attachments byte-identical between users |
|
||||
| 4.3s | passed | `chat/multi-device-attachment-sharing.spec.ts` | only the uploading device claims "Shared from your device"; the second same-user device can request it |
|
||||
| 4.3s | passed | `chat/chat-message-features.spec.ts` | renders link embeds for shared links |
|
||||
| 4.3s | passed | `chat/multi-device-attachment-sharing.spec.ts` | relays file-announce metadata to a sibling device that is already online during upload |
|
||||
| 4.2s | passed | `voice/dm-header-call-ring.spec.ts` | callee is notified when the caller starts the call from the DM chat header |
|
||||
| 4.1s | passed | `chat/chat-message-features.spec.ts` | shows typing indicators to other users |
|
||||
| 4.0s | passed | `chat/dm-flow.spec.ts` | delivers a live DM to the recipient conversation |
|
||||
| 3.9s | passed | `chat/custom-emoji-user-binding.spec.ts` | a second user on the same client does not inherit the first user library |
|
||||
| 3.9s | passed | `chat/dm-flow.spec.ts` | opens a DM from a user card and queues messages while offline |
|
||||
| 3.9s | passed | `settings/ice-server-settings.spec.ts` | allows adding, removing, and reordering ICE servers |
|
||||
| 3.8s | passed | `chat/dm-flow.spec.ts` | shows friend and message actions on the search people list |
|
||||
| 3.8s | passed | `auth/multi-signal-server-auth.spec.ts` | auto-provisions a foreign signal server when a new endpoint is added |
|
||||
| 3.7s | passed | `auth/offline-signal-server-no-login-loop.spec.ts` | does not redirect to authorize login after a foreign server goes offline |
|
||||
| 3.6s | passed | `chat/chat-message-features.spec.ts` | shows local room history on first saved-server click |
|
||||
| 3.5s | passed | `auth/login-return-url.spec.ts` | unwraps nested login returnUrl chains after successful login |
|
||||
| 3.1s | passed | `servers/server-discovery-default.spec.ts` | a fresh account sees public servers in Popular Servers without searching |
|
||||
| 3.1s | passed | `servers/server-discovery-default.spec.ts` | discovery falls back to the public listing when featured/trending routes 404 |
|
||||
| 3.1s | passed | `auth/login-return-url.spec.ts` | redirects unauthenticated /servers visits to login and returns there after login |
|
||||
| 2.8s | passed | `auth/login-return-url.spec.ts` | lets a returning user log back in after an expired session redirect |
|
||||
| 2.8s | passed | `chat/local-attachment-persistence.spec.ts` | remembers sent image and file across a page reload with no peer connected |
|
||||
| 2.5s | passed | `chat/attachment-only-message-grouping.spec.ts` | each caption-less attachment keeps its own message bubble and preview |
|
||||
| 2.3s | passed | `settings/ice-server-settings.spec.ts` | validates TURN entries require credentials |
|
||||
| 2.3s | passed | `chat/multi-image-gallery.spec.ts` | groups three images in one message bubble with a visible grid |
|
||||
| 1.9s | passed | `plugins/plugin-support-api.spec.ts` | covers plugin requirement, event, data, and websocket APIs with the fixture plugin |
|
||||
| 1.7s | passed | `mobile/mobile-settings-logout.spec.ts` | exposes logout in the settings menu on mobile viewports |
|
||||
| 1.2s | passed | `mobile/mobile-login-on-startup.spec.ts` | greets a signed-out mobile visitor on /dashboard with the login screen |
|
||||
| 1.2s | passed | `mobile/mobile-login-on-startup.spec.ts` | greets a signed-out mobile visitor on the app root with the login screen |
|
||||
| 0.0s | passed | `mobile/android-app-icon.spec.ts` | renders the brand mark (white cat on a purple disc) in the launcher bitmap |
|
||||
| 0.0s | passed | `mobile/android-app-icon.spec.ts` | renders the splash art as the brand mark centred on a purple field |
|
||||
| 0.0s | passed | `mobile/android-app-icon.spec.ts` | insets the adaptive foreground so launcher masks do not clip the cat face |
|
||||
| 0.0s | passed | `mobile/android-app-icon.spec.ts` | replaces every stock Capacitor placeholder with the brand asset |
|
||||
| 0.0s | passed | `mobile/android-app-icon.spec.ts` | ships a launcher icon and splash for every required density |
|
||||
| 0.0s | passed | `mobile/android-app-icon.spec.ts` | uses the brand purple as the adaptive-icon background |
|
||||
|
||||
## Files in this folder
|
||||
|
||||
| Path | Purpose |
|
||||
| --- | --- |
|
||||
| `README.md` | This summary |
|
||||
| `00-summary.md` | Short status for handoff/skimming |
|
||||
| `slow-tests.md` | Slow-test detail only |
|
||||
| `parsed-report.json` | Machine-readable extract |
|
||||
| `full-run.log` | Raw Playwright JSON report (+ npm banner) |
|
||||
| `run-started.txt` / `run-finished.txt` | UTC timestamps |
|
||||
File diff suppressed because one or more lines are too long
@@ -0,0 +1,516 @@
|
||||
{
|
||||
"stats": {
|
||||
"startTime": "2026-08-12T10:58:09.830Z",
|
||||
"duration": 804598.4550000001,
|
||||
"expected": 65,
|
||||
"skipped": 0,
|
||||
"unexpected": 0,
|
||||
"flaky": 0
|
||||
},
|
||||
"failures": [],
|
||||
"timeouts": [],
|
||||
"slow": [
|
||||
{
|
||||
"title": "8 users with different signal configs can voice, mute, deafen, and chat concurrently",
|
||||
"file": "voice/mixed-signal-config-voice.spec.ts",
|
||||
"status": "passed",
|
||||
"duration": 128215,
|
||||
"error": null,
|
||||
"errors": [],
|
||||
"timeoutHint": false
|
||||
},
|
||||
{
|
||||
"title": "keeps 8 users on 2 signal apis while voice, mute, and deafen stay consistent for 20+ seconds",
|
||||
"file": "voice/multi-signal-eight-user-voice.spec.ts",
|
||||
"status": "passed",
|
||||
"duration": 125136,
|
||||
"error": null,
|
||||
"errors": [],
|
||||
"timeoutHint": false
|
||||
},
|
||||
{
|
||||
"title": "gives a new user a blank slate and restores only that user local data after account switches",
|
||||
"file": "auth/user-session-data-isolation.spec.ts",
|
||||
"status": "passed",
|
||||
"duration": 53448,
|
||||
"error": null,
|
||||
"errors": [],
|
||||
"timeoutHint": false
|
||||
},
|
||||
{
|
||||
"title": "shows per-server channel lists on first saved-server click",
|
||||
"file": "chat/chat-message-features.spec.ts",
|
||||
"status": "passed",
|
||||
"duration": 33665,
|
||||
"error": null,
|
||||
"errors": [],
|
||||
"timeoutHint": false
|
||||
},
|
||||
{
|
||||
"title": "syncs messages between same-user devices and late-joining users after offline gaps",
|
||||
"file": "chat/multi-client-chat-sync.spec.ts",
|
||||
"status": "passed",
|
||||
"duration": 30290,
|
||||
"error": null,
|
||||
"errors": [],
|
||||
"timeoutHint": false
|
||||
}
|
||||
],
|
||||
"all": [
|
||||
{
|
||||
"title": "unwraps nested login returnUrl chains after successful login",
|
||||
"file": "auth/login-return-url.spec.ts",
|
||||
"status": "passed",
|
||||
"duration": 3506,
|
||||
"timeoutHint": false
|
||||
},
|
||||
{
|
||||
"title": "redirects unauthenticated /servers visits to login and returns there after login",
|
||||
"file": "auth/login-return-url.spec.ts",
|
||||
"status": "passed",
|
||||
"duration": 3088,
|
||||
"timeoutHint": false
|
||||
},
|
||||
{
|
||||
"title": "lets a returning user log back in after an expired session redirect",
|
||||
"file": "auth/login-return-url.spec.ts",
|
||||
"status": "passed",
|
||||
"duration": 2811,
|
||||
"timeoutHint": false
|
||||
},
|
||||
{
|
||||
"title": "covers identity, chat sync, typing exclusion, and voice exclusivity",
|
||||
"file": "auth/multi-device-session.spec.ts",
|
||||
"status": "passed",
|
||||
"duration": 8640,
|
||||
"timeoutHint": false
|
||||
},
|
||||
{
|
||||
"title": "auto-provisions a foreign signal server when a new endpoint is added",
|
||||
"file": "auth/multi-signal-server-auth.spec.ts",
|
||||
"status": "passed",
|
||||
"duration": 3836,
|
||||
"timeoutHint": false
|
||||
},
|
||||
{
|
||||
"title": "does not redirect to authorize login after a foreign server goes offline",
|
||||
"file": "auth/offline-signal-server-no-login-loop.spec.ts",
|
||||
"status": "passed",
|
||||
"duration": 3727,
|
||||
"timeoutHint": false
|
||||
},
|
||||
{
|
||||
"title": "preserves a user saved rooms and local history across app restarts",
|
||||
"file": "auth/user-session-data-isolation.spec.ts",
|
||||
"status": "passed",
|
||||
"duration": 19725,
|
||||
"timeoutHint": false
|
||||
},
|
||||
{
|
||||
"title": "gives a new user a blank slate and restores only that user local data after account switches",
|
||||
"file": "auth/user-session-data-isolation.spec.ts",
|
||||
"status": "passed",
|
||||
"duration": 53448,
|
||||
"timeoutHint": false
|
||||
},
|
||||
{
|
||||
"title": "each caption-less attachment keeps its own message bubble and preview",
|
||||
"file": "chat/attachment-only-message-grouping.spec.ts",
|
||||
"status": "passed",
|
||||
"duration": 2507,
|
||||
"timeoutHint": false
|
||||
},
|
||||
{
|
||||
"title": "shows per-server channel lists on first saved-server click",
|
||||
"file": "chat/chat-message-features.spec.ts",
|
||||
"status": "passed",
|
||||
"duration": 33665,
|
||||
"timeoutHint": false
|
||||
},
|
||||
{
|
||||
"title": "shows local room history on first saved-server click",
|
||||
"file": "chat/chat-message-features.spec.ts",
|
||||
"status": "passed",
|
||||
"duration": 3598,
|
||||
"timeoutHint": false
|
||||
},
|
||||
{
|
||||
"title": "syncs messages in a newly created text channel",
|
||||
"file": "chat/chat-message-features.spec.ts",
|
||||
"status": "passed",
|
||||
"duration": 19613,
|
||||
"timeoutHint": false
|
||||
},
|
||||
{
|
||||
"title": "shows typing indicators to other users",
|
||||
"file": "chat/chat-message-features.spec.ts",
|
||||
"status": "passed",
|
||||
"duration": 4090,
|
||||
"timeoutHint": false
|
||||
},
|
||||
{
|
||||
"title": "edits and removes messages for both users",
|
||||
"file": "chat/chat-message-features.spec.ts",
|
||||
"status": "passed",
|
||||
"duration": 5534,
|
||||
"timeoutHint": false
|
||||
},
|
||||
{
|
||||
"title": "syncs image and file attachments between users",
|
||||
"file": "chat/chat-message-features.spec.ts",
|
||||
"status": "passed",
|
||||
"duration": 4442,
|
||||
"timeoutHint": false
|
||||
},
|
||||
{
|
||||
"title": "syncs multi-chunk image attachments byte-identical between users",
|
||||
"file": "chat/chat-message-features.spec.ts",
|
||||
"status": "passed",
|
||||
"duration": 4369,
|
||||
"timeoutHint": false
|
||||
},
|
||||
{
|
||||
"title": "renders link embeds for shared links",
|
||||
"file": "chat/chat-message-features.spec.ts",
|
||||
"status": "passed",
|
||||
"duration": 4303,
|
||||
"timeoutHint": false
|
||||
},
|
||||
{
|
||||
"title": "sends KLIPY GIF messages with mocked API responses",
|
||||
"file": "chat/chat-message-features.spec.ts",
|
||||
"status": "passed",
|
||||
"duration": 4610,
|
||||
"timeoutHint": false
|
||||
},
|
||||
{
|
||||
"title": "a second user on the same client does not inherit the first user library",
|
||||
"file": "chat/custom-emoji-user-binding.spec.ts",
|
||||
"status": "passed",
|
||||
"duration": 3929,
|
||||
"timeoutHint": false
|
||||
},
|
||||
{
|
||||
"title": "opens a DM from a user card and queues messages while offline",
|
||||
"file": "chat/dm-flow.spec.ts",
|
||||
"status": "passed",
|
||||
"duration": 3882,
|
||||
"timeoutHint": false
|
||||
},
|
||||
{
|
||||
"title": "delivers a live DM to the recipient conversation",
|
||||
"file": "chat/dm-flow.spec.ts",
|
||||
"status": "passed",
|
||||
"duration": 4024,
|
||||
"timeoutHint": false
|
||||
},
|
||||
{
|
||||
"title": "shows friend and message actions on the search people list",
|
||||
"file": "chat/dm-flow.spec.ts",
|
||||
"status": "passed",
|
||||
"duration": 3849,
|
||||
"timeoutHint": false
|
||||
},
|
||||
{
|
||||
"title": "browser receiver can request and download a generic file above the auto-save cap",
|
||||
"file": "chat/large-generic-file-transfer.spec.ts",
|
||||
"status": "passed",
|
||||
"duration": 5690,
|
||||
"timeoutHint": false
|
||||
},
|
||||
{
|
||||
"title": "remembers sent image and file across a page reload with no peer connected",
|
||||
"file": "chat/local-attachment-persistence.spec.ts",
|
||||
"status": "passed",
|
||||
"duration": 2793,
|
||||
"timeoutHint": false
|
||||
},
|
||||
{
|
||||
"title": "syncs messages between same-user devices and late-joining users after offline gaps",
|
||||
"file": "chat/multi-client-chat-sync.spec.ts",
|
||||
"status": "passed",
|
||||
"duration": 30290,
|
||||
"timeoutHint": false
|
||||
},
|
||||
{
|
||||
"title": "only the uploading device claims \"Shared from your device\"; the second same-user device can request it",
|
||||
"file": "chat/multi-device-attachment-sharing.spec.ts",
|
||||
"status": "passed",
|
||||
"duration": 4333,
|
||||
"timeoutHint": false
|
||||
},
|
||||
{
|
||||
"title": "relays file-announce metadata to a sibling device that is already online during upload",
|
||||
"file": "chat/multi-device-attachment-sharing.spec.ts",
|
||||
"status": "passed",
|
||||
"duration": 4266,
|
||||
"timeoutHint": false
|
||||
},
|
||||
{
|
||||
"title": "groups three images in one message bubble with a visible grid",
|
||||
"file": "chat/multi-image-gallery.spec.ts",
|
||||
"status": "passed",
|
||||
"duration": 2294,
|
||||
"timeoutHint": false
|
||||
},
|
||||
{
|
||||
"title": "shows desktop notifications and unread badges for inactive channels",
|
||||
"file": "chat/notifications.spec.ts",
|
||||
"status": "passed",
|
||||
"duration": 4758,
|
||||
"timeoutHint": false
|
||||
},
|
||||
{
|
||||
"title": "keeps unread badges visible when a muted channel suppresses desktop popups",
|
||||
"file": "chat/notifications.spec.ts",
|
||||
"status": "passed",
|
||||
"duration": 20875,
|
||||
"timeoutHint": false
|
||||
},
|
||||
{
|
||||
"title": "syncs avatar changes for online and late-joining users and persists after restart",
|
||||
"file": "chat/profile-avatar-sync.spec.ts",
|
||||
"status": "passed",
|
||||
"duration": 9605,
|
||||
"timeoutHint": false
|
||||
},
|
||||
{
|
||||
"title": "syncs display name and description changes for online and late-joining users and persists after restart",
|
||||
"file": "chat/profile-avatar-sync.spec.ts",
|
||||
"status": "passed",
|
||||
"duration": 11864,
|
||||
"timeoutHint": false
|
||||
},
|
||||
{
|
||||
"title": "loads the chat-server image for online, late-joining, restarted, and discovery users",
|
||||
"file": "chat/server-icon-sync.spec.ts",
|
||||
"status": "passed",
|
||||
"duration": 14204,
|
||||
"timeoutHint": false
|
||||
},
|
||||
{
|
||||
"title": "ships a launcher icon and splash for every required density",
|
||||
"file": "mobile/android-app-icon.spec.ts",
|
||||
"status": "passed",
|
||||
"duration": 1,
|
||||
"timeoutHint": false
|
||||
},
|
||||
{
|
||||
"title": "replaces every stock Capacitor placeholder with the brand asset",
|
||||
"file": "mobile/android-app-icon.spec.ts",
|
||||
"status": "passed",
|
||||
"duration": 2,
|
||||
"timeoutHint": false
|
||||
},
|
||||
{
|
||||
"title": "uses the brand purple as the adaptive-icon background",
|
||||
"file": "mobile/android-app-icon.spec.ts",
|
||||
"status": "passed",
|
||||
"duration": 1,
|
||||
"timeoutHint": false
|
||||
},
|
||||
{
|
||||
"title": "renders the brand mark (white cat on a purple disc) in the launcher bitmap",
|
||||
"file": "mobile/android-app-icon.spec.ts",
|
||||
"status": "passed",
|
||||
"duration": 13,
|
||||
"timeoutHint": false
|
||||
},
|
||||
{
|
||||
"title": "renders the splash art as the brand mark centred on a purple field",
|
||||
"file": "mobile/android-app-icon.spec.ts",
|
||||
"status": "passed",
|
||||
"duration": 7,
|
||||
"timeoutHint": false
|
||||
},
|
||||
{
|
||||
"title": "insets the adaptive foreground so launcher masks do not clip the cat face",
|
||||
"file": "mobile/android-app-icon.spec.ts",
|
||||
"status": "passed",
|
||||
"duration": 3,
|
||||
"timeoutHint": false
|
||||
},
|
||||
{
|
||||
"title": "greets a signed-out mobile visitor on /dashboard with the login screen",
|
||||
"file": "mobile/mobile-login-on-startup.spec.ts",
|
||||
"status": "passed",
|
||||
"duration": 1217,
|
||||
"timeoutHint": false
|
||||
},
|
||||
{
|
||||
"title": "greets a signed-out mobile visitor on the app root with the login screen",
|
||||
"file": "mobile/mobile-login-on-startup.spec.ts",
|
||||
"status": "passed",
|
||||
"duration": 1181,
|
||||
"timeoutHint": false
|
||||
},
|
||||
{
|
||||
"title": "exposes logout in the settings menu on mobile viewports",
|
||||
"file": "mobile/mobile-settings-logout.spec.ts",
|
||||
"status": "passed",
|
||||
"duration": 1704,
|
||||
"timeoutHint": false
|
||||
},
|
||||
{
|
||||
"title": "runs chat, embed, soundboard, and profile APIs between two users",
|
||||
"file": "plugins/plugin-api-two-users.spec.ts",
|
||||
"status": "passed",
|
||||
"duration": 27382,
|
||||
"timeoutHint": false
|
||||
},
|
||||
{
|
||||
"title": "installs, grants, activates, and logs an all-API test plugin",
|
||||
"file": "plugins/plugin-manager-ui.spec.ts",
|
||||
"status": "passed",
|
||||
"duration": 4564,
|
||||
"timeoutHint": false
|
||||
},
|
||||
{
|
||||
"title": "covers plugin requirement, event, data, and websocket APIs with the fixture plugin",
|
||||
"file": "plugins/plugin-support-api.spec.ts",
|
||||
"status": "passed",
|
||||
"duration": 1913,
|
||||
"timeoutHint": false
|
||||
},
|
||||
{
|
||||
"title": "single user screen share: video and audio flow to receiver, voice audio continues",
|
||||
"file": "screen-share/screen-share.spec.ts",
|
||||
"status": "passed",
|
||||
"duration": 15375,
|
||||
"timeoutHint": false
|
||||
},
|
||||
{
|
||||
"title": "multiple users screen share simultaneously",
|
||||
"file": "screen-share/screen-share.spec.ts",
|
||||
"status": "passed",
|
||||
"duration": 11093,
|
||||
"timeoutHint": false
|
||||
},
|
||||
{
|
||||
"title": "screen share connection stays stable for 10+ seconds",
|
||||
"file": "screen-share/screen-share.spec.ts",
|
||||
"status": "passed",
|
||||
"duration": 23371,
|
||||
"timeoutHint": false
|
||||
},
|
||||
{
|
||||
"title": "a fresh account sees public servers in Popular Servers without searching",
|
||||
"file": "servers/server-discovery-default.spec.ts",
|
||||
"status": "passed",
|
||||
"duration": 3149,
|
||||
"timeoutHint": false
|
||||
},
|
||||
{
|
||||
"title": "discovery falls back to the public listing when featured/trending routes 404",
|
||||
"file": "servers/server-discovery-default.spec.ts",
|
||||
"status": "passed",
|
||||
"duration": 3110,
|
||||
"timeoutHint": false
|
||||
},
|
||||
{
|
||||
"title": "shows warning icon when a peer loses all connections",
|
||||
"file": "settings/connectivity-warning.spec.ts",
|
||||
"status": "passed",
|
||||
"duration": 21313,
|
||||
"timeoutHint": false
|
||||
},
|
||||
{
|
||||
"title": "allows adding, removing, and reordering ICE servers",
|
||||
"file": "settings/ice-server-settings.spec.ts",
|
||||
"status": "passed",
|
||||
"duration": 3855,
|
||||
"timeoutHint": false
|
||||
},
|
||||
{
|
||||
"title": "validates TURN entries require credentials",
|
||||
"file": "settings/ice-server-settings.spec.ts",
|
||||
"status": "passed",
|
||||
"duration": 2311,
|
||||
"timeoutHint": false
|
||||
},
|
||||
{
|
||||
"title": "users with different ICE configs can voice chat together",
|
||||
"file": "settings/stun-turn-fallback.spec.ts",
|
||||
"status": "passed",
|
||||
"duration": 11549,
|
||||
"timeoutHint": false
|
||||
},
|
||||
{
|
||||
"title": "keeps two users hearing each other after a data-channel error and close",
|
||||
"file": "voice/data-channel-recovery.spec.ts",
|
||||
"status": "passed",
|
||||
"duration": 10035,
|
||||
"timeoutHint": false
|
||||
},
|
||||
{
|
||||
"title": "heals a three-user voice mesh when one client loses every data channel",
|
||||
"file": "voice/data-channel-recovery.spec.ts",
|
||||
"status": "passed",
|
||||
"duration": 12070,
|
||||
"timeoutHint": false
|
||||
},
|
||||
{
|
||||
"title": "two users can ring, answer, chat, see self voice indicators, and exchange audio",
|
||||
"file": "voice/direct-call.spec.ts",
|
||||
"status": "passed",
|
||||
"duration": 17480,
|
||||
"timeoutHint": false
|
||||
},
|
||||
{
|
||||
"title": "keeps private-call audio flowing after the data channel closes",
|
||||
"file": "voice/direct-call.spec.ts",
|
||||
"status": "passed",
|
||||
"duration": 8950,
|
||||
"timeoutHint": false
|
||||
},
|
||||
{
|
||||
"title": "missing and ended private calls do not leave stale call controls behind",
|
||||
"file": "voice/direct-call.spec.ts",
|
||||
"status": "passed",
|
||||
"duration": 5345,
|
||||
"timeoutHint": false
|
||||
},
|
||||
{
|
||||
"title": "callee is notified when the caller starts the call from the DM chat header",
|
||||
"file": "voice/dm-header-call-ring.spec.ts",
|
||||
"status": "passed",
|
||||
"duration": 4235,
|
||||
"timeoutHint": false
|
||||
},
|
||||
{
|
||||
"title": "callee homed on another signal server is notified when called via their provisioned actor id",
|
||||
"file": "voice/dm-header-call-ring.spec.ts",
|
||||
"status": "passed",
|
||||
"duration": 4815,
|
||||
"timeoutHint": false
|
||||
},
|
||||
{
|
||||
"title": "8 users with different signal configs can voice, mute, deafen, and chat concurrently",
|
||||
"file": "voice/mixed-signal-config-voice.spec.ts",
|
||||
"status": "passed",
|
||||
"duration": 128215,
|
||||
"timeoutHint": false
|
||||
},
|
||||
{
|
||||
"title": "keeps 8 users on 2 signal apis while voice, mute, and deafen stay consistent for 20+ seconds",
|
||||
"file": "voice/multi-signal-eight-user-voice.spec.ts",
|
||||
"status": "passed",
|
||||
"duration": 125136,
|
||||
"timeoutHint": false
|
||||
},
|
||||
{
|
||||
"title": "two users register, create server, join voice, and stay connected 10+ seconds with audio",
|
||||
"file": "voice/voice-full-journey.spec.ts",
|
||||
"status": "passed",
|
||||
"duration": 21107,
|
||||
"timeoutHint": false
|
||||
},
|
||||
{
|
||||
"title": "clears stale mute state after abrupt disconnect and voice rejoin",
|
||||
"file": "voice/voice-mute-state-reset.spec.ts",
|
||||
"status": "passed",
|
||||
"duration": 6888,
|
||||
"timeoutHint": false
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
2026-08-12T11:11:34Z
|
||||
@@ -0,0 +1 @@
|
||||
2026-08-12T10:58:08Z
|
||||
@@ -0,0 +1,17 @@
|
||||
# Slow E2E tests (≥30s)
|
||||
|
||||
All of these **passed**. Listed because the product ask is that timeouts should not happen and the app should stay fast.
|
||||
|
||||
| Duration | File | Test |
|
||||
| --- | --- | --- |
|
||||
| 128.2s | `voice/mixed-signal-config-voice.spec.ts` | 8 users with different signal configs can voice, mute, deafen, and chat concurrently |
|
||||
| 125.1s | `voice/multi-signal-eight-user-voice.spec.ts` | keeps 8 users on 2 signal apis while voice, mute, and deafen stay consistent for 20+ seconds |
|
||||
| 53.4s | `auth/user-session-data-isolation.spec.ts` | gives a new user a blank slate and restores only that user local data after account switches |
|
||||
| 33.7s | `chat/chat-message-features.spec.ts` | shows per-server channel lists on first saved-server click |
|
||||
| 30.3s | `chat/multi-client-chat-sync.spec.ts` | syncs messages between same-user devices and late-joining users after offline gaps |
|
||||
|
||||
## Notes
|
||||
|
||||
- `mixed-signal-config-voice` and `multi-signal-eight-user-voice` are intentionally heavy (8 users / multi-signal). ~2 minutes each is suite design cost more than a single-user app hang.
|
||||
- `user-session-data-isolation` (~53s) and channel/chat sync (~30–34s) are closer to “app feels slow” candidates if they regress upward.
|
||||
- Playwright config `timeout` is 90s per test; none of the failures/timeouts hit that ceiling in this run.
|
||||
Reference in New Issue
Block a user