@ontrails/testing 1.0.0-beta.13 → 1.0.0-beta.15

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (83) hide show
  1. package/.turbo/turbo-lint.log +1 -1
  2. package/CHANGELOG.md +28 -0
  3. package/README.md +11 -11
  4. package/dist/all.d.ts +10 -5
  5. package/dist/all.d.ts.map +1 -1
  6. package/dist/all.js +78 -26
  7. package/dist/all.js.map +1 -1
  8. package/dist/assertions.d.ts +23 -0
  9. package/dist/assertions.d.ts.map +1 -1
  10. package/dist/assertions.js +154 -0
  11. package/dist/assertions.js.map +1 -1
  12. package/dist/context.d.ts +17 -16
  13. package/dist/context.d.ts.map +1 -1
  14. package/dist/context.js +31 -20
  15. package/dist/context.js.map +1 -1
  16. package/dist/contracts.d.ts.map +1 -1
  17. package/dist/contracts.js +9 -5
  18. package/dist/contracts.js.map +1 -1
  19. package/dist/crosses.d.ts +4 -4
  20. package/dist/crosses.d.ts.map +1 -1
  21. package/dist/crosses.js +49 -39
  22. package/dist/crosses.js.map +1 -1
  23. package/dist/detours.d.ts +5 -4
  24. package/dist/detours.d.ts.map +1 -1
  25. package/dist/detours.js +93 -14
  26. package/dist/detours.js.map +1 -1
  27. package/dist/effective-examples.d.ts +30 -0
  28. package/dist/effective-examples.d.ts.map +1 -0
  29. package/dist/effective-examples.js +227 -0
  30. package/dist/effective-examples.js.map +1 -0
  31. package/dist/examples.d.ts +1 -1
  32. package/dist/examples.d.ts.map +1 -1
  33. package/dist/examples.js +79 -41
  34. package/dist/examples.js.map +1 -1
  35. package/dist/harness-cli.d.ts +3 -3
  36. package/dist/harness-cli.d.ts.map +1 -1
  37. package/dist/harness-cli.js +25 -33
  38. package/dist/harness-cli.js.map +1 -1
  39. package/dist/harness-mcp.d.ts +3 -3
  40. package/dist/harness-mcp.d.ts.map +1 -1
  41. package/dist/harness-mcp.js +9 -8
  42. package/dist/harness-mcp.js.map +1 -1
  43. package/dist/index.d.ts +6 -4
  44. package/dist/index.d.ts.map +1 -1
  45. package/dist/index.js +5 -2
  46. package/dist/index.js.map +1 -1
  47. package/dist/scenario.d.ts +37 -0
  48. package/dist/scenario.d.ts.map +1 -0
  49. package/dist/scenario.js +235 -0
  50. package/dist/scenario.js.map +1 -0
  51. package/dist/types.d.ts +38 -5
  52. package/dist/types.d.ts.map +1 -1
  53. package/package.json +9 -5
  54. package/src/__tests__/all.test.ts +217 -29
  55. package/src/__tests__/context.test.ts +32 -12
  56. package/src/__tests__/contracts.test.ts +72 -18
  57. package/src/__tests__/crosses.test.ts +78 -78
  58. package/src/__tests__/detours.test.ts +176 -19
  59. package/src/__tests__/effective-examples.test.ts +203 -0
  60. package/src/__tests__/examples.test.ts +152 -50
  61. package/src/__tests__/harness-cli.test.ts +90 -0
  62. package/src/__tests__/harness-mcp.test.ts +37 -0
  63. package/src/__tests__/partial-match.test.ts +126 -0
  64. package/src/__tests__/scenario.test.ts +381 -0
  65. package/src/all.ts +149 -12
  66. package/src/assertions.ts +253 -0
  67. package/src/context.ts +64 -38
  68. package/src/contracts.ts +14 -8
  69. package/src/crosses.ts +93 -51
  70. package/src/detours.ts +155 -18
  71. package/src/effective-examples.ts +350 -0
  72. package/src/examples.ts +127 -59
  73. package/src/harness-cli.ts +33 -49
  74. package/src/harness-mcp.ts +9 -8
  75. package/src/index.ts +13 -3
  76. package/src/scenario.ts +370 -0
  77. package/src/types.ts +63 -5
  78. package/tsconfig.tests.json +10 -0
  79. package/tsconfig.tsbuildinfo +1 -1
  80. package/dist/follows.d.ts +0 -38
  81. package/dist/follows.d.ts.map +0 -1
  82. package/dist/follows.js +0 -212
  83. package/dist/follows.js.map +0 -1
@@ -0,0 +1,30 @@
1
+ import type { Trail, TrailExample } from '@ontrails/core';
2
+ /**
3
+ * Returns `true` if the given example was synthesized from contour fixtures
4
+ * by `deriveTrailExamples`, `false` if it was authored on the trail.
5
+ */
6
+ export declare const isDerivedExample: (example: TrailExample<unknown, unknown>) => boolean;
7
+ /**
8
+ * Prefer authored trail examples and fall back to contour-derived fixtures.
9
+ *
10
+ * Examples returned by this helper come from one of two provenances:
11
+ * - **Authored.** When `trail.examples` is non-empty, its entries are
12
+ * returned verbatim. These are the developer's stated intent and carry
13
+ * full invariants — including crossing-coverage assertions in
14
+ * `testExamples`.
15
+ * - **Derived.** When there are no authored examples but the trail has
16
+ * contours with examples, candidate inputs are synthesized from contour
17
+ * fixtures and validated against `trail.input`. These are opportunistic
18
+ * coverage that exists to let `testAll(app)` exercise contour-backed
19
+ * trails without per-test setup; they are not guaranteed to exercise
20
+ * every composition branch, so consumers should relax invariants that
21
+ * only make sense for authored inputs (see `isDerivedExample`).
22
+ *
23
+ * Contour examples stay as the raw input payload so Trails validation /
24
+ * transforms still happen exactly once inside the normal test execution
25
+ * path. Derived examples are additionally tagged via a module-level
26
+ * `WeakSet` so consumers can detect them without widening the public
27
+ * `TrailExample` shape.
28
+ */
29
+ export declare const deriveTrailExamples: (trail: Trail<unknown, unknown, unknown>) => readonly TrailExample<unknown, unknown>[];
30
+ //# sourceMappingURL=effective-examples.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"effective-examples.d.ts","sourceRoot":"","sources":["../src/effective-examples.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAc,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAiBtE;;;GAGG;AACH,eAAO,MAAM,gBAAgB,GAC3B,SAAS,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,KACtC,OAAuC,CAAC;AAqQ3C;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,eAAO,MAAM,mBAAmB,GAC9B,OAAO,KAAK,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,KACtC,SAAS,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,EAyCzC,CAAC"}
@@ -0,0 +1,227 @@
1
+ import { getContourReferences } from '@ontrails/core';
2
+ import { z } from 'zod';
3
+ /**
4
+ * Tracks examples that `deriveTrailExamples` synthesizes from contour
5
+ * fixtures. Authored examples are passed through untouched and never
6
+ * appear here, so consumers can distinguish the two by identity.
7
+ *
8
+ * Exposed via `isDerivedExample` so downstream testing helpers (e.g.
9
+ * `testExamples` crossing coverage) can relax invariants that only make
10
+ * sense for authored inputs.
11
+ */
12
+ const derivedExamples = new WeakSet();
13
+ /**
14
+ * Returns `true` if the given example was synthesized from contour fixtures
15
+ * by `deriveTrailExamples`, `false` if it was authored on the trail.
16
+ */
17
+ export const isDerivedExample = (example) => derivedExamples.has(example);
18
+ const capitalize = (value) => value.length === 0 ? value : value.slice(0, 1).toUpperCase() + value.slice(1);
19
+ const collectReferenceMap = (contours) => {
20
+ const contourNames = new Set(contours.map((contour) => contour.name));
21
+ return new Map(contours.map((contour) => [
22
+ contour.name,
23
+ getContourReferences(contour).filter((reference) => contourNames.has(reference.contour)),
24
+ ]));
25
+ };
26
+ const getIdentityValue = (fixture) => fixture.example[fixture.contour.identity];
27
+ const candidateMatchesSelectedReference = (candidate, target, reference) => Object.is(candidate.example[reference.field], getIdentityValue(target));
28
+ const selectedMatchesCandidateReference = (fixture, candidate, reference) => Object.is(fixture.example[reference.field], getIdentityValue(candidate));
29
+ const matchesCandidateReferences = (candidate, selected, referencesByContour) => {
30
+ const candidateReferences = referencesByContour.get(candidate.contour.name) ?? [];
31
+ for (const reference of candidateReferences) {
32
+ const target = selected.find((fixture) => fixture.contour.name === reference.contour);
33
+ if (target === undefined) {
34
+ continue;
35
+ }
36
+ if (!candidateMatchesSelectedReference(candidate, target, reference)) {
37
+ return false;
38
+ }
39
+ }
40
+ return true;
41
+ };
42
+ const matchesSelectedReferences = (candidate, selected, referencesByContour) => {
43
+ for (const fixture of selected) {
44
+ const fixtureReferences = referencesByContour.get(fixture.contour.name) ?? [];
45
+ for (const reference of fixtureReferences) {
46
+ if (reference.contour !== candidate.contour.name) {
47
+ continue;
48
+ }
49
+ if (!selectedMatchesCandidateReference(fixture, candidate, reference)) {
50
+ return false;
51
+ }
52
+ }
53
+ }
54
+ return true;
55
+ };
56
+ const matchesKnownReferences = (candidate, selected, referencesByContour) => matchesCandidateReferences(candidate, selected, referencesByContour) &&
57
+ matchesSelectedReferences(candidate, selected, referencesByContour);
58
+ const selectContourFixtures = (contours, referencesByContour, index = 0, selected = []) => {
59
+ const contour = contours[index];
60
+ if (contour === undefined) {
61
+ return [selected];
62
+ }
63
+ const examples = contour.examples ?? [];
64
+ const matchingFixtures = examples.flatMap((example, exampleIndex) => {
65
+ const fixture = {
66
+ contour,
67
+ example: example,
68
+ index: exampleIndex,
69
+ };
70
+ if (!matchesKnownReferences(fixture, selected, referencesByContour)) {
71
+ return [];
72
+ }
73
+ return selectContourFixtures(contours, referencesByContour, index + 1, [
74
+ ...selected,
75
+ fixture,
76
+ ]);
77
+ });
78
+ return matchingFixtures;
79
+ };
80
+ /**
81
+ * Merge selected contour fixtures into a single candidate input object.
82
+ *
83
+ * The resulting record contains:
84
+ * - `<contour>`: the full fixture payload keyed by contour name.
85
+ * - `<contour><Identity>`: the fixture's identity value on a prefixed key.
86
+ * - `<contour><Field>`: every fixture field on a prefixed key.
87
+ * - Unqualified `<field>` keys: first-write-wins across contours.
88
+ *
89
+ * The first-write-wins behaviour on unqualified keys is intentional but can
90
+ * silently drop a later contour's value when two contours share a field name
91
+ * (e.g. both declare `id`). The prefixed aliases above are unambiguous and
92
+ * always written, so schemas that consume the prefixed form are unaffected;
93
+ * schemas that rely on the bare field name should disambiguate via the
94
+ * prefixed alias instead.
95
+ */
96
+ const buildDerivedInput = (fixtures) => {
97
+ const candidate = {};
98
+ for (const fixture of fixtures) {
99
+ candidate[fixture.contour.name] = fixture.example;
100
+ candidate[`${fixture.contour.name}${capitalize(fixture.contour.identity)}`] = getIdentityValue(fixture);
101
+ for (const [field, value] of Object.entries(fixture.example)) {
102
+ if (!Object.hasOwn(candidate, field)) {
103
+ candidate[field] = value;
104
+ }
105
+ candidate[`${fixture.contour.name}${capitalize(field)}`] = value;
106
+ }
107
+ }
108
+ return candidate;
109
+ };
110
+ /**
111
+ * Project the merged candidate input down to keys the trail's input schema
112
+ * knows about.
113
+ *
114
+ * `buildDerivedInput` emits synthesized prefixed aliases (e.g. `userEmail`)
115
+ * alongside bare field names. Strict schemas (`z.object(...).strict()`)
116
+ * reject any unknown key, which means an otherwise valid derived fixture
117
+ * would silently fail `safeParse` just because of the synthesized aliases.
118
+ * When the input is a `ZodObject`, trim the candidate to its declared keys
119
+ * before validation. Non-object inputs pass through unchanged — they are
120
+ * validated as-is and can decide for themselves.
121
+ */
122
+ const projectInputForSchema = (inputSchema, candidate) => {
123
+ if (!(inputSchema instanceof z.ZodObject)) {
124
+ return candidate;
125
+ }
126
+ const known = Object.keys(inputSchema.shape);
127
+ const projected = {};
128
+ for (const key of known) {
129
+ if (Object.hasOwn(candidate, key)) {
130
+ projected[key] = candidate[key];
131
+ }
132
+ }
133
+ return projected;
134
+ };
135
+ /**
136
+ * Derive an expected output value from the selected contour fixtures when
137
+ * exactly one fixture's payload satisfies the trail's output schema.
138
+ *
139
+ * Returns `undefined` when the trail has no output schema, when no fixture
140
+ * matches, or when more than one matches — callers should then leave the
141
+ * derived example without an `expected` and fall back to schema-only
142
+ * validation. We intentionally do **not** infer `expected` from the merged
143
+ * candidate input: input and output schemas frequently overlap structurally
144
+ * but represent different semantics, so inferring from the input would
145
+ * produce false deep-equality failures.
146
+ */
147
+ const deriveExpectedValue = (trail, fixtures) => {
148
+ if (trail.output === undefined) {
149
+ return undefined;
150
+ }
151
+ const outputSchema = trail.output;
152
+ const contourMatches = fixtures
153
+ .map((fixture) => outputSchema.safeParse(fixture.example))
154
+ .filter((candidate) => candidate.success);
155
+ if (contourMatches.length !== 1) {
156
+ return undefined;
157
+ }
158
+ const [singleMatch] = contourMatches;
159
+ if (singleMatch === undefined) {
160
+ return undefined;
161
+ }
162
+ return singleMatch.data;
163
+ };
164
+ const formatFixtureName = (fixtures, index) => {
165
+ const label = fixtures
166
+ .map((fixture) => {
167
+ const identity = getIdentityValue(fixture);
168
+ const fallback = fixture.index + 1;
169
+ return `${fixture.contour.name}:${String(identity ?? fallback)}`;
170
+ })
171
+ .join(', ');
172
+ return label.length > 0
173
+ ? `Derived fixture ${index + 1} (${label})`
174
+ : `Derived fixture ${index + 1}`;
175
+ };
176
+ /**
177
+ * Prefer authored trail examples and fall back to contour-derived fixtures.
178
+ *
179
+ * Examples returned by this helper come from one of two provenances:
180
+ * - **Authored.** When `trail.examples` is non-empty, its entries are
181
+ * returned verbatim. These are the developer's stated intent and carry
182
+ * full invariants — including crossing-coverage assertions in
183
+ * `testExamples`.
184
+ * - **Derived.** When there are no authored examples but the trail has
185
+ * contours with examples, candidate inputs are synthesized from contour
186
+ * fixtures and validated against `trail.input`. These are opportunistic
187
+ * coverage that exists to let `testAll(app)` exercise contour-backed
188
+ * trails without per-test setup; they are not guaranteed to exercise
189
+ * every composition branch, so consumers should relax invariants that
190
+ * only make sense for authored inputs (see `isDerivedExample`).
191
+ *
192
+ * Contour examples stay as the raw input payload so Trails validation /
193
+ * transforms still happen exactly once inside the normal test execution
194
+ * path. Derived examples are additionally tagged via a module-level
195
+ * `WeakSet` so consumers can detect them without widening the public
196
+ * `TrailExample` shape.
197
+ */
198
+ export const deriveTrailExamples = (trail) => {
199
+ if (trail.examples !== undefined && trail.examples.length > 0) {
200
+ return trail.examples;
201
+ }
202
+ if (trail.contours.length === 0) {
203
+ return [];
204
+ }
205
+ if (trail.contours.some((contour) => contour.examples === undefined || contour.examples.length === 0)) {
206
+ return [];
207
+ }
208
+ const referencesByContour = collectReferenceMap(trail.contours);
209
+ const fixtureSets = selectContourFixtures(trail.contours, referencesByContour);
210
+ return fixtureSets.flatMap((fixtures, index) => {
211
+ const merged = buildDerivedInput(fixtures);
212
+ const input = projectInputForSchema(trail.input, merged);
213
+ const validated = trail.input.safeParse(input);
214
+ if (!validated.success) {
215
+ return [];
216
+ }
217
+ const expected = deriveExpectedValue(trail, fixtures);
218
+ const derived = {
219
+ ...(expected === undefined ? {} : { expected }),
220
+ input,
221
+ name: formatFixtureName(fixtures, index),
222
+ };
223
+ derivedExamples.add(derived);
224
+ return [derived];
225
+ });
226
+ };
227
+ //# sourceMappingURL=effective-examples.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"effective-examples.js","sourceRoot":"","sources":["../src/effective-examples.ts"],"names":[],"mappings":"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"}
@@ -16,7 +16,7 @@ import type { TestExecutionOptions } from './context.js';
16
16
  *
17
17
  * One line in your test file:
18
18
  * ```ts
19
- * testExamples(app);
19
+ * testExamples(graph);
20
20
  * ```
21
21
  */
22
22
  export declare const testExamples: (app: Topo, ctxOrFactory?: Partial<TrailContext> | TestExecutionOptions | (() => Partial<TrailContext> | TestExecutionOptions)) => void;
@@ -1 +1 @@
1
- {"version":3,"file":"examples.d.ts","sourceRoot":"","sources":["../src/examples.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,KAAK,EAGV,IAAI,EAGJ,YAAY,EACb,MAAM,gBAAgB,CAAC;AAmCxB,OAAO,KAAK,EAAiB,oBAAoB,EAAE,MAAM,cAAc,CAAC;AA6MxE;;;;;;;;;;GAUG;AACH,eAAO,MAAM,YAAY,GACvB,KAAK,IAAI,EACT,eACI,OAAO,CAAC,YAAY,CAAC,GACrB,oBAAoB,GACpB,CAAC,MAAM,OAAO,CAAC,YAAY,CAAC,GAAG,oBAAoB,CAAC,KACvD,IA0EF,CAAC"}
1
+ {"version":3,"file":"examples.d.ts","sourceRoot":"","sources":["../src/examples.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,KAAK,EAGV,IAAI,EAGJ,YAAY,EACb,MAAM,gBAAgB,CAAC;AAuCxB,OAAO,KAAK,EAAkB,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAmPzE;;;;;;;;;;GAUG;AACH,eAAO,MAAM,YAAY,GACvB,KAAK,IAAI,EACT,eACI,OAAO,CAAC,YAAY,CAAC,GACrB,oBAAoB,GACpB,CAAC,MAAM,OAAO,CAAC,YAAY,CAAC,GAAG,oBAAoB,CAAC,KACvD,IAoGF,CAAC"}
package/dist/examples.js CHANGED
@@ -7,9 +7,10 @@
7
7
  * declarations, checks that every declared crossing was called at least once.
8
8
  */
9
9
  import { describe, expect, test } from 'bun:test';
10
- import { AlreadyExistsError, AmbiguousError, AssertionError, AuthError, CancelledError, ConflictError, InternalError, NetworkError, NotFoundError, PermissionError, RateLimitError, executeTrail, Result, TimeoutError, TrailsError, ValidationError, validateInput, } from '@ontrails/core';
11
- import { assertErrorMatch, assertFullMatch, assertSchemaMatch, } from './assertions.js';
12
- import { defaultMintPermit, mergeProvisionOverrides, mergeTestContext, normalizeTestExecutionOptions, resolveMockProvisions, } from './context.js';
10
+ import { AlreadyExistsError, AmbiguousError, AssertionError, AuthError, buildCrossValidationSchema, CancelledError, ConflictError, DerivationError, InternalError, NetworkError, NotFoundError, PermissionError, RateLimitError, RetryExhaustedError, executeTrail, Result, TimeoutError, TrailsError, ValidationError, validateInput, } from '@ontrails/core';
11
+ import { assertErrorMatch, assertFullMatch, assertPartialMatch, assertSchemaMatch, } from './assertions.js';
12
+ import { defaultCreatePermit, mergeResourceOverrides, mergeTestContext, normalizeTestExecutionOptions, createMockResources, } from './context.js';
13
+ import { isDerivedExample, deriveTrailExamples } from './effective-examples.js';
13
14
  // ---------------------------------------------------------------------------
14
15
  // Error class name -> constructor map
15
16
  // ---------------------------------------------------------------------------
@@ -20,11 +21,13 @@ const ERROR_MAP = {
20
21
  AuthError: AuthError,
21
22
  CancelledError: CancelledError,
22
23
  ConflictError: ConflictError,
24
+ DerivationError: DerivationError,
23
25
  InternalError: InternalError,
24
26
  NetworkError: NetworkError,
25
27
  NotFoundError: NotFoundError,
26
28
  PermissionError: PermissionError,
27
29
  RateLimitError: RateLimitError,
30
+ RetryExhaustedError: RetryExhaustedError,
28
31
  TimeoutError: TimeoutError,
29
32
  TrailsError: TrailsError,
30
33
  ValidationError: ValidationError,
@@ -39,13 +42,13 @@ const resolveErrorClass = (name) => ERROR_MAP[name] ?? Error;
39
42
  // ---------------------------------------------------------------------------
40
43
  const assertProgressiveMatch = (result, example, output) => {
41
44
  if (example.expected !== undefined) {
42
- assertFullMatch(result, example.expected);
43
- return;
45
+ return assertFullMatch(result, example.expected);
46
+ }
47
+ if (example.expectedMatch !== undefined) {
48
+ return assertPartialMatch(result, example.expectedMatch);
44
49
  }
45
50
  if (example.error !== undefined) {
46
- const errorClass = resolveErrorClass(example.error);
47
- assertErrorMatch(result, errorClass);
48
- return;
51
+ return assertErrorMatch(result, resolveErrorClass(example.error));
49
52
  }
50
53
  assertSchemaMatch(result, output);
51
54
  };
@@ -66,18 +69,18 @@ const handleValidationError = (validated, example) => {
66
69
  throw new Error(`Example "${example.name}" has invalid input: ${validated.error.message}`);
67
70
  };
68
71
  /**
69
- * Apply auto-minting: if the trail declares scoped permits and the context
70
- * doesn't already have a permit, mint one and merge it into the context.
72
+ * Apply auto-permit: if the trail declares scoped permits and the context
73
+ * doesn't already have a permit, create one and merge it into the context.
71
74
  */
72
- const applyAutoMint = (ctx, trailDef, opts) => {
75
+ const applyAutoPermit = (ctx, trailDef, opts) => {
73
76
  if (opts.strictPermits) {
74
77
  return ctx;
75
78
  }
76
79
  if (ctx.permit !== undefined) {
77
80
  return ctx;
78
81
  }
79
- const mint = opts.mintPermit ?? defaultMintPermit;
80
- const permit = mint(trailDef);
82
+ const create = opts.createPermit ?? defaultCreatePermit;
83
+ const permit = create(trailDef);
81
84
  if (!permit) {
82
85
  return ctx;
83
86
  }
@@ -87,15 +90,15 @@ const applyAutoMint = (ctx, trailDef, opts) => {
87
90
  * Run a single example against a trail.
88
91
  * Handles validation, execution, and assertions.
89
92
  */
90
- const runExample = async (t, example, output, testCtx, provisions, opts) => {
93
+ const runExample = async (t, example, output, testCtx, resources, opts) => {
91
94
  const validated = validateInput(t.input, example.input);
92
95
  if (handleValidationError(validated, example)) {
93
96
  return;
94
97
  }
95
- const ctx = opts ? applyAutoMint(testCtx, t, opts) : testCtx;
98
+ const ctx = opts ? applyAutoPermit(testCtx, t, opts) : testCtx;
96
99
  const result = await executeTrail(t, example.input, {
97
100
  ctx,
98
- provisions: provisions ?? opts?.provisions,
101
+ resources: resources ?? opts?.resources,
99
102
  });
100
103
  assertProgressiveMatch(result, example, output);
101
104
  };
@@ -109,37 +112,51 @@ const runExample = async (t, example, output, testCtx, provisions, opts) => {
109
112
  * in the topo and executes it with validated input. Falls back to
110
113
  * `Result.ok()` when neither is available.
111
114
  */
112
- const createCoverageCross = (called, baseCross, topo, ctx, provisions) => {
113
- const cross = (id, input) => {
115
+ const createCoverageCross = (called, baseCross, topo, ctx, resources) => {
116
+ const invokeCross = async (idOrTrail, input, self) => {
117
+ const id = typeof idOrTrail === 'string' ? idOrTrail : idOrTrail.id;
114
118
  called.add(id);
115
119
  if (baseCross !== undefined) {
116
- return baseCross(id, input);
120
+ return await baseCross(id, input);
117
121
  }
118
122
  const trailDef = topo.get(id);
119
123
  if (trailDef !== undefined) {
120
- return executeTrail(trailDef, input, {
121
- ctx: { ...ctx, cross },
122
- provisions,
124
+ return await executeTrail(trailDef, input, {
125
+ ctx: { ...ctx, cross: self },
126
+ resources,
127
+ validationSchema: buildCrossValidationSchema(trailDef),
123
128
  });
124
129
  }
125
- return Promise.resolve(Result.ok());
130
+ return Result.ok();
131
+ };
132
+ // Accepts either a trail object (typed cross), a string id (untyped),
133
+ // or a batch of `[target, input]` tuples.
134
+ const cross = async function cross(idOrTrail, input) {
135
+ if (Array.isArray(idOrTrail)) {
136
+ return await Promise.all(idOrTrail.map(([target, batchInput]) => invokeCross(target, batchInput, cross)));
137
+ }
138
+ return await invokeCross(idOrTrail, input, cross);
126
139
  };
127
140
  return cross;
128
141
  };
129
142
  /**
130
143
  * Run a single example against a trail with crossings, recording cross calls.
131
144
  */
132
- const runCompositionExample = async (trailDef, example, output, baseCtx, called, topo, provisions, opts) => {
145
+ const runCompositionExample = async (trailDef, example, output, baseCtx, called, topo, resources, opts) => {
133
146
  const validated = validateInput(trailDef.input, example.input);
134
147
  if (handleValidationError(validated, example)) {
135
148
  return;
136
149
  }
137
- const mintedCtx = opts ? applyAutoMint(baseCtx, trailDef, opts) : baseCtx;
138
- const cross = createCoverageCross(called, mintedCtx.cross, topo, mintedCtx, provisions);
139
- const testCtx = { ...mintedCtx, cross };
150
+ const permittedCtx = opts
151
+ ? applyAutoPermit(baseCtx, trailDef, opts)
152
+ : baseCtx;
153
+ const cross = createCoverageCross(called, permittedCtx.cross, topo, permittedCtx, resources);
154
+ const testCtx = { ...permittedCtx, cross };
155
+ // Top-level trail validates against trail.input (not merged crossInput).
156
+ // Merged validation only applies to cross targets in executeFromMap/createCoverageCross.
140
157
  const result = await executeTrail(trailDef, example.input, {
141
158
  ctx: testCtx,
142
- provisions: provisions ?? opts?.provisions,
159
+ resources: resources ?? opts?.resources,
143
160
  });
144
161
  assertProgressiveMatch(result, example, output);
145
162
  };
@@ -154,13 +171,17 @@ const runCompositionExample = async (trailDef, example, output, baseCtx, called,
154
171
  *
155
172
  * One line in your test file:
156
173
  * ```ts
157
- * testExamples(app);
174
+ * testExamples(graph);
158
175
  * ```
159
176
  */
160
177
  export const testExamples = (app, ctxOrFactory) => {
161
178
  const resolveInput = typeof ctxOrFactory === 'function' ? ctxOrFactory : () => ctxOrFactory;
162
- const allTrails = app.list();
163
- const withExamples = allTrails.filter((t) => t.examples !== undefined && t.examples.length > 0);
179
+ const withExamples = app.list()
180
+ .map((trailDef) => ({
181
+ ...trailDef,
182
+ examples: deriveTrailExamples(trailDef),
183
+ }))
184
+ .filter((trailDef) => trailDef.examples.length > 0);
164
185
  const simpleTrails = withExamples.filter((t) => t.crosses.length === 0);
165
186
  const compositionTrails = withExamples.filter((t) => t.crosses.length > 0);
166
187
  // Simple trails: run examples directly
@@ -172,30 +193,47 @@ export const testExamples = (app, ctxOrFactory) => {
172
193
  }
173
194
  test.each([...examples])('example: $name', async (example) => {
174
195
  const resolved = normalizeTestExecutionOptions(resolveInput());
175
- const provisions = mergeProvisionOverrides(await resolveMockProvisions(app), resolved.ctx, resolved.provisions);
196
+ const resources = mergeResourceOverrides(await createMockResources(app), resolved.ctx, resolved.resources);
176
197
  const testCtx = mergeTestContext(resolved.ctx);
177
- await runExample(t, example, output, testCtx, provisions, resolved);
198
+ await runExample(t, example, output, testCtx, resources, resolved);
178
199
  });
179
200
  });
180
201
  }
181
- // Composition trails: use recording cross and check coverage
202
+ // Composition trails: use recording cross and check coverage.
203
+ //
204
+ // Crossing coverage only runs against AUTHORED examples. Contour-derived
205
+ // fixtures are opportunistic coverage that may not exercise every
206
+ // `ctx.cross()` branch in the trail, so asserting coverage against them
207
+ // would produce false failures for trails whose authored intent was a
208
+ // single path. When a trail has zero authored examples the coverage
209
+ // assertion is skipped entirely — the derived-example runs still
210
+ // execute, but they are not required to cover declared crossings.
182
211
  if (compositionTrails.length > 0) {
183
212
  describe.each(compositionTrails)('$id', (t) => {
184
213
  const { examples, output } = t;
185
214
  if (!examples) {
186
215
  return;
187
216
  }
188
- const called = new Set();
217
+ const calledFromAuthored = new Set();
218
+ const hasAuthoredExamples = examples.some((example) => !isDerivedExample(example));
219
+ // Only record cross calls from authored examples. Derived fixtures
220
+ // execute normally but do not contribute to coverage — the sink map
221
+ // routes each example to the right bucket without an inline
222
+ // conditional inside the test body.
223
+ const discardSink = new Set();
224
+ const pickCoverageSink = (example) => isDerivedExample(example) ? discardSink : calledFromAuthored;
189
225
  test.each([...examples])('example: $name', async (example) => {
190
226
  const resolved = normalizeTestExecutionOptions(resolveInput());
191
- const provisions = mergeProvisionOverrides(await resolveMockProvisions(app), resolved.ctx, resolved.provisions);
227
+ const resources = mergeResourceOverrides(await createMockResources(app), resolved.ctx, resolved.resources);
192
228
  const baseCtx = mergeTestContext(resolved.ctx);
193
- await runCompositionExample(t, example, output, baseCtx, called, app, provisions, resolved);
194
- });
195
- test('crossing coverage', () => {
196
- const uncovered = t.crosses.filter((id) => !called.has(id));
197
- expect(uncovered).toEqual([]);
229
+ await runCompositionExample(t, example, output, baseCtx, pickCoverageSink(example), app, resources, resolved);
198
230
  });
231
+ if (hasAuthoredExamples) {
232
+ test('crossing coverage', () => {
233
+ const uncovered = t.crosses.filter((id) => !calledFromAuthored.has(id));
234
+ expect(uncovered).toEqual([]);
235
+ });
236
+ }
199
237
  });
200
238
  }
201
239
  };
@@ -1 +1 @@
1
- {"version":3,"file":"examples.js","sourceRoot":"","sources":["../src/examples.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"examples.js","sourceRoot":"","sources":["../src/examples.ts"],"names":[],"mappings":"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"}
@@ -1,18 +1,18 @@
1
1
  /**
2
2
  * CLI integration test harness.
3
3
  *
4
- * Builds CLI commands from an App, executes them in-process,
4
+ * Builds CLI commands from a graph, executes them in-process,
5
5
  * and captures stdout/stderr.
6
6
  */
7
7
  import type { CliHarness, CliHarnessOptions } from './types.js';
8
8
  /**
9
9
  * Create a CLI harness for integration testing.
10
10
  *
11
- * Builds commands from the app's topo and provides a `run()` method
11
+ * Builds commands from the graph's topo and provides a `run()` method
12
12
  * that parses command strings and executes them in-process.
13
13
  *
14
14
  * ```ts
15
- * const harness = createCliHarness({ app });
15
+ * const harness = createCliHarness({ graph });
16
16
  * const result = await harness.run("entity show --name Alpha --output json");
17
17
  * expect(result.exitCode).toBe(0);
18
18
  * ```
@@ -1 +1 @@
1
- {"version":3,"file":"harness-cli.d.ts","sourceRoot":"","sources":["../src/harness-cli.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,OAAO,KAAK,EACV,UAAU,EACV,iBAAiB,EAElB,MAAM,YAAY,CAAC;AAoRpB;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,gBAAgB,GAAI,SAAS,iBAAiB,KAAG,UAM7D,CAAC"}
1
+ {"version":3,"file":"harness-cli.d.ts","sourceRoot":"","sources":["../src/harness-cli.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAOH,OAAO,KAAK,EACV,UAAU,EACV,iBAAiB,EAElB,MAAM,YAAY,CAAC;AA8PpB;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,gBAAgB,GAAI,SAAS,iBAAiB,KAAG,UAW7D,CAAC"}