@contractspec/lib.testing 3.7.19 → 3.7.21

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.
package/dist/index.d.ts CHANGED
@@ -3,4 +3,5 @@ export * from './adapters/vitest-adapter';
3
3
  export * from './generator/assertion-builder';
4
4
  export * from './generator/golden-test-generator';
5
5
  export * from './recorder/traffic-recorder';
6
+ export * from './testing.feature';
6
7
  export * from './types';
package/dist/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  // @bun
2
- function T(e,r){if(e.success)return[`const result = await ${r.runnerCall};`,`expect(result).toEqual(${s(e.expectedOutput??null)});`].join(`
2
+ function x(e,r){if(e.success)return[`const result = await ${r.runnerCall};`,`expect(result).toEqual(${s(e.expectedOutput??null)});`].join(`
3
3
  `);return`await expect(${r.runnerCall}).rejects.toMatchObject(${s(e.expectedError??{message:"expected failure"})});`}function s(e){return JSON.stringify(e,(r,t)=>{if(t instanceof Date)return t.toISOString();if(typeof t>"u")return null;return t},2)}function p(e){let r=e.cases.map((t)=>{let n=s(t.input),i=s(t.metadata??{}),a=`const result = await ${e.runnerFunction}(input${t.id}, metadata${t.id});
4
4
  expect(result).toEqual(${s(t.expectedOutput??null)});`,o=`await expect(${e.runnerFunction}(input${t.id}, metadata${t.id})).rejects.toMatchObject(${s(t.expectedError??{message:"expected failure"})});`;return`
5
5
  test('${t.name}', async () => {
@@ -25,4 +25,4 @@ import { ${e.runnerFunction} } from '${e.runnerImport}';
25
25
 
26
26
  describe('${e.suiteName}', () => {${r}
27
27
  });
28
- `.trim()}import{performance as c}from"perf_hooks";import{randomUUID as m}from"crypto";class f{serializeMetadata;constructor(e=(r)=>({tenantId:r.tenantId,userId:r.userId,channel:r.channel})){this.serializeMetadata=e}createCases(e){return e.map((r,t)=>({id:r.id??m(),name:r.success?`case-${t+1}-success`:`case-${t+1}-failure`,input:r.input,expectedOutput:r.output,expectedError:r.error,success:r.success,metadata:this.serializeMetadata?.(r)}))}generate(e,r){let t=this.createCases(e);if(r.framework==="jest")return p({suiteName:r.suiteName,cases:t,runnerImport:r.runnerImport,runnerFunction:r.runnerFunction});return d({suiteName:r.suiteName,cases:t,runnerImport:r.runnerImport,runnerFunction:r.runnerFunction})}}async function G(e,r){let t=[];for(let n of e){let i=c.now();try{let a=await r(n.input,n.metadata);if(!n.success){t.push({caseId:n.id,passed:!1,durationMs:c.now()-i,error:Error("Expected failure but runner resolved")});continue}let o=JSON.stringify(a)===JSON.stringify(n.expectedOutput??null);t.push({caseId:n.id,passed:o,durationMs:c.now()-i,error:o?void 0:{expected:n.expectedOutput,received:a}})}catch(a){let o=c.now()-i;if(!n.success)t.push({caseId:n.id,passed:!0,durationMs:o});else t.push({caseId:n.id,passed:!1,durationMs:o,error:a})}}return t}import{randomUUID as l}from"crypto";class h{items=[];async save(e){this.items.push(e)}async list(e){if(!e)return[...this.items];return this.items.filter((r)=>r.operation.name===e)}}class g{store;sampleRate;sanitize;constructor(e){this.store=e.store,this.sampleRate=e.sampleRate??1,this.sanitize=e.sanitize}async record(e){if(!this.shouldSample())return;let r={id:l(),operation:e.operation,input:u(e.input),output:u(e.output),error:e.error?u(e.error):void 0,success:e.success,timestamp:new Date,durationMs:e.durationMs,tenantId:e.tenantId,userId:e.userId,channel:e.channel,metadata:e.metadata},t=this.sanitize?this.sanitize(r):r;await this.store.save(t)}shouldSample(){if(this.sampleRate>=1)return!0;return Math.random()<=this.sampleRate}}function u(e){if(e==null)return e??void 0;try{let r=globalThis.structuredClone;if(typeof r==="function")return r(e);return JSON.parse(JSON.stringify(e))}catch{return}}export{s as serialize,G as runGoldenTests,d as generateVitestSuite,p as generateJestSuite,T as buildAssertions,g as TrafficRecorder,h as InMemoryTrafficStore,f as GoldenTestGenerator};
28
+ `.trim()}import{performance as c}from"perf_hooks";import{randomUUID as m}from"crypto";class f{serializeMetadata;constructor(e=(r)=>({tenantId:r.tenantId,userId:r.userId,channel:r.channel})){this.serializeMetadata=e}createCases(e){return e.map((r,t)=>({id:r.id??m(),name:r.success?`case-${t+1}-success`:`case-${t+1}-failure`,input:r.input,expectedOutput:r.output,expectedError:r.error,success:r.success,metadata:this.serializeMetadata?.(r)}))}generate(e,r){let t=this.createCases(e);if(r.framework==="jest")return p({suiteName:r.suiteName,cases:t,runnerImport:r.runnerImport,runnerFunction:r.runnerFunction});return d({suiteName:r.suiteName,cases:t,runnerImport:r.runnerImport,runnerFunction:r.runnerFunction})}}async function b(e,r){let t=[];for(let n of e){let i=c.now();try{let a=await r(n.input,n.metadata);if(!n.success){t.push({caseId:n.id,passed:!1,durationMs:c.now()-i,error:Error("Expected failure but runner resolved")});continue}let o=JSON.stringify(a)===JSON.stringify(n.expectedOutput??null);t.push({caseId:n.id,passed:o,durationMs:c.now()-i,error:o?void 0:{expected:n.expectedOutput,received:a}})}catch(a){let o=c.now()-i;if(!n.success)t.push({caseId:n.id,passed:!0,durationMs:o});else t.push({caseId:n.id,passed:!1,durationMs:o,error:a})}}return t}import{randomUUID as l}from"crypto";class h{items=[];async save(e){this.items.push(e)}async list(e){if(!e)return[...this.items];return this.items.filter((r)=>r.operation.name===e)}}class T{store;sampleRate;sanitize;constructor(e){this.store=e.store,this.sampleRate=e.sampleRate??1,this.sanitize=e.sanitize}async record(e){if(!this.shouldSample())return;let r={id:l(),operation:e.operation,input:u(e.input),output:u(e.output),error:e.error?u(e.error):void 0,success:e.success,timestamp:new Date,durationMs:e.durationMs,tenantId:e.tenantId,userId:e.userId,channel:e.channel,metadata:e.metadata},t=this.sanitize?this.sanitize(r):r;await this.store.save(t)}shouldSample(){if(this.sampleRate>=1)return!0;return Math.random()<=this.sampleRate}}function u(e){if(e==null)return e??void 0;try{let r=globalThis.structuredClone;if(typeof r==="function")return r(e);return JSON.parse(JSON.stringify(e))}catch{return}}import{defineFeature as g}from"@contractspec/lib.contracts-spec/features";var F=g({meta:{key:"libs.testing",version:"1.0.0",title:"Testing",description:"Contract-aware testing utilities and runners",domain:"testing",owners:["@contractspec-core"],tags:["package","libs","testing"],stability:"experimental"}});export{s as serialize,b as runGoldenTests,d as generateVitestSuite,p as generateJestSuite,x as buildAssertions,T as TrafficRecorder,F as TestingFeature,h as InMemoryTrafficStore,f as GoldenTestGenerator};
@@ -1,4 +1,4 @@
1
- function T(e,r){if(e.success)return[`const result = await ${r.runnerCall};`,`expect(result).toEqual(${s(e.expectedOutput??null)});`].join(`
1
+ function x(e,r){if(e.success)return[`const result = await ${r.runnerCall};`,`expect(result).toEqual(${s(e.expectedOutput??null)});`].join(`
2
2
  `);return`await expect(${r.runnerCall}).rejects.toMatchObject(${s(e.expectedError??{message:"expected failure"})});`}function s(e){return JSON.stringify(e,(r,t)=>{if(t instanceof Date)return t.toISOString();if(typeof t>"u")return null;return t},2)}function p(e){let r=e.cases.map((t)=>{let n=s(t.input),i=s(t.metadata??{}),a=`const result = await ${e.runnerFunction}(input${t.id}, metadata${t.id});
3
3
  expect(result).toEqual(${s(t.expectedOutput??null)});`,o=`await expect(${e.runnerFunction}(input${t.id}, metadata${t.id})).rejects.toMatchObject(${s(t.expectedError??{message:"expected failure"})});`;return`
4
4
  test('${t.name}', async () => {
@@ -24,4 +24,4 @@ import { ${e.runnerFunction} } from '${e.runnerImport}';
24
24
 
25
25
  describe('${e.suiteName}', () => {${r}
26
26
  });
27
- `.trim()}import{performance as c}from"node:perf_hooks";import{randomUUID as m}from"crypto";class f{serializeMetadata;constructor(e=(r)=>({tenantId:r.tenantId,userId:r.userId,channel:r.channel})){this.serializeMetadata=e}createCases(e){return e.map((r,t)=>({id:r.id??m(),name:r.success?`case-${t+1}-success`:`case-${t+1}-failure`,input:r.input,expectedOutput:r.output,expectedError:r.error,success:r.success,metadata:this.serializeMetadata?.(r)}))}generate(e,r){let t=this.createCases(e);if(r.framework==="jest")return p({suiteName:r.suiteName,cases:t,runnerImport:r.runnerImport,runnerFunction:r.runnerFunction});return d({suiteName:r.suiteName,cases:t,runnerImport:r.runnerImport,runnerFunction:r.runnerFunction})}}async function G(e,r){let t=[];for(let n of e){let i=c.now();try{let a=await r(n.input,n.metadata);if(!n.success){t.push({caseId:n.id,passed:!1,durationMs:c.now()-i,error:Error("Expected failure but runner resolved")});continue}let o=JSON.stringify(a)===JSON.stringify(n.expectedOutput??null);t.push({caseId:n.id,passed:o,durationMs:c.now()-i,error:o?void 0:{expected:n.expectedOutput,received:a}})}catch(a){let o=c.now()-i;if(!n.success)t.push({caseId:n.id,passed:!0,durationMs:o});else t.push({caseId:n.id,passed:!1,durationMs:o,error:a})}}return t}import{randomUUID as l}from"crypto";class h{items=[];async save(e){this.items.push(e)}async list(e){if(!e)return[...this.items];return this.items.filter((r)=>r.operation.name===e)}}class g{store;sampleRate;sanitize;constructor(e){this.store=e.store,this.sampleRate=e.sampleRate??1,this.sanitize=e.sanitize}async record(e){if(!this.shouldSample())return;let r={id:l(),operation:e.operation,input:u(e.input),output:u(e.output),error:e.error?u(e.error):void 0,success:e.success,timestamp:new Date,durationMs:e.durationMs,tenantId:e.tenantId,userId:e.userId,channel:e.channel,metadata:e.metadata},t=this.sanitize?this.sanitize(r):r;await this.store.save(t)}shouldSample(){if(this.sampleRate>=1)return!0;return Math.random()<=this.sampleRate}}function u(e){if(e==null)return e??void 0;try{let r=globalThis.structuredClone;if(typeof r==="function")return r(e);return JSON.parse(JSON.stringify(e))}catch{return}}export{s as serialize,G as runGoldenTests,d as generateVitestSuite,p as generateJestSuite,T as buildAssertions,g as TrafficRecorder,h as InMemoryTrafficStore,f as GoldenTestGenerator};
27
+ `.trim()}import{performance as c}from"node:perf_hooks";import{randomUUID as m}from"crypto";class f{serializeMetadata;constructor(e=(r)=>({tenantId:r.tenantId,userId:r.userId,channel:r.channel})){this.serializeMetadata=e}createCases(e){return e.map((r,t)=>({id:r.id??m(),name:r.success?`case-${t+1}-success`:`case-${t+1}-failure`,input:r.input,expectedOutput:r.output,expectedError:r.error,success:r.success,metadata:this.serializeMetadata?.(r)}))}generate(e,r){let t=this.createCases(e);if(r.framework==="jest")return p({suiteName:r.suiteName,cases:t,runnerImport:r.runnerImport,runnerFunction:r.runnerFunction});return d({suiteName:r.suiteName,cases:t,runnerImport:r.runnerImport,runnerFunction:r.runnerFunction})}}async function b(e,r){let t=[];for(let n of e){let i=c.now();try{let a=await r(n.input,n.metadata);if(!n.success){t.push({caseId:n.id,passed:!1,durationMs:c.now()-i,error:Error("Expected failure but runner resolved")});continue}let o=JSON.stringify(a)===JSON.stringify(n.expectedOutput??null);t.push({caseId:n.id,passed:o,durationMs:c.now()-i,error:o?void 0:{expected:n.expectedOutput,received:a}})}catch(a){let o=c.now()-i;if(!n.success)t.push({caseId:n.id,passed:!0,durationMs:o});else t.push({caseId:n.id,passed:!1,durationMs:o,error:a})}}return t}import{randomUUID as l}from"crypto";class h{items=[];async save(e){this.items.push(e)}async list(e){if(!e)return[...this.items];return this.items.filter((r)=>r.operation.name===e)}}class T{store;sampleRate;sanitize;constructor(e){this.store=e.store,this.sampleRate=e.sampleRate??1,this.sanitize=e.sanitize}async record(e){if(!this.shouldSample())return;let r={id:l(),operation:e.operation,input:u(e.input),output:u(e.output),error:e.error?u(e.error):void 0,success:e.success,timestamp:new Date,durationMs:e.durationMs,tenantId:e.tenantId,userId:e.userId,channel:e.channel,metadata:e.metadata},t=this.sanitize?this.sanitize(r):r;await this.store.save(t)}shouldSample(){if(this.sampleRate>=1)return!0;return Math.random()<=this.sampleRate}}function u(e){if(e==null)return e??void 0;try{let r=globalThis.structuredClone;if(typeof r==="function")return r(e);return JSON.parse(JSON.stringify(e))}catch{return}}import{defineFeature as g}from"@contractspec/lib.contracts-spec/features";var F=g({meta:{key:"libs.testing",version:"1.0.0",title:"Testing",description:"Contract-aware testing utilities and runners",domain:"testing",owners:["@contractspec-core"],tags:["package","libs","testing"],stability:"experimental"}});export{s as serialize,b as runGoldenTests,d as generateVitestSuite,p as generateJestSuite,x as buildAssertions,T as TrafficRecorder,F as TestingFeature,h as InMemoryTrafficStore,f as GoldenTestGenerator};
@@ -0,0 +1 @@
1
+ export declare const TestingFeature: import("@contractspec/lib.contracts-spec").FeatureModuleSpec;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@contractspec/lib.testing",
3
- "version": "3.7.19",
3
+ "version": "3.7.21",
4
4
  "description": "Contract-aware testing utilities and runners",
5
5
  "keywords": [
6
6
  "contractspec",
@@ -31,12 +31,12 @@
31
31
  },
32
32
  "dependencies": {
33
33
  "@contractspec/lib.schema": "3.7.14",
34
- "@contractspec/lib.contracts-spec": "5.3.0"
34
+ "@contractspec/lib.contracts-spec": "5.5.0"
35
35
  },
36
36
  "devDependencies": {
37
37
  "@contractspec/tool.typescript": "3.7.13",
38
38
  "typescript": "^5.9.3",
39
- "@contractspec/tool.bun": "3.7.14"
39
+ "@contractspec/tool.bun": "3.7.15"
40
40
  },
41
41
  "exports": {
42
42
  ".": {