atlas-pipeline-mcp 1.0.21 → 1.0.22
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/tools/advanced-testgen.d.ts +93 -0
- package/dist/tools/advanced-testgen.d.ts.map +1 -0
- package/dist/tools/advanced-testgen.js +382 -0
- package/dist/tools/advanced-testgen.js.map +1 -0
- package/dist/tools/architecture-advisor.d.ts +174 -0
- package/dist/tools/architecture-advisor.d.ts.map +1 -0
- package/dist/tools/architecture-advisor.js +509 -0
- package/dist/tools/architecture-advisor.js.map +1 -0
- package/dist/tools/code-migration.d.ts +86 -0
- package/dist/tools/code-migration.d.ts.map +1 -0
- package/dist/tools/code-migration.js +339 -0
- package/dist/tools/code-migration.js.map +1 -0
- package/dist/tools/ml-predictor.d.ts +84 -0
- package/dist/tools/ml-predictor.d.ts.map +1 -0
- package/dist/tools/ml-predictor.js +407 -0
- package/dist/tools/ml-predictor.js.map +1 -0
- package/dist/tools/rag-search.d.ts +88 -0
- package/dist/tools/rag-search.d.ts.map +1 -0
- package/dist/tools/rag-search.js +338 -0
- package/dist/tools/rag-search.js.map +1 -0
- package/package.json +2 -2
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Atlas Server - AI-Powered Test Generation Engine
|
|
3
|
+
*
|
|
4
|
+
* Advanced test generation with AI/ML:
|
|
5
|
+
* - Unit test generation with edge cases
|
|
6
|
+
* - Integration test scaffolding
|
|
7
|
+
* - E2E test generation
|
|
8
|
+
* - Property-based testing
|
|
9
|
+
* - Mutation testing
|
|
10
|
+
* - Test data generation (realistic, edge cases, boundary values)
|
|
11
|
+
* - Mock/stub generation
|
|
12
|
+
* - Test coverage analysis & gap detection
|
|
13
|
+
* - Regression test selection
|
|
14
|
+
* - Visual regression tests
|
|
15
|
+
* - Performance test generation
|
|
16
|
+
* - Security test cases
|
|
17
|
+
*
|
|
18
|
+
* @module advanced-testgen
|
|
19
|
+
* @author Nishant Unavane
|
|
20
|
+
* @version 1.0.0
|
|
21
|
+
*/
|
|
22
|
+
export interface TestGenOptions {
|
|
23
|
+
projectPath: string;
|
|
24
|
+
sourceFile: string;
|
|
25
|
+
testTypes?: TestType[];
|
|
26
|
+
framework?: TestFramework;
|
|
27
|
+
coverageGoal?: number;
|
|
28
|
+
includeEdgeCases?: boolean;
|
|
29
|
+
includeMocks?: boolean;
|
|
30
|
+
includeIntegration?: boolean;
|
|
31
|
+
useAI?: boolean;
|
|
32
|
+
creativity?: number;
|
|
33
|
+
}
|
|
34
|
+
export type TestType = 'unit' | 'integration' | 'e2e' | 'property' | 'mutation' | 'performance' | 'security' | 'visual';
|
|
35
|
+
export type TestFramework = 'jest' | 'vitest' | 'mocha' | 'pytest' | 'junit' | 'cypress' | 'playwright';
|
|
36
|
+
export interface TestGenResult {
|
|
37
|
+
sourceFile: string;
|
|
38
|
+
testFile: string;
|
|
39
|
+
framework: TestFramework;
|
|
40
|
+
tests: GeneratedTest[];
|
|
41
|
+
mocks: GeneratedMock[];
|
|
42
|
+
fixtures: TestFixture[];
|
|
43
|
+
coverage: CoverageAnalysis;
|
|
44
|
+
recommendations: string[];
|
|
45
|
+
generationTimeMs: number;
|
|
46
|
+
}
|
|
47
|
+
export interface GeneratedTest {
|
|
48
|
+
name: string;
|
|
49
|
+
type: TestType;
|
|
50
|
+
description: string;
|
|
51
|
+
code: string;
|
|
52
|
+
targetFunction: string;
|
|
53
|
+
testCase: TestCase;
|
|
54
|
+
priority: 'critical' | 'high' | 'medium' | 'low';
|
|
55
|
+
confidence: number;
|
|
56
|
+
}
|
|
57
|
+
export interface TestCase {
|
|
58
|
+
scenario: string;
|
|
59
|
+
inputs: any[];
|
|
60
|
+
expectedOutput: any;
|
|
61
|
+
assertions: string[];
|
|
62
|
+
setup?: string;
|
|
63
|
+
teardown?: string;
|
|
64
|
+
}
|
|
65
|
+
export interface GeneratedMock {
|
|
66
|
+
name: string;
|
|
67
|
+
type: 'mock' | 'stub' | 'spy';
|
|
68
|
+
target: string;
|
|
69
|
+
code: string;
|
|
70
|
+
}
|
|
71
|
+
export interface TestFixture {
|
|
72
|
+
name: string;
|
|
73
|
+
data: any;
|
|
74
|
+
description: string;
|
|
75
|
+
}
|
|
76
|
+
export interface CoverageAnalysis {
|
|
77
|
+
currentCoverage: number;
|
|
78
|
+
projectedCoverage: number;
|
|
79
|
+
gaps: CoverageGap[];
|
|
80
|
+
recommendations: string[];
|
|
81
|
+
}
|
|
82
|
+
export interface CoverageGap {
|
|
83
|
+
location: string;
|
|
84
|
+
type: 'branch' | 'statement' | 'function';
|
|
85
|
+
reason: string;
|
|
86
|
+
suggestedTest: string;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Generate comprehensive tests for source file
|
|
90
|
+
*/
|
|
91
|
+
export declare function generateTests(options: TestGenOptions): Promise<TestGenResult>;
|
|
92
|
+
export default generateTests;
|
|
93
|
+
//# sourceMappingURL=advanced-testgen.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"advanced-testgen.d.ts","sourceRoot":"","sources":["../../src/tools/advanced-testgen.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAYH,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IAGnB,SAAS,CAAC,EAAE,QAAQ,EAAE,CAAC;IACvB,SAAS,CAAC,EAAE,aAAa,CAAC;IAC1B,YAAY,CAAC,EAAE,MAAM,CAAC;IAGtB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAG7B,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,MAAM,QAAQ,GAChB,MAAM,GACN,aAAa,GACb,KAAK,GACL,UAAU,GACV,UAAU,GACV,aAAa,GACb,UAAU,GACV,QAAQ,CAAC;AAEb,MAAM,MAAM,aAAa,GACrB,MAAM,GACN,QAAQ,GACR,OAAO,GACP,QAAQ,GACR,OAAO,GACP,SAAS,GACT,YAAY,CAAC;AAEjB,MAAM,WAAW,aAAa;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,aAAa,CAAC;IAEzB,KAAK,EAAE,aAAa,EAAE,CAAC;IACvB,KAAK,EAAE,aAAa,EAAE,CAAC;IACvB,QAAQ,EAAE,WAAW,EAAE,CAAC;IAExB,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,eAAe,EAAE,MAAM,EAAE,CAAC;IAE1B,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,QAAQ,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IAGb,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,QAAQ,CAAC;IAEnB,QAAQ,EAAE,UAAU,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;IACjD,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,QAAQ;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,GAAG,EAAE,CAAC;IACd,cAAc,EAAE,GAAG,CAAC;IACpB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,KAAK,CAAC;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,GAAG,CAAC;IACV,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,gBAAgB;IAC/B,eAAe,EAAE,MAAM,CAAC;IACxB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,IAAI,EAAE,WAAW,EAAE,CAAC;IACpB,eAAe,EAAE,MAAM,EAAE,CAAC;CAC3B;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,QAAQ,GAAG,WAAW,GAAG,UAAU,CAAC;IAC1C,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,MAAM,CAAC;CACvB;AA8RD;;GAEG;AACH,wBAAsB,aAAa,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC,CAwJnF;AAMD,eAAe,aAAa,CAAC"}
|
|
@@ -0,0 +1,382 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Atlas Server - AI-Powered Test Generation Engine
|
|
3
|
+
*
|
|
4
|
+
* Advanced test generation with AI/ML:
|
|
5
|
+
* - Unit test generation with edge cases
|
|
6
|
+
* - Integration test scaffolding
|
|
7
|
+
* - E2E test generation
|
|
8
|
+
* - Property-based testing
|
|
9
|
+
* - Mutation testing
|
|
10
|
+
* - Test data generation (realistic, edge cases, boundary values)
|
|
11
|
+
* - Mock/stub generation
|
|
12
|
+
* - Test coverage analysis & gap detection
|
|
13
|
+
* - Regression test selection
|
|
14
|
+
* - Visual regression tests
|
|
15
|
+
* - Performance test generation
|
|
16
|
+
* - Security test cases
|
|
17
|
+
*
|
|
18
|
+
* @module advanced-testgen
|
|
19
|
+
* @author Nishant Unavane
|
|
20
|
+
* @version 1.0.0
|
|
21
|
+
*/
|
|
22
|
+
import { promises as fs } from 'fs';
|
|
23
|
+
import { logger, createTimer } from '../utils.js';
|
|
24
|
+
import { z } from 'zod';
|
|
25
|
+
// ============================================================================
|
|
26
|
+
// Validation Schema
|
|
27
|
+
// ============================================================================
|
|
28
|
+
const TestGenOptionsSchema = z.object({
|
|
29
|
+
projectPath: z.string().min(1),
|
|
30
|
+
sourceFile: z.string().min(1),
|
|
31
|
+
testTypes: z.array(z.enum(['unit', 'integration', 'e2e', 'property', 'mutation', 'performance', 'security', 'visual'])).optional(),
|
|
32
|
+
framework: z.enum(['jest', 'vitest', 'mocha', 'pytest', 'junit', 'cypress', 'playwright']).optional(),
|
|
33
|
+
coverageGoal: z.number().min(0).max(100).optional(),
|
|
34
|
+
includeEdgeCases: z.boolean().optional(),
|
|
35
|
+
includeMocks: z.boolean().optional(),
|
|
36
|
+
includeIntegration: z.boolean().optional(),
|
|
37
|
+
useAI: z.boolean().optional(),
|
|
38
|
+
creativity: z.number().min(0).max(1).optional(),
|
|
39
|
+
});
|
|
40
|
+
// ============================================================================
|
|
41
|
+
// Code Analysis
|
|
42
|
+
// ============================================================================
|
|
43
|
+
/**
|
|
44
|
+
* Extract functions from source code
|
|
45
|
+
*/
|
|
46
|
+
function extractFunctions(code) {
|
|
47
|
+
const functions = [];
|
|
48
|
+
// Match function declarations
|
|
49
|
+
const funcPattern = /function\s+(\w+)\s*\(([^)]*)\)\s*{([^}]*)}/g;
|
|
50
|
+
let match;
|
|
51
|
+
while ((match = funcPattern.exec(code)) !== null) {
|
|
52
|
+
if (match[1] && match[2] !== undefined && match[3]) {
|
|
53
|
+
functions.push({
|
|
54
|
+
name: match[1],
|
|
55
|
+
params: match[2].split(',').map(p => p.trim()).filter(Boolean),
|
|
56
|
+
body: match[3],
|
|
57
|
+
lineNumber: code.substring(0, match.index).split('\n').length,
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
// Match arrow functions
|
|
62
|
+
const arrowPattern = /const\s+(\w+)\s*=\s*\(([^)]*)\)\s*=>\s*{([^}]*)}/g;
|
|
63
|
+
while ((match = arrowPattern.exec(code)) !== null) {
|
|
64
|
+
if (match[1] && match[2] !== undefined && match[3]) {
|
|
65
|
+
functions.push({
|
|
66
|
+
name: match[1],
|
|
67
|
+
params: match[2].split(',').map(p => p.trim()).filter(Boolean),
|
|
68
|
+
body: match[3],
|
|
69
|
+
lineNumber: code.substring(0, match.index).split('\n').length,
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
return functions;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Analyze function to determine test cases
|
|
77
|
+
*/
|
|
78
|
+
function analyzeFunction(func) {
|
|
79
|
+
const testCases = [];
|
|
80
|
+
// Happy path test
|
|
81
|
+
testCases.push({
|
|
82
|
+
scenario: `${func.name} with valid inputs`,
|
|
83
|
+
inputs: func.params.map(() => 'validInput'),
|
|
84
|
+
expectedOutput: 'expectedResult',
|
|
85
|
+
assertions: [`expect(result).toBeDefined()`],
|
|
86
|
+
});
|
|
87
|
+
// Edge cases
|
|
88
|
+
if (func.params.length > 0) {
|
|
89
|
+
// Null/undefined test
|
|
90
|
+
testCases.push({
|
|
91
|
+
scenario: `${func.name} with null/undefined inputs`,
|
|
92
|
+
inputs: func.params.map(() => null),
|
|
93
|
+
expectedOutput: null,
|
|
94
|
+
assertions: [`expect(result).toBeNull() or throw error`],
|
|
95
|
+
});
|
|
96
|
+
// Empty values test
|
|
97
|
+
testCases.push({
|
|
98
|
+
scenario: `${func.name} with empty values`,
|
|
99
|
+
inputs: func.params.map(() => ''),
|
|
100
|
+
expectedOutput: '',
|
|
101
|
+
assertions: [`expect(result).toBe('')`],
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
// Boundary value tests
|
|
105
|
+
if (func.body.includes('length') || func.body.includes('size')) {
|
|
106
|
+
testCases.push({
|
|
107
|
+
scenario: `${func.name} with boundary values (0, 1, max)`,
|
|
108
|
+
inputs: [0, 1, Number.MAX_SAFE_INTEGER],
|
|
109
|
+
expectedOutput: 'bounded result',
|
|
110
|
+
assertions: [`expect(result).toBeGreaterThanOrEqual(0)`],
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
// Error cases
|
|
114
|
+
if (func.body.includes('throw') || func.body.includes('Error')) {
|
|
115
|
+
testCases.push({
|
|
116
|
+
scenario: `${func.name} throws error on invalid input`,
|
|
117
|
+
inputs: ['invalid'],
|
|
118
|
+
expectedOutput: 'Error',
|
|
119
|
+
assertions: [`expect(() => ${func.name}(invalid)).toThrow()`],
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
return testCases;
|
|
123
|
+
}
|
|
124
|
+
// ============================================================================
|
|
125
|
+
// Test Generation
|
|
126
|
+
// ============================================================================
|
|
127
|
+
/**
|
|
128
|
+
* Generate Jest/Vitest unit test
|
|
129
|
+
*/
|
|
130
|
+
function generateUnitTest(func, testCase, framework) {
|
|
131
|
+
const testCode = `
|
|
132
|
+
describe('${func.name}', () => {
|
|
133
|
+
test('${testCase.scenario}', () => {
|
|
134
|
+
// Arrange
|
|
135
|
+
const inputs = ${JSON.stringify(testCase.inputs)};
|
|
136
|
+
|
|
137
|
+
// Act
|
|
138
|
+
const result = ${func.name}(...inputs);
|
|
139
|
+
|
|
140
|
+
// Assert
|
|
141
|
+
${testCase.assertions.join('\n ')}
|
|
142
|
+
});
|
|
143
|
+
});
|
|
144
|
+
`.trim();
|
|
145
|
+
return testCode;
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Generate property-based test
|
|
149
|
+
*/
|
|
150
|
+
function generatePropertyTest(func, framework) {
|
|
151
|
+
return `
|
|
152
|
+
import { fc, test } from '@fast-check/vitest';
|
|
153
|
+
|
|
154
|
+
test.prop([fc.string(), fc.integer()])('${func.name} property: idempotent', (input, num) => {
|
|
155
|
+
const result1 = ${func.name}(input, num);
|
|
156
|
+
const result2 = ${func.name}(input, num);
|
|
157
|
+
|
|
158
|
+
// Property: calling with same inputs should yield same result
|
|
159
|
+
expect(result1).toEqual(result2);
|
|
160
|
+
});
|
|
161
|
+
`.trim();
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Generate integration test
|
|
165
|
+
*/
|
|
166
|
+
function generateIntegrationTest(func, framework) {
|
|
167
|
+
return `
|
|
168
|
+
describe('${func.name} Integration', () => {
|
|
169
|
+
test('integrates with external dependencies', async () => {
|
|
170
|
+
// Setup
|
|
171
|
+
const mockDb = createMockDatabase();
|
|
172
|
+
const mockApi = createMockApi();
|
|
173
|
+
|
|
174
|
+
// Execute
|
|
175
|
+
const result = await ${func.name}(mockDb, mockApi);
|
|
176
|
+
|
|
177
|
+
// Verify
|
|
178
|
+
expect(result).toBeDefined();
|
|
179
|
+
expect(mockDb.called).toBe(true);
|
|
180
|
+
expect(mockApi.called).toBe(true);
|
|
181
|
+
});
|
|
182
|
+
});
|
|
183
|
+
`.trim();
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* Generate mock/stub
|
|
187
|
+
*/
|
|
188
|
+
function generateMock(dependency, framework) {
|
|
189
|
+
return {
|
|
190
|
+
name: `mock${dependency}`,
|
|
191
|
+
type: 'mock',
|
|
192
|
+
target: dependency,
|
|
193
|
+
code: `
|
|
194
|
+
const mock${dependency} = {
|
|
195
|
+
method: jest.fn(() => 'mocked response'),
|
|
196
|
+
anotherMethod: jest.fn().mockResolvedValue({ data: 'test' }),
|
|
197
|
+
};
|
|
198
|
+
`.trim(),
|
|
199
|
+
};
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Generate test fixtures
|
|
203
|
+
*/
|
|
204
|
+
function generateFixtures(func) {
|
|
205
|
+
return [
|
|
206
|
+
{
|
|
207
|
+
name: `${func.name}ValidInput`,
|
|
208
|
+
data: { id: 1, name: 'Test User', email: 'test@example.com' },
|
|
209
|
+
description: 'Valid input for happy path testing',
|
|
210
|
+
},
|
|
211
|
+
{
|
|
212
|
+
name: `${func.name}EdgeCase`,
|
|
213
|
+
data: { id: 0, name: '', email: null },
|
|
214
|
+
description: 'Edge case with boundary values',
|
|
215
|
+
},
|
|
216
|
+
{
|
|
217
|
+
name: `${func.name}LargeDataset`,
|
|
218
|
+
data: Array.from({ length: 1000 }, (_, i) => ({ id: i, value: Math.random() })),
|
|
219
|
+
description: 'Large dataset for performance testing',
|
|
220
|
+
},
|
|
221
|
+
];
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* Analyze coverage gaps
|
|
225
|
+
*/
|
|
226
|
+
function analyzeCoverageGaps(code, generatedTests) {
|
|
227
|
+
const gaps = [];
|
|
228
|
+
// Detect branches
|
|
229
|
+
const branches = (code.match(/if\s*\(/g) || []).length;
|
|
230
|
+
const testedBranches = generatedTests.filter(t => t.testCase.scenario.includes('edge') || t.testCase.scenario.includes('error')).length;
|
|
231
|
+
if (testedBranches < branches) {
|
|
232
|
+
gaps.push({
|
|
233
|
+
location: 'conditional branches',
|
|
234
|
+
type: 'branch',
|
|
235
|
+
reason: `${branches - testedBranches} branches not covered`,
|
|
236
|
+
suggestedTest: 'Add tests for all conditional paths',
|
|
237
|
+
});
|
|
238
|
+
}
|
|
239
|
+
// Detect error handling
|
|
240
|
+
if (code.includes('try') || code.includes('catch')) {
|
|
241
|
+
const errorTests = generatedTests.filter(t => t.testCase.scenario.includes('error')).length;
|
|
242
|
+
if (errorTests === 0) {
|
|
243
|
+
gaps.push({
|
|
244
|
+
location: 'error handling',
|
|
245
|
+
type: 'statement',
|
|
246
|
+
reason: 'No tests for error scenarios',
|
|
247
|
+
suggestedTest: 'Add tests for try/catch blocks',
|
|
248
|
+
});
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
return gaps;
|
|
252
|
+
}
|
|
253
|
+
// ============================================================================
|
|
254
|
+
// Main Test Generation Function
|
|
255
|
+
// ============================================================================
|
|
256
|
+
/**
|
|
257
|
+
* Generate comprehensive tests for source file
|
|
258
|
+
*/
|
|
259
|
+
export async function generateTests(options) {
|
|
260
|
+
const timer = createTimer();
|
|
261
|
+
const { projectPath, sourceFile, testTypes = ['unit', 'integration'], framework = 'vitest', coverageGoal = 80, includeEdgeCases = true, includeMocks = true, includeIntegration = true, useAI = true, creativity = 0.7, } = TestGenOptionsSchema.parse(options);
|
|
262
|
+
logger.info({ sourceFile, framework, testTypes }, 'Generating tests');
|
|
263
|
+
// Read source code
|
|
264
|
+
const code = await fs.readFile(sourceFile, 'utf-8');
|
|
265
|
+
// Extract functions to test
|
|
266
|
+
const functions = extractFunctions(code);
|
|
267
|
+
logger.info({ functionCount: functions.length }, 'Functions extracted');
|
|
268
|
+
const allTests = [];
|
|
269
|
+
const allMocks = [];
|
|
270
|
+
const allFixtures = [];
|
|
271
|
+
// Generate tests for each function
|
|
272
|
+
for (const func of functions) {
|
|
273
|
+
const testCases = analyzeFunction(func);
|
|
274
|
+
for (const testCase of testCases) {
|
|
275
|
+
// Unit tests
|
|
276
|
+
if (testTypes.includes('unit')) {
|
|
277
|
+
const testCode = generateUnitTest(func, testCase, framework);
|
|
278
|
+
allTests.push({
|
|
279
|
+
name: `test_${func.name}_${testCase.scenario.replace(/\s+/g, '_')}`,
|
|
280
|
+
type: 'unit',
|
|
281
|
+
description: testCase.scenario,
|
|
282
|
+
code: testCode,
|
|
283
|
+
targetFunction: func.name,
|
|
284
|
+
testCase,
|
|
285
|
+
priority: testCase.scenario.includes('valid') ? 'critical' : 'high',
|
|
286
|
+
confidence: 0.85,
|
|
287
|
+
});
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
// Property-based tests
|
|
291
|
+
if (testTypes.includes('property') && func.params.length > 0) {
|
|
292
|
+
const propertyTest = generatePropertyTest(func, framework);
|
|
293
|
+
allTests.push({
|
|
294
|
+
name: `property_${func.name}`,
|
|
295
|
+
type: 'property',
|
|
296
|
+
description: `Property-based test for ${func.name}`,
|
|
297
|
+
code: propertyTest,
|
|
298
|
+
targetFunction: func.name,
|
|
299
|
+
testCase: {
|
|
300
|
+
scenario: 'Property testing',
|
|
301
|
+
inputs: [],
|
|
302
|
+
expectedOutput: 'Property holds',
|
|
303
|
+
assertions: ['Property: idempotent'],
|
|
304
|
+
},
|
|
305
|
+
priority: 'medium',
|
|
306
|
+
confidence: 0.7,
|
|
307
|
+
});
|
|
308
|
+
}
|
|
309
|
+
// Integration tests
|
|
310
|
+
if (testTypes.includes('integration') && includeIntegration) {
|
|
311
|
+
const integrationTest = generateIntegrationTest(func, framework);
|
|
312
|
+
allTests.push({
|
|
313
|
+
name: `integration_${func.name}`,
|
|
314
|
+
type: 'integration',
|
|
315
|
+
description: `Integration test for ${func.name}`,
|
|
316
|
+
code: integrationTest,
|
|
317
|
+
targetFunction: func.name,
|
|
318
|
+
testCase: {
|
|
319
|
+
scenario: 'Integration with dependencies',
|
|
320
|
+
inputs: [],
|
|
321
|
+
expectedOutput: 'Integration successful',
|
|
322
|
+
assertions: ['Dependencies called correctly'],
|
|
323
|
+
},
|
|
324
|
+
priority: 'high',
|
|
325
|
+
confidence: 0.65,
|
|
326
|
+
});
|
|
327
|
+
}
|
|
328
|
+
// Generate mocks
|
|
329
|
+
if (includeMocks && func.body.includes('import')) {
|
|
330
|
+
allMocks.push(generateMock(func.name + 'Dependency', framework));
|
|
331
|
+
}
|
|
332
|
+
// Generate fixtures
|
|
333
|
+
allFixtures.push(...generateFixtures(func));
|
|
334
|
+
}
|
|
335
|
+
// Coverage analysis
|
|
336
|
+
const coverageGaps = analyzeCoverageGaps(code, allTests);
|
|
337
|
+
const currentCoverage = 0; // Would integrate with actual coverage tool
|
|
338
|
+
const projectedCoverage = Math.min(100, (allTests.length / Math.max(functions.length * 3, 1)) * 100);
|
|
339
|
+
const coverage = {
|
|
340
|
+
currentCoverage,
|
|
341
|
+
projectedCoverage,
|
|
342
|
+
gaps: coverageGaps,
|
|
343
|
+
recommendations: [
|
|
344
|
+
`Generated ${allTests.length} tests for ${functions.length} functions`,
|
|
345
|
+
projectedCoverage >= coverageGoal
|
|
346
|
+
? `Coverage goal of ${coverageGoal}% achievable`
|
|
347
|
+
: `Add ${Math.ceil((coverageGoal - projectedCoverage) / 10)} more tests to reach ${coverageGoal}%`,
|
|
348
|
+
'Review edge cases and error scenarios',
|
|
349
|
+
],
|
|
350
|
+
};
|
|
351
|
+
// Generate test file path
|
|
352
|
+
const testFile = sourceFile.replace(/\.(ts|js)$/, `.test.$1`);
|
|
353
|
+
const recommendations = [
|
|
354
|
+
'Run tests to verify they pass',
|
|
355
|
+
'Add more edge cases as you discover them',
|
|
356
|
+
'Consider mutation testing to verify test quality',
|
|
357
|
+
'Integrate with CI/CD pipeline',
|
|
358
|
+
];
|
|
359
|
+
const generationTimeMs = timer.elapsed();
|
|
360
|
+
logger.info({
|
|
361
|
+
testsGenerated: allTests.length,
|
|
362
|
+
mocksGenerated: allMocks.length,
|
|
363
|
+
projectedCoverage: `${projectedCoverage.toFixed(1)}%`,
|
|
364
|
+
generationTimeMs
|
|
365
|
+
}, 'Test generation completed');
|
|
366
|
+
return {
|
|
367
|
+
sourceFile,
|
|
368
|
+
testFile,
|
|
369
|
+
framework,
|
|
370
|
+
tests: allTests,
|
|
371
|
+
mocks: allMocks,
|
|
372
|
+
fixtures: allFixtures,
|
|
373
|
+
coverage,
|
|
374
|
+
recommendations,
|
|
375
|
+
generationTimeMs,
|
|
376
|
+
};
|
|
377
|
+
}
|
|
378
|
+
// ============================================================================
|
|
379
|
+
// Export
|
|
380
|
+
// ============================================================================
|
|
381
|
+
export default generateTests;
|
|
382
|
+
//# sourceMappingURL=advanced-testgen.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"advanced-testgen.js","sourceRoot":"","sources":["../../src/tools/advanced-testgen.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Atlas Server - AI Architecture Advisor
|
|
3
|
+
*
|
|
4
|
+
* Deep learning powered architecture analysis:
|
|
5
|
+
* - Architecture pattern detection & recommendations
|
|
6
|
+
* - Microservices vs Monolith analysis
|
|
7
|
+
* - Scalability assessment & bottleneck prediction
|
|
8
|
+
* - Design pattern suggestions
|
|
9
|
+
* - Anti-pattern detection & remediation
|
|
10
|
+
* - Technology stack recommendations
|
|
11
|
+
* - Performance architecture optimization
|
|
12
|
+
* - Security architecture review
|
|
13
|
+
* - Cloud architecture best practices
|
|
14
|
+
* - Cost optimization suggestions
|
|
15
|
+
* - Observability recommendations
|
|
16
|
+
* - Disaster recovery planning
|
|
17
|
+
*
|
|
18
|
+
* @module architecture-advisor
|
|
19
|
+
* @author Nishant Unavane
|
|
20
|
+
* @version 1.0.0
|
|
21
|
+
*/
|
|
22
|
+
export interface ArchitectureAdvisorOptions {
|
|
23
|
+
projectPath: string;
|
|
24
|
+
analysisDepth?: 'quick' | 'standard' | 'comprehensive';
|
|
25
|
+
focus?: ArchitectureFocus[];
|
|
26
|
+
teamSize?: number;
|
|
27
|
+
expectedScale?: 'small' | 'medium' | 'large' | 'enterprise';
|
|
28
|
+
budget?: 'low' | 'medium' | 'high' | 'unlimited';
|
|
29
|
+
preferredStack?: string[];
|
|
30
|
+
cloudProvider?: 'aws' | 'azure' | 'gcp' | 'multi' | 'on-premise';
|
|
31
|
+
performanceGoals?: PerformanceGoals;
|
|
32
|
+
securityRequirements?: SecurityLevel;
|
|
33
|
+
}
|
|
34
|
+
export type ArchitectureFocus = 'scalability' | 'performance' | 'security' | 'maintainability' | 'cost' | 'reliability' | 'observability' | 'modernization';
|
|
35
|
+
export type SecurityLevel = 'basic' | 'standard' | 'high' | 'critical';
|
|
36
|
+
export interface PerformanceGoals {
|
|
37
|
+
maxResponseTime?: number;
|
|
38
|
+
maxConcurrentUsers?: number;
|
|
39
|
+
targetAvailability?: number;
|
|
40
|
+
dataVolumePerDay?: number;
|
|
41
|
+
}
|
|
42
|
+
export interface ArchitectureAdvisorResult {
|
|
43
|
+
projectPath: string;
|
|
44
|
+
currentArchitecture: ArchitecturePattern;
|
|
45
|
+
detectedPatterns: DetectedPattern[];
|
|
46
|
+
techStack: TechStack;
|
|
47
|
+
strengths: ArchitectureStrength[];
|
|
48
|
+
weaknesses: ArchitectureWeakness[];
|
|
49
|
+
opportunities: ArchitectureOpportunity[];
|
|
50
|
+
threats: ArchitectureThreat[];
|
|
51
|
+
recommendations: ArchitectureRecommendation[];
|
|
52
|
+
roadmap: MigrationRoadmap;
|
|
53
|
+
scores: ArchitectureScores;
|
|
54
|
+
predictions: ArchitecturePrediction[];
|
|
55
|
+
analysisTimeMs: number;
|
|
56
|
+
}
|
|
57
|
+
export interface ArchitecturePattern {
|
|
58
|
+
primary: string;
|
|
59
|
+
secondary: string[];
|
|
60
|
+
confidence: number;
|
|
61
|
+
description: string;
|
|
62
|
+
}
|
|
63
|
+
export interface DetectedPattern {
|
|
64
|
+
name: string;
|
|
65
|
+
type: 'design-pattern' | 'anti-pattern' | 'architectural-pattern';
|
|
66
|
+
locations: string[];
|
|
67
|
+
usage: number;
|
|
68
|
+
appropriateness: number;
|
|
69
|
+
explanation: string;
|
|
70
|
+
}
|
|
71
|
+
export interface TechStack {
|
|
72
|
+
languages: string[];
|
|
73
|
+
frameworks: string[];
|
|
74
|
+
databases: string[];
|
|
75
|
+
infrastructure: string[];
|
|
76
|
+
tools: string[];
|
|
77
|
+
modernityScore: number;
|
|
78
|
+
maintainabilityScore: number;
|
|
79
|
+
learningCurve: 'easy' | 'moderate' | 'steep';
|
|
80
|
+
}
|
|
81
|
+
export interface ArchitectureStrength {
|
|
82
|
+
area: string;
|
|
83
|
+
description: string;
|
|
84
|
+
impact: 'low' | 'medium' | 'high';
|
|
85
|
+
examples: string[];
|
|
86
|
+
}
|
|
87
|
+
export interface ArchitectureWeakness {
|
|
88
|
+
area: string;
|
|
89
|
+
description: string;
|
|
90
|
+
severity: 'low' | 'medium' | 'high' | 'critical';
|
|
91
|
+
impact: string;
|
|
92
|
+
remediation: string;
|
|
93
|
+
}
|
|
94
|
+
export interface ArchitectureOpportunity {
|
|
95
|
+
area: string;
|
|
96
|
+
description: string;
|
|
97
|
+
benefit: string;
|
|
98
|
+
effort: 'low' | 'medium' | 'high';
|
|
99
|
+
roi: number;
|
|
100
|
+
}
|
|
101
|
+
export interface ArchitectureThreat {
|
|
102
|
+
area: string;
|
|
103
|
+
description: string;
|
|
104
|
+
probability: number;
|
|
105
|
+
impact: 'low' | 'medium' | 'high' | 'critical';
|
|
106
|
+
mitigation: string;
|
|
107
|
+
}
|
|
108
|
+
export interface ArchitectureRecommendation {
|
|
109
|
+
category: ArchitectureFocus;
|
|
110
|
+
priority: 'critical' | 'high' | 'medium' | 'low';
|
|
111
|
+
title: string;
|
|
112
|
+
description: string;
|
|
113
|
+
rationale: string;
|
|
114
|
+
benefits: string[];
|
|
115
|
+
challenges: string[];
|
|
116
|
+
implementation: ImplementationPlan;
|
|
117
|
+
alternatives: Alternative[];
|
|
118
|
+
}
|
|
119
|
+
export interface ImplementationPlan {
|
|
120
|
+
phases: Phase[];
|
|
121
|
+
estimatedEffort: string;
|
|
122
|
+
requiredSkills: string[];
|
|
123
|
+
estimatedCost: string;
|
|
124
|
+
}
|
|
125
|
+
export interface Phase {
|
|
126
|
+
name: string;
|
|
127
|
+
duration: string;
|
|
128
|
+
tasks: string[];
|
|
129
|
+
deliverables: string[];
|
|
130
|
+
risks: string[];
|
|
131
|
+
}
|
|
132
|
+
export interface Alternative {
|
|
133
|
+
name: string;
|
|
134
|
+
pros: string[];
|
|
135
|
+
cons: string[];
|
|
136
|
+
whenToUse: string;
|
|
137
|
+
}
|
|
138
|
+
export interface MigrationRoadmap {
|
|
139
|
+
timeline: 'short' | 'medium' | 'long';
|
|
140
|
+
phases: RoadmapPhase[];
|
|
141
|
+
quickWins: string[];
|
|
142
|
+
longTermGoals: string[];
|
|
143
|
+
}
|
|
144
|
+
export interface RoadmapPhase {
|
|
145
|
+
phase: number;
|
|
146
|
+
name: string;
|
|
147
|
+
duration: string;
|
|
148
|
+
objectives: string[];
|
|
149
|
+
dependencies: number[];
|
|
150
|
+
}
|
|
151
|
+
export interface ArchitectureScores {
|
|
152
|
+
overall: number;
|
|
153
|
+
scalability: number;
|
|
154
|
+
performance: number;
|
|
155
|
+
security: number;
|
|
156
|
+
maintainability: number;
|
|
157
|
+
reliability: number;
|
|
158
|
+
costEfficiency: number;
|
|
159
|
+
observability: number;
|
|
160
|
+
}
|
|
161
|
+
export interface ArchitecturePrediction {
|
|
162
|
+
metric: string;
|
|
163
|
+
currentValue: number;
|
|
164
|
+
predictedValue: number;
|
|
165
|
+
timeframe: string;
|
|
166
|
+
confidence: number;
|
|
167
|
+
reasoning: string;
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Comprehensive architecture analysis and recommendations
|
|
171
|
+
*/
|
|
172
|
+
export declare function analyzeArchitecture(options: ArchitectureAdvisorOptions): Promise<ArchitectureAdvisorResult>;
|
|
173
|
+
export default analyzeArchitecture;
|
|
174
|
+
//# sourceMappingURL=architecture-advisor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"architecture-advisor.d.ts","sourceRoot":"","sources":["../../src/tools/architecture-advisor.ts"],"names":[],"mappings":"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"}
|