Virtual Care Service — Testing Strategy
Status: populated Owner: TBD Last updated: 2026-04-18 Companion: Service Template · Testing Standards
1. Coverage Targets
| Layer | Target |
|---|---|
| Domain logic (FSM, invariants, token) | ≥ 90% |
| Application use cases | ≥ 85% |
| Infrastructure adapters | ≥ 80% |
| Overall service | ≥ 80% |
2. Test Layers
2.1 Unit Tests
| Scenario | File |
|---|---|
| Session FSM: valid transitions | virtual-session.spec.ts |
| Session FSM: invalid transitions throw domain error | virtual-session.spec.ts |
| Session cannot be created without patient | virtual-session.spec.ts |
| No session row if video backend returns 503 | create-virtual-session.use-case.spec.ts |
| Recording requires consent flag | virtual-session.spec.ts |
| Join token: expiry validation | join-token.spec.ts |
| Join token: invalid signature rejected | join-token.spec.ts |
| Participant FSM: valid transitions | session-participant.spec.ts |
| Async visit: clientMutationId idempotency | async-visit.spec.ts |
| Config: credentials never returned in DTO | tenant-config.mapper.spec.ts |
2.2 Integration Tests (mandatory)
| Test | File |
|---|---|
| Tenant isolation — session query returns only own tenant | tenant-isolation.integration.spec.ts |
| Outbox — session lifecycle events published after commit | outbox.integration.spec.ts |
| Inbox — scheduling appointment events deduplicated | inbox.integration.spec.ts |
| RLS blocks cross-tenant session access | rls-enforcement.integration.spec.ts |
| Consent gate blocks session creation when consent missing | consent-gate.integration.spec.ts |
| Session creation blocked when backend returns 503 | video-backend-health.integration.spec.ts |
| Appointment auto-creates session (event-driven) | appointment-handler.integration.spec.ts |
| Session end triggers FHIR Encounter creation | encounter-creation.integration.spec.ts |
| Async visit clientMutationId deduplication | async-visit-dedup.integration.spec.ts |
2.3 Contract Tests
| Test | File |
|---|---|
| OpenAPI contract — sessions CRUD | sessions.pact.spec.ts |
| OpenAPI contract — join token | join-token.pact.spec.ts |
Event schema — session.created.v1 | session-created.schema.spec.ts |
Event schema — session.ended.v1 | session-ended.schema.spec.ts |
| Jitsi adapter — mock Jitsi API contract | jitsi-meet.pact.spec.ts |
| FHIR gateway — Encounter creation contract | fhir-encounter.pact.spec.ts |
2.4 E2E Tests
| Scenario | File |
|---|---|
| Full session lifecycle: create → join → admit → end | session-lifecycle.e2e.spec.ts |
| Bandwidth fallback: session fails → fallback messaging created | bandwidth-fallback.e2e.spec.ts |
| Join token: expired token rejected | join-token-expired.e2e.spec.ts |
| Async visit: submit offline content; verify deduplication | async-visit.e2e.spec.ts |
| Tenant isolation: cross-tenant request blocked | cross-tenant.e2e.spec.ts |
3. Simulation Requirements
- Jitsi mock server: WireMock stubs for room create (success), room create (503), and health check endpoints.
- Bandwidth simulation: Tests for fallback must simulate 503 from backend mid-session.
- Appointment event simulator: NATS message injection for
scheduling.appointment.scheduled.v1withserviceType=VR.
4. Test Data / Seed Requirements
- 2 tenants:
tenant-a(licensed),tenant-b(licensed),tenant-nolicense(unlicensed) - 5 providers, 10 patients with telehealth consent on file, 2 patients without consent
- Pre-created sessions in each lifecycle state for FSM transition tests
- KMS stub for join token signing in test environment