dev/e2e: disposable server for app e2e / agent UI testing #145

Merged
cameron merged 1 commits from feature/e2e-dev-server into master 2026-09-29 19:56:58 +00:00
Owner

Summary

A disposable ImageApi instance for end-to-end and agent-driven UI testing of the mobile app (FileViewer-React), running next to a real local server without touching it.

dev/e2e/
├── e2e.sh           # up | build | fixtures | reset | start | stop | status | token | api | logs
├── gen_fixtures.py  # synthetic library: path/date/scenario burned into every image,
│                    #   EXIF dates/GPS/cameras via one exiftool batch, manifest.json
└── README.md
src/main.rs          # LOCAL_BIND_URL: the hardcoded localhost:8088 listener is now
                     #   configurable (default unchanged; empty disables it)
src/bin/create_user.rs  # no HTTP registration route exists; idempotent, runs migrations

Isolation from a running dev server: own build dir (target/e2e — a running target/debug exe is file-locked on Windows), own process name (image-api-e2e.exe, so stop can never kill the real one), port 8090, own db/thumbs/HLS. Media is a copy of pristine fixtures, so tests can mutate freely and reset restores the baseline.

Fixtures cover EXIF+GPS albums in several zones, videos (HLS), 60-photo scroll folder, filename-only dates, undated (mtime), on-this-day memories, EXCLUDED_DIRS, a byte-identical duplicate, an empty folder.

Companion: FileViewer-React feature/e2e-agent-driving (the drive-app skill that drives the emulator against this server).

Test plan

  • dev/e2e/e2e.sh up from scratch: builds, generates 98 fixtures, 97 indexed (private/ excluded by design), tags seeded, both HLS playlists generated — while the real server kept serving on :8088
  • cargo fmt, cargo clippy --all-targets (only the pre-existing filename_audit warning), full test suite (only the pre-existing filename_audit::run_audit_skips_disabled_and_offline_libraries failure, also failing on master)

🤖 Generated with Claude Code

## Summary A disposable ImageApi instance for end-to-end and agent-driven UI testing of the mobile app (FileViewer-React), running **next to** a real local server without touching it. dev/e2e/ ├── e2e.sh # up | build | fixtures | reset | start | stop | status | token | api | logs ├── gen_fixtures.py # synthetic library: path/date/scenario burned into every image, │ # EXIF dates/GPS/cameras via one exiftool batch, manifest.json └── README.md src/main.rs # LOCAL_BIND_URL: the hardcoded localhost:8088 listener is now # configurable (default unchanged; empty disables it) src/bin/create_user.rs # no HTTP registration route exists; idempotent, runs migrations Isolation from a running dev server: own build dir (`target/e2e` — a running `target/debug` exe is file-locked on Windows), own process name (`image-api-e2e.exe`, so `stop` can never kill the real one), port 8090, own db/thumbs/HLS. Media is a *copy* of pristine fixtures, so tests can mutate freely and `reset` restores the baseline. Fixtures cover EXIF+GPS albums in several zones, videos (HLS), 60-photo scroll folder, filename-only dates, undated (mtime), on-this-day memories, `EXCLUDED_DIRS`, a byte-identical duplicate, an empty folder. Companion: FileViewer-React `feature/e2e-agent-driving` (the `drive-app` skill that drives the emulator against this server). ## Test plan - [x] `dev/e2e/e2e.sh up` from scratch: builds, generates 98 fixtures, 97 indexed (private/ excluded by design), tags seeded, both HLS playlists generated — while the real server kept serving on :8088 - [x] `cargo fmt`, `cargo clippy --all-targets` (only the pre-existing `filename_audit` warning), full test suite (only the pre-existing `filename_audit::run_audit_skips_disabled_and_offline_libraries` failure, also failing on master) 🤖 Generated with [Claude Code](https://claude.com/claude-code)
cameron added 1 commit 2026-09-29 18:46:01 +00:00
`dev/e2e/e2e.sh up` runs an isolated ImageApi (port 8090, own build dir,
db, thumbnails, HLS) next to a real local server, serving a copy of a
synthetic fixture library. Every fixture image has its path, date and
scenario burned into the pixels; manifest.json records expected dates,
GPS, cameras, tags and counts. `reset` restores the baseline.

- LOCAL_BIND_URL makes the hardcoded localhost:8088 listener
  configurable (default unchanged; empty disables it) so a second
  instance can start.
- create_user bin: the server has no registration route; idempotent.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
cameron merged commit 8284509c90 into master 2026-09-29 19:56:58 +00:00
cameron deleted branch feature/e2e-dev-server 2026-09-29 19:56:59 +00:00
Sign in to join this conversation.