Skip to content

Porting Plan: Bruno → TypeScript Suite

Plan to port the operations-relevant Bruno tests in api-test into the new TypeScript suite (operations/api-tests). Built from a full inventory of the Bruno collections. See the design for the framework and the decision log for the choices this builds on.

In scope: item, business-affiliate, kanban, operations-configuration, and the single operations partitionCheck probe.

Explicitly out of scope:

  • orders — the orders API is changing imminently; do not port it now.
  • pdf-render and qr-lookup (partitionCheck) — sibling services, not part of this component.
CollectionFilesWith assertionsdisabledIn scope
item666334
business-affiliates28235
kanban656248
operations-configuration221
partitionCheck/operations110✅ (item-openapi probe)
orders601545❌ API changing
partitionCheck/{pdf-render,qr-lookup}663❌ other services

Two facts reshape “port them all”:

  1. File count ≠ work. Many in-scope files are example-only (no assertions) or duplicated — the 17-step kanban lifecycle exists twice, byte-identical (Demo202509-card-ordering == Tickets/operations-56). Port the distinct scenarios and endpoints, not files. Effective in-scope target ≈ 40–60 TS test files.
  2. No version-gating exists anywhere — nothing to port there.

Triage policy (confirmed): port disabled tests that still cover a real, current endpoint (e.g. item Printing, HappyPath drafts); drop stale scaffolds. Do not auto-quarantine — quarantine needs a ticket + expiry (DQ-014).

Capabilities are deployed features; the only meaningful differences are local vs AWS. The Capability enum: baseline, email, image-upload, pdf-printing, csv-upload.

SUTCapabilities
localbaseline
all AWS (alpha002-dev, -stage, alpha001-demo, -prod)baseline, image-upload, pdf-printing, csv-upload

email is deployed nowhere yet. Each test declares requires; a test skips (reported) when its capability is absent from the SUT.

CapabilityIn-scope testsRuns on dev?
baselineitem CRUD / query / drafts / supplies / lookups / history; all kanban; all BA; config
pdf-printingitem print-label / print-breadcrumb; kanban print-card✅ (dev has it)
csv-uploaditem upload-job (CSV bulk import)✅ (dev has it)
image-upload(no Bruno tests to port currently)
email(no operations Bruno tests; not deployed)

So against any AWS SUT, all in-scope categories run; only email (undeployed) and local (baseline only) leave tests skipped.

CategorySource scenarios
probeEach module’s OpenAPI reachability; partitionCheck/operations; config-route presence
sanityitem create→get; kanban create+get; BA CRUD; config auth 200
acceptanceKanban 17-step lifecycle (the flagship cross-workflow)
functionalitem drafts / supplies / bulk / lookups (10 dims) / history / printing; kanban details / summaries / print-cards / annotate / unmark / for-item; BA roles / name-cascade / vendor-lookup
stressitem noName / bad-auth / no-draft / discard-none-exists; config no-auth 401; BA verify-deletion 404
bugTicket folders where a Linear ticket exists (kanban operations-117, item lookup-management-626/671); otherwise fold into functional

kanban cards need items, so item precedes kanban. business-affiliate and operations-configuration are independent and parallelizable.

PlantUML diagram

Because tests are leaves (DQ-013), the chained Bruno flows become composable builders in util/test (or a level’s shared), not test→test imports:

  • createItem(overrides) → item + captured eId/rId (used by item + kanban).
  • createCard(itemEId) and requestCard(cardEId) (used by kanban).
  • createBusinessAffiliate(...), addVendorRole(...).

These replace Bruno’s bru.setVar/getVar chaining with explicit, typed composition. Each run mints a fresh tenant (DQ-017), so fixtures are isolated without teardown.

Increment 0 (framework + item probe/sanity + generated item proxy) is done.

#IncrementDeliverablesExit checkpoint
1Probes + config + builder patterngen-proxies for kanban / BA / config; OpenAPI probes for all in-scope modules; operations-configuration sanity (200) + stress (401); establish the createItem builderrun --category probe green for all modules; config sanity+stress green
2item module (full)item façade expanded; sanity (query); functional (drafts, supplies, bulk, all 10 lookups, history, printing→pdf-printing, upload-job→csv-upload); stress (noName, bad-auth, no-draft)item coverage complete; item probe→functional green vs dev (all run)
3kanban module (full)kanban façade; sanity (create+get+query); acceptance = 17-step lifecycle (deduped) as a module cross-workflow; functional (details / summaries / print-cards→pdf-printing / annotate / unmark / for-item)kanban lifecycle acceptance green; kanban coverage complete
4business-affiliate (full)BA façade; sanity (CRUD); functional (roles, name-cascade, vendor lookup role=VENDOR); stress (deletion 404)BA coverage complete (parallelizable with 2–3)
5Consolidation + infracustom reporter (result matrix), quarantine validator, globalSetup SUT descriptor; define the acceptance release-gate set; per-request X-Author override; CHANGELOG + PRsrun --category acceptance green end-to-end; operations PR + documentation PR open

Increments 2 and 4 are independent given the builders from Increment 1; Increment 3 requires the item builder. Each increment ends green against alpha002-dev (auth via make secrets).

  • orders — out of scope (API changing). Revisit after the API stabilizes.
  • pdf-render / qr-lookup — out of scope (other services).
  • disabled triage — port-if-current-endpoint, drop-if-stale (above).
  • Capability modelbaseline / email / image-upload / pdf-printing / csv-upload; local = baseline, AWS = baseline + image-upload + pdf-printing + csv-upload.
  • X-Author per-request override — small authed-client extension, landed in Increment 5 (some tests vary author to exercise authorship).

Copyright: (c) Arda Systems 2025-2026, All rights reserved