@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.
Files changed (75) hide show
  1. package/dist/ai-engine/index.d.ts +1 -6
  2. package/dist/ai-engine/index.d.ts.map +1 -1
  3. package/dist/ai-engine/index.js +1 -6
  4. package/dist/ai-engine/index.js.map +1 -1
  5. package/dist/executor/response-handler.d.ts +15 -0
  6. package/dist/executor/response-handler.d.ts.map +1 -1
  7. package/dist/executor/response-handler.js +53 -0
  8. package/dist/executor/response-handler.js.map +1 -1
  9. package/dist/executor/test-executor.d.ts +14 -0
  10. package/dist/executor/test-executor.d.ts.map +1 -1
  11. package/dist/executor/test-executor.js +90 -2
  12. package/dist/executor/test-executor.js.map +1 -1
  13. package/dist/generators/ai-endpoint-test-generator.d.ts +21 -0
  14. package/dist/generators/ai-endpoint-test-generator.d.ts.map +1 -0
  15. package/dist/generators/ai-endpoint-test-generator.js +178 -0
  16. package/dist/generators/ai-endpoint-test-generator.js.map +1 -0
  17. package/dist/generators/data/type-strategies.d.ts +7 -2
  18. package/dist/generators/data/type-strategies.d.ts.map +1 -1
  19. package/dist/generators/data/type-strategies.js +88 -4
  20. package/dist/generators/data/type-strategies.js.map +1 -1
  21. package/dist/generators/edge-case-generator.d.ts +1 -1
  22. package/dist/generators/edge-case-generator.d.ts.map +1 -1
  23. package/dist/generators/edge-case-generator.js +160 -38
  24. package/dist/generators/edge-case-generator.js.map +1 -1
  25. package/dist/generators/edge-cases/boundary-analyzer.d.ts.map +1 -1
  26. package/dist/generators/edge-cases/boundary-analyzer.js +56 -11
  27. package/dist/generators/edge-cases/boundary-analyzer.js.map +1 -1
  28. package/dist/generators/errors/validation-error-strategy.js +8 -8
  29. package/dist/generators/errors/validation-error-strategy.js.map +1 -1
  30. package/dist/generators/happy-path-generator.d.ts.map +1 -1
  31. package/dist/generators/happy-path-generator.js +74 -7
  32. package/dist/generators/happy-path-generator.js.map +1 -1
  33. package/dist/generators/input-coverage-engine.d.ts +7 -0
  34. package/dist/generators/input-coverage-engine.d.ts.map +1 -0
  35. package/dist/generators/input-coverage-engine.js +304 -0
  36. package/dist/generators/input-coverage-engine.js.map +1 -0
  37. package/dist/mcp/handlers/analyze-api.d.ts +52 -0
  38. package/dist/mcp/handlers/analyze-api.d.ts.map +1 -0
  39. package/dist/mcp/handlers/analyze-api.js +272 -0
  40. package/dist/mcp/handlers/analyze-api.js.map +1 -0
  41. package/dist/mcp/handlers/export-to-postman.d.ts +4 -0
  42. package/dist/mcp/handlers/export-to-postman.d.ts.map +1 -1
  43. package/dist/mcp/handlers/export-to-postman.js +23 -6
  44. package/dist/mcp/handlers/export-to-postman.js.map +1 -1
  45. package/dist/mcp/handlers/generate-tests.d.ts +12 -37
  46. package/dist/mcp/handlers/generate-tests.d.ts.map +1 -1
  47. package/dist/mcp/handlers/generate-tests.js +69 -468
  48. package/dist/mcp/handlers/generate-tests.js.map +1 -1
  49. package/dist/mcp/handlers/index.d.ts +1 -0
  50. package/dist/mcp/handlers/index.d.ts.map +1 -1
  51. package/dist/mcp/handlers/index.js +1 -0
  52. package/dist/mcp/handlers/index.js.map +1 -1
  53. package/dist/mcp/handlers/run-tests.d.ts +7 -1
  54. package/dist/mcp/handlers/run-tests.d.ts.map +1 -1
  55. package/dist/mcp/handlers/run-tests.js +24 -7
  56. package/dist/mcp/handlers/run-tests.js.map +1 -1
  57. package/dist/mcp/server.d.ts +7 -6
  58. package/dist/mcp/server.d.ts.map +1 -1
  59. package/dist/mcp/server.js +16 -13
  60. package/dist/mcp/server.js.map +1 -1
  61. package/dist/types/index.d.ts +1 -0
  62. package/dist/types/index.d.ts.map +1 -1
  63. package/dist/types/index.js +2 -1
  64. package/dist/types/index.js.map +1 -1
  65. package/dist/types/qa-context.d.ts +39 -0
  66. package/dist/types/qa-context.d.ts.map +1 -0
  67. package/dist/types/qa-context.js +2 -0
  68. package/dist/types/qa-context.js.map +1 -0
  69. package/dist/types/test-case.d.ts +5 -0
  70. package/dist/types/test-case.d.ts.map +1 -1
  71. package/dist/utils/coverage-calculator.d.ts +24 -0
  72. package/dist/utils/coverage-calculator.d.ts.map +1 -1
  73. package/dist/utils/coverage-calculator.js +32 -0
  74. package/dist/utils/coverage-calculator.js.map +1 -1
  75. package/package.json +1 -1
@@ -1,519 +1,120 @@
1
1
  /**
2
2
  * Generate Tests Handler
3
3
  *
4
- * Handles the generate-tests tool which creates intelligent test suites from OpenAPI specs.
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 { generateHappyPathTests } from '../../generators/happy-path-generator.js';
10
- import { generateEdgeCaseTests } from '../../generators/edge-case-generator.js';
11
- import { generateErrorCaseTests } from '../../generators/error-case-generator.js';
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
- import { generateAuthHeaders } from '../../utils/auth-generator.js';
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 1 of 3 — Generate a test suite from an OpenAPI specification. ' +
21
- 'Reads the spec (YAML or JSON) and produces test cases for every endpoint: ' +
22
- 'happy-path (valid inputs, expect 2xx), edge-case (boundary values, empty arrays, nulls), ' +
23
- 'error-case (missing required fields, wrong types, expect 4xx/5xx). ' +
24
- 'Returns a "tests" array; pass that array directly to run-tests to execute them. ' +
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
- specPath: {
29
+ contextFile: {
32
30
  type: 'string',
33
- description: 'Absolute or relative path to the OpenAPI spec file (YAML or JSON). ' +
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
- baseUrl: {
33
+ specPath: {
38
34
  type: 'string',
39
- description: 'Base URL of the API (e.g., "https://api.example.com"). ' +
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
- userStories: {
37
+ baseUrl: {
57
38
  type: 'string',
58
- description: 'Plain-text user stories or acceptance criteria (e.g., "As a user I can log in with email and password"). ' +
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: 'Domain-specific values to inject into generated tests instead of synthetic placeholders. ' +
70
- 'Works for ANY API just provide the fields your API uses. ' +
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
- this.log.info('Generating tests', {
85
- specPath: params.specPath,
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
- // Parse or discover spec
92
- const spec = await this.specService.parseOrDiscoverSpec(params.specPath, params.baseUrl);
93
- const endpoints = await this.specService.extractEndpoints(spec);
94
- this.log.info('Endpoints extracted', { count: endpoints.length });
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
- if (categories.includes('error-case')) {
119
- const errorTests = generateErrorCaseTests(endpoints, generatorOptions);
120
- allTests.push(...errorTests);
121
- this.log.info('Error case tests generated', { count: errorTests.length });
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
- if (categories.includes('business-rule')) {
124
- if (!params.userStories) {
125
- throw new Error('userStories parameter is required when categories includes "business-rule"');
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
- // Enrich tests with metadata
135
- allTests = enrichTestsWithMetadata(allTests, endpoints);
136
- // AI post-generation analysis (always enabled)
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: categories.reduce((acc, cat) => {
162
- acc[cat] = allTests.filter(t => t.category === cat).length;
163
- return acc;
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
- testsNeedingReview: allTests.filter(t => t.confidence === 'low').length
170
- },
171
- // AI enhancements (only if there were any)
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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"}
@@ -3,6 +3,7 @@
3
3
  *
4
4
  * @module mcp/handlers
5
5
  */
6
+ export { AnalyzeApiHandler } from './analyze-api.js';
6
7
  export { GenerateTestsHandler } from './generate-tests.js';
7
8
  export { RunTestsHandler } from './run-tests.js';
8
9
  export { ExportResultsHandler } from './export-results.js';