freezmo/tests
Martin Dvorak df34337b4a Accessibility pass, report control for homework exercises, clearer rail actions
- axe is clean across every screen in both themes, phone and desktop. Fixed:
  the hidden file inputs (aria-hidden + tabIndex -1 — they are opened by
  labelled buttons, so they should not be in the accessibility tree), the
  heading order (deck/homework/smart-review cards are h2 under the page h1;
  LearningSection takes a level so it stays h2 on the library and h3 inside
  the settings dialog) and landmarks around the study and review feeds.
- tests/contrast.mjs (new diagnostic): samples rendered pixels, because axe
  cannot judge text on blurred glass — it reports those nodes as incomplete.
  It skips disabled controls (1.4.3 exempts them) and content behind an open
  sheet. Result: no below-minimum text on any scanned screen.
- The report control exists in the homework guide too: under each "Try it
  yourself" exercise, labelled "Report exercise", without a skip (there is no
  queue to skip). lib/question-reports now takes deckId/deckTitle directly.
- The rail's two creation actions are buttons now (.nav-action) rather than
  quiet nav rows — once the library is full they were the only way to start
  something on desktop and read as just more navigation. "Make my homework"
  is "New homework" wherever it is an action (rail, empty state, share
  chooser, manifest shortcut); the page title and mode switch keep their
  wording.

Version 0.1.6 (three task bumps), SW -> freezmo-v52.
2026-10-12 21:15:56 +00:00
..
bubble-perf.mjs Stop blurring the animated scene on static glass (2x frame time) 2026-10-12 19:47:36 +00:00
bubbles-test.mjs Ice scene: the glossy orbs become rising bubbles, ~38% more transparent 2026-10-11 15:50:17 +00:00
chat-test.mjs One-pill study chrome, toggling chat pickers, readable homework steps 2026-10-12 14:21:11 +00:00
contrast.mjs Accessibility pass, report control for homework exercises, clearer rail actions 2026-10-12 21:15:56 +00:00
freeze-loading-test.mjs Move the e2e suites into the repo (tests/), out of /tmp 2026-10-11 15:11:06 +00:00
i18n-test.mjs Move the e2e suites into the repo (tests/), out of /tmp 2026-10-11 15:11:06 +00:00
lib.mjs Infra: split dev and production (releases, services, deploy script) 2026-10-11 19:25:29 +00:00
mobile-test.mjs Accessibility pass, report control for homework exercises, clearer rail actions 2026-10-12 21:15:56 +00:00
model-compare.mjs Chat mode, phase 1: grounded streaming chat over your notes 2026-10-11 18:32:11 +00:00
native-test.mjs Accessibility pass, report control for homework exercises, clearer rail actions 2026-10-12 21:15:56 +00:00
phase1-test.mjs Deck/homework writes sync themselves when sync is on 2026-10-12 16:40:49 +00:00
phase2-test.mjs Security: model budget + concurrency caps, SSRF guards, spoof-proof limits 2026-10-12 20:40:57 +00:00
phase3-test.mjs Deck/homework writes sync themselves when sync is on 2026-10-12 16:40:49 +00:00
README.md Chat mode, phase 2: local history, answer actions, motion polish 2026-10-11 19:03:48 +00:00
regression.mjs Accessibility pass, report control for homework exercises, clearer rail actions 2026-10-12 21:15:56 +00:00
review-test.mjs Link loading overlay escapes the glass card (portal to body) 2026-10-12 19:04:38 +00:00
run-all.mjs Security: model budget + concurrency caps, SSRF guards, spoof-proof limits 2026-10-12 20:40:57 +00:00
security-test.mjs Security: model budget + concurrency caps, SSRF guards, spoof-proof limits 2026-10-12 20:40:57 +00:00
wizard-test.mjs Accessibility pass, report control for homework exercises, clearer rail actions 2026-10-12 21:15:56 +00:00

Browser suites

End-to-end checks for Freezmo, driven by Playwright against a running production build. Everything lives in this repo (nothing in /tmp), so a reboot cannot wipe the harness.

Requirements

  • The app is running on http://127.0.0.1:3207 (systemctl --user start freezmo).
  • A Chromium build. The suites auto-detect the newest Playwright Chromium in ~/.cache/ms-playwright/; override with CHROME=/path/to/chrome.
  • npm install (dev deps: playwright-core, axe-core).

Running

npm run build && systemctl --user restart freezmo   # fresh build first
npm run test:e2e                 # every suite, in order
npm run test:e2e -- phase1       # only suites whose name contains "phase1"

Each suite prints PASS/FAIL lines and exits non-zero on failure; the runner prints a per-suite summary at the end.

Suites

Suite Covers
regression.mjs Library, deck card + menu, study feed to results, homework entry, desktop shell + settings/health panel.
bubbles-test.mjs Ice-scene bubbles: stacking/layout contract, keyframes only transform+opacity, rise/sway/scale/fade phases, per-breakpoint counts (5/3/2), phone pacing, reduced motion, tab-hidden parking.
mobile-test.mjs Five-tab bar at 360/390 × EN/CS × dark/light × reduced motion (labels, targets, no hamburger/drawer), the library ⋯ sheet (Import JSON / New folder), the settings sheet (touch targets, key flow, drag-to-close, backdrop), axe contrast audits.
wizard-test.mjs Deck 3-step flow and homework flow, flat action bar, in-page mode switch, the loading lock, abort-on-leave.
native-test.mjs Manifest/PWA head, offline banner + disabled generate, share target GET + POST, Back-gesture layers, undo toast, tab re-tap, haptics, draft restore.
i18n-test.mjs EN/CS dictionary parity, locale switch, Czech desktop shell, Czech phone tab labels and plurals.
freeze-loading-test.mjs The generation loading screen appears immediately, hides the action bar, Cancel returns with the notice.
review-test.mjs Smart Review loading feedback under a stalled request, the session end-to-end, mistakes, and the health-probe cache.
phase1-test.mjs Backup export/import, persistence row, nudge, encrypted sync (enable/join/push/delete + API validation), usage-limit handling (client + a stub Ollama).
phase2-test.mjs Answer history + SRS from a real study run, review/mistakes, stats, exam mode, push reminders hidden without VAPID and validated with it.
phase3-test.mjs Check my work (API + phone/desktop UI), follow-ups, guide step explain, turn-into-a-study-deck.
chat-test.mjs Chat: streaming API (validation, allowlist, context travel, history window, thinking separation, usage-limit mapping), attachment extraction, entry points, streaming/stop, markdown + KaTeX, model/scope pickers, edit/regenerate, offline, reduced motion, plus history (IDB persistence, reload, rename/search/delete/undo, scope+model memory), assistant actions, the export payload and a two-device sync round-trip.

Extra instances

phase1, phase2 and phase3 start their own next start instance with a stub Ollama (or VAPID keys) on a spare port (3208/3209). Each suite checks the port is free first and kills the whole process group on exit, so ports do not leak between suites. Scratch data for the VAPID test lives in tests/.tmp/ (gitignored).

Diagnostics (not part of the run)

node tests/bubble-perf.mjs [label] measures the ice-scene frame cost with a CDP performance trace (rAF frame timing, long tasks, main-thread busy time, style recalcs) on a 4× throttled phone profile and a 2× desktop profile. It always exits 0; the numbers are for tuning the bubble count/speed.