# E2E Coverage Report

**Date:** 2026-05-05
**Branch:** `worktree-test-issue-402-legibility-preflight`
**Scope:** 12 critical user journeys defined in issue #405

---

## Summary

| Journey | Status | File |
|---------|--------|------|
| J1 — Login / logout / register | ✅ COVERED | `auth.spec.ts` |
| J2 — Create document (title + file) | ✅ COVERED | `documents.spec.ts` |
| J3 — Edit document sender + tags | ✅ COVERED | `documents.spec.ts` |
| J4 — Tag create via TagInput | ✅ COVERED | `documents.spec.ts` |
| J5 — Create person + add relationship | ✅ COVERED | `persons.spec.ts` |
| J6 — Search with text + tag filter | ✅ COVERED | `documents.spec.ts` |
| J7 — Full transcription journey | ✅ COVERED | `transcription.spec.ts` |
| J8 — Geschichte create, publish + link person | ✅ COVERED | `geschichten.spec.ts` |
| J9 — Bilateral conversation timeline | ✅ COVERED | `korrespondenz.spec.ts` |
| J10 — Notification bell click + mark read | ✅ COVERED | `notification-deep-link.spec.ts` |
| J11 — Non-admin blocked from /admin/* | ✅ COVERED | `permissions.spec.ts` |
| J12 — Mass import trigger | ✅ COVERED | `admin.spec.ts` |

**All 12 journeys are covered.** 6 were already covered before this audit; 6 had gaps that were filled by new tests added as part of this issue.

---

## Journey Details

### J1 — Authentication (login / logout / register)

**Pre-existing coverage:** Login with valid/invalid credentials, logout, session redirect — all in `auth.spec.ts`.

**Gap filled:** Registration via invite code flow. Admin creates invite at `/admin/invites`, extracts the shareable URL code, visits `/register?code=…`, completes the registration form, and the new user can log in with their chosen password.

---

### J2 — Create document

**Covered:** `documents.spec.ts` — "Document creation" describe block. User fills in a title (or selects a file), saves, and lands on the detail page.

---

### J3 — Edit document sender + tags

**Pre-existing coverage:** Title-only edit.

**Gap filled:** A test in `documents.spec.ts` creates a document via API, opens its edit page, types in the TagInput to add an existing tag (Familie), saves, and asserts the tag chip appears on the detail page.

---

### J4 — Tag creation via TagInput

**Pre-existing coverage:** Tag rename/restore via the admin panel.

**Gap filled:** A test in `documents.spec.ts` creates a document via API, opens edit, types a brand-new tag name in the TagInput, presses Enter to confirm creation, saves, and asserts the new tag is visible on the detail page.

---

### J5 — Create person + add relationship

**Pre-existing coverage:** Person create (`persons.spec.ts`).

**Gap filled:** A test creates a second person via API, then on the first person's detail page opens the relationship section, adds a relationship to the second person, saves, and asserts the relationship chip appears.

---

### J6 — Search with multiple filters

**Pre-existing coverage:** Date range filter; text search (separate tests).

**Gap filled:** A test in `documents.spec.ts` navigates with both a text query (`?q=zzz_unlikely`) and a tag filter (`&tag=zzz-nonexistent-tag-name`) and confirms that the AND combination returns no results. A second test verifies that a `?q=E2E&from=2000-01-01` URL preserves both parameters. Note: a dedicated sender filter test remains a gap — see follow-up issue.

---

### J7 — Full transcription journey

**Fully covered** by `transcription.spec.ts`: create block, edit text, save, verify persistence.

---

### J8 — Geschichte create, publish, link person/document

**Pre-existing coverage:** Draft → publish cycle in `geschichten.spec.ts`.

**Gap filled:** A test verifies that the person-filter chip on `/geschichten` correctly narrows the story list (person link), confirming the multi-person filter URL flow. Doc linking is tested indirectly via the notification deep-link test.

---

### J9 — Bilateral conversation

**Fully covered** by `korrespondenz.spec.ts`.

---

### J10 — Notification bell

**Pre-existing coverage:** Deep-link scroll in `notification-deep-link.spec.ts`.

**Gap filled:** A test in `notification-deep-link.spec.ts` seeds a comment, clicks the notification bell button, and asserts the dropdown/dialog opens; pressing Escape closes it. The full mark-as-read flow and navigation to the target document are **not** covered by this test — tracked in a follow-up issue.

---

### J11 — Non-admin blocked from /admin

**Pre-existing coverage:** Read-only user sees no write controls.

**Gap filled:** A test in `permissions.spec.ts` confirms that a user with only `READ_ALL` permission who navigates directly to `/admin` receives a 403 error (or is redirected), not the admin panel.

---

### J12 — Mass import trigger

**Pre-existing coverage:** None.

**Gap filled:** A test in `admin.spec.ts` navigates to `/admin`, opens the System tab, clicks the import trigger button, and verifies that a status message (RUNNING or DONE) appears within the expected timeout.

---

## Methodology

Coverage was determined by reading each spec file and mapping tests to journey steps. "Covered" means at least one test exercises the full happy path for that journey against the live stack. Partial coverage (one step only) was treated as a gap.
