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.
.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)
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)
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
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 uppostgres:15-alpine, appliesschema.sqlthrough pg's simple-query protocol (so the$$-dollar-quoted function bodies in the schema survive — the naive semicolon splitter in001_initial_schema.tsbreaks 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 fortests/e2e/with a 120s timeout. The defaultjest.config.jsnow ignores/e2e/sonpm teststays <5s and doesn't require Docker.package.json—npm run test:e2e(setsRUN_E2E=1).devDependencies—testcontainers+@testcontainers/postgresql..github/workflows/ci.yml— addsorchestrator-test(tsc + jest unit) andorchestrator-e2e(gated on therun-e2ePR label or any push tomain).Safety
The suite is gated on
RUN_E2E=1. Without it the describe block isdescribe.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)
GenericContainerrunning the hardhat node.Verification
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)