|
| 1 | +--- |
| 2 | +name: verify |
| 3 | +description: Verify reader features end-to-end by importing a synthetic volume through the real upload modal and driving the reader with Playwright. Use when a change needs runtime observation in the actual app (not unit tests). |
| 4 | +--- |
| 5 | + |
| 6 | +# Verifying mokuro-reader changes end-to-end |
| 7 | + |
| 8 | +## Launch |
| 9 | + |
| 10 | +```bash |
| 11 | +npm run dev -- --port 5199 --strictPort # dedicated port; NEVER bare 5173 (other worktrees own it) |
| 12 | +``` |
| 13 | + |
| 14 | +Browser: Playwright from `node_modules`, executablePath |
| 15 | +`~/.cache/ms-playwright/chromium-1208/chrome-linux64/chrome` (note `chrome-linux64`, not `chrome-linux`). |
| 16 | +Headless is fine. Don't drive the user's Chrome (stale service worker, port collisions, hidden-window rAF freeze). |
| 17 | + |
| 18 | +## Synthetic volume fixture |
| 19 | + |
| 20 | +The import needs a `.mokuro` + matching `.cbz` (same basename): |
| 21 | + |
| 22 | +- Pages: ImageMagick solid-color portraits with page numbers: |
| 23 | + `magick -size 1400x2000 xc:"#d8f0ff" -bordercolor black -border 8 -resize 1400x2000\! -gravity center -pointsize 400 -annotate 0 "1" 001.png` |
| 24 | +- `vol1.cbz`: `zip -j vol1.cbz *.png` |
| 25 | +- `vol1.mokuro` (all fields required): `{version, title, title_uuid, volume, volume_uuid, chars, pages: [{version, img_width, img_height, blocks: [], img_path}]}` |
| 26 | + |
| 27 | +## Import through the real UI |
| 28 | + |
| 29 | +1. Navbar icon cluster: `div.flex.gap-5 > button` — nth(2) is the upload icon → opens the Import modal (`<dialog>`). |
| 30 | +2. **Gotcha:** `getByRole()` fails to match buttons inside the flowbite modal `<dialog>` — use CSS locators (`page.locator('dialog button', { hasText: ... })`) or `page.evaluate` with `textContent.trim()` matching. |
| 31 | +3. `waitForEvent('filechooser')` + click the `choose files` button, `setFiles([vol1.mokuro, vol1.cbz])`, then click the exact-text `Import` button. |
| 32 | +4. Wait for `text=GapTest` in the catalog, click series → volume → reader (`#/reader/<title>/<uuid>`). |
| 33 | + |
| 34 | +## Driving the reader |
| 35 | + |
| 36 | +- RTL default: `ArrowLeft` = forward. Auto view mode pairs pages (cover shows alone first). |
| 37 | +- Page elements: `#manga-panel [data-page-index]` — measure `getBoundingClientRect()` for gap/scale/pan assertions (natural page width 1400 → scale = rect.width/1400). |
| 38 | +- Wheel with modifiers: `page.keyboard.down('Control'/'Shift')` + `page.mouse.wheel(0, ±100)` — Playwright applies held modifiers to the wheel event. CDP does NOT swap deltaY→deltaX under shift the way real input does; handlers reading `deltaY || deltaX` cover both. |
| 39 | +- Reader toast: search text nodes for the notification string. |
| 40 | +- Reader settings drawer: `button.reader-hud.right-3` (there are 3 `.reader-hud` buttons; `.first()` is the page-counter). Toggle labels (e.g. "Continuous scroll") are clickable once the drawer opens; close by clicking far from the drawer. |
| 41 | +- Persisted settings check: `JSON.parse(localStorage.getItem('profiles'))[currentProfile]`. |
| 42 | + |
| 43 | +## Known noise |
| 44 | + |
| 45 | +- `[pageerror] Unexpected token '<'` on first dev-server load — pre-existing dev artifact, unrelated to features. |
0 commit comments