MotirBuilding in public
MOTIR · moooon
onMotir
You’re viewing a public project. Anyone can view it — no account needed. Sign in to submit, upvote, or comment on requests.View-only — you can’t edit work items
MOTIR-139

2.6.5 E2E — Epic-2 acceptance journey (Playwright): create → detail → lifecycle → list/tree

Done
Description

Estimate: 35m · Depends on: 2.6.1

Add tests/e2e/epic2-acceptance.spec.ts — the card’s "Playwright over the create → detail → status-change flow" as ONE consolidated, user-visible epic-acceptance journey through the real shell, where the existing e2e specs are per-feature smoke tests. It proves the type-parent rule + the full status lifecycle + list/tree reflection compose for a real user.

The journey (one signed-in session, against the seeded shell):

  1. Open a project and create an issue via the create modal — pick a kind, then confirm the parent picker offers only LEGAL parents for that kind (e.g. a subtask requires a story/task/bug parent and is never offered an epic; the type-parent rule surfaced in the UI), select a legal parent, submit.
  2. Open its detail page and confirm it rendered (identifier, title, kind, status, assignee, parent breadcrumb).
  3. Walk it through a multi-step status lifecycle via the status picker (todo → in_progress → in_review → done), confirming at each step that illegal targets are not offered / are blocked under the restricted default policy (e.g. no direct todo → done).
  4. Verify reflection in both read surfaces: the issue List view shows the item with its updated status, and the Tree view shows it nested under its parent — closing the loop on Stories 2.4 (tree) + 2.5 (list).

Reuse the existing e2e patterns and selector conventions; this file owns the cross-feature journey, the per-feature specs keep their focused smoke coverage (do not duplicate them). Heed the known E2E selector gotchas: a Combobox option’s accessible name is label + secondary text (match the substring, not an exact name), and the /issues empty state has an h1 Issues + an h2 "No issues yet" (use exact/level on heading selectors). Branch is subtask/PROD-2.6.5-* (a subtask/* branch → CI runs Playwright; E2E is NOT skipped, unlike seed/* / design/*).

Acceptance criteria

  • New file tests/e2e/epic2-acceptance.spec.ts, grep-taggable as epic2-acceptance; passes under pnpm test:e2e.
  • The create step asserts the parent picker offers only legal parents for the chosen kind (an illegal parent is absent), exercising the type-parent rule through the UI.
  • The status walk drives a multi-step lifecycle via the status picker and asserts an illegal direct transition is unavailable/blocked under restricted policy.
  • After the walk, BOTH the List and the Tree views are asserted to reflect the item’s final status + parentage.
  • Reuses existing fixtures/helpers + selector conventions; no duplication of the focused per-feature specs.
  • Runs in the CI e2e job (subtask/* branch — Playwright not skipped).

Context refs

  • tests/e2e/{issue-create-edit-flow,issue-detail-flow,workflow-flow}.spec.ts — the per-feature specs this journey composes (patterns to reuse, not duplicate)
  • tests/e2e/work-items-isolation.spec.ts, playwright.config.ts, the e2e auth/sign-in helper
  • The issue create modal + detail page + List/Tree view components (Stories 2.3 / 2.4 / 2.5)
  • Memory: prodect-e2e-selector-gotchas (Combobox option name = label + secondary; /issues empty-state headings)
  • motir-core/CLAUDE.md — manual merge mode; real-stack E2E