5.7.8 Playwright E2E — mention → bell increment → drawer → click → issue → marked read → badge decrement; preference-off stops the channel
Estimate: 28m · Depends on: 5.7.5
The story-closing end-to-end journey over the real stack (Principle #18 — review at the Story level): the in-app notification loop a user actually experiences, plus the preference-gate cut. Run against the standing dev-server + inngest-stub harness (the OOM-safe reuseExistingServer pattern; the cron/job pipeline drives the fan-in).
Playwright (tests/e2e/notifications.spec.ts): two browser contexts — B (zhuyue@motir.co) and A (bophilips@motir.co). B opens an issue and @-mentions A in a comment (the 5.1 picker keyboard path). A's bell badge increments (after A's navigation/poll). A opens the drawer → the mention sits atop Direct with the unread blue-dot; the badge clears (seen). A clicks the row → it deep-links to the issue AND the row marks read (dot gone, greyed); the unread count decrements (asserted to come from the response, no full reload). B mentions A twice more → "Mark all as read" in the overflow clears every dot in one action; on reload they STAY read (the JRACLOUD-85017 regression is absent). Self-exclusion: B mentioning B produces no bell increment for B.
Preference cut: A opens /settings/account → Notifications, toggles in-app OFF for "Mentioned" → B mentions A again → A's bell does NOT increment, but the [EMAIL] dev-console line still fires (email channel untouched). A toggles email OFF instead (in-app back on) → the next mention increments the bell while NO [EMAIL] line fires — demonstrating the single gate driving both channels independently.
Acceptance criteria
notifications.spec.tspasses the full journey (mention → bell increment → drawer open/seen → click → issue deep-link → row marked read → badge decrement → mark-all → survives reload) + the self-exclusion case, green in CI's Playwright lane.- The preference cut passes: in-app-off stops the bell (email still sends); email-off stops the mail (bell still increments) — both off the same
/settings/accountmatrix. - The badge/count updates without a whole-page reload on mark-read (the inline-edit contract observed in the E2E); the run uses the standing dev-server + inngest-stub harness; the flaky-isolation rule is respected.
Context refs
tests/e2e/comments.spec.ts(5.1.7) +tests/e2e/_helpers/— the comment/mention journey + the multi-context + selector gotchas (Combobox option name = label+secondary; the[EMAIL]dev-console grep contract)- 5.7.5 (the bell/drawer surface) + 5.7.6 (the preferences matrix) — the surfaces under test
- The E2E harness memories: standing dev server + inngest stub (OOM-safe reuseExistingServer), shared-DB flake isolation; finding #57 (the feed stays paged under the journey)