Skip to main content

Care Plan Service — Testing Strategy

Status: populated Owner: TBD Last updated: 2026-04-18 Companion: Service Template · 03 platform-services · 02 DDD

Coverage Targets

LayerMinimum coverage
Unit (domain + use cases)90%
Integration80%
ContractAll API endpoints and published events
E2ECritical paths only

Test Types

Unit Tests (test/unit/)

  • Care plan status transition logic — all valid and invalid transitions
  • Optimistic concurrency: version increment, stale-version rejection
  • Goal overdue detection algorithm
  • Activity status transition rules
  • FHIR mapper — CarePlan, Goal, Task, CareTeam domain → FHIR resource
  • Outbox event construction — payload shape per event type
  • Error factory — correct HTTP codes for domain errors

Integration Tests (test/integration/)

Mandatory (must pass before any merge):

Test fileWhat it proves
tenant-isolation.integration.spec.tsTenant A cannot read or write Tenant B's care plans; zero cross-tenant leakage under adversarial queries
outbox.integration.spec.tsDomain events written to outbox in same transaction as entity; relay publishes to NATS; idempotent re-publish
inbox.integration.spec.tsConsumed events (patient.registered) are deduplicated; duplicate delivery has no side effect

Additional:

Test fileScenario
create-care-plan.integration.spec.tsFull create → DB → outbox → event published
version-conflict.integration.spec.tsConcurrent updates return 409; no silent overwrite
care-plan-closed.integration.spec.tsMutations on completed/revoked plan return 409
fhir-read-surface.integration.spec.tsFHIR CarePlan/Goal/CareTeam read returns valid R4 resource
licensing-gate.integration.spec.tsMODULE_NOT_LICENSED returned when entitlement absent

Contract Tests (test/contract/)

  • care-plans-api.pact.spec.ts — consumer-driven Pact contracts for patient-chart-service and patient-portal-service
  • care-plan-events.schema.spec.ts — all produced events validated against JSON schemas registered in schema registry
  • fhir-careplan.schema.spec.ts — FHIR CarePlan output validated against R4 StructureDefinition

E2E Tests (test/e2e/)

ScenarioFile
Create plan → add goal → add activity → complete activity → reviewcare-plan-full-lifecycle.e2e.spec.ts
Multidisciplinary edit: two clinicians updating same plan; conflict surfacedconcurrent-edit.e2e.spec.ts
Patient portal reads plan via FHIR surfaceportal-fhir-read.e2e.spec.ts

Test Infrastructure

  • Vitest for unit and integration tests
  • Testcontainers for Postgres (per-test schema isolation)
  • NATS test server for outbox/inbox integration tests
  • Pact broker for consumer-driven contract tests
  • Golden FHIR fixtures stored in test/fixtures/fhir/ — validated in CI against R4 base profile

Key Scenarios to Never Remove

  1. Tenant isolation — adversarial cross-tenant query returns 0 results
  2. Version conflict — stale write returns 409, not 200
  3. Closed plan mutation — returns 409, not 200
  4. Outbox transactionality — crash after DB write replays event correctly on recovery