@ontrails/testing 1.0.0-beta.3 → 1.0.0-beta.5

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.
@@ -1,13 +1,13 @@
1
1
  /**
2
- * testHike — composition-aware scenario testing for hikes.
2
+ * testFollows — composition-aware scenario testing for trails with follow.
3
3
  *
4
- * Tests the composition graph: which trails were followed, in what order,
4
+ * Tests the follow graph: which trails were followed, in what order,
5
5
  * and supports failure injection from followed trail examples.
6
6
  */
7
7
 
8
8
  import { describe, expect, test } from 'bun:test';
9
9
 
10
- import type { AnyHike, AnyTrail, FollowFn, TrailContext } from '@ontrails/core';
10
+ import type { AnyTrail, FollowFn, TrailContext } from '@ontrails/core';
11
11
  import {
12
12
  InternalError,
13
13
  Result,
@@ -22,7 +22,7 @@ import {
22
22
  expectOk,
23
23
  } from './assertions.js';
24
24
  import { mergeTestContext } from './context.js';
25
- import type { HikeScenario } from './types.js';
25
+ import type { FollowScenario } from './types.js';
26
26
 
27
27
  // ---------------------------------------------------------------------------
28
28
  // Follow trace
@@ -58,7 +58,7 @@ const findErrorExample = (
58
58
  */
59
59
  const tryInjectError = (
60
60
  id: string,
61
- scenario: HikeScenario,
61
+ scenario: FollowScenario,
62
62
  trailsMap: ReadonlyMap<string, AnyTrail> | undefined
63
63
  ): Result<unknown, Error> | undefined => {
64
64
  const injection = scenario.injectFromExample?.[id];
@@ -101,7 +101,7 @@ const executeFromMap = (
101
101
  if (validated.isErr()) {
102
102
  return validated;
103
103
  }
104
- return trailDef.implementation(validated.value, ctx);
104
+ return trailDef.run(validated.value, ctx);
105
105
  };
106
106
 
107
107
  // ---------------------------------------------------------------------------
@@ -113,7 +113,7 @@ const executeFromMap = (
113
113
  */
114
114
  const createRecordingFollow = (
115
115
  trace: FollowRecord[],
116
- scenario: HikeScenario,
116
+ scenario: FollowScenario,
117
117
  trailsMap: ReadonlyMap<string, AnyTrail> | undefined,
118
118
  baseFollow: FollowFn | undefined,
119
119
  ctx: TrailContext
@@ -148,8 +148,8 @@ const createRecordingFollow = (
148
148
 
149
149
  const assertScenarioResult = (
150
150
  result: Result<unknown, Error>,
151
- scenario: HikeScenario,
152
- hikeDef: AnyHike
151
+ scenario: FollowScenario,
152
+ trailDef: AnyTrail
153
153
  ): void => {
154
154
  if (scenario.expectValue !== undefined) {
155
155
  assertFullMatch(result, scenario.expectValue);
@@ -162,13 +162,13 @@ const assertScenarioResult = (
162
162
  }
163
163
  } else if (scenario.expectOk === true) {
164
164
  expect(result.isOk()).toBe(true);
165
- assertSchemaMatch(result, hikeDef.output);
165
+ assertSchemaMatch(result, trailDef.output);
166
166
  }
167
167
  };
168
168
 
169
169
  const assertFollowTrace = (
170
170
  trace: readonly FollowRecord[],
171
- scenario: HikeScenario
171
+ scenario: FollowScenario
172
172
  ): void => {
173
173
  if (scenario.expectFollowed !== undefined) {
174
174
  const followedIds = trace.map((r) => r.id);
@@ -185,7 +185,7 @@ const assertFollowTrace = (
185
185
 
186
186
  const handleValidationError = (
187
187
  validated: Result<unknown, Error>,
188
- scenario: HikeScenario
188
+ scenario: FollowScenario
189
189
  ): boolean => {
190
190
  if (!validated.isErr()) {
191
191
  return false;
@@ -207,7 +207,7 @@ const handleValidationError = (
207
207
  // ---------------------------------------------------------------------------
208
208
 
209
209
  const buildTestContext = (
210
- scenario: HikeScenario,
210
+ scenario: FollowScenario,
211
211
  ctx: Partial<TrailContext> | undefined,
212
212
  trailsMap: ReadonlyMap<string, AnyTrail> | undefined
213
213
  ): { trace: FollowRecord[]; testCtx: TrailContext } => {
@@ -224,28 +224,28 @@ const buildTestContext = (
224
224
  };
225
225
 
226
226
  const runScenario = async (
227
- hikeDef: AnyHike,
228
- scenario: HikeScenario,
227
+ trailDef: AnyTrail,
228
+ scenario: FollowScenario,
229
229
  ctx: Partial<TrailContext> | undefined,
230
230
  trailsMap: ReadonlyMap<string, AnyTrail> | undefined
231
231
  ): Promise<void> => {
232
- const validated = validateInput(hikeDef.input, scenario.input);
232
+ const validated = validateInput(trailDef.input, scenario.input);
233
233
  if (handleValidationError(validated, scenario)) {
234
234
  return;
235
235
  }
236
236
 
237
237
  const { trace, testCtx } = buildTestContext(scenario, ctx, trailsMap);
238
- const result = await hikeDef.implementation(expectOk(validated), testCtx);
238
+ const result = await trailDef.run(expectOk(validated), testCtx);
239
239
  assertFollowTrace(trace, scenario);
240
- assertScenarioResult(result, scenario, hikeDef);
240
+ assertScenarioResult(result, scenario, trailDef);
241
241
  };
242
242
 
243
243
  // ---------------------------------------------------------------------------
244
- // testHike
244
+ // testFollows
245
245
  // ---------------------------------------------------------------------------
246
246
 
247
- /** Options for testHike that provide trail definitions for injection. */
248
- export interface TestHikeOptions {
247
+ /** Options for testFollows that provide trail definitions for injection. */
248
+ export interface TestFollowOptions {
249
249
  /** Partial context overrides. */
250
250
  readonly ctx?: Partial<TrailContext> | undefined;
251
251
  /** Map of trail ID to trail definition, used for injectFromExample. */
@@ -253,11 +253,11 @@ export interface TestHikeOptions {
253
253
  }
254
254
 
255
255
  /**
256
- * Generate a describe block for a hike with one test per scenario.
256
+ * Generate a describe block for a composition trail with one test per scenario.
257
257
  *
258
258
  * @example
259
259
  * ```ts
260
- * testHike(onboardHike, [
260
+ * testFollows(onboardTrail, [
261
261
  * {
262
262
  * description: "follows add then relate",
263
263
  * input: { name: "Alpha" },
@@ -267,16 +267,16 @@ export interface TestHikeOptions {
267
267
  * ]);
268
268
  * ```
269
269
  */
270
- export const testHike = (
271
- hikeDef: AnyHike,
272
- scenarios: readonly HikeScenario[],
273
- options?: TestHikeOptions
270
+ export const testFollows = (
271
+ trailDef: AnyTrail,
272
+ scenarios: readonly FollowScenario[],
273
+ options?: TestFollowOptions
274
274
  ): void => {
275
- describe(hikeDef.id, () => {
275
+ describe(trailDef.id, () => {
276
276
  test.each([...scenarios])(
277
277
  '$description',
278
- async (scenario: HikeScenario) => {
279
- await runScenario(hikeDef, scenario, options?.ctx, options?.trails);
278
+ async (scenario: FollowScenario) => {
279
+ await runScenario(trailDef, scenario, options?.ctx, options?.trails);
280
280
  }
281
281
  );
282
282
  });
package/src/index.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  // Contract-driven testing
2
2
  export { testAll } from './all.js';
3
3
  export { testExamples } from './examples.js';
4
- export { testHike } from './hike.js';
4
+ export { testFollows } from './follows.js';
5
5
  export { testTrail } from './trail.js';
6
6
  export { testContracts } from './contracts.js';
7
7
  export { testDetours } from './detours.js';
@@ -24,10 +24,10 @@ export { createCliHarness } from './harness-cli.js';
24
24
  export { createMcpHarness } from './harness-mcp.js';
25
25
 
26
26
  // Types
27
- export type { TestHikeOptions } from './hike.js';
27
+ export type { TestFollowOptions } from './follows.js';
28
28
 
29
29
  export type {
30
- HikeScenario,
30
+ FollowScenario,
31
31
  TestScenario,
32
32
  TestLogger,
33
33
  TestTrailContextOptions,
package/src/trail.ts CHANGED
@@ -82,7 +82,7 @@ const runScenario = async (
82
82
  }
83
83
  const validatedInput = expectOk(validated);
84
84
 
85
- const result = await trailDef.implementation(validatedInput, testCtx);
85
+ const result = await trailDef.run(validatedInput, testCtx);
86
86
  assertScenarioResult(result, scenario, trailDef);
87
87
  };
88
88
 
package/src/types.ts CHANGED
@@ -26,11 +26,11 @@ export interface TestScenario {
26
26
  }
27
27
 
28
28
  // ---------------------------------------------------------------------------
29
- // Hike Scenario (for testHike)
29
+ // Follow Scenario (for testFollows)
30
30
  // ---------------------------------------------------------------------------
31
31
 
32
- /** A test scenario for a hike's composition graph. */
33
- export interface HikeScenario extends TestScenario {
32
+ /** A test scenario for a trail's composition graph. */
33
+ export interface FollowScenario extends TestScenario {
34
34
  /** Assert these trail IDs were followed, in order. */
35
35
  readonly expectFollowed?: readonly string[] | undefined;
36
36
  /** Assert follow counts per trail ID. */
@@ -1 +1 @@
1
- {"root":["./src/all.ts","./src/assertions.ts","./src/context.ts","./src/contracts.ts","./src/detours.ts","./src/examples.ts","./src/harness-cli.ts","./src/harness-mcp.ts","./src/hike.ts","./src/index.ts","./src/logger.ts","./src/trail.ts","./src/types.ts"],"version":"5.9.3"}
1
+ {"root":["./src/all.ts","./src/assertions.ts","./src/context.ts","./src/contracts.ts","./src/detours.ts","./src/examples.ts","./src/follows.ts","./src/harness-cli.ts","./src/harness-mcp.ts","./src/index.ts","./src/logger.ts","./src/trail.ts","./src/types.ts"],"version":"5.9.3"}
package/dist/hike.d.ts DELETED
@@ -1,32 +0,0 @@
1
- /**
2
- * testHike — composition-aware scenario testing for hikes.
3
- *
4
- * Tests the composition graph: which trails were followed, in what order,
5
- * and supports failure injection from followed trail examples.
6
- */
7
- import type { AnyHike, AnyTrail, TrailContext } from '@ontrails/core';
8
- import type { HikeScenario } from './types.js';
9
- /** Options for testHike that provide trail definitions for injection. */
10
- export interface TestHikeOptions {
11
- /** Partial context overrides. */
12
- readonly ctx?: Partial<TrailContext> | undefined;
13
- /** Map of trail ID to trail definition, used for injectFromExample. */
14
- readonly trails?: ReadonlyMap<string, AnyTrail> | undefined;
15
- }
16
- /**
17
- * Generate a describe block for a hike with one test per scenario.
18
- *
19
- * @example
20
- * ```ts
21
- * testHike(onboardHike, [
22
- * {
23
- * description: "follows add then relate",
24
- * input: { name: "Alpha" },
25
- * expectOk: true,
26
- * expectFollowed: ["entity.add", "entity.relate"],
27
- * },
28
- * ]);
29
- * ```
30
- */
31
- export declare const testHike: (hikeDef: AnyHike, scenarios: readonly HikeScenario[], options?: TestHikeOptions) => void;
32
- //# sourceMappingURL=hike.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"hike.d.ts","sourceRoot":"","sources":["../src/hike.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAY,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAehF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AA8N/C,yEAAyE;AACzE,MAAM,WAAW,eAAe;IAC9B,iCAAiC;IACjC,QAAQ,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,GAAG,SAAS,CAAC;IACjD,uEAAuE;IACvE,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,QAAQ,CAAC,GAAG,SAAS,CAAC;CAC7D;AAED;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,QAAQ,GACnB,SAAS,OAAO,EAChB,WAAW,SAAS,YAAY,EAAE,EAClC,UAAU,eAAe,KACxB,IASF,CAAC"}
package/dist/hike.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"hike.js","sourceRoot":"","sources":["../src/hike.ts"],"names":[],"mappings":"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"}