@machina.ai/openapi-contract-tester 2.2.0 → 3.0.1
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/ai-engine/index.d.ts +1 -6
- package/dist/ai-engine/index.d.ts.map +1 -1
- package/dist/ai-engine/index.js +1 -6
- package/dist/ai-engine/index.js.map +1 -1
- package/dist/executor/response-handler.d.ts +15 -0
- package/dist/executor/response-handler.d.ts.map +1 -1
- package/dist/executor/response-handler.js +53 -0
- package/dist/executor/response-handler.js.map +1 -1
- package/dist/executor/test-executor.d.ts +14 -0
- package/dist/executor/test-executor.d.ts.map +1 -1
- package/dist/executor/test-executor.js +90 -2
- package/dist/executor/test-executor.js.map +1 -1
- package/dist/generators/ai-endpoint-test-generator.d.ts +21 -0
- package/dist/generators/ai-endpoint-test-generator.d.ts.map +1 -0
- package/dist/generators/ai-endpoint-test-generator.js +178 -0
- package/dist/generators/ai-endpoint-test-generator.js.map +1 -0
- package/dist/generators/data/type-strategies.d.ts +7 -2
- package/dist/generators/data/type-strategies.d.ts.map +1 -1
- package/dist/generators/data/type-strategies.js +88 -4
- package/dist/generators/data/type-strategies.js.map +1 -1
- package/dist/generators/edge-case-generator.d.ts +1 -1
- package/dist/generators/edge-case-generator.d.ts.map +1 -1
- package/dist/generators/edge-case-generator.js +160 -38
- package/dist/generators/edge-case-generator.js.map +1 -1
- package/dist/generators/edge-cases/boundary-analyzer.d.ts.map +1 -1
- package/dist/generators/edge-cases/boundary-analyzer.js +56 -11
- package/dist/generators/edge-cases/boundary-analyzer.js.map +1 -1
- package/dist/generators/errors/validation-error-strategy.js +8 -8
- package/dist/generators/errors/validation-error-strategy.js.map +1 -1
- package/dist/generators/happy-path-generator.d.ts.map +1 -1
- package/dist/generators/happy-path-generator.js +74 -7
- package/dist/generators/happy-path-generator.js.map +1 -1
- package/dist/generators/input-coverage-engine.d.ts +7 -0
- package/dist/generators/input-coverage-engine.d.ts.map +1 -0
- package/dist/generators/input-coverage-engine.js +304 -0
- package/dist/generators/input-coverage-engine.js.map +1 -0
- package/dist/mcp/handlers/analyze-api.d.ts +52 -0
- package/dist/mcp/handlers/analyze-api.d.ts.map +1 -0
- package/dist/mcp/handlers/analyze-api.js +272 -0
- package/dist/mcp/handlers/analyze-api.js.map +1 -0
- package/dist/mcp/handlers/export-to-postman.d.ts +4 -0
- package/dist/mcp/handlers/export-to-postman.d.ts.map +1 -1
- package/dist/mcp/handlers/export-to-postman.js +23 -6
- package/dist/mcp/handlers/export-to-postman.js.map +1 -1
- package/dist/mcp/handlers/generate-tests.d.ts +12 -37
- package/dist/mcp/handlers/generate-tests.d.ts.map +1 -1
- package/dist/mcp/handlers/generate-tests.js +69 -468
- package/dist/mcp/handlers/generate-tests.js.map +1 -1
- package/dist/mcp/handlers/index.d.ts +1 -0
- package/dist/mcp/handlers/index.d.ts.map +1 -1
- package/dist/mcp/handlers/index.js +1 -0
- package/dist/mcp/handlers/index.js.map +1 -1
- package/dist/mcp/handlers/run-tests.d.ts +7 -1
- package/dist/mcp/handlers/run-tests.d.ts.map +1 -1
- package/dist/mcp/handlers/run-tests.js +24 -7
- package/dist/mcp/handlers/run-tests.js.map +1 -1
- package/dist/mcp/server.d.ts +7 -6
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +16 -13
- package/dist/mcp/server.js.map +1 -1
- package/dist/types/index.d.ts +1 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +2 -1
- package/dist/types/index.js.map +1 -1
- package/dist/types/qa-context.d.ts +39 -0
- package/dist/types/qa-context.d.ts.map +1 -0
- package/dist/types/qa-context.js +2 -0
- package/dist/types/qa-context.js.map +1 -0
- package/dist/types/test-case.d.ts +5 -0
- package/dist/types/test-case.d.ts.map +1 -1
- package/dist/utils/coverage-calculator.d.ts +24 -0
- package/dist/utils/coverage-calculator.d.ts.map +1 -1
- package/dist/utils/coverage-calculator.js +32 -0
- package/dist/utils/coverage-calculator.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,519 +1,120 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Generate Tests Handler
|
|
3
3
|
*
|
|
4
|
-
*
|
|
4
|
+
* STEP 2 of 3 in the QA workflow.
|
|
5
|
+
* Reads the semantic contract produced by analyze-api (qa-context.json)
|
|
6
|
+
* and generates full input-coverage tests for every endpoint.
|
|
5
7
|
*
|
|
6
8
|
* @module mcp/handlers/generate-tests
|
|
7
9
|
*/
|
|
8
10
|
import { BaseToolHandler } from './base-handler.js';
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
11
|
+
import { SpecService } from '../services/spec-service.js';
|
|
12
|
+
import { FileService } from '../services/file-service.js';
|
|
13
|
+
import { generateCoverageForEndpoint } from '../../generators/input-coverage-engine.js';
|
|
12
14
|
import { enrichTestsWithMetadata } from '../../generators/test-enricher.js';
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
* Handler for test generation tool
|
|
16
|
-
*/
|
|
15
|
+
const DEFAULT_CONTEXT_FILE = './qa-context.json';
|
|
16
|
+
const DEFAULT_TESTS_FILE = './test-to-execute.json';
|
|
17
17
|
export class GenerateTestsHandler extends BaseToolHandler {
|
|
18
18
|
specService;
|
|
19
|
+
fileService;
|
|
19
20
|
name = 'generate-tests';
|
|
20
|
-
description = 'STEP
|
|
21
|
-
'Reads
|
|
22
|
-
'
|
|
23
|
-
'
|
|
24
|
-
'
|
|
25
|
-
'Use aiLevel="smart" or "advanced" to leverage the LLM for smarter value generation. ' +
|
|
26
|
-
'Provide testData with realistic values (e.g., valid email, password, product ID) so generated ' +
|
|
27
|
-
'tests use real data instead of placeholders.';
|
|
21
|
+
description = 'STEP 2 of 3 — Generates a complete test suite from the semantic contract produced by analyze-api. ' +
|
|
22
|
+
'Reads qa-context.json and generates input-coverage tests: for each input (headers, body fields, ' +
|
|
23
|
+
'path params, query params) it generates valid values, missing-required cases, invalid types, ' +
|
|
24
|
+
'and boundary values. Always run analyze-api (step 1) first. ' +
|
|
25
|
+
'Saves tests to test-to-execute.json for use by run-tests (step 3).';
|
|
28
26
|
inputSchema = {
|
|
29
27
|
type: 'object',
|
|
30
28
|
properties: {
|
|
31
|
-
|
|
29
|
+
contextFile: {
|
|
32
30
|
type: 'string',
|
|
33
|
-
description: '
|
|
34
|
-
'Example: "/project/api/openapi.yaml" or "~/docs/spec.json". ' +
|
|
35
|
-
'At least one of specPath or baseUrl is required.'
|
|
31
|
+
description: 'Path to qa-context.json from analyze-api. Defaults to "./qa-context.json".'
|
|
36
32
|
},
|
|
37
|
-
|
|
33
|
+
specPath: {
|
|
38
34
|
type: 'string',
|
|
39
|
-
description: '
|
|
40
|
-
'If specPath is omitted, auto-discovery is attempted at common paths ' +
|
|
41
|
-
'(/openapi.json, /swagger.json, /api-docs). ' +
|
|
42
|
-
'Also used by run-tests as the target URL when executing tests.'
|
|
43
|
-
},
|
|
44
|
-
categories: {
|
|
45
|
-
type: 'array',
|
|
46
|
-
items: {
|
|
47
|
-
type: 'string',
|
|
48
|
-
enum: ['happy-path', 'edge-case', 'error-case', 'business-rule']
|
|
49
|
-
},
|
|
50
|
-
description: 'Which test categories to generate. Default: ["happy-path", "edge-case", "error-case"]. ' +
|
|
51
|
-
'happy-path: valid requests expecting 2xx. ' +
|
|
52
|
-
'edge-case: boundary inputs (empty strings, 0, very long values). ' +
|
|
53
|
-
'error-case: invalid requests expecting 4xx/5xx. ' +
|
|
54
|
-
'business-rule: domain-specific rules derived from userStories.'
|
|
35
|
+
description: 'Path to OpenAPI spec — used to enrich tests with schema metadata.'
|
|
55
36
|
},
|
|
56
|
-
|
|
37
|
+
baseUrl: {
|
|
57
38
|
type: 'string',
|
|
58
|
-
description: '
|
|
59
|
-
'When provided with aiLevel="smart" or "advanced", the LLM generates test cases ' +
|
|
60
|
-
'tailored to these requirements. Required for business-rule category.'
|
|
61
|
-
},
|
|
62
|
-
seed: {
|
|
63
|
-
type: 'number',
|
|
64
|
-
description: 'Integer seed for reproducible random test data generation. ' +
|
|
65
|
-
'Same seed always produces the same tests. Useful for CI/CD pipelines.'
|
|
39
|
+
description: 'Base URL of the API. Example: "https://api.example.com"'
|
|
66
40
|
},
|
|
67
41
|
testData: {
|
|
68
42
|
type: 'object',
|
|
69
|
-
description: '
|
|
70
|
-
'
|
|
71
|
-
'Example: { "email": "test@example.com", "password": "Secret123!", "productId": "prod_abc" }. ' +
|
|
72
|
-
'Keys match field names in the API request body or path parameters.',
|
|
43
|
+
description: 'Real values to use instead of generated placeholders. ' +
|
|
44
|
+
'Example: { "email": "test@example.com", "Authorization": "Bearer real-token" }',
|
|
73
45
|
additionalProperties: true
|
|
74
46
|
},
|
|
47
|
+
testsFile: {
|
|
48
|
+
type: 'string',
|
|
49
|
+
description: 'Output path for tests. Defaults to "./test-to-execute.json".'
|
|
50
|
+
}
|
|
75
51
|
},
|
|
76
52
|
required: []
|
|
77
53
|
};
|
|
78
|
-
constructor(specService) {
|
|
54
|
+
constructor(specService = new SpecService(), fileService = new FileService()) {
|
|
79
55
|
super();
|
|
80
56
|
this.specService = specService;
|
|
57
|
+
this.fileService = fileService;
|
|
81
58
|
}
|
|
82
59
|
async handle(args) {
|
|
83
60
|
const params = args;
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
baseUrl: params.baseUrl,
|
|
87
|
-
categories: params.categories,
|
|
88
|
-
hasUserStories: !!params.userStories
|
|
89
|
-
});
|
|
61
|
+
const contextFile = params.contextFile ?? DEFAULT_CONTEXT_FILE;
|
|
62
|
+
const testsFile = params.testsFile ?? DEFAULT_TESTS_FILE;
|
|
90
63
|
try {
|
|
91
|
-
//
|
|
92
|
-
const
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
// Generate tests based on categories
|
|
96
|
-
const categories = params.categories || ['happy-path', 'edge-case', 'error-case'];
|
|
97
|
-
let allTests = [];
|
|
98
|
-
// Always use AI - fallbacks handle errors gracefully
|
|
99
|
-
const effectiveAiLevel = 'smart';
|
|
100
|
-
this.log.info('AI mode', {
|
|
101
|
-
aiLevel: effectiveAiLevel
|
|
102
|
-
});
|
|
103
|
-
const generatorOptions = {
|
|
104
|
-
seed: params.seed,
|
|
105
|
-
aiLevel: effectiveAiLevel,
|
|
106
|
-
testData: params.testData
|
|
107
|
-
};
|
|
108
|
-
if (categories.includes('happy-path')) {
|
|
109
|
-
const happyTests = await generateHappyPathTests(endpoints, generatorOptions);
|
|
110
|
-
allTests.push(...happyTests);
|
|
111
|
-
this.log.info('Happy path tests generated', { count: happyTests.length });
|
|
112
|
-
}
|
|
113
|
-
if (categories.includes('edge-case')) {
|
|
114
|
-
const edgeTests = generateEdgeCaseTests(endpoints, generatorOptions);
|
|
115
|
-
allTests.push(...edgeTests);
|
|
116
|
-
this.log.info('Edge case tests generated', { count: edgeTests.length });
|
|
64
|
+
// 1. Read QA context
|
|
65
|
+
const contextExists = await this.fileService.fileExists(contextFile);
|
|
66
|
+
if (!contextExists) {
|
|
67
|
+
return this.formatError(new Error(`qa-context.json not found at "${contextFile}". Run analyze-api first to generate it.`));
|
|
117
68
|
}
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
69
|
+
const contextRaw = await this.fileService.readFile(contextFile);
|
|
70
|
+
const qaContext = JSON.parse(contextRaw);
|
|
71
|
+
this.log.info('QA context loaded', {
|
|
72
|
+
endpoints: qaContext.endpoints.length,
|
|
73
|
+
contextFile
|
|
74
|
+
});
|
|
75
|
+
// 2. Generate coverage tests for every endpoint
|
|
76
|
+
let allTests = [];
|
|
77
|
+
for (const endpointCtx of qaContext.endpoints) {
|
|
78
|
+
const tests = generateCoverageForEndpoint(endpointCtx, {
|
|
79
|
+
testData: params.testData,
|
|
80
|
+
});
|
|
81
|
+
allTests.push(...tests);
|
|
122
82
|
}
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
83
|
+
this.log.info('Coverage tests generated', { count: allTests.length });
|
|
84
|
+
// 3. Optionally enrich with spec metadata (auth headers, contentType, etc.)
|
|
85
|
+
if (params.specPath || params.baseUrl) {
|
|
86
|
+
try {
|
|
87
|
+
const spec = await this.specService.parseOrDiscoverSpec(params.specPath, params.baseUrl);
|
|
88
|
+
const endpoints = await this.specService.extractEndpoints(spec);
|
|
89
|
+
allTests = enrichTestsWithMetadata(allTests, endpoints);
|
|
90
|
+
this.log.info('Tests enriched with spec metadata');
|
|
91
|
+
}
|
|
92
|
+
catch {
|
|
93
|
+
this.log.warn('Could not enrich with spec metadata — using coverage data only');
|
|
126
94
|
}
|
|
127
|
-
// Business rules always use AI
|
|
128
|
-
// If LLM is not available, it will fail gracefully with a clear error
|
|
129
|
-
const { generateFromUserStories } = await import('../../generators/business-rule-from-stories-generator.js');
|
|
130
|
-
const businessTests = await generateFromUserStories(params.userStories, endpoints, { aiLevel: effectiveAiLevel });
|
|
131
|
-
allTests.push(...businessTests);
|
|
132
|
-
this.log.info('Business rule tests generated', { count: businessTests.length });
|
|
133
95
|
}
|
|
134
|
-
//
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
const aiAnalysis = await this.analyzeTestGaps(endpoints, allTests, effectiveAiLevel);
|
|
138
|
-
this.log.info('AI analysis complete', {
|
|
139
|
-
missingHeaders: aiAnalysis.missingHeaders?.length || 0,
|
|
140
|
-
missingHappyPaths: aiAnalysis.missingHappyPaths?.length || 0,
|
|
141
|
-
missingEdgeCases: aiAnalysis.missingEdgeCases?.length || 0,
|
|
142
|
-
warnings: aiAnalysis.warnings.length
|
|
143
|
-
});
|
|
144
|
-
// Apply AI suggestions
|
|
145
|
-
const result = this.applyAISuggestions(allTests, endpoints, aiAnalysis);
|
|
146
|
-
allTests = result.tests;
|
|
147
|
-
const aiEnhancements = result.aiEnhancements;
|
|
148
|
-
this.log.info('AI enhancements applied', aiEnhancements);
|
|
149
|
-
this.log.info('Test generation complete', {
|
|
150
|
-
total: allTests.length,
|
|
151
|
-
byCategory: categories.reduce((acc, cat) => {
|
|
152
|
-
acc[cat] = allTests.filter(t => t.category === cat).length;
|
|
153
|
-
return acc;
|
|
154
|
-
}, {})
|
|
155
|
-
});
|
|
96
|
+
// 4. Save to file
|
|
97
|
+
await this.fileService.saveFile(testsFile, JSON.stringify(allTests, null, 2));
|
|
98
|
+
this.log.info('Tests saved', { path: testsFile, count: allTests.length });
|
|
156
99
|
return this.formatResponse({
|
|
157
100
|
success: true,
|
|
101
|
+
testsFile,
|
|
158
102
|
tests: allTests,
|
|
159
103
|
summary: {
|
|
160
104
|
total: allTests.length,
|
|
161
|
-
byCategory:
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
byOrigin: {
|
|
166
|
-
heuristic: allTests.filter(t => t.origin === 'heuristic').length,
|
|
167
|
-
ai: allTests.filter(t => t.origin === 'ai').length
|
|
105
|
+
byCategory: {
|
|
106
|
+
'happy-path': allTests.filter(t => t.category === 'happy-path').length,
|
|
107
|
+
'edge-case': allTests.filter(t => t.category === 'edge-case').length,
|
|
108
|
+
'error-case': allTests.filter(t => t.category === 'error-case').length,
|
|
168
109
|
},
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
aiEnhancements: aiEnhancements.totalEnhanced > 0 ? aiEnhancements : undefined,
|
|
173
|
-
// Warnings (only if there are any)
|
|
174
|
-
warnings: aiAnalysis.warnings.length > 0 ? {
|
|
175
|
-
items: aiAnalysis.warnings,
|
|
176
|
-
summary: {
|
|
177
|
-
total: aiAnalysis.warnings.length,
|
|
178
|
-
byLevel: {
|
|
179
|
-
critical: aiAnalysis.warnings.filter(w => w.level === 'critical').length,
|
|
180
|
-
error: aiAnalysis.warnings.filter(w => w.level === 'error').length,
|
|
181
|
-
warning: aiAnalysis.warnings.filter(w => w.level === 'warning').length,
|
|
182
|
-
info: aiAnalysis.warnings.filter(w => w.level === 'info').length
|
|
183
|
-
}
|
|
184
|
-
}
|
|
185
|
-
} : undefined
|
|
110
|
+
highConfidence: allTests.filter(t => t.confidence === 'high').length,
|
|
111
|
+
needsReview: allTests.filter(t => t.confidence === 'low').length,
|
|
112
|
+
}
|
|
186
113
|
});
|
|
187
114
|
}
|
|
188
115
|
catch (error) {
|
|
189
116
|
return this.formatError(error);
|
|
190
117
|
}
|
|
191
118
|
}
|
|
192
|
-
/**
|
|
193
|
-
* Analyzes generated tests for gaps using AI
|
|
194
|
-
*
|
|
195
|
-
* @param endpoints - Parsed endpoints
|
|
196
|
-
* @param generatedTests - Tests that were generated
|
|
197
|
-
* @param effectiveAiLevel - AI level being used
|
|
198
|
-
* @returns Analysis result with identified gaps and warnings
|
|
199
|
-
*/
|
|
200
|
-
async analyzeTestGaps(endpoints, generatedTests, effectiveAiLevel) {
|
|
201
|
-
if (effectiveAiLevel === 'off') {
|
|
202
|
-
return { gaps: [], warnings: [] };
|
|
203
|
-
}
|
|
204
|
-
const { callLLM } = await import('../../llm/ai-client.js');
|
|
205
|
-
const CHUNK_SIZE = 10;
|
|
206
|
-
// Preparar resumen compacto de un chunk de endpoints
|
|
207
|
-
const buildChunkSummary = (chunkEndpoints) => {
|
|
208
|
-
const endpointsSummary = chunkEndpoints.map(e => {
|
|
209
|
-
const headerDetails = e.headerParams.map(h => {
|
|
210
|
-
const schema = h.schema && !('$ref' in h.schema) ? h.schema : undefined;
|
|
211
|
-
return {
|
|
212
|
-
name: h.name,
|
|
213
|
-
required: !!h.required,
|
|
214
|
-
...(schema?.type && { type: schema.type }),
|
|
215
|
-
...(schema?.enum && { enum: schema.enum }),
|
|
216
|
-
...(schema?.pattern && { pattern: schema.pattern }),
|
|
217
|
-
...(schema?.format && { format: schema.format }),
|
|
218
|
-
};
|
|
219
|
-
});
|
|
220
|
-
return {
|
|
221
|
-
method: e.method,
|
|
222
|
-
path: e.path,
|
|
223
|
-
summary: e.operation?.summary,
|
|
224
|
-
hasRequestBody: !!e.requestBody,
|
|
225
|
-
contentType: e.requestContentType,
|
|
226
|
-
hasPathParams: e.pathParams.length > 0,
|
|
227
|
-
headerParams: headerDetails.length > 0 ? headerDetails : undefined,
|
|
228
|
-
securitySchemes: e.securitySchemes?.map(s => s.type),
|
|
229
|
-
responseCodes: Object.keys(e.responses)
|
|
230
|
-
};
|
|
231
|
-
});
|
|
232
|
-
// Solo tests de estos endpoints
|
|
233
|
-
const chunkPaths = new Set(chunkEndpoints.map(e => `${e.method} ${e.path}`));
|
|
234
|
-
const chunkTests = generatedTests
|
|
235
|
-
.filter(t => chunkPaths.has(`${t.method} ${t.path}`))
|
|
236
|
-
.map(t => ({
|
|
237
|
-
id: t.id,
|
|
238
|
-
category: t.category,
|
|
239
|
-
method: t.method,
|
|
240
|
-
path: t.path,
|
|
241
|
-
hasHeaders: !!t.headers && Object.keys(t.headers).length > 0,
|
|
242
|
-
expectedStatus: t.expectedStatus
|
|
243
|
-
}));
|
|
244
|
-
return { endpointsSummary, chunkTests };
|
|
245
|
-
};
|
|
246
|
-
// Analizar un chunk de endpoints
|
|
247
|
-
const analyzeChunk = async (chunkEndpoints, chunkIndex) => {
|
|
248
|
-
const { endpointsSummary, chunkTests } = buildChunkSummary(chunkEndpoints);
|
|
249
|
-
const prompt = `Analiza endpoints y tests. Identifica gaps de forma agnóstica.
|
|
250
|
-
|
|
251
|
-
ENDPOINTS:${JSON.stringify(endpointsSummary)}
|
|
252
|
-
|
|
253
|
-
TESTS:${JSON.stringify(chunkTests)}
|
|
254
|
-
|
|
255
|
-
Retorna SOLO JSON con endpoints REALES del spec:
|
|
256
|
-
{"missingHeaders":[{"endpoints":["METHOD /path"],"header":"name","reason":"why"}],"missingHappyPaths":[{"endpoint":"METHOD /path","reason":"why","dependencies":[],"suggestion":"how"}],"missingEdgeCases":[{"endpoint":"METHOD /path","scenario":"desc","expectedStatus":400}],"missingHeaderValidationTests":[{"endpoint":"METHOD /path","header":"name","scenario":"desc","expectedStatus":400,"reason":"why","testType":"missing|invalid","invalidValue":"optional"}],"warnings":[{"level":"warning","category":"coverage","message":"msg","suggestion":"fix"}]}
|
|
257
|
-
|
|
258
|
-
REGLAS:
|
|
259
|
-
- Agnóstico: sin asumir dominio
|
|
260
|
-
- headerParams del spec → generar tests missing (sin header) e invalid (valor incorrecto)
|
|
261
|
-
- Content-Type missing/invalid → 415, otros headers → 400
|
|
262
|
-
- Detectar happy paths y edge cases faltantes
|
|
263
|
-
- Si no hay gaps, arrays vacíos`;
|
|
264
|
-
try {
|
|
265
|
-
const result = await callLLM(prompt, { maxTokens: 8192, temperature: 0.2 });
|
|
266
|
-
if (!result.success || !result.text) {
|
|
267
|
-
return { gaps: [], warnings: [] };
|
|
268
|
-
}
|
|
269
|
-
const jsonMatch = result.text.match(/\{[\s\S]*\}/);
|
|
270
|
-
if (!jsonMatch) {
|
|
271
|
-
return { gaps: [], warnings: [] };
|
|
272
|
-
}
|
|
273
|
-
const parsed = JSON.parse(jsonMatch[0]);
|
|
274
|
-
return {
|
|
275
|
-
missingHeaders: parsed.missingHeaders || [],
|
|
276
|
-
missingHappyPaths: parsed.missingHappyPaths || [],
|
|
277
|
-
missingEdgeCases: parsed.missingEdgeCases || [],
|
|
278
|
-
missingHeaderValidationTests: parsed.missingHeaderValidationTests || [],
|
|
279
|
-
warnings: parsed.warnings || []
|
|
280
|
-
};
|
|
281
|
-
}
|
|
282
|
-
catch (error) {
|
|
283
|
-
this.log.warn(`AI analysis chunk ${chunkIndex} failed`, { error });
|
|
284
|
-
return { gaps: [], warnings: [] };
|
|
285
|
-
}
|
|
286
|
-
};
|
|
287
|
-
// Dividir endpoints en chunks
|
|
288
|
-
const chunks = [];
|
|
289
|
-
for (let i = 0; i < endpoints.length; i += CHUNK_SIZE) {
|
|
290
|
-
chunks.push(endpoints.slice(i, i + CHUNK_SIZE));
|
|
291
|
-
}
|
|
292
|
-
this.log.info('AI analysis starting', {
|
|
293
|
-
totalEndpoints: endpoints.length,
|
|
294
|
-
chunks: chunks.length,
|
|
295
|
-
chunkSize: CHUNK_SIZE
|
|
296
|
-
});
|
|
297
|
-
// Ejecutar chunks (1 solo = directo, múltiples = paralelo)
|
|
298
|
-
const chunkResults = chunks.length === 1
|
|
299
|
-
? [await analyzeChunk(chunks[0], 0)]
|
|
300
|
-
: await Promise.all(chunks.map((chunk, i) => analyzeChunk(chunk, i)));
|
|
301
|
-
// Merge resultados de todos los chunks
|
|
302
|
-
const merged = {
|
|
303
|
-
missingHeaders: [],
|
|
304
|
-
missingHappyPaths: [],
|
|
305
|
-
missingEdgeCases: [],
|
|
306
|
-
missingHeaderValidationTests: [],
|
|
307
|
-
warnings: []
|
|
308
|
-
};
|
|
309
|
-
for (const result of chunkResults) {
|
|
310
|
-
if (result.missingHeaders)
|
|
311
|
-
merged.missingHeaders.push(...result.missingHeaders);
|
|
312
|
-
if (result.missingHappyPaths)
|
|
313
|
-
merged.missingHappyPaths.push(...result.missingHappyPaths);
|
|
314
|
-
if (result.missingEdgeCases)
|
|
315
|
-
merged.missingEdgeCases.push(...result.missingEdgeCases);
|
|
316
|
-
if (result.missingHeaderValidationTests)
|
|
317
|
-
merged.missingHeaderValidationTests.push(...result.missingHeaderValidationTests);
|
|
318
|
-
if (result.warnings)
|
|
319
|
-
merged.warnings.push(...result.warnings);
|
|
320
|
-
}
|
|
321
|
-
this.log.info('AI analysis complete', {
|
|
322
|
-
chunks: chunks.length,
|
|
323
|
-
missingHeaders: merged.missingHeaders.length,
|
|
324
|
-
missingHappyPaths: merged.missingHappyPaths.length,
|
|
325
|
-
missingEdgeCases: merged.missingEdgeCases.length,
|
|
326
|
-
missingHeaderValidationTests: merged.missingHeaderValidationTests.length,
|
|
327
|
-
warnings: merged.warnings.length
|
|
328
|
-
});
|
|
329
|
-
return merged;
|
|
330
|
-
}
|
|
331
|
-
/**
|
|
332
|
-
* Applies AI suggestions to enhance generated tests
|
|
333
|
-
*
|
|
334
|
-
* @param tests - Current test array
|
|
335
|
-
* @param endpoints - Parsed endpoints
|
|
336
|
-
* @param analysis - AI analysis results
|
|
337
|
-
* @returns Enhanced tests and summary
|
|
338
|
-
*/
|
|
339
|
-
applyAISuggestions(tests, endpoints, analysis) {
|
|
340
|
-
let headersAdded = 0;
|
|
341
|
-
let happyPathsAdded = 0;
|
|
342
|
-
let edgeCasesAdded = 0;
|
|
343
|
-
let headerValidationTestsAdded = 0;
|
|
344
|
-
// 1. Agregar headers faltantes a tests existentes
|
|
345
|
-
if (analysis.missingHeaders) {
|
|
346
|
-
for (const headerGap of analysis.missingHeaders) {
|
|
347
|
-
for (const endpointPath of headerGap.endpoints) {
|
|
348
|
-
// Encontrar tests para este endpoint
|
|
349
|
-
const matchingTests = tests.filter(t => `${t.method} ${t.path}` === endpointPath);
|
|
350
|
-
for (const test of matchingTests) {
|
|
351
|
-
if (!test.headers)
|
|
352
|
-
test.headers = {};
|
|
353
|
-
// Agregar header si no existe
|
|
354
|
-
if (!test.headers[headerGap.header]) {
|
|
355
|
-
test.headers[headerGap.header] =
|
|
356
|
-
headerGap.header === 'Authorization' ? 'Bearer {{TOKEN}}' :
|
|
357
|
-
headerGap.header === 'Content-Type' ? 'application/json' :
|
|
358
|
-
'{{HEADER_VALUE}}';
|
|
359
|
-
// Marcar en metadata
|
|
360
|
-
if (!test.metadata)
|
|
361
|
-
test.metadata = {};
|
|
362
|
-
if (!test.metadata.aiEnhanced)
|
|
363
|
-
test.metadata.aiEnhanced = [];
|
|
364
|
-
test.metadata.aiEnhanced.push({
|
|
365
|
-
type: 'header',
|
|
366
|
-
field: headerGap.header,
|
|
367
|
-
reason: headerGap.reason
|
|
368
|
-
});
|
|
369
|
-
headersAdded++;
|
|
370
|
-
}
|
|
371
|
-
}
|
|
372
|
-
}
|
|
373
|
-
}
|
|
374
|
-
}
|
|
375
|
-
// 2. Generar happy paths faltantes
|
|
376
|
-
if (analysis.missingHappyPaths) {
|
|
377
|
-
for (const happyGap of analysis.missingHappyPaths) {
|
|
378
|
-
// Buscar endpoint
|
|
379
|
-
const endpoint = endpoints.find(e => `${e.method} ${e.path}` === happyGap.endpoint);
|
|
380
|
-
if (!endpoint)
|
|
381
|
-
continue;
|
|
382
|
-
// Verificar que no exista ya un happy path
|
|
383
|
-
const hasHappyPath = tests.some(t => t.method === endpoint.method &&
|
|
384
|
-
t.path === endpoint.path &&
|
|
385
|
-
t.category === 'happy-path');
|
|
386
|
-
if (!hasHappyPath) {
|
|
387
|
-
// Generar happy path básico
|
|
388
|
-
const newTest = {
|
|
389
|
-
id: `ai-happy-${endpoint.method.toLowerCase()}-${endpoint.path.replace(/[^a-z0-9]/g, '-')}`,
|
|
390
|
-
name: `${endpoint.method} ${endpoint.path} - Happy Path (AI-suggested)`,
|
|
391
|
-
description: happyGap.suggestion,
|
|
392
|
-
category: 'happy-path',
|
|
393
|
-
method: endpoint.method,
|
|
394
|
-
path: endpoint.path,
|
|
395
|
-
pathParams: generatePathParamsPlaceholder(endpoint),
|
|
396
|
-
headers: generateAuthHeaders(endpoint.securitySchemes || []),
|
|
397
|
-
body: endpoint.requestBody ? {} : undefined, // Placeholder
|
|
398
|
-
contentType: endpoint.requestContentType,
|
|
399
|
-
expectedStatus: 200,
|
|
400
|
-
expectedSchema: endpoint.responses[200],
|
|
401
|
-
validateSchema: true,
|
|
402
|
-
requiresAuth: endpoint.requiresAuth,
|
|
403
|
-
origin: 'ai',
|
|
404
|
-
confidence: 'low',
|
|
405
|
-
metadata: {
|
|
406
|
-
aiGenerated: true,
|
|
407
|
-
dependencies: happyGap.dependencies,
|
|
408
|
-
reason: happyGap.reason
|
|
409
|
-
}
|
|
410
|
-
};
|
|
411
|
-
tests.push(newTest);
|
|
412
|
-
happyPathsAdded++;
|
|
413
|
-
}
|
|
414
|
-
}
|
|
415
|
-
}
|
|
416
|
-
// 3. Generar edge cases faltantes
|
|
417
|
-
if (analysis.missingEdgeCases) {
|
|
418
|
-
for (const edgeGap of analysis.missingEdgeCases) {
|
|
419
|
-
const endpoint = endpoints.find(e => `${e.method} ${e.path}` === edgeGap.endpoint);
|
|
420
|
-
if (!endpoint)
|
|
421
|
-
continue;
|
|
422
|
-
const newTest = {
|
|
423
|
-
id: `ai-edge-${endpoint.method.toLowerCase()}-${endpoint.path.replace(/[^a-z0-9]/g, '-')}-${edgeGap.scenario.replace(/\s+/g, '-')}`,
|
|
424
|
-
name: `${endpoint.method} ${endpoint.path} - ${edgeGap.scenario}`,
|
|
425
|
-
description: `AI-suggested edge case: ${edgeGap.scenario}`,
|
|
426
|
-
category: 'edge-case',
|
|
427
|
-
method: endpoint.method,
|
|
428
|
-
path: endpoint.path,
|
|
429
|
-
pathParams: {}, // Placeholder para invalid values
|
|
430
|
-
headers: generateAuthHeaders(endpoint.securitySchemes || []),
|
|
431
|
-
expectedStatus: edgeGap.expectedStatus,
|
|
432
|
-
validateSchema: false,
|
|
433
|
-
requiresAuth: endpoint.requiresAuth,
|
|
434
|
-
origin: 'ai',
|
|
435
|
-
confidence: 'low',
|
|
436
|
-
metadata: {
|
|
437
|
-
aiGenerated: true,
|
|
438
|
-
scenario: edgeGap.scenario
|
|
439
|
-
}
|
|
440
|
-
};
|
|
441
|
-
tests.push(newTest);
|
|
442
|
-
edgeCasesAdded++;
|
|
443
|
-
}
|
|
444
|
-
}
|
|
445
|
-
// 4. Generar header validation tests (error cases para headers)
|
|
446
|
-
if (analysis.missingHeaderValidationTests) {
|
|
447
|
-
for (const headerTest of analysis.missingHeaderValidationTests) {
|
|
448
|
-
const endpoint = endpoints.find(e => `${e.method} ${e.path}` === headerTest.endpoint);
|
|
449
|
-
if (!endpoint)
|
|
450
|
-
continue;
|
|
451
|
-
// Determinar headers según el tipo de test
|
|
452
|
-
const headers = {};
|
|
453
|
-
// Agregar auth headers si el endpoint lo requiere (excepto si estamos testeando auth)
|
|
454
|
-
if (endpoint.requiresAuth && headerTest.header !== 'Authorization') {
|
|
455
|
-
Object.assign(headers, generateAuthHeaders(endpoint.securitySchemes || []));
|
|
456
|
-
}
|
|
457
|
-
// Si es test de "invalid", usar el valor inválido; si es "missing", omitir el header
|
|
458
|
-
if (headerTest.testType === 'invalid' && headerTest.invalidValue) {
|
|
459
|
-
headers[headerTest.header] = headerTest.invalidValue;
|
|
460
|
-
}
|
|
461
|
-
// Si es "missing", no agregar el header (headers ya está sin él)
|
|
462
|
-
const newTest = {
|
|
463
|
-
id: `ai-header-${headerTest.testType}-${endpoint.method.toLowerCase()}-${endpoint.path.replace(/[^a-z0-9]/g, '-')}-${headerTest.header.toLowerCase().replace(/[^a-z0-9]/g, '-')}`,
|
|
464
|
-
name: `${endpoint.method} ${endpoint.path} - ${headerTest.scenario}`,
|
|
465
|
-
description: `AI-suggested header validation: ${headerTest.reason}`,
|
|
466
|
-
category: 'error-case',
|
|
467
|
-
method: endpoint.method,
|
|
468
|
-
path: endpoint.path,
|
|
469
|
-
pathParams: generatePathParamsPlaceholder(endpoint),
|
|
470
|
-
headers,
|
|
471
|
-
body: endpoint.requestBody ? {} : undefined, // Placeholder body si se requiere
|
|
472
|
-
contentType: headerTest.header === 'Content-Type' ? undefined : endpoint.requestContentType,
|
|
473
|
-
expectedStatus: headerTest.expectedStatus,
|
|
474
|
-
validateSchema: false,
|
|
475
|
-
requiresAuth: endpoint.requiresAuth,
|
|
476
|
-
origin: 'ai',
|
|
477
|
-
confidence: 'medium',
|
|
478
|
-
metadata: {
|
|
479
|
-
aiGenerated: true,
|
|
480
|
-
headerValidation: {
|
|
481
|
-
header: headerTest.header,
|
|
482
|
-
testType: headerTest.testType,
|
|
483
|
-
reason: headerTest.reason
|
|
484
|
-
}
|
|
485
|
-
}
|
|
486
|
-
};
|
|
487
|
-
tests.push(newTest);
|
|
488
|
-
headerValidationTestsAdded++;
|
|
489
|
-
}
|
|
490
|
-
}
|
|
491
|
-
return {
|
|
492
|
-
tests,
|
|
493
|
-
aiEnhancements: {
|
|
494
|
-
headersAdded,
|
|
495
|
-
happyPathsAdded,
|
|
496
|
-
edgeCasesAdded,
|
|
497
|
-
headerValidationTestsAdded,
|
|
498
|
-
totalEnhanced: headersAdded + happyPathsAdded + edgeCasesAdded + headerValidationTestsAdded
|
|
499
|
-
}
|
|
500
|
-
};
|
|
501
|
-
}
|
|
502
|
-
}
|
|
503
|
-
/**
|
|
504
|
-
* Helper: generar path params placeholder
|
|
505
|
-
*/
|
|
506
|
-
function generatePathParamsPlaceholder(endpoint) {
|
|
507
|
-
const params = {};
|
|
508
|
-
for (const param of endpoint.pathParams) {
|
|
509
|
-
if (param.schema && !('$ref' in param.schema)) {
|
|
510
|
-
const schema = param.schema;
|
|
511
|
-
params[param.name] =
|
|
512
|
-
schema.type === 'integer' ? 1 :
|
|
513
|
-
schema.format === 'uuid' ? '{{UUID_FROM_PREVIOUS_STEP}}' :
|
|
514
|
-
'{{VALUE_FROM_PREVIOUS_STEP}}';
|
|
515
|
-
}
|
|
516
|
-
}
|
|
517
|
-
return params;
|
|
518
119
|
}
|
|
519
120
|
//# sourceMappingURL=generate-tests.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generate-tests.js","sourceRoot":"","sources":["../../../src/mcp/handlers/generate-tests.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"generate-tests.js","sourceRoot":"","sources":["../../../src/mcp/handlers/generate-tests.ts"],"names":[],"mappings":"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"}
|