Repository navigation
Conversation
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01EfCGEM9KbXgoMSJDq2fX7j
The logout e2e test failed in full runs: a response to a request sent before the logout (e.g. a slow thumbnail) sets the session cookie again and logs the user back in. The test now waits for the pending API requests before logging out; a red test reproduces the bug. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01EfCGEM9KbXgoMSJDq2fX7j
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01EfCGEM9KbXgoMSJDq2fX7j
E2E: a restricted user's deep link to a hidden folder falls back to the root like a missing folder, but without the warning toast (red). FE: every sorting and grouping option with accented names; grouping by name splits the A group at accented letters (red). The grid renders more rows on scroll. The flatten search also matches sibling folders that start with the same name (red). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01EfCGEM9KbXgoMSJDq2fX7j
E2E: a search deep link with ?p= opens the lightbox on that photo; a link that is not a query object is searched as text; an unknown search type shows a server error instead of "This search link is broken" (red). FE: text <-> query round trips with non-ASCII text; the parser collapses the double space of a folder name (red). Autocomplete suggestions. BE: accent-insensitive text search works on MySQL, not on SQLite (red). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01EfCGEM9KbXgoMSJDq2fX7j
E2E: a video that fails to load (404) shows the error message. FE: paging with the arrow keys and buttons stops at the first and last photo and wraps with loop on; the next button of the last photo with loop on still shows the normal next icon instead of ionRepeatOutline (red). Zoom limits, pan bounds and the zoom reset on the next photo; face boxes and captions follow their settings; FullScreenService toggles. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01EfCGEM9KbXgoMSJDq2fX7j
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01EfCGEM9KbXgoMSJDq2fX7j
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01EfCGEM9KbXgoMSJDq2fX7j
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01EfCGEM9KbXgoMSJDq2fX7j
BE UploadRouter: a name clash is rejected per file and keeps the existing file; a user below the minimum upload role is refused (red: 401 instead of 403); Upload.maxFileSizeMB defaults to 50 and a larger file is rejected per file with the limit in the message (red: no such setting). FE UploaderService: server errors per file with a partial success, the upload is not offered below the minimum role; red: the unsupported file is not named, no client side size limit, no "Can't save to this folder" message, no retry for a dropped connection. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01EfCGEM9KbXgoMSJDq2fX7j
E2E: admin page sanity test, a normal user doesn't get /admin (red: lands on /login without a toast, the admin API answers 401 instead of 403). New `admin-config` Playwright project that runs after the others: a toggled setting persists, an invalid setting shows an error and nothing of that save is kept (red: the error is not inline on the field), indexing from the admin page finishes. BE: invalid settings are rejected and the config is unchanged; role change and deletion end that user's session; an admin can't delete themselves or lower their own role (red: allowed when there is an other admin); JobManager run/stop/progress and jobs with a failing item; duplicates query. FE: number settings get min/max (red: validate() ignores them), users, duplicates and extension installer services, failed extension install. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01EfCGEM9KbXgoMSJDq2fX7j
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01EfCGEM9KbXgoMSJDq2fX7j
The admin page polls the job progress every 15 s when it saw no job running, so the finished state can show up later than the default 5 s. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01EfCGEM9KbXgoMSJDq2fX7j
A phone has no hover, so the face boxes are invisible but still links: the first tap of a double tap opens the person search. Intended: a tap shows the faces, a double tap zooms, a tap on a shown face searches. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01EfCGEM9KbXgoMSJDq2fX7j
…#1312 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01EfCGEM9KbXgoMSJDq2fX7j
CodeQL flags Math.random next to a user and password as insecure randomness (2 high alerts on #1345). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01EfCGEM9KbXgoMSJDq2fX7j
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01EfCGENN46XtyR33sPzDmT8
Review of the CUJ tests (epic #1254, fix list #1344)Verdict: the test phase is solid and mostly does what the issues asked, but it is not mergeable as is. CI is red on MySQL because of a race in a new test, and a number of agreed behaviours were dropped without being tracked anywhere. What was run (head
Do the "red" tests really fail?Yes, but they are wrapped as expected failures ( The real error of all 28 expected-failure e2e results was pulled from the JSON report: every one fails on its intended assertion, none on a broken selector or setup. The one exception in spirit is the logout race test (defect 2). App bugs the tests surfaced:
What is covered
In the issues, but not coveredAgreed or proposed in the sub-issues, no test, and mostly not in #1344 either. They survive only in closing comments of closed issues, so they will get lost.
Not covered and not listed anywhere
Defects in the tests
Is the approach reasonable?Mostly yes:
Concerns:
Decisions in #1344 worth a second look
Generated by Claude Code |
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01EfCGEPa8u5G6wwkqjpRheE
The first listing answers from the disk scan and saves to the DB in the background, so the search right after it raced the save (failed on MySQL). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01EfCGEPa8u5G6wwkqjpRheE
… test #1306 route.fetch() stored the cookie of the held answer in the browser at once, so the test failed before the request was released. Now the request goes out with the cookie of before the logout and reaches the browser after it. The redirect of a deleted user to /login is a green test of its own. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01EfCGEPa8u5G6wwkqjpRheE
The fallback to Home and the no-leak check are green tests now; only the toast is marked as failing. The invalid link message is the agreed text, and the markers name their sub-issues. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01EfCGEPa8u5G6wwkqjpRheE
- albums: wait for the delete or the confirmation, not isVisible() - autocomplete: clicking a suggestion searches, no conditional Enter - createSharing: closes the navbar menu when it opened it - Invalid sharing: delete the sharings the tests create - share list deletion: the guest keeps the sharing open; its session and the link stop working - album names with randomUUID() Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01EfCGEPa8u5G6wwkqjpRheE
Playwright skips a project whose dependencies failed, so its result was lost on a red run. Also accept /gallery as the root in admin.spec.ts and only treat a zip name as a renamed copy when it is not a result itself. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01EfCGEPa8u5G6wwkqjpRheE
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01EfCGEPa8u5G6wwkqjpRheE
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01EfCGEPa8u5G6wwkqjpRheE
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01EfCGEPa8u5G6wwkqjpRheE
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01EfCGEPa8u5G6wwkqjpRheE
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01EfCGEPa8u5G6wwkqjpRheE
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01EfCGEPa8u5G6wwkqjpRheE
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01EfCGEPa8u5G6wwkqjpRheE
…1307 #1313 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01EfCGEPa8u5G6wwkqjpRheE
#1307 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01EfCGEPa8u5G6wwkqjpRheE
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01EfCGEPa8u5G6wwkqjpRheE
big_ben.jpg is smaller than the lightbox, so expectLightboxPhoto could never pass on it and the test would stay red after the fix. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01EfCGEPa8u5G6wwkqjpRheE
…urlBase and search errors #1254 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01EfCGEPa8u5G6wwkqjpRheE
…edules #1307 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01EfCGEPa8u5G6wwkqjpRheE
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01EfCGEPa8u5G6wwkqjpRheE
… info panel #1254 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01EfCGEPa8u5G6wwkqjpRheE
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01EfCGEPa8u5G6wwkqjpRheE
Admin is the intended default; the admin can lower it to User in the settings. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01EfCGEPa8u5G6wwkqjpRheE
#1254 The urlBase expects a reverse proxy that strips it. AGENTS.md notes that and the default user right of a gallery without login. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01EfCGEPa8u5G6wwkqjpRheE
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01EfCGEPa8u5G6wwkqjpRheE
Update: review fixes and the missing CUJ tests25 new commits on this branch, following the review. No production code changed. Fixes from the review
New tests (see the updated description)
New expected failures (to add to #1344)
Test runs
Generated by Claude Code |
| * No external network in the tests: the map tiles (OpenStreetMap by default) are blank images. | ||
| */ | ||
| const blockMapTiles = async (page: Page): Promise<void> => { | ||
| await page.route(url => url.hostname.endsWith('tile.openstreetmap.org') || url.hostname === 'api.mapbox.com', |
The test phase of the critical user journeys epic #1254 (sub-issues #1305–#1316), done test-first. The fixes of #1344 will come in this same PR. It is a draft until then.
Behaviour that doesn't work yet has tests that are marked as failing, so CI stays green:
test.fail()// TODO #13xxcommentit.fails()#1344 lists every one of them. The fix phase removes each marker as its fix lands.
Tests, one or more commits per sub-issue
ErrorCodesvalue: 401 auth, 403 rights, 404 missing directory or file (PATH_ERROR), 400 for errors of user input (incl.SETTINGS_ERROR,ALBUM_ERROR,USER_CREATION_ERROR,ALREADY_AUTHENTICATED), 500 for the restsession.spec.ts)sharing-lifecycle.spec.ts)sharing-rights.spec.ts,SharingPermissions.spec.ts)ChangedOnDisk.spec.ts)?p=map.spec.ts, tiles blocked) and its markers.saved_searches.pg2confalbumsrandom-link.spec.ts).Upload.maxFileSizeMB/adminJobManager(run, stop, a failing item, schedules), the photo and video converting jobsusers.spec.ts)FreshInstall.spec.ts: an empty DB, the default admin logs in, the folder is listed and searchable; an olderDataStructureVersionrebuilds the DB and keeps the users and their passwords.NoAuthentication.spec.ts): Admin is the intended default visitor role; lowering it to User in the settings closes the admin API.Server.urlBasebehind a proxy that strips it (UrlBase.spec.ts).Test infrastructure
playwright.config.tshas 4 projects:chromiummobile: Pixel 7, runslightbox.spec.tsandnavigation.spec.tsmobile-sanity: runs the tests tagged@sanityon the same phoneadmin-config: runs after the other three, for tests that change the config or run jobs. CI runs it on its own (separate report) when one of the other projects failed, since Playwright skips it then.E2E_PORTruns the e2e server on another port (e.g. in parallel worktrees);start-e2e-servergets its port fromPORT.test/playwright/helpers.ts:pinch(),doubleTap()desktopViewport(),clickNavbarTab()expectNoHorizontalScroll()expectNavbar()also handles the phone menucreateDirectorySharingWithApi,createUserWithApi, ...)No production code changed yet.
Not covered by e2e, on purpose
demo/images, the public demo.Test runs (test phase)
FreshInstall.spec.tswaits for the background index save.Part of #1254 and #1344.
Generated by Claude Code