From 9715831f82bb9e341f3f9c476f7b8d5eb9abd850 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Bombeck?= Date: Sun, 17 May 2026 00:53:03 +0200 Subject: [PATCH] =?UTF-8?q?v1.4.34.5=20=E2=80=94=20audit=20follow-on:=20cr?= =?UTF-8?q?itical-path=20tests=20+=20iOS=20textarea=20zoom?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Follow-on to v1.4.34.4. Tests: 24 new integration tests across 5 files closing the highest critical-path gaps the test-coverage audit flagged: - auth-password-change.test.ts pins the v1.4.34.3+ destroyAllSessions three-transport revocation contract. - admin-reset-password.test.ts mirrors the same shape for admin resets. - withings-oauth.test.ts covers connect / callback / disconnect + state-token replay rejection. - passkey-register.test.ts covers register-options + register-verify + tampered-attestation + challenge single-use. - cache-invalidation-coverage.test.ts grids the IW-G invalidation matrix across 5 write surfaces. Integration suite: 197/50 → 222/55. tsc + lint clean. Mobile: Five textareas no longer trigger iOS Safari zoom-on-focus. The Coach composer, bug-report description, admin feedback note, medication-side-effects notes, and medication-intake JSON import all shipped text-sm (14 px). iOS Safari zooms whenever an input renders below 16 px. Switched each to `text-base sm:text-sm` so mobile clears the floor while desktop keeps the compact look. --- CHANGELOG.md | 34 +++ package.json | 2 +- src/app/bugreport/page.tsx | 4 +- src/app/medications/page.tsx | 4 +- .../admin/feedback-inbox-section.tsx | 4 +- .../insights/coach-panel/coach-input.tsx | 7 +- .../medications/SideEffectsSection.tsx | 5 +- .../integration/admin-reset-password.test.ts | 258 ++++++++++++++++ .../integration/auth-password-change.test.ts | 274 +++++++++++++++++ .../cache-invalidation-coverage.test.ts | 267 ++++++++++++++++ tests/integration/passkey-register.test.ts | 252 +++++++++++++++ tests/integration/withings-oauth.test.ts | 289 ++++++++++++++++++ 12 files changed, 1394 insertions(+), 6 deletions(-) create mode 100644 tests/integration/admin-reset-password.test.ts create mode 100644 tests/integration/auth-password-change.test.ts create mode 100644 tests/integration/cache-invalidation-coverage.test.ts create mode 100644 tests/integration/passkey-register.test.ts create mode 100644 tests/integration/withings-oauth.test.ts diff --git a/CHANGELOG.md b/CHANGELOG.md index fb4bac6b6..6535d95d2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,39 @@ # Changelog +## [1.4.34.5] — 2026-05-17 — Audit follow-on: critical-path tests + iOS textarea zoom + +Follow-on to v1.4.34.4. Two batches: the missing critical-path +integration tests the test-coverage audit flagged, and the textarea +viewport-zoom fix the mobile-deep audit flagged as F-5. + +### Tests + +- **24 new integration tests across 5 files** closing the critical + gaps from `.planning/round-audit-test-coverage.md`: + - `tests/integration/auth-password-change.test.ts` pins the v1.4.34.3+ + `destroyAllSessions` three-transport revocation contract + end-to-end (Session.deleteMany, ApiToken.revoked, RefreshToken.revokedAt). + - `tests/integration/admin-reset-password.test.ts` mirrors the same + contract for the admin-driven reset. + - `tests/integration/withings-oauth.test.ts` covers connect / + callback / disconnect plus state-token replay rejection. + - `tests/integration/passkey-register.test.ts` covers register-options + + register-verify + tampered-attestation rejection + challenge + single-use. + - `tests/integration/cache-invalidation-coverage.test.ts` grids the + v1.4.34 IW-G invalidation matrix across 5 write surfaces. +- Integration suite goes from 197/50 to 222/55. tsc + lint clean. + +### Mobile + +- **Five textareas no longer trigger iOS Safari zoom-on-focus.** The + Coach composer, bug-report description, admin feedback note, + medication-side-effects notes, and medication-intake JSON import all + shipped `text-sm` (14 px). iOS Safari zooms the viewport whenever an + input renders below 16 px. Switched each to `text-base sm:text-sm` + so the mobile baseline clears the floor while desktop keeps the + compact look. + ## [1.4.34.4] — 2026-05-17 — Audit-driven hotfix bundle (security, UX, code-quality, docs) A consolidated hotfix landing the findings from a six-axis audit diff --git a/package.json b/package.json index fac4b4642..02739c2af 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "healthlog", - "version": "1.4.34.4", + "version": "1.4.34.5", "description": "Self-hosted personal-health-tracking PWA with Withings integration, AI insights, and doctor-report PDF export.", "license": "AGPL-3.0-only", "homepage": "https://healthlog.dev", diff --git a/src/app/bugreport/page.tsx b/src/app/bugreport/page.tsx index c9c920058..7ecef4e74 100644 --- a/src/app/bugreport/page.tsx +++ b/src/app/bugreport/page.tsx @@ -207,7 +207,9 @@ export default function BugReportPage() { minLength={10} maxLength={5000} rows={8} - className="border-input bg-background text-foreground placeholder:text-muted-foreground focus-visible:ring-ring w-full rounded-md border px-3 py-2 text-sm focus-visible:ring-2 focus-visible:outline-none" + // text-base on mobile so iOS Safari doesn't zoom on + // focus; text-sm on sm+ keeps the compact desktop look. + className="border-input bg-background text-foreground placeholder:text-muted-foreground focus-visible:ring-ring w-full rounded-md border px-3 py-2 text-base focus-visible:ring-2 focus-visible:outline-none sm:text-sm" /> diff --git a/src/app/medications/page.tsx b/src/app/medications/page.tsx index 1b90cc4b3..9797f4b0e 100644 --- a/src/app/medications/page.tsx +++ b/src/app/medications/page.tsx @@ -466,7 +466,9 @@ function IntakeImportDialog({ onChange={(e) => setJsonText(e.target.value)} placeholder={t("medications.importPaste")} rows={8} - className="border-input bg-background text-foreground placeholder:text-muted-foreground focus-visible:ring-ring w-full rounded-md border px-3 py-2 font-mono text-sm focus-visible:ring-2 focus-visible:outline-none" + // text-base on mobile so iOS Safari doesn't zoom on + // focus; text-sm on sm+ for the compact import textarea. + className="border-input bg-background text-foreground placeholder:text-muted-foreground focus-visible:ring-ring w-full rounded-md border px-3 py-2 font-mono text-base focus-visible:ring-2 focus-visible:outline-none sm:text-sm" /> {result && (