Adding all the tests and fixes to the passengers app

This commit is contained in:
Muluhabt
2026-07-21 13:45:49 +03:00
parent 8ce2d2d874
commit f2ae9c883f
3316 changed files with 15548 additions and 37 deletions

137
docs/TESTING.md Normal file
View File

@@ -0,0 +1,137 @@
# EDR Passenger — Testing Runbook
How to run **everything**: the API bug-hunt harness and the UI (browser) harness, view the reports,
run a single test, and troubleshoot. Both are hermetic (their own Postgres on 5544 — never prod).
- **Findings:** `docs/ISSUES.md` · **Fixes:** `docs/SOLUTIONS.md`
- **Test plans:** `docs/e2e-test-matrix.md` (API) · `docs/ui-e2e-test-matrix.md` (UI)
---
## 0. Prerequisites (one time)
- **Docker Desktop** running (the harness starts Postgres + RabbitMQ containers).
- **Node ≥ 20**, **pnpm 11** (`corepack enable` if needed).
- Install deps once: `pnpm install` (from repo root).
That's it — no manual DB, env, or auth setup. The scripts handle migrations, seeding, and auth.
---
## 1. Run the API harness (fast — no browser)
Covers pricing math, FX, wallet/refund/payment integrity, config validation, auth gaps, and the
authenticated-booking regression. **25 tests.**
```bash
bash e2e/run.sh # infra + migrate + run + open HTML report
# or: pnpm test:e2e:passenger
```
Flags: `bash e2e/run.sh --down` (tear DB down after) · `--no-open` (don't open the browser).
Report → `apps/edr-passenger-api/e2e-report/index.html`.
**Run a single API suite / test:**
```bash
cd apps/edr-passenger-api
npx jest --config ./test/jest-e2e.json test/pricing-fare-engine.e2e-spec.ts
npx jest --config ./test/jest-e2e.json -t "double-spend" # by test name
```
(The test DB must be up — run `bash e2e/prepare.sh` once if you skipped `e2e/run.sh`.)
---
## 2. Run the UI harness (browser — Playwright)
Covers the real portal booking flow (search → pay → confirm) with the price cross-check, plus
backoffice auth. **One command boots the whole stack** (Postgres + RabbitMQ + passenger-api +
portal + backoffice), seeds a bookable trip, mints passenger + staff auth, runs, and opens the report.
```bash
pnpm test:e2e:ui # = bash e2e-ui/run.sh (turnkey)
```
First run takes ~12 min (it builds `@edr/types` and boots the Next.js apps). If the stack is already
running, it reuses it. Report → `e2e-ui-report/index.html`.
**Run a subset / single UI test** (stack already up):
```bash
pnpm test:e2e:ui:only --project=portal # just the portal booking tests
pnpm test:e2e:ui:only --project=backoffice
npx playwright test -c e2e-ui/playwright.config.ts ua1 # by file name
```
**Watch it run in a real browser** (headed) or step through it:
```bash
npx playwright test -c e2e-ui/playwright.config.ts --project=portal --headed
npx playwright test -c e2e-ui/playwright.config.ts --project=portal --debug # Playwright Inspector
npx playwright show-report e2e-ui-report # open a past report
npx playwright show-trace test-results/**/trace.zip # trace of a failed run
```
Projects: `portal` (logged-in passenger), `guest` (no auth), `backoffice` (staff), `propagation`
(Track B — staff writes config via API → passenger portal reads; 4 tests).
---
## 3. Run absolutely everything
```bash
bash e2e/run.sh --no-open # API: 25 tests
pnpm test:e2e:ui # UI: 9 tests (boots the stack)
```
Or the standalone hermetic API DB only: `bash e2e/prepare.sh` then `pnpm --filter @edr/passenger-api test:e2e`.
---
## 4. What each harness contains
| Harness | Location | What it proves |
| --- | --- | --- |
| API | `apps/edr-passenger-api/test/*.e2e-spec.ts` + `e2e/` | fare/FX math, promo/negative-total, wallet double-spend, refund-never-paid, FX-write authz gap, DTO validation gaps, **C-10 authed-booking FK regression** |
| UI | `e2e-ui/` | **UA-1** booking money cross-check; **UA-13** 🔴 client-forged total (C-1); **UA-8** 🔴 promo dropped (H-13); **Track B** — fare change propagates live (PB-2), **C-8** passenger rewrites FX, **M-1** negative price accepted; smokes |
A test name with **🔴** encodes buggy behavior — when it **passes**, the bug is present. After you
apply a fix from `docs/SOLUTIONS.md`, flip that test to assert the corrected behavior.
Seed for the UI flow: `apps/edr-passenger-api/test/fixtures/seed-ui.ts` (bookable Train/Schedule/
Coach/Seats + WALLET/TELEBIRR payment methods + promos + funded wallet). Standalone:
`DATABASE_URL=…5544 npx ts-node test/fixtures/seed-ui.ts`.
---
## 5. Teardown
```bash
docker compose -f e2e/docker-compose.yml down # stops + wipes the test DB + RabbitMQ
```
The dev app processes (api/portal/backoffice) started by Playwright's `webServer` stop with the run;
if you booted them manually, `lsof -ti :4000 :5174 :5184 | xargs kill`.
---
## 6. Troubleshooting
| Symptom | Cause / fix |
| --- | --- |
| `Cannot find module '@edr/types'` on API boot | Types not built → `pnpm --filter @edr/types build` (the run scripts do this). |
| API boot hangs on `AmqpConnection … ECONNREFUSED` | RabbitMQ not up → `docker compose -f e2e/docker-compose.yml up -d rabbitmq-e2e`. |
| `EADDRINUSE :::4000` | A stale API instance is bound → `lsof -ti :4000 | xargs kill -9`, then re-run. |
| Backoffice test redirects to `/login` | Staff storageState missing/expired → it's re-minted every run by `global-setup`; ensure `SEED_PASSENGER_STAFF=true` in `apps/edr-passenger-api/.env`. |
| Portal booking 400 `Booking_passengerId_fkey` | **This is finding C-10** (real bug). The harness seeds `Passenger.id == iamUserId` to work around it — see `docs/ISSUES.md` C-10. |
| Docker daemon not running | `open -a Docker`, wait ~15s, re-run. |
| Ports differ | api 4000, portal 5174, backoffice 5184, payment 3003, Postgres 5544, RabbitMQ 5672. Override via `PORTAL_URL` / `BACKOFFICE_URL` / `API_URL` / `DATABASE_URL` env. |
---
## 7. Coverage status & what's next
- **Done:** full hermetic harness, 34 green tests (25 API + 9 UI). UA-1 keystone + UA-8/UA-13 abuse
rows, Track B propagation (PB-2, C-8, M-1), both auth roles, `BookingFlow` page-object.
- **Next (Track A):** more `bookOneAdult` variations — UA-2 (USD), UA-6 (round-trip); multi-passenger
free-child (UA-4/5) + gateway/DJF (UA-3) need helper extensions (per-pax form, forged webhook).
- **Next (Track B):** PB-5 (disable station→gone), PB-10 (delete FX→1.0 fallback), config-mid-flight.
See `docs/ui-e2e-test-matrix.md` for the full row-by-row plan.