Skip to content

Manual Test Plans — Projection Visualization & Actions

Operator-facing test plans for the projection / subscription surface in CritterWatch's BFF UI. Tracks CritterWatch#314.

Each plan is a sequence of test steps in the format the issue prescribed:

FieldWhat it captures
SetupWhich sample family, scale, launch profile (Aspire scenario, env vars, CLI flags)
ActionThe operator interaction or external event under test
Expected observationWhat the UI should render — or what alert should fire
How to verifyConcrete handles — UI element under what selector, capability snapshot field, mt_event_progression columns to query directly

Scenario families

PlanSubstrateNotes
ViewingTrip / TeleHealth / MultiStoreHostProjections list + detail pages; per-store HWM; shard-state badges; dead-letter section policy awareness
ActionsTrip familyPause, restart, rebuild, rewind across single-store async projections
Long-running rebuilds (priority)TeleHealth (5 tenants × 50k events default; 50 × 400k upstream max)Rebuild duration, mid-flight pause/restart, process kill + recovery, force-apply-error, cluster failover
Multi-storeMultiStoreHost (MainPlusAncillary + AncillaryOnly modes)All actions against ancillary projections; per-store HWM independence
Multi-tenancyMTTrips (master-table dynamic tenancy); TeleHealth (conjoined + hash-partitioning)Dynamic tenant add / disable / enable; per-tenant ops

The long-running rebuilds plan is the priority area; everything else is round-out. Read the priority plan first if you only have time for one.

Substrate quick-reference

Set up the right Aspire scenario before running any plan below.

SampleWhat it gives youAspire profile
Trips (RepairShop + TripService + TripPublisher)Standard 3-projection async setup over RabbitMQ + MartenFull (default)
Trips2Repeat of Trips with a separate prefix; useful for "two services side by side" testsFull
Trips3Trip family over Amazon SQS via LocalStack + brotli compressionFull
PolecatTripsTrip family backed by Polecat instead of MartenFull
MTTripsTrip messaging over LocalStack SQS + Marten master-table dynamic tenancyFull, or tenancy for dedicated profile
IncidentsStop-on-error projection sample (PS#3 substrate)Full
TeleHealthMarten.ScaleTesting-derived; default 5 tenants × 50k events, scalable via CLI flagsFull (default scale), or multi-store for AncillaryOnly
MultiStoreHostThree Marten stores (Trips + Incidents + TeleHealth) in one process — PS#2 substrateFull or multi-store
ModularMonolithFour-module sample with local-queue inter-module messagingFull

Aspire scenarios are selected via the CRITTERWATCH_SCENARIO env var on BffHost, or via launch profile in Properties/launchSettings.json. See src/BffHost/README.md for the full mode matrix.

Verification handles

Every plan ends each step with a "How to verify" line. The common handles, in order of preference:

  1. UI element with a data-testid — preferred when one exists (the Vue components added them defensively in #314, #150, #309 follow-ups). Cite the testid directly so the verification is automatable later.
  2. UI element with a stable text + selector pair — e.g. el-card:has-text("…"), el-table__row[data-row-key="…"]. Cite the pair.
  3. BFF API or SignalR snapshotGET /api/critterwatch/service-summaries/<service-id> returns the same ServiceSummary aggregate the UI renders from. Curl it when the UI's render is in doubt.
  4. Raw Marten / Polecat tablesmt_event_progression (Marten) or pc_event_progression (Polecat). Use these when the test exercises low-level daemon behaviour (HWM, agent_status, pause_reason, running_on_node, warning/critical_behind_threshold per the 6-column extended-progression-tracking surface).

When a plan asks for a "How to verify" step that requires raw-table access, the SQL is included inline so the operator doesn't need to context-switch.

Cross-references

  • #309 — Long-running projection rebuild orchestration (design partner for the rebuild plan; cross-referenced where tests depend on unimplemented features).
  • PS#2 — issue #2 — multi-store HWM rendering (fix landed in #329 / #333 / #334 / #335).
  • PS#3 — issue #3 — projection error-policy aware DLQ section (fix landed in #326 / #327 / #328).

Released under the MIT License.