Implements the full E2E flow against the deployed docker stack and
documents it as a repeatable test playbook.
Surfaced and fixed three real issues while building the E2E:
1. JWT secret mismatch — docker-compose.override.yml backend was using
a NoteLett-only JWT_SECRET that platform-service did not share, so
every Authorization: Bearer call returned 'Invalid or expired token'.
Aligned the override to use platform-service's actual secret
(dev-ecosystem-secret-do-not-use-in-production).
2. CORS preflight missing PATCH/DELETE — @bytelyst/fastify-core registers
@fastify/cors with only { origin }, which leaves Access-Control-Allow-
Methods at the @fastify/cors default of 'GET,HEAD,POST'. Real browser
PATCH/DELETE preflights would fail. Added an onSend hook in
backend/src/server.ts that rewrites the header to
'GET,HEAD,POST,PATCH,PUT,DELETE,OPTIONS' on CORS preflight responses.
3. Product 'notelett' wasn't registered with platform-service — auth
register/login both error with 'Unknown or disabled product: notelett'.
The seed script now POSTs to /api/products idempotently.
Deliverables:
- scripts/e2e-docker-seed.sh — idempotent: registers the notelett product
and creates two test users (admin@notelett.app with role=admin who can
write, user@notelett.app with role=user who is read-only). Re-runs are
no-ops once seeded.
- scripts/e2e-docker-test.sh — 9-step E2E that drives the deployed stack
via HTTP only (no browser): login → CORS preflight for PATCH →
workspace create → note create → note read → note PATCH (status:
draft→active) → note list → note delete → workspace delete.
- docs/testing/E2E_DOCKER_TESTING.md — full playbook covering prereqs,
seed, automated E2E, manual UI smoke, stack architecture diagram,
troubleshooting (JWT mismatch, unknown product, role rejection,
CORS, port conflict, data loss), tear-down, CI wiring guidance.
- package.json — pnpm e2e:docker:seed and pnpm e2e:docker:test
shortcuts.
Verified live on this host's deployed stack:
$ bash scripts/e2e-docker-seed.sh
↷ product 'notelett' already exists
↷ admin user already registered + login works
✓ user created
🟢 Seed complete.
$ bash scripts/e2e-docker-test.sh
✓ user=usr_e094e0c2-... role=admin
✓ CORS allows PATCH
✓ workspace created
✓ note created
✓ note read matches
✓ note patched (status: draft → active)
✓ note list returned (1 item)
✓ note deleted (HTTP 204)
✓ workspace deleted (HTTP 204)
🟢 All 9 E2E steps passed.
Backend regression suite still green: 380/380.
35 lines
1.5 KiB
JSON
35 lines
1.5 KiB
JSON
{
|
|
"name": "notelett-workspace",
|
|
"private": true,
|
|
"packageManager": "pnpm@10.6.5",
|
|
"scripts": {
|
|
"typecheck": "pnpm --filter @notelett/backend run typecheck && pnpm --filter @notelett/web run typecheck && pnpm --filter @notelett/mobile run typecheck",
|
|
"test": "pnpm --filter @notelett/backend run test && pnpm --filter @notelett/web run test && pnpm --filter @notelett/mobile run test",
|
|
"build": "pnpm --filter @notelett/backend run build && pnpm --filter @notelett/web run build",
|
|
"install:common-plat": "BYTELYST_PACKAGE_SOURCE=common-plat pnpm install -r",
|
|
"install:gitea": "BYTELYST_PACKAGE_SOURCE=gitea pnpm install -r",
|
|
"smoke:local": "bash scripts/local-smoke.sh",
|
|
"smoke:compose": "bash scripts/compose-smoke.sh",
|
|
"e2e:docker:seed": "bash scripts/e2e-docker-seed.sh",
|
|
"e2e:docker:test": "bash scripts/e2e-docker-test.sh",
|
|
"seed:bootstrap": "pnpm --filter @notelett/backend run bootstrap:seed",
|
|
"audit:release-guards": "bash scripts/release-guard-audit.sh",
|
|
"audit:ui": "bash scripts/ui-drift-audit.sh",
|
|
"audit:ui:strict": "bash scripts/ui-drift-audit.sh --strict",
|
|
"audit:ui:ratchet": "bash scripts/ui-drift-ratchet.sh",
|
|
"audit:ui:ratchet:update": "bash scripts/ui-drift-ratchet.sh --update",
|
|
"dependency:health": "bash scripts/dependency-health.sh",
|
|
"verify": "pnpm run typecheck && pnpm run test && pnpm run build",
|
|
"prepare": "husky"
|
|
},
|
|
"devDependencies": {
|
|
"husky": "^9.0.0"
|
|
},
|
|
"pnpm": {
|
|
"overrides": {
|
|
"react": "19.2.0",
|
|
"react-dom": "19.2.0"
|
|
}
|
|
}
|
|
}
|