(chore) add playwright e2e test
This commit is contained in:
@@ -35,3 +35,7 @@ This repo (`riotpiao`) or the homelab repo. Follows from decision 1 — whicheve
|
|||||||
---
|
---
|
||||||
|
|
||||||
Once answered, update this file with the decisions taken (date + rationale) before starting [01-phase0-unblock.md](01-phase0-unblock.md).
|
Once answered, update this file with the decisions taken (date + rationale) before starting [01-phase0-unblock.md](01-phase0-unblock.md).
|
||||||
|
|
||||||
|
## Hard requirement: Playwright
|
||||||
|
|
||||||
|
Every phase shipping a UI surface (Phase 2, 3, 4, 5) requires a passing Playwright e2e spec before merge — not optional, gated in CI alongside `pnpm test`. Setup lands in Phase 0 task 0.6a.
|
||||||
|
|||||||
@@ -25,6 +25,10 @@ Blocking. Nothing ships until this lands. Requires [00-decisions.md](00-decision
|
|||||||
- [ ] **0.6** Add Vitest + Testing Library + `msw`; add `test` and `test:watch` scripts to `package.json`
|
- [ ] **0.6** Add Vitest + Testing Library + `msw`; add `test` and `test:watch` scripts to `package.json`
|
||||||
- Verify: `pnpm test` → runner executes, 0 tests, exit 0
|
- Verify: `pnpm test` → runner executes, 0 tests, exit 0
|
||||||
|
|
||||||
|
- [ ] **0.6a** Add Playwright (`pnpm create playwright`); add `test:e2e` script to `package.json`; wire into CI as a hard gate (build fails if `test:e2e` fails)
|
||||||
|
- Playwright is a hard requirement, not optional, for every phase that ships a UI surface (Phase 2, 3, 4, 5) — no surface merges without a passing e2e spec
|
||||||
|
- Verify: `pnpm test:e2e` → runner executes, 0 tests, exit 0
|
||||||
|
|
||||||
- [ ] **0.7** Triage unrelated cluster issues: `sms` Application Degraded (`macos-bluebubbles` Pending 3h), `longhorn-config` OutOfSync
|
- [ ] **0.7** Triage unrelated cluster issues: `sms` Application Degraded (`macos-bluebubbles` Pending 3h), `longhorn-config` OutOfSync
|
||||||
- Unrelated to atlas, but delivery tree (Phase 3) will render both red on day one — fix or explicitly accept as known-red
|
- Unrelated to atlas, but delivery tree (Phase 3) will render both red on day one — fix or explicitly accept as known-red
|
||||||
|
|
||||||
@@ -34,6 +38,7 @@ Blocking. Nothing ships until this lands. Requires [00-decisions.md](00-decision
|
|||||||
kubectl get pods -n portfolio # 2/2 Running
|
kubectl get pods -n portfolio # 2/2 Running
|
||||||
curl -sS -o /dev/null -w '%{http_code}\n' https://riotpiao.com # 200
|
curl -sS -o /dev/null -w '%{http_code}\n' https://riotpiao.com # 200
|
||||||
pnpm test # runner executes, 0 tests, exit 0
|
pnpm test # runner executes, 0 tests, exit 0
|
||||||
|
pnpm test:e2e # runner executes, 0 tests, exit 0
|
||||||
```
|
```
|
||||||
|
|
||||||
Next: [02-phase1-atlas-core.md](02-phase1-atlas-core.md)
|
Next: [02-phase1-atlas-core.md](02-phase1-atlas-core.md)
|
||||||
|
|||||||
@@ -6,6 +6,7 @@
|
|||||||
|
|
||||||
- [ ] `stream_test.go` — SSE emits a delta within 5s of a pod state change
|
- [ ] `stream_test.go` — SSE emits a delta within 5s of a pod state change
|
||||||
- [ ] `topology.test.tsx` — graph re-renders on delta without a full reload
|
- [ ] `topology.test.tsx` — graph re-renders on delta without a full reload
|
||||||
|
- [ ] `topology.e2e.ts` (Playwright, hard requirement) — load `/topology`, assert graph nodes render, delete a pod, assert node count updates without reload
|
||||||
|
|
||||||
## GREEN
|
## GREEN
|
||||||
|
|
||||||
@@ -24,6 +25,7 @@
|
|||||||
```bash
|
```bash
|
||||||
# delete a pod, observe graph update in <5s without reloading
|
# delete a pod, observe graph update in <5s without reloading
|
||||||
kubectl delete pod <name> -n <ns>
|
kubectl delete pod <name> -n <ns>
|
||||||
|
pnpm test:e2e topology.e2e.ts # required, must pass before merge
|
||||||
```
|
```
|
||||||
|
|
||||||
Next: [04-phase3-delivery.md](04-phase3-delivery.md)
|
Next: [04-phase3-delivery.md](04-phase3-delivery.md)
|
||||||
|
|||||||
@@ -6,6 +6,7 @@
|
|||||||
|
|
||||||
- [ ] `delivery_test.go` — apps group correctly by `sync-wave`; Secret names absent from output (kind+count only); `repoURL` absent from output
|
- [ ] `delivery_test.go` — apps group correctly by `sync-wave`; Secret names absent from output (kind+count only); `repoURL` absent from output
|
||||||
- [ ] `delivery.test.tsx` — 550-node tree renders under frame budget with virtualization on
|
- [ ] `delivery.test.tsx` — 550-node tree renders under frame budget with virtualization on
|
||||||
|
- [ ] `delivery.e2e.ts` (Playwright, hard requirement) — load `/delivery`, click app node, assert side panel opens with virtualized resource tree, assert no Secret names appear in DOM
|
||||||
|
|
||||||
## GREEN
|
## GREEN
|
||||||
|
|
||||||
@@ -24,6 +25,7 @@
|
|||||||
```bash
|
```bash
|
||||||
# trigger an Argo sync, observe wave-ordered animation
|
# trigger an Argo sync, observe wave-ordered animation
|
||||||
argocd app sync homelab-root
|
argocd app sync homelab-root
|
||||||
|
pnpm test:e2e delivery.e2e.ts # required, must pass before merge
|
||||||
```
|
```
|
||||||
|
|
||||||
Also in scope for this phase: delete fabricated stats in `app/page.tsx` ("40% CPU reduction", "99.2% uptime", "Mission-critical", "60% latency cut") — wire each card to a real number from `/api/topology` or `/api/delivery`, or remove the claim. Five of six landing cards link to routes that don't exist (`/infrastructure`, `/systems`, `/llm`, `/kafka`, `/opensource`) — fix or remove.
|
Also in scope for this phase: delete fabricated stats in `app/page.tsx` ("40% CPU reduction", "99.2% uptime", "Mission-critical", "60% latency cut") — wire each card to a real number from `/api/topology` or `/api/delivery`, or remove the claim. Five of six landing cards link to routes that don't exist (`/infrastructure`, `/systems`, `/llm`, `/kafka`, `/opensource`) — fix or remove.
|
||||||
|
|||||||
@@ -6,6 +6,7 @@
|
|||||||
|
|
||||||
- [ ] `exec_parse_test.go` — fuzz corpus: every non-allowlisted input rejects and performs zero upstream calls
|
- [ ] `exec_parse_test.go` — fuzz corpus: every non-allowlisted input rejects and performs zero upstream calls
|
||||||
- [ ] `exec_test.go` — unknown namespace rejects on snapshot membership, not regex
|
- [ ] `exec_test.go` — unknown namespace rejects on snapshot membership, not regex
|
||||||
|
- [ ] `terminal.e2e.ts` (Playwright, hard requirement) — load terminal UI, submit `get nodes`, assert rendered output; submit an injection payload, assert rejection surfaces in UI, zero upstream call
|
||||||
|
|
||||||
## GREEN
|
## GREEN
|
||||||
|
|
||||||
@@ -25,6 +26,7 @@
|
|||||||
```bash
|
```bash
|
||||||
# attempt injection payloads against /api/exec; all rejected, all logged
|
# attempt injection payloads against /api/exec; all rejected, all logged
|
||||||
curl -X POST https://riotpiao.com/api/exec -d '{"cmd":"get pods; rm -rf /"}'
|
curl -X POST https://riotpiao.com/api/exec -d '{"cmd":"get pods; rm -rf /"}'
|
||||||
|
pnpm test:e2e terminal.e2e.ts # required, must pass before merge
|
||||||
```
|
```
|
||||||
|
|
||||||
Next: [06-phase5-chat.md](06-phase5-chat.md)
|
Next: [06-phase5-chat.md](06-phase5-chat.md)
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ Depends on [00-decisions.md](00-decisions.md) #4 (is chat in scope for v1).
|
|||||||
- [ ] `budget_test.go` — 13th message in 24h returns `429` with `Retry-After`
|
- [ ] `budget_test.go` — 13th message in 24h returns `429` with `Retry-After`
|
||||||
- [ ] `injection_test.go` — snapshot content cannot alter system-prompt behaviour
|
- [ ] `injection_test.go` — snapshot content cannot alter system-prompt behaviour
|
||||||
- [ ] `context_test.go` — history truncation keeps total tokens under 16384
|
- [ ] `context_test.go` — history truncation keeps total tokens under 16384
|
||||||
|
- [ ] `chat.e2e.ts` (Playwright, hard requirement) — load chat UI, send message, assert streamed tokens render, assert queue position renders under load, assert reasoning block is collapsible
|
||||||
|
|
||||||
## GREEN
|
## GREEN
|
||||||
|
|
||||||
@@ -34,6 +35,7 @@ Depends on [00-decisions.md](00-decisions.md) #4 (is chat in scope for v1).
|
|||||||
```bash
|
```bash
|
||||||
# load test at 20 concurrent clients
|
# load test at 20 concurrent clients
|
||||||
# GPU sequence usage never exceeds 6, no upstream 5xx, queue drains
|
# GPU sequence usage never exceeds 6, no upstream 5xx, queue drains
|
||||||
|
pnpm test:e2e chat.e2e.ts # required, must pass before merge
|
||||||
```
|
```
|
||||||
|
|
||||||
## Done — atlas v1 shipped
|
## Done — atlas v1 shipped
|
||||||
|
|||||||
@@ -30,3 +30,4 @@ Not started. **5 decisions block Phase 1** — see [00-decisions.md](00-decision
|
|||||||
- I4: no free-form string reaches an internal system (closed enum, snapshot-membership validation)
|
- I4: no free-form string reaches an internal system (closed enum, snapshot-membership validation)
|
||||||
- I5: GPU chat concurrency capped at 6 of 8 sequence slots, disconnect cancels upstream immediately
|
- I5: GPU chat concurrency capped at 6 of 8 sequence slots, disconnect cancels upstream immediately
|
||||||
- TDD: RED (tests named before code) → GREEN (minimal code) → REFACTOR, per phase
|
- TDD: RED (tests named before code) → GREEN (minimal code) → REFACTOR, per phase
|
||||||
|
- Playwright e2e is a hard requirement for every UI-shipping phase (2, 3, 4, 5) — no surface merges without a passing spec
|
||||||
|
|||||||
Reference in New Issue
Block a user