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-renderandqr-lookup(partitionCheck) — sibling services, not part of this component.
| Collection | Files | With assertions | disabled | In scope |
|---|---|---|---|---|
item | 66 | 63 | 34 | ✅ |
business-affiliates | 28 | 23 | 5 | ✅ |
kanban | 65 | 62 | 48 | ✅ |
operations-configuration | 2 | 2 | 1 | ✅ |
partitionCheck/operations | 1 | 1 | 0 | ✅ (item-openapi probe) |
orders | 60 | 15 | 45 | ❌ API changing |
partitionCheck/{pdf-render,qr-lookup} | 6 | 6 | 3 | ❌ other services |
Two facts reshape “port them all”:
- 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. - 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).
Capability Model
Section titled “Capability Model”Capabilities are deployed features; the only meaningful differences are local vs
AWS. The Capability enum:
baseline, email, image-upload, pdf-printing, csv-upload.
| SUT | Capabilities |
|---|---|
local | baseline |
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.
| Capability | In-scope tests | Runs on dev? |
|---|---|---|
baseline | item CRUD / query / drafts / supplies / lookups / history; all kanban; all BA; config | ✅ |
pdf-printing | item print-label / print-breadcrumb; kanban print-card | ✅ (dev has it) |
csv-upload | item 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.
Category Mapping
Section titled “Category Mapping”| Category | Source scenarios |
|---|---|
probe | Each module’s OpenAPI reachability; partitionCheck/operations; config-route presence |
sanity | item create→get; kanban create+get; BA CRUD; config auth 200 |
acceptance | Kanban 17-step lifecycle (the flagship cross-workflow) |
functional | item drafts / supplies / bulk / lookups (10 dims) / history / printing; kanban details / summaries / print-cards / annotate / unmark / for-item; BA roles / name-cascade / vendor-lookup |
stress | item noName / bad-auth / no-draft / discard-none-exists; config no-auth 401; BA verify-deletion 404 |
bug | Ticket folders where a Linear ticket exists (kanban operations-117, item lookup-management-626/671); otherwise fold into functional |
Dependency Order
Section titled “Dependency Order”kanban cards need items, so item precedes kanban. business-affiliate and
operations-configuration are independent and parallelizable.
Reusable Workflow Builders
Section titled “Reusable Workflow Builders”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)andrequestCard(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.
Increments and Checkpoints
Section titled “Increments and Checkpoints”Increment 0 (framework + item probe/sanity + generated item proxy) is done.
| # | Increment | Deliverables | Exit checkpoint |
|---|---|---|---|
| 1 | Probes + config + builder pattern | gen-proxies for kanban / BA / config; OpenAPI probes for all in-scope modules; operations-configuration sanity (200) + stress (401); establish the createItem builder | run --category probe green for all modules; config sanity+stress green |
| 2 | item 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) |
| 3 | kanban 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 |
| 4 | business-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) |
| 5 | Consolidation + infra | custom reporter (result matrix), quarantine validator, globalSetup SUT descriptor; define the acceptance release-gate set; per-request X-Author override; CHANGELOG + PRs | run --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).
Resolved Decisions
Section titled “Resolved Decisions”orders— out of scope (API changing). Revisit after the API stabilizes.pdf-render/qr-lookup— out of scope (other services).disabledtriage — port-if-current-endpoint, drop-if-stale (above).- Capability model —
baseline/email/image-upload/pdf-printing/csv-upload; local = baseline, AWS = baseline + image-upload + pdf-printing + csv-upload. X-Authorper-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
Copyright: © Arda Systems 2025-2026, All rights reserved