PR Q: E2E Testcontainers integration suite #21

Merged
nsatoshi merged 1 commits from devin/1776882556-pr-q-e2e into main 2026-04-22 20:31:07 +00:00
Owner

Closes gap-analysis v2 §7.8 (no E2E tests vs a live Postgres/Chain-138 node) / §10.8 (Jest + Testcontainers scaffolding).

What

  • tests/e2e/transactionLifecycle.e2e.test.ts — real-Postgres E2E suite via @testcontainers/postgresql. Brings up postgres:15-alpine, applies schema.sql through pg's simple-query protocol (so the $$-dollar-quoted function bodies in the schema survive — the naive semicolon splitter in 001_initial_schema.ts breaks on them), then migrations 002/003/004. Exercises the plans HTTP endpoint, the signed event bus hash chain, and the idempotency_keys table against the live container.
  • jest.e2e.config.js — dedicated config for tests/e2e/ with a 120s timeout. The default jest.config.js now ignores /e2e/ so npm test stays <5s and doesn't require Docker.
  • package.jsonnpm run test:e2e (sets RUN_E2E=1).
  • devDependenciestestcontainers + @testcontainers/postgresql.
  • .github/workflows/ci.yml — adds orchestrator-test (tsc + jest unit) and orchestrator-e2e (gated on the run-e2e PR label or any push to main).

Safety

The suite is gated on RUN_E2E=1. Without it the describe block is describe.skip-ed, so CI environments or dev machines without Docker don't fail. A guard test asserts the skip invariant so nobody accidentally deletes the opt-in.

Follow-ups (intentionally out-of-scope)

  • ganache/hardhat container for DLT leg. The current test uses the mock notary — once the contract fixtures stabilise, swap in a GenericContainer running the hardhat node.
  • Stub FIN container — PR R stands up the HTTP sandbox; once landed, the E2E suite can add an end-to-end MT760 round-trip test.

Verification

npx tsc --noEmit              clean
npm test (unit)               7 suites, 80/80 passing
npm run test:e2e              1 suite, 4/4 passing (docker up)
Closes gap-analysis v2 §7.8 (no E2E tests vs a live Postgres/Chain-138 node) / §10.8 (Jest + Testcontainers scaffolding). ## What - `tests/e2e/transactionLifecycle.e2e.test.ts` — real-Postgres E2E suite via `@testcontainers/postgresql`. Brings up `postgres:15-alpine`, applies `schema.sql` through pg's simple-query protocol (so the `$$`-dollar-quoted function bodies in the schema survive — the naive semicolon splitter in `001_initial_schema.ts` breaks on them), then migrations 002/003/004. Exercises the plans HTTP endpoint, the signed event bus hash chain, and the idempotency_keys table against the live container. - `jest.e2e.config.js` — dedicated config for `tests/e2e/` with a 120s timeout. The default `jest.config.js` now ignores `/e2e/` so `npm test` stays <5s and doesn't require Docker. - `package.json` — `npm run test:e2e` (sets `RUN_E2E=1`). - `devDependencies` — `testcontainers` + `@testcontainers/postgresql`. - `.github/workflows/ci.yml` — adds `orchestrator-test` (tsc + jest unit) and `orchestrator-e2e` (gated on the `run-e2e` PR label or any push to `main`). ## Safety The suite is gated on `RUN_E2E=1`. Without it the describe block is `describe.skip`-ed, so CI environments or dev machines without Docker don't fail. A guard test asserts the skip invariant so nobody accidentally deletes the opt-in. ## Follow-ups (intentionally out-of-scope) - ganache/hardhat container for DLT leg. The current test uses the mock notary — once the contract fixtures stabilise, swap in a `GenericContainer` running the hardhat node. - Stub FIN container — PR R stands up the HTTP sandbox; once landed, the E2E suite can add an end-to-end MT760 round-trip test. ## Verification npx tsc --noEmit clean npm test (unit) 7 suites, 80/80 passing npm run test:e2e 1 suite, 4/4 passing (docker up)
nsatoshi added 1 commit 2026-04-22 18:36:41 +00:00
E2E Testcontainers integration suite
Some checks failed
CI / Frontend Lint (pull_request) Failing after 7s
CI / Frontend Type Check (pull_request) Failing after 6s
CI / Frontend Build (pull_request) Failing after 6s
CI / Frontend E2E Tests (pull_request) Failing after 7s
CI / Orchestrator Build (pull_request) Failing after 5s
CI / Orchestrator Unit Tests (pull_request) Failing after 6s
CI / Orchestrator E2E (Testcontainers) (pull_request) Has been skipped
CI / Contracts Compile (pull_request) Failing after 5s
CI / Contracts Test (pull_request) Failing after 7s
Code Quality / SonarQube Analysis (pull_request) Failing after 21s
Code Quality / Code Quality Checks (pull_request) Failing after 5s
Security Scan / Dependency Vulnerability Scan (pull_request) Failing after 3s
Security Scan / OWASP ZAP Scan (pull_request) Failing after 3s
69d8635f3c
Closes gap-analysis v2 §7.8 (no E2E vs live Postgres / §10.8
(Testcontainers opt-in suite).

- tests/e2e/transactionLifecycle.e2e.test.ts — Postgres-backed E2E
  suite via @testcontainers/postgresql. Brings up a real postgres:15
  container, applies schema.sql (via pg simple-query protocol so $$
  function bodies survive) + migrations 002/003/004, wires the
  plans endpoints against it, and asserts:
    * POST /api/plans persists and reads back
    * eventBus.publish produces a hash-chained pair with verifyChain
      returning ok
    * idempotency_keys row insertion round-trips
- jest.e2e.config.js — dedicated config for tests/e2e/ with 120s
  timeout; default jest.config.js now ignores /e2e/ so `npm test`
  stays fast (<5s) and doesn't require Docker.
- package.json — adds 'npm run test:e2e' (sets RUN_E2E=1).
- devDependencies — testcontainers + @testcontainers/postgresql.
- Suite gates on `RUN_E2E=1`. Without it the describe block is
  skipped, so CI environments without Docker don't fail; a guard
  test asserts the skip invariant.
- .github/workflows/ci.yml — adds orchestrator-test (tsc + jest)
  and orchestrator-e2e (gated on the 'run-e2e' PR label or any
  push to main).
- Verification:
    npx tsc --noEmit              clean
    npm test (unit)               7 suites, 80/80 passing
    npm run test:e2e              1 suite, 4/4 passing (docker up)
nsatoshi merged commit d7d3e80bff into main 2026-04-22 20:31:07 +00:00
Sign in to join this conversation.
No Reviewers
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: d-bis/CurrenciCombo#21