@slbdn/mcp-tester 1.4.3 → 1.5.4
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/CHANGELOG.md +59 -0
- package/README.md +78 -26
- package/dist/ai/provider.d.ts +145 -0
- package/dist/ai/provider.d.ts.map +1 -0
- package/dist/ai/provider.js +428 -0
- package/dist/ai/provider.js.map +1 -0
- package/dist/cli/index.js +214 -14
- package/dist/cli/index.js.map +1 -1
- package/dist/generate-cases.d.ts +113 -0
- package/dist/generate-cases.d.ts.map +1 -0
- package/dist/generate-cases.js +565 -0
- package/dist/generate-cases.js.map +1 -0
- package/dist/generate-tests.d.ts +52 -1
- package/dist/generate-tests.d.ts.map +1 -1
- package/dist/generate-tests.js +208 -81
- package/dist/generate-tests.js.map +1 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/matchers.d.ts +31 -21
- package/dist/matchers.d.ts.map +1 -1
- package/dist/matchers.js.map +1 -1
- package/dist/templates/full-stack/.github/workflows/test.yml +34 -0
- package/dist/templates/full-stack/README.md +73 -0
- package/dist/templates/full-stack/examples/mock-server.js +115 -0
- package/dist/templates/full-stack/jest.config.js +39 -0
- package/dist/templates/full-stack/package.json +31 -0
- package/dist/templates/full-stack/scripts/generate-tests.ts +32 -0
- package/dist/templates/full-stack/scripts/generate-types.ts +28 -0
- package/dist/templates/full-stack/src/server.ts +78 -0
- package/dist/templates/full-stack/tests/helpers.ts +29 -0
- package/dist/templates/full-stack/tests/parallel.test.ts +44 -0
- package/dist/templates/full-stack/tests/server.test.ts +36 -0
- package/dist/templates/full-stack/tests/tools.test.ts +61 -0
- package/dist/templates/full-stack/tsconfig.json +19 -0
- package/dist/templates/minimal-jest/README.md +42 -0
- package/dist/templates/minimal-jest/examples/mock-server.js +62 -0
- package/dist/templates/minimal-jest/jest.config.js +24 -0
- package/dist/templates/minimal-jest/package.json +24 -0
- package/dist/templates/minimal-jest/tests/server.test.ts +64 -0
- package/dist/templates/minimal-jest/tsconfig.json +19 -0
- package/dist/templates/standard-jest/.github/workflows/test.yml +32 -0
- package/dist/templates/standard-jest/README.md +44 -0
- package/dist/templates/standard-jest/examples/mock-server.js +122 -0
- package/dist/templates/standard-jest/jest.config.js +39 -0
- package/dist/templates/standard-jest/package.json +27 -0
- package/dist/templates/standard-jest/tests/helpers.ts +43 -0
- package/dist/templates/standard-jest/tests/prompts.test.ts +37 -0
- package/dist/templates/standard-jest/tests/resources.test.ts +37 -0
- package/dist/templates/standard-jest/tests/server.test.ts +30 -0
- package/dist/templates/standard-jest/tests/tools.test.ts +87 -0
- package/dist/templates/standard-jest/tsconfig.json +19 -0
- package/docs/advanced.md +424 -0
- package/docs/ai-generation.md +211 -0
- package/docs/api-reference.md +819 -0
- package/docs/cicd.md +289 -0
- package/docs/cli.md +225 -0
- package/docs/examples.md +300 -0
- package/docs/nodejs-compatibility.md +81 -0
- package/docs/releases.md +413 -0
- package/docs/starter-templates.md +110 -0
- package/docs/testing.md +443 -0
- package/docs/troubleshooting.md +139 -0
- package/jest.d.ts +43 -0
- package/package.json +5 -2
package/dist/generate-tests.d.ts
CHANGED
|
@@ -6,6 +6,27 @@
|
|
|
6
6
|
*/
|
|
7
7
|
import { MCPClient } from './client/MCPClient.js';
|
|
8
8
|
import type { ServerConfig } from './client/MCPClient.js';
|
|
9
|
+
import type { Tool, Resource, Prompt } from '@modelcontextprotocol/sdk/types.js';
|
|
10
|
+
import { type GeneratedCase } from './generate-cases.js';
|
|
11
|
+
import { type AIProvider, type OpenAICompatOptions } from './ai/provider.js';
|
|
12
|
+
/**
|
|
13
|
+
* How test cases are derived.
|
|
14
|
+
*
|
|
15
|
+
* - `'static'` — the classic generator: one listing test + one probe call per
|
|
16
|
+
* tool. @defaultValue
|
|
17
|
+
* - `'edge'` — additionally derives boundary/invalid cases from each tool's
|
|
18
|
+
* JSON Schema (offline, deterministic).
|
|
19
|
+
* - `'ai'` — edge cases plus AI-suggested cases. Requires a provider (see
|
|
20
|
+
* {@link GenerateTestOptions.provider} or the `MCP_TESTER_AI_*` env vars);
|
|
21
|
+
* falls back to `'edge'` with a warning unless {@link GenerateTestOptions.requireAi}
|
|
22
|
+
* is set.
|
|
23
|
+
*/
|
|
24
|
+
export type GenerationMode = 'static' | 'edge' | 'ai';
|
|
25
|
+
/** AI configuration accepted by the generate functions. */
|
|
26
|
+
export interface AIOptions extends OpenAICompatOptions {
|
|
27
|
+
/** Fail instead of falling back to deterministic cases when AI is unavailable. @defaultValue false */
|
|
28
|
+
requireAi?: boolean;
|
|
29
|
+
}
|
|
9
30
|
/**
|
|
10
31
|
* Options for test generation.
|
|
11
32
|
*/
|
|
@@ -28,7 +49,36 @@ export interface GenerateTestOptions {
|
|
|
28
49
|
timeout?: number;
|
|
29
50
|
/** Description for the test suite. */
|
|
30
51
|
description?: string;
|
|
52
|
+
/** How test cases are derived. @defaultValue 'static' */
|
|
53
|
+
mode?: GenerationMode;
|
|
54
|
+
/** Pre-built AI provider; overrides env-based discovery. */
|
|
55
|
+
provider?: AIProvider;
|
|
56
|
+
/** AI provider configuration (used when `provider` is not supplied). */
|
|
57
|
+
ai?: AIOptions;
|
|
58
|
+
/** Dry-run every derived case against the live server and annotate the
|
|
59
|
+
* generated tests with what actually happens. @defaultValue false */
|
|
60
|
+
verify?: boolean;
|
|
31
61
|
}
|
|
62
|
+
/**
|
|
63
|
+
* Collapse control characters (including line terminators) so untrusted text
|
|
64
|
+
* can be embedded in a `//` line comment without terminating it. Model-provided
|
|
65
|
+
* rationales are the main caller — a raw newline would otherwise let the text
|
|
66
|
+
* escape the comment and become executable test code.
|
|
67
|
+
*/
|
|
68
|
+
export declare function escapeLineComment(s: string): string;
|
|
69
|
+
/** Escape a string for use inside a single- or double-quoted JavaScript literal. */
|
|
70
|
+
export declare function escapeJsString(s: string, quote?: "'" | '"'): string;
|
|
71
|
+
/**
|
|
72
|
+
* Options consumed by {@link buildTestFile} (server description is passed separately).
|
|
73
|
+
*/
|
|
74
|
+
type TestBuildOptions = Pick<GenerateTestOptions, 'framework' | 'description' | 'includeResources' | 'includePrompts' | 'includeTools' | 'includeMatchers'>;
|
|
75
|
+
/**
|
|
76
|
+
* Generate a complete test file.
|
|
77
|
+
*
|
|
78
|
+
* @internal Exported for testing; consumers should use {@link generateTests}
|
|
79
|
+
* or {@link generateTestsFromClient}.
|
|
80
|
+
*/
|
|
81
|
+
export declare function buildTestFile(tools: Tool[], resources: Resource[], prompts: Prompt[], options: TestBuildOptions, server: ServerConfig, cases?: GeneratedCase[]): string;
|
|
32
82
|
/**
|
|
33
83
|
* Connect to an MCP server, inspect capabilities, and generate a test file.
|
|
34
84
|
*
|
|
@@ -38,7 +88,7 @@ export declare function generateTests(options: GenerateTestOptions): Promise<str
|
|
|
38
88
|
/**
|
|
39
89
|
* Options for {@link generateTestsFromClient}.
|
|
40
90
|
*/
|
|
41
|
-
export type GenerateTestsFromClientOptions = Pick<GenerateTestOptions, 'framework' | 'description' | 'includeResources' | 'includePrompts' | 'includeTools' | 'includeMatchers'>;
|
|
91
|
+
export type GenerateTestsFromClientOptions = Pick<GenerateTestOptions, 'framework' | 'description' | 'includeResources' | 'includePrompts' | 'includeTools' | 'includeMatchers' | 'mode' | 'provider' | 'ai' | 'verify' | 'timeout'>;
|
|
42
92
|
/**
|
|
43
93
|
* Generate a test file from an already-connected client.
|
|
44
94
|
*
|
|
@@ -52,4 +102,5 @@ export type GenerateTestsFromClientOptions = Pick<GenerateTestOptions, 'framewor
|
|
|
52
102
|
* @returns The generated test file content
|
|
53
103
|
*/
|
|
54
104
|
export declare function generateTestsFromClient(client: MCPClient, server: ServerConfig, options?: GenerateTestsFromClientOptions): Promise<string>;
|
|
105
|
+
export {};
|
|
55
106
|
//# sourceMappingURL=generate-tests.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generate-tests.d.ts","sourceRoot":"","sources":["../src/generate-tests.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,KAAK,EAAE,YAAY,EAAqB,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"generate-tests.d.ts","sourceRoot":"","sources":["../src/generate-tests.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,KAAK,EAAE,YAAY,EAAqB,MAAM,uBAAuB,CAAC;AAC7E,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,oCAAoC,CAAC;AAEjF,OAAO,EACL,KAAK,aAAa,EAInB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,KAAK,UAAU,EAEf,KAAK,mBAAmB,EAEzB,MAAM,kBAAkB,CAAC;AAE1B;;;;;;;;;;;GAWG;AACH,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG,MAAM,GAAG,IAAI,CAAC;AAEtD,2DAA2D;AAC3D,MAAM,WAAW,SAAU,SAAQ,mBAAmB;IACpD,sGAAsG;IACtG,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,qCAAqC;IACrC,OAAO,EAAE,MAAM,CAAC;IAChB,wCAAwC;IACxC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,qDAAqD;IACrD,SAAS,CAAC,EAAE,MAAM,GAAG,QAAQ,CAAC;IAC9B,iDAAiD;IACjD,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,+CAA+C;IAC/C,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,kDAAkD;IAClD,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,kDAAkD;IAClD,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,sEAAsE;IACtE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,sCAAsC;IACtC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,yDAAyD;IACzD,IAAI,CAAC,EAAE,cAAc,CAAC;IACtB,4DAA4D;IAC5D,QAAQ,CAAC,EAAE,UAAU,CAAC;IACtB,wEAAwE;IACxE,EAAE,CAAC,EAAE,SAAS,CAAC;IACf;0EACsE;IACtE,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAsFD;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAGnD;AAED,oFAAoF;AACpF,wBAAgB,cAAc,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,GAAE,GAAG,GAAG,GAAS,GAAG,MAAM,CAYxE;AA+HD;;GAEG;AACH,KAAK,gBAAgB,GAAG,IAAI,CAC1B,mBAAmB,EACjB,WAAW,GACX,aAAa,GACb,kBAAkB,GAClB,gBAAgB,GAChB,cAAc,GACd,iBAAiB,CACpB,CAAC;AAEF;;;;;GAKG;AACH,wBAAgB,aAAa,CAC3B,KAAK,EAAE,IAAI,EAAE,EACb,SAAS,EAAE,QAAQ,EAAE,EACrB,OAAO,EAAE,MAAM,EAAE,EACjB,OAAO,EAAE,gBAAgB,EACzB,MAAM,EAAE,YAAY,EACpB,KAAK,GAAE,aAAa,EAAO,GAC1B,MAAM,CAgGR;AAmGD;;;;GAIG;AACH,wBAAsB,aAAa,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,MAAM,CAAC,CA+BjF;AAED;;GAEG;AACH,MAAM,MAAM,8BAA8B,GAAG,IAAI,CAC/C,mBAAmB,EACjB,WAAW,GACX,aAAa,GACb,kBAAkB,GAClB,gBAAgB,GAChB,cAAc,GACd,iBAAiB,GACjB,MAAM,GACN,UAAU,GACV,IAAI,GACJ,QAAQ,GACR,SAAS,CACZ,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,wBAAsB,uBAAuB,CAC3C,MAAM,EAAE,SAAS,EACjB,MAAM,EAAE,YAAY,EACpB,OAAO,GAAE,8BAAmC,GAC3C,OAAO,CAAC,MAAM,CAAC,CAcjB"}
|
package/dist/generate-tests.js
CHANGED
|
@@ -6,63 +6,8 @@
|
|
|
6
6
|
*/
|
|
7
7
|
import { MCPClient } from './client/MCPClient.js';
|
|
8
8
|
import { getPackageVersion } from './utils/version.js';
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
*/
|
|
12
|
-
function generateSampleValue(schema) {
|
|
13
|
-
const type = schema.type;
|
|
14
|
-
const examples = schema.examples;
|
|
15
|
-
const enumValues = schema['enum'];
|
|
16
|
-
if (enumValues && enumValues.length > 0)
|
|
17
|
-
return enumValues[0];
|
|
18
|
-
if (examples && examples.length > 0)
|
|
19
|
-
return examples[0];
|
|
20
|
-
if (schema.default !== undefined)
|
|
21
|
-
return schema.default;
|
|
22
|
-
switch (type) {
|
|
23
|
-
case 'string':
|
|
24
|
-
return schema.description
|
|
25
|
-
? `example-${String(schema.description).toLowerCase().replace(/\s+/g, '-')}`
|
|
26
|
-
: 'example';
|
|
27
|
-
case 'number':
|
|
28
|
-
case 'integer':
|
|
29
|
-
return 42;
|
|
30
|
-
case 'boolean':
|
|
31
|
-
return true;
|
|
32
|
-
case 'array':
|
|
33
|
-
if (schema.items && typeof schema.items === 'object') {
|
|
34
|
-
return [generateSampleValue(schema.items)];
|
|
35
|
-
}
|
|
36
|
-
return [];
|
|
37
|
-
case 'object':
|
|
38
|
-
return {};
|
|
39
|
-
default:
|
|
40
|
-
return 'example';
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
/**
|
|
44
|
-
* Generate sample arguments from a tool's input schema.
|
|
45
|
-
*/
|
|
46
|
-
function generateToolArgs(tool) {
|
|
47
|
-
const schema = tool.inputSchema;
|
|
48
|
-
if (!schema || !schema.properties)
|
|
49
|
-
return {};
|
|
50
|
-
const args = {};
|
|
51
|
-
const props = schema.properties;
|
|
52
|
-
const required = new Set(schema.required || []);
|
|
53
|
-
// Generate values for all required fields, and optional ones with defaults
|
|
54
|
-
for (const [key, propSchema] of Object.entries(props)) {
|
|
55
|
-
if (required.has(key) || propSchema.default !== undefined) {
|
|
56
|
-
args[key] = generateSampleValue(propSchema);
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
// If no required fields, generate at least one so the test is useful
|
|
60
|
-
if (Object.keys(args).length === 0 && Object.keys(props).length > 0) {
|
|
61
|
-
const firstKey = Object.keys(props)[0];
|
|
62
|
-
args[firstKey] = generateSampleValue(props[firstKey]);
|
|
63
|
-
}
|
|
64
|
-
return args;
|
|
65
|
-
}
|
|
9
|
+
import { generateToolArgs, suggestEdgeCasesForTools, mergeAndValidateCases, } from './generate-cases.js';
|
|
10
|
+
import { createProviderFromEnv, } from './ai/provider.js';
|
|
66
11
|
/**
|
|
67
12
|
* Build the `client.start({ ... })` config literal for the generated test.
|
|
68
13
|
* Uses JSON.stringify for values so quotes/backslashes are safely escaped.
|
|
@@ -90,31 +35,118 @@ function formatServerLabel(server) {
|
|
|
90
35
|
const stdio = server;
|
|
91
36
|
return `${stdio.command}${stdio.args && stdio.args.length > 0 ? ' ' + stdio.args.join(' ') : ''}`;
|
|
92
37
|
}
|
|
38
|
+
/**
|
|
39
|
+
* Render one derived test case as an `it(...)` block.
|
|
40
|
+
*/
|
|
41
|
+
function generateCaseTest(c) {
|
|
42
|
+
const lines = [];
|
|
43
|
+
const argsStr = JSON.stringify(c.args);
|
|
44
|
+
lines.push(` // ${c.source} — ${escapeLineComment(c.rationale)}`);
|
|
45
|
+
// --verify found the server behaving differently than predicted: keep the
|
|
46
|
+
// case for visibility but skip it, and say what actually happened.
|
|
47
|
+
if (c.observed && c.expectation !== 'observe' && c.observed !== c.expectation) {
|
|
48
|
+
lines.push(` // verify: expected ${c.expectation} but server returned ${c.observed} — adjust manually`);
|
|
49
|
+
lines.push(` it.skip('${escapeJsString(c.title)}', async () => {`);
|
|
50
|
+
lines.push(' const result = await client.callTool({');
|
|
51
|
+
lines.push(` name: '${toolNameLiteral(c.tool)}',`);
|
|
52
|
+
lines.push(` arguments: ${argsStr},`);
|
|
53
|
+
lines.push(' }).catch((error: unknown) => error);');
|
|
54
|
+
lines.push(' expect(result).toBeDefined();');
|
|
55
|
+
lines.push(' });');
|
|
56
|
+
return lines;
|
|
57
|
+
}
|
|
58
|
+
if (c.expectation === 'observe') {
|
|
59
|
+
lines.push(` it('${escapeJsString(c.title)}', async () => {`);
|
|
60
|
+
lines.push(' const result = await client.callTool({');
|
|
61
|
+
lines.push(` name: '${toolNameLiteral(c.tool)}',`);
|
|
62
|
+
lines.push(` arguments: ${argsStr},`);
|
|
63
|
+
lines.push(' }).catch((error: unknown) => error);');
|
|
64
|
+
lines.push(' // Observation only — record what the server actually does.');
|
|
65
|
+
lines.push(' expect(result).toBeDefined();');
|
|
66
|
+
lines.push(` console.log('[${toolNameLiteral(c.tool)}]', JSON.stringify(result));`);
|
|
67
|
+
lines.push(' });');
|
|
68
|
+
}
|
|
69
|
+
else if (c.expectation === 'error') {
|
|
70
|
+
lines.push(` it('${escapeJsString(c.title)}', async () => {`);
|
|
71
|
+
lines.push(' const result = await client.callTool({');
|
|
72
|
+
lines.push(` name: '${toolNameLiteral(c.tool)}',`);
|
|
73
|
+
lines.push(` arguments: ${argsStr},`);
|
|
74
|
+
lines.push(' }).catch((error: unknown) => error);');
|
|
75
|
+
lines.push(' expect(isToolError(result)).toBe(true);');
|
|
76
|
+
lines.push(' });');
|
|
77
|
+
}
|
|
78
|
+
else {
|
|
79
|
+
lines.push(` it('${escapeJsString(c.title)}', async () => {`);
|
|
80
|
+
lines.push(' const result = await client.callTool({');
|
|
81
|
+
lines.push(` name: '${toolNameLiteral(c.tool)}',`);
|
|
82
|
+
lines.push(` arguments: ${argsStr},`);
|
|
83
|
+
lines.push(' }).catch((error: unknown) => error);');
|
|
84
|
+
lines.push(' expect(isToolError(result)).toBe(false);');
|
|
85
|
+
lines.push(' });');
|
|
86
|
+
}
|
|
87
|
+
return lines;
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Collapse control characters (including line terminators) so untrusted text
|
|
91
|
+
* can be embedded in a `//` line comment without terminating it. Model-provided
|
|
92
|
+
* rationales are the main caller — a raw newline would otherwise let the text
|
|
93
|
+
* escape the comment and become executable test code.
|
|
94
|
+
*/
|
|
95
|
+
export function escapeLineComment(s) {
|
|
96
|
+
// eslint-disable-next-line no-control-regex -- intentional: collapse control chars and line terminators
|
|
97
|
+
return s.replace(/[\u0000-\u001f\u2028\u2029]+/g, ' ');
|
|
98
|
+
}
|
|
99
|
+
/** Escape a string for use inside a single- or double-quoted JavaScript literal. */
|
|
100
|
+
export function escapeJsString(s, quote = "'") {
|
|
101
|
+
// Escape backslashes first, then the chosen quote, then newlines/control chars.
|
|
102
|
+
return (s
|
|
103
|
+
.replace(/\\/g, '\\\\')
|
|
104
|
+
.replace(new RegExp(quote, 'g'), `\\${quote}`)
|
|
105
|
+
.replace(/\n/g, '\\n')
|
|
106
|
+
.replace(/\r/g, '\\r')
|
|
107
|
+
.replace(/\t/g, '\\t')
|
|
108
|
+
// eslint-disable-next-line no-control-regex -- intentional: we want to escape ASCII control chars in user-provided strings
|
|
109
|
+
.replace(/[\u0000-\u001f]/g, (ch) => `\\u${ch.charCodeAt(0).toString(16).padStart(4, '0')}`));
|
|
110
|
+
}
|
|
111
|
+
/** Emit a safe single-quoted string literal for a tool name. */
|
|
112
|
+
function toolNameLiteral(name) {
|
|
113
|
+
return escapeJsString(name, "'");
|
|
114
|
+
}
|
|
93
115
|
/**
|
|
94
116
|
* Generate tool test cases.
|
|
95
117
|
*/
|
|
96
|
-
function generateToolTests(tools) {
|
|
118
|
+
function generateToolTests(tools, cases = []) {
|
|
97
119
|
if (tools.length === 0)
|
|
98
120
|
return '';
|
|
99
121
|
const lines = [" describe('Tools', () => {"];
|
|
122
|
+
if (cases.length > 0) {
|
|
123
|
+
lines.push(' const isToolError = (res: unknown): boolean =>');
|
|
124
|
+
lines.push(' res instanceof Error ||');
|
|
125
|
+
lines.push(' (typeof res === "object" && res !== null && (res as { isError?: unknown }).isError === true);');
|
|
126
|
+
}
|
|
100
127
|
for (const tool of tools) {
|
|
101
128
|
const sampleArgs = generateToolArgs(tool);
|
|
102
129
|
const argsStr = Object.keys(sampleArgs).length > 0 ? JSON.stringify(sampleArgs) : '{}';
|
|
103
130
|
lines.push('');
|
|
104
|
-
lines.push(` it('should have tool "${tool.name}"', async () => {`);
|
|
131
|
+
lines.push(` it('should have tool "${escapeJsString(tool.name, "'")}"', async () => {`);
|
|
105
132
|
lines.push(' const tools = await client.listTools();');
|
|
106
|
-
lines.push(` expect(tools).toHaveTool('${tool.name}');`);
|
|
133
|
+
lines.push(` expect(tools).toHaveTool('${toolNameLiteral(tool.name)}');`);
|
|
107
134
|
lines.push(' });');
|
|
108
135
|
lines.push('');
|
|
109
136
|
// Call test. Generated arguments are guesses, and some tools intentionally
|
|
110
137
|
// return/throw errors — so accept a successful result or a tool-level error.
|
|
111
|
-
lines.push(` it('should call "${tool.name}"', async () => {`);
|
|
138
|
+
lines.push(` it('should call "${escapeJsString(tool.name, "'")}"', async () => {`);
|
|
112
139
|
lines.push(' const result = await client.callTool({');
|
|
113
|
-
lines.push(` name: '${tool.name}',`);
|
|
140
|
+
lines.push(` name: '${toolNameLiteral(tool.name)}',`);
|
|
114
141
|
lines.push(` arguments: ${argsStr},`);
|
|
115
142
|
lines.push(' }).catch((error: unknown) => error);');
|
|
116
143
|
lines.push(' expect(result).toBeDefined();');
|
|
117
144
|
lines.push(' });');
|
|
145
|
+
// Derived edge/AI cases for this tool.
|
|
146
|
+
for (const c of cases.filter((c) => c.tool === tool.name)) {
|
|
147
|
+
lines.push('');
|
|
148
|
+
lines.push(...generateCaseTest(c));
|
|
149
|
+
}
|
|
118
150
|
}
|
|
119
151
|
lines.push(' });');
|
|
120
152
|
return lines.join('\n');
|
|
@@ -128,13 +160,13 @@ function generateResourceTests(resources) {
|
|
|
128
160
|
const lines = [" describe('Resources', () => {"];
|
|
129
161
|
for (const resource of resources) {
|
|
130
162
|
lines.push('');
|
|
131
|
-
lines.push(` it('should have resource "${resource.uri}"', async () => {`);
|
|
163
|
+
lines.push(` it('should have resource "${escapeJsString(resource.uri, "'")}"', async () => {`);
|
|
132
164
|
lines.push(' const resources = await client.listResources();');
|
|
133
|
-
lines.push(` expect(resources).toHaveResource('${resource.uri}');`);
|
|
165
|
+
lines.push(` expect(resources).toHaveResource('${escapeJsString(resource.uri, "'")}');`);
|
|
134
166
|
lines.push(' });');
|
|
135
167
|
lines.push('');
|
|
136
|
-
lines.push(` it('should read resource "${resource.uri}"', async () => {`);
|
|
137
|
-
lines.push(` const result = await client.readResource('${resource.uri}');`);
|
|
168
|
+
lines.push(` it('should read resource "${escapeJsString(resource.uri, "'")}"', async () => {`);
|
|
169
|
+
lines.push(` const result = await client.readResource('${escapeJsString(resource.uri, "'")}');`);
|
|
138
170
|
lines.push(' expect(result.contents).toBeDefined();');
|
|
139
171
|
lines.push(' expect(result.contents.length).toBeGreaterThan(0);');
|
|
140
172
|
lines.push(' });');
|
|
@@ -161,13 +193,13 @@ function generatePromptTests(prompts) {
|
|
|
161
193
|
}
|
|
162
194
|
const argsStr = Object.keys(promptArgs).length > 0 ? `, ${JSON.stringify(promptArgs)}` : '';
|
|
163
195
|
lines.push('');
|
|
164
|
-
lines.push(` it('should have prompt "${prompt.name}"', async () => {`);
|
|
196
|
+
lines.push(` it('should have prompt "${escapeJsString(prompt.name, "'")}"', async () => {`);
|
|
165
197
|
lines.push(' const prompts = await client.listPrompts();');
|
|
166
|
-
lines.push(` expect(prompts).toHavePrompt('${prompt.name}');`);
|
|
198
|
+
lines.push(` expect(prompts).toHavePrompt('${escapeJsString(prompt.name, "'")}');`);
|
|
167
199
|
lines.push(' });');
|
|
168
200
|
lines.push('');
|
|
169
|
-
lines.push(` it('should get prompt "${prompt.name}"', async () => {`);
|
|
170
|
-
lines.push(` const result = await client.getPrompt('${prompt.name}'${argsStr});`);
|
|
201
|
+
lines.push(` it('should get prompt "${escapeJsString(prompt.name, "'")}"', async () => {`);
|
|
202
|
+
lines.push(` const result = await client.getPrompt('${escapeJsString(prompt.name, "'")}'${argsStr});`);
|
|
171
203
|
lines.push(' expect(result.messages).toBeDefined();');
|
|
172
204
|
lines.push(' expect(result.messages.length).toBeGreaterThan(0);');
|
|
173
205
|
lines.push(' });');
|
|
@@ -177,8 +209,11 @@ function generatePromptTests(prompts) {
|
|
|
177
209
|
}
|
|
178
210
|
/**
|
|
179
211
|
* Generate a complete test file.
|
|
212
|
+
*
|
|
213
|
+
* @internal Exported for testing; consumers should use {@link generateTests}
|
|
214
|
+
* or {@link generateTestsFromClient}.
|
|
180
215
|
*/
|
|
181
|
-
function buildTestFile(tools, resources, prompts, options, server) {
|
|
216
|
+
export function buildTestFile(tools, resources, prompts, options, server, cases = []) {
|
|
182
217
|
const framework = options.framework || 'jest';
|
|
183
218
|
const description = options.description || 'MCP Server';
|
|
184
219
|
const startCmd = formatServerStart(server);
|
|
@@ -204,18 +239,21 @@ function buildTestFile(tools, resources, prompts, options, server) {
|
|
|
204
239
|
// Header comment
|
|
205
240
|
const header = [
|
|
206
241
|
'/**',
|
|
207
|
-
` * Generated test file for: ${description}`,
|
|
242
|
+
` * Generated test file for: ${description.replace(/\*\//g, '*\\/')}`,
|
|
208
243
|
' *',
|
|
209
244
|
` * Framework: ${framework}`,
|
|
210
|
-
` * Server: ${serverLabel}`,
|
|
245
|
+
` * Server: ${serverLabel.replace(/\*\//g, '*\\/')}`,
|
|
211
246
|
` * Tools: ${tools.length} | Resources: ${resources.length} | Prompts: ${prompts.length}`,
|
|
247
|
+
cases.length > 0 ? ` * Derived cases: ${cases.length} (edge/AI)` : null,
|
|
212
248
|
' *',
|
|
213
249
|
` * Generated by @slbdn/mcp-tester v${getPackageVersion()}`,
|
|
214
250
|
' * Run: npx jest --testTimeout=30000 (or npx vitest run)',
|
|
215
251
|
' */',
|
|
216
|
-
]
|
|
252
|
+
]
|
|
253
|
+
.filter((line) => line !== null)
|
|
254
|
+
.join('\n');
|
|
217
255
|
// Test sections
|
|
218
|
-
const toolTests = options.includeTools !== false ? generateToolTests(tools) : '';
|
|
256
|
+
const toolTests = options.includeTools !== false ? generateToolTests(tools, cases) : '';
|
|
219
257
|
const resourceTests = options.includeResources !== false ? generateResourceTests(resources) : '';
|
|
220
258
|
const promptTests = options.includePrompts !== false ? generatePromptTests(prompts) : '';
|
|
221
259
|
// Combine
|
|
@@ -230,7 +268,7 @@ function buildTestFile(tools, resources, prompts, options, server) {
|
|
|
230
268
|
${importLines.join('\n')}
|
|
231
269
|
|
|
232
270
|
${beforeAllLine}
|
|
233
|
-
describe('${description}', () => {
|
|
271
|
+
describe('${escapeJsString(description, "'")}', () => {
|
|
234
272
|
let client: MCPClient;
|
|
235
273
|
|
|
236
274
|
beforeEach(async () => {
|
|
@@ -262,6 +300,82 @@ ${sections.join('\n\n')}
|
|
|
262
300
|
});
|
|
263
301
|
`;
|
|
264
302
|
}
|
|
303
|
+
/**
|
|
304
|
+
* Derive test cases for the requested {@link GenerationMode}.
|
|
305
|
+
*
|
|
306
|
+
* - `static` → no extra cases
|
|
307
|
+
* - `edge` → deterministic schema rules
|
|
308
|
+
* - `ai` → rules + AI-suggested cases (validated against the real schemas)
|
|
309
|
+
*
|
|
310
|
+
* @returns The cases, a diagnostics string (or null), and whether AI ran.
|
|
311
|
+
*/
|
|
312
|
+
async function buildCases(tools, options, serverLabel) {
|
|
313
|
+
const mode = options.mode ?? 'static';
|
|
314
|
+
if (mode === 'static' || options.includeTools === false || tools.length === 0) {
|
|
315
|
+
return { cases: [], note: null, usedAI: false };
|
|
316
|
+
}
|
|
317
|
+
const ruleCases = suggestEdgeCasesForTools(tools);
|
|
318
|
+
if (mode === 'edge') {
|
|
319
|
+
return { cases: ruleCases, note: null, usedAI: false };
|
|
320
|
+
}
|
|
321
|
+
// mode === 'ai'
|
|
322
|
+
const provider = options.provider ?? createProviderFromEnv();
|
|
323
|
+
if (!provider) {
|
|
324
|
+
if (options.ai?.requireAi) {
|
|
325
|
+
throw new Error('AI generation requested with requireAi, but no provider is available. ' +
|
|
326
|
+
'Set MCP_TESTER_AI_API_KEY (and optionally MCP_TESTER_AI_BASE_URL / MCP_TESTER_AI_MODEL), ' +
|
|
327
|
+
'or pass a provider.');
|
|
328
|
+
}
|
|
329
|
+
return {
|
|
330
|
+
cases: ruleCases,
|
|
331
|
+
note: 'No AI provider configured (set MCP_TESTER_AI_API_KEY); ' +
|
|
332
|
+
'fell back to deterministic edge cases.',
|
|
333
|
+
usedAI: false,
|
|
334
|
+
};
|
|
335
|
+
}
|
|
336
|
+
const analysis = {
|
|
337
|
+
serverLabel,
|
|
338
|
+
tools: tools.map((t) => ({
|
|
339
|
+
name: t.name,
|
|
340
|
+
description: t.description,
|
|
341
|
+
inputSchema: t.inputSchema,
|
|
342
|
+
})),
|
|
343
|
+
};
|
|
344
|
+
const aiCases = await provider.suggestCases(analysis);
|
|
345
|
+
const schemas = new Map(tools.map((t) => [t.name, t]));
|
|
346
|
+
const { cases, rejected } = mergeAndValidateCases([ruleCases, aiCases], schemas);
|
|
347
|
+
// Only AI cases can be rejected (rule cases are exempt from schema
|
|
348
|
+
// validation), but count by source so the diagnostic stays correct if that
|
|
349
|
+
// ever changes.
|
|
350
|
+
const dropped = rejected.filter((r) => r.c.source.startsWith('ai:')).length;
|
|
351
|
+
const note = dropped > 0
|
|
352
|
+
? `AI suggested cases: ${aiCases.length}, kept after schema validation: ${aiCases.length - dropped} (dropped ${dropped})`
|
|
353
|
+
: null;
|
|
354
|
+
return { cases, note, usedAI: true };
|
|
355
|
+
}
|
|
356
|
+
/**
|
|
357
|
+
* Dry-run every derived case against the live server and record what actually
|
|
358
|
+
* happens in `case.observed`. The renderer turns mismatches into `it.skip`
|
|
359
|
+
* blocks with an explanatory comment.
|
|
360
|
+
*/
|
|
361
|
+
async function verifyCases(client, cases, timeout) {
|
|
362
|
+
for (const c of cases) {
|
|
363
|
+
if (c.expectation === 'observe')
|
|
364
|
+
continue;
|
|
365
|
+
try {
|
|
366
|
+
const result = await client.callTool({
|
|
367
|
+
name: c.tool,
|
|
368
|
+
arguments: c.args,
|
|
369
|
+
timeout: Math.min(timeout, 15_000),
|
|
370
|
+
});
|
|
371
|
+
const isError = result.isError === true;
|
|
372
|
+
c.observed = isError ? 'error' : 'success';
|
|
373
|
+
}
|
|
374
|
+
catch {
|
|
375
|
+
c.observed = 'error';
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
}
|
|
265
379
|
/**
|
|
266
380
|
* Connect to an MCP server, inspect capabilities, and generate a test file.
|
|
267
381
|
*
|
|
@@ -280,12 +394,19 @@ export async function generateTests(options) {
|
|
|
280
394
|
args: options.args,
|
|
281
395
|
});
|
|
282
396
|
const [tools, resources, prompts] = await Promise.all([
|
|
283
|
-
client.listTools(),
|
|
284
|
-
client.listResources(),
|
|
285
|
-
client.listPrompts(),
|
|
397
|
+
options.includeTools === false ? Promise.resolve([]) : client.listTools(),
|
|
398
|
+
options.includeResources === false ? Promise.resolve([]) : client.listResources(),
|
|
399
|
+
options.includePrompts === false ? Promise.resolve([]) : client.listPrompts(),
|
|
286
400
|
]);
|
|
287
401
|
const server = { command: options.command, args: options.args };
|
|
288
|
-
|
|
402
|
+
const serverLabel = formatServerLabel(server);
|
|
403
|
+
const { cases, note } = await buildCases(tools, options, serverLabel);
|
|
404
|
+
if (note)
|
|
405
|
+
console.warn(`mcp-tester: ${note}`);
|
|
406
|
+
if (options.verify && cases.length > 0) {
|
|
407
|
+
await verifyCases(client, cases, options.timeout || 30000);
|
|
408
|
+
}
|
|
409
|
+
return buildTestFile(tools, resources, prompts, options, server, cases);
|
|
289
410
|
}
|
|
290
411
|
finally {
|
|
291
412
|
await client.stop();
|
|
@@ -309,6 +430,12 @@ export async function generateTestsFromClient(client, server, options = {}) {
|
|
|
309
430
|
options.includeResources === false ? Promise.resolve([]) : client.listResources(),
|
|
310
431
|
options.includePrompts === false ? Promise.resolve([]) : client.listPrompts(),
|
|
311
432
|
]);
|
|
312
|
-
|
|
433
|
+
const { cases, note } = await buildCases(tools, options, formatServerLabel(server));
|
|
434
|
+
if (note)
|
|
435
|
+
console.warn(`mcp-tester: ${note}`);
|
|
436
|
+
if (options.verify && cases.length > 0) {
|
|
437
|
+
await verifyCases(client, cases, options.timeout || 30000);
|
|
438
|
+
}
|
|
439
|
+
return buildTestFile(tools, resources, prompts, options, server, cases);
|
|
313
440
|
}
|
|
314
441
|
//# sourceMappingURL=generate-tests.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generate-tests.js","sourceRoot":"","sources":["../src/generate-tests.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"generate-tests.js","sourceRoot":"","sources":["../src/generate-tests.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -39,7 +39,9 @@ export * as assert from './assert.js';
|
|
|
39
39
|
export { AssertionError } from './assert.js';
|
|
40
40
|
export { toHaveTool, toHaveResource, toHavePrompt, toHaveToolWithSchema, toHaveToolCount, toHaveResourceCount, toHavePromptCount, toHaveResourceByName, toHavePromptWithArgs, toReturnText, toReturnTextContaining, toReturnError, toReturnOk, toReturnJson, toReturnContentCount, toReturnImage, toReturnResourceText, toReturnResourceTextContaining, toReturnPromptTextContaining, toReturnPromptMessageCount, setupJestMatchers, setupVitestMatchers, setupCustomMatchers, assertToolText, assertToolTextContains, assertHasTool, assertHasResource, assertHasPrompt, } from './matchers.js';
|
|
41
41
|
export { generateTests, generateTestsFromClient } from './generate-tests.js';
|
|
42
|
-
export type { GenerateTestOptions, GenerateTestsFromClientOptions } from './generate-tests.js';
|
|
42
|
+
export type { GenerateTestOptions, GenerateTestsFromClientOptions, GenerationMode, AIOptions, } from './generate-tests.js';
|
|
43
|
+
export { type GeneratedCase, type CaseExpectation, type CaseSource, generateToolArgs, suggestEdgeCases, suggestEdgeCasesForTools, validateArgsAgainstSchema, mergeAndValidateCases, } from './generate-cases.js';
|
|
44
|
+
export { type AIProvider, type ServerAnalysis, type OpenAICompatOptions, OpenAICompatProvider, createProviderFromEnv, suggestCasesWithAI, DEFAULT_AI_BASE_URL, DEFAULT_AI_MODEL, } from './ai/provider.js';
|
|
43
45
|
export { generateTypes, generateTypesFromClient } from './generate-types.js';
|
|
44
46
|
export type { GenerateTypesOptions, GenerateTypesFromClientOptions } from './generate-types.js';
|
|
45
47
|
export { getPackageVersion } from './utils/version.js';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAEH,OAAO,EACL,SAAS,EACT,KAAK,YAAY,EACjB,KAAK,iBAAiB,EACtB,KAAK,0BAA0B,EAC/B,KAAK,eAAe;AACpB,wCAAwC;AACxC,KAAK,eAAe,EACpB,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACpB,KAAK,mBAAmB,EACxB,KAAK,YAAY,EACjB,KAAK,YAAY,EACjB,KAAK,oBAAoB,GAC1B,MAAM,mBAAmB,CAAC;AAC3B,YAAY,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EACL,cAAc,EACd,eAAe,EACf,kBAAkB,EAClB,kBAAkB,EAClB,sBAAsB,EACtB,cAAc,GACf,MAAM,mBAAmB,CAAC;AAC3B,YAAY,EAAE,MAAM,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AACzE,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,EACL,WAAW,EACX,SAAS,EACT,gBAAgB,EAChB,mBAAmB,EACnB,iBAAiB,EACjB,mBAAmB,GACpB,MAAM,oBAAoB,CAAC;AAC5B,YAAY,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,KAAK,MAAM,MAAM,aAAa,CAAC;AACtC,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EACL,UAAU,EACV,cAAc,EACd,YAAY,EACZ,oBAAoB,EACpB,eAAe,EACf,mBAAmB,EACnB,iBAAiB,EACjB,oBAAoB,EACpB,oBAAoB,EACpB,YAAY,EACZ,sBAAsB,EACtB,aAAa,EACb,UAAU,EACV,YAAY,EACZ,oBAAoB,EACpB,aAAa,EACb,oBAAoB,EACpB,8BAA8B,EAC9B,4BAA4B,EAC5B,0BAA0B,EAC1B,iBAAiB,EACjB,mBAAmB,EACnB,mBAAmB,EACnB,cAAc,EACd,sBAAsB,EACtB,aAAa,EACb,iBAAiB,EACjB,eAAe,GAChB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,aAAa,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AAC7E,YAAY,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAEH,OAAO,EACL,SAAS,EACT,KAAK,YAAY,EACjB,KAAK,iBAAiB,EACtB,KAAK,0BAA0B,EAC/B,KAAK,eAAe;AACpB,wCAAwC;AACxC,KAAK,eAAe,EACpB,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACpB,KAAK,mBAAmB,EACxB,KAAK,YAAY,EACjB,KAAK,YAAY,EACjB,KAAK,oBAAoB,GAC1B,MAAM,mBAAmB,CAAC;AAC3B,YAAY,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EACL,cAAc,EACd,eAAe,EACf,kBAAkB,EAClB,kBAAkB,EAClB,sBAAsB,EACtB,cAAc,GACf,MAAM,mBAAmB,CAAC;AAC3B,YAAY,EAAE,MAAM,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AACzE,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,EACL,WAAW,EACX,SAAS,EACT,gBAAgB,EAChB,mBAAmB,EACnB,iBAAiB,EACjB,mBAAmB,GACpB,MAAM,oBAAoB,CAAC;AAC5B,YAAY,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,KAAK,MAAM,MAAM,aAAa,CAAC;AACtC,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EACL,UAAU,EACV,cAAc,EACd,YAAY,EACZ,oBAAoB,EACpB,eAAe,EACf,mBAAmB,EACnB,iBAAiB,EACjB,oBAAoB,EACpB,oBAAoB,EACpB,YAAY,EACZ,sBAAsB,EACtB,aAAa,EACb,UAAU,EACV,YAAY,EACZ,oBAAoB,EACpB,aAAa,EACb,oBAAoB,EACpB,8BAA8B,EAC9B,4BAA4B,EAC5B,0BAA0B,EAC1B,iBAAiB,EACjB,mBAAmB,EACnB,mBAAmB,EACnB,cAAc,EACd,sBAAsB,EACtB,aAAa,EACb,iBAAiB,EACjB,eAAe,GAChB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,aAAa,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AAC7E,YAAY,EACV,mBAAmB,EACnB,8BAA8B,EAC9B,cAAc,EACd,SAAS,GACV,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,KAAK,aAAa,EAClB,KAAK,eAAe,EACpB,KAAK,UAAU,EACf,gBAAgB,EAChB,gBAAgB,EAChB,wBAAwB,EACxB,yBAAyB,EACzB,qBAAqB,GACtB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,KAAK,UAAU,EACf,KAAK,cAAc,EACnB,KAAK,mBAAmB,EACxB,oBAAoB,EACpB,qBAAqB,EACrB,kBAAkB,EAClB,mBAAmB,EACnB,gBAAgB,GACjB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,aAAa,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AAC7E,YAAY,EAAE,oBAAoB,EAAE,8BAA8B,EAAE,MAAM,qBAAqB,CAAC;AAChG,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -34,6 +34,8 @@ export * as assert from './assert.js';
|
|
|
34
34
|
export { AssertionError } from './assert.js';
|
|
35
35
|
export { toHaveTool, toHaveResource, toHavePrompt, toHaveToolWithSchema, toHaveToolCount, toHaveResourceCount, toHavePromptCount, toHaveResourceByName, toHavePromptWithArgs, toReturnText, toReturnTextContaining, toReturnError, toReturnOk, toReturnJson, toReturnContentCount, toReturnImage, toReturnResourceText, toReturnResourceTextContaining, toReturnPromptTextContaining, toReturnPromptMessageCount, setupJestMatchers, setupVitestMatchers, setupCustomMatchers, assertToolText, assertToolTextContains, assertHasTool, assertHasResource, assertHasPrompt, } from './matchers.js';
|
|
36
36
|
export { generateTests, generateTestsFromClient } from './generate-tests.js';
|
|
37
|
+
export { generateToolArgs, suggestEdgeCases, suggestEdgeCasesForTools, validateArgsAgainstSchema, mergeAndValidateCases, } from './generate-cases.js';
|
|
38
|
+
export { OpenAICompatProvider, createProviderFromEnv, suggestCasesWithAI, DEFAULT_AI_BASE_URL, DEFAULT_AI_MODEL, } from './ai/provider.js';
|
|
37
39
|
export { generateTypes, generateTypesFromClient } from './generate-types.js';
|
|
38
40
|
export { getPackageVersion } from './utils/version.js';
|
|
39
41
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAEH,OAAO,EACL,SAAS,GAaV,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EACL,cAAc,EACd,eAAe,EACf,kBAAkB,EAClB,kBAAkB,EAClB,sBAAsB,EACtB,cAAc,GACf,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,EACL,WAAW,EACX,SAAS,EACT,gBAAgB,EAChB,mBAAmB,EACnB,iBAAiB,EACjB,mBAAmB,GACpB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,KAAK,MAAM,MAAM,aAAa,CAAC;AACtC,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EACL,UAAU,EACV,cAAc,EACd,YAAY,EACZ,oBAAoB,EACpB,eAAe,EACf,mBAAmB,EACnB,iBAAiB,EACjB,oBAAoB,EACpB,oBAAoB,EACpB,YAAY,EACZ,sBAAsB,EACtB,aAAa,EACb,UAAU,EACV,YAAY,EACZ,oBAAoB,EACpB,aAAa,EACb,oBAAoB,EACpB,8BAA8B,EAC9B,4BAA4B,EAC5B,0BAA0B,EAC1B,iBAAiB,EACjB,mBAAmB,EACnB,mBAAmB,EACnB,cAAc,EACd,sBAAsB,EACtB,aAAa,EACb,iBAAiB,EACjB,eAAe,GAChB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,aAAa,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAEH,OAAO,EACL,SAAS,GAaV,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EACL,cAAc,EACd,eAAe,EACf,kBAAkB,EAClB,kBAAkB,EAClB,sBAAsB,EACtB,cAAc,GACf,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,EACL,WAAW,EACX,SAAS,EACT,gBAAgB,EAChB,mBAAmB,EACnB,iBAAiB,EACjB,mBAAmB,GACpB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,KAAK,MAAM,MAAM,aAAa,CAAC;AACtC,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EACL,UAAU,EACV,cAAc,EACd,YAAY,EACZ,oBAAoB,EACpB,eAAe,EACf,mBAAmB,EACnB,iBAAiB,EACjB,oBAAoB,EACpB,oBAAoB,EACpB,YAAY,EACZ,sBAAsB,EACtB,aAAa,EACb,UAAU,EACV,YAAY,EACZ,oBAAoB,EACpB,aAAa,EACb,oBAAoB,EACpB,8BAA8B,EAC9B,4BAA4B,EAC5B,0BAA0B,EAC1B,iBAAiB,EACjB,mBAAmB,EACnB,mBAAmB,EACnB,cAAc,EACd,sBAAsB,EACtB,aAAa,EACb,iBAAiB,EACjB,eAAe,GAChB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,aAAa,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AAO7E,OAAO,EAIL,gBAAgB,EAChB,gBAAgB,EAChB,wBAAwB,EACxB,yBAAyB,EACzB,qBAAqB,GACtB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAIL,oBAAoB,EACpB,qBAAqB,EACrB,kBAAkB,EAClB,mBAAmB,EACnB,gBAAgB,GACjB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,aAAa,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AAE7E,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC"}
|
package/dist/matchers.d.ts
CHANGED
|
@@ -1,30 +1,40 @@
|
|
|
1
1
|
import { Tool, Resource, Prompt, CallToolResult, ReadResourceResult, GetPromptResult } from '@modelcontextprotocol/sdk/types.js';
|
|
2
|
+
/**
|
|
3
|
+
* The matcher signatures, declared once so both augmentation targets below
|
|
4
|
+
* stay in sync.
|
|
5
|
+
*/
|
|
6
|
+
export interface MCPMatchers<R = void> {
|
|
7
|
+
toHaveTool(toolName: string): R;
|
|
8
|
+
toHaveResource(uri: string): R;
|
|
9
|
+
toHavePrompt(promptName: string): R;
|
|
10
|
+
toHaveToolWithSchema(toolName: string): R;
|
|
11
|
+
toHaveToolCount(count: number): R;
|
|
12
|
+
toHaveResourceCount(count: number): R;
|
|
13
|
+
toHavePromptCount(count: number): R;
|
|
14
|
+
toHaveResourceByName(name: string): R;
|
|
15
|
+
toHavePromptWithArgs(promptName: string): R;
|
|
16
|
+
toReturnText(expected?: string): R;
|
|
17
|
+
toReturnTextContaining(substring: string): R;
|
|
18
|
+
toReturnError(): R;
|
|
19
|
+
toReturnOk(): R;
|
|
20
|
+
toReturnJson(expected: unknown): R;
|
|
21
|
+
toReturnContentCount(count: number): R;
|
|
22
|
+
toReturnImage(): R;
|
|
23
|
+
toReturnResourceText(expected?: string): R;
|
|
24
|
+
toReturnResourceTextContaining(substring: string): R;
|
|
25
|
+
toReturnPromptTextContaining(substring: string): R;
|
|
26
|
+
toReturnPromptMessageCount(count: number): R;
|
|
27
|
+
}
|
|
2
28
|
declare global {
|
|
3
29
|
namespace jest {
|
|
4
|
-
interface Matchers<R> {
|
|
5
|
-
toHaveTool(toolName: string): R;
|
|
6
|
-
toHaveResource(uri: string): R;
|
|
7
|
-
toHavePrompt(promptName: string): R;
|
|
8
|
-
toHaveToolWithSchema(toolName: string): R;
|
|
9
|
-
toHaveToolCount(count: number): R;
|
|
10
|
-
toHaveResourceCount(count: number): R;
|
|
11
|
-
toHavePromptCount(count: number): R;
|
|
12
|
-
toHaveResourceByName(name: string): R;
|
|
13
|
-
toHavePromptWithArgs(promptName: string): R;
|
|
14
|
-
toReturnText(expected?: string): R;
|
|
15
|
-
toReturnTextContaining(substring: string): R;
|
|
16
|
-
toReturnError(): R;
|
|
17
|
-
toReturnOk(): R;
|
|
18
|
-
toReturnJson(expected: unknown): R;
|
|
19
|
-
toReturnContentCount(count: number): R;
|
|
20
|
-
toReturnImage(): R;
|
|
21
|
-
toReturnResourceText(expected?: string): R;
|
|
22
|
-
toReturnResourceTextContaining(substring: string): R;
|
|
23
|
-
toReturnPromptTextContaining(substring: string): R;
|
|
24
|
-
toReturnPromptMessageCount(count: number): R;
|
|
30
|
+
interface Matchers<R> extends MCPMatchers<R> {
|
|
25
31
|
}
|
|
26
32
|
}
|
|
27
33
|
}
|
|
34
|
+
declare module 'expect' {
|
|
35
|
+
interface Matchers<R extends void | Promise<void>, T = unknown> extends MCPMatchers<R> {
|
|
36
|
+
}
|
|
37
|
+
}
|
|
28
38
|
/**
|
|
29
39
|
* Check if a tool with the given name exists in the tools array.
|
|
30
40
|
* Works with `.not` for negation.
|