@tayo-dev/rtl 1.0.0
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/README.md +250 -0
- package/dist/analyzer/mocks/detector.d.ts +59 -0
- package/dist/analyzer/mocks/detector.d.ts.map +1 -0
- package/dist/analyzer/mocks/detector.js +264 -0
- package/dist/analyzer/mocks/detector.js.map +1 -0
- package/dist/analyzer/mocks/target-analyzer.d.ts +92 -0
- package/dist/analyzer/mocks/target-analyzer.d.ts.map +1 -0
- package/dist/analyzer/mocks/target-analyzer.js +305 -0
- package/dist/analyzer/mocks/target-analyzer.js.map +1 -0
- package/dist/analyzer/visual/element-analyzer.d.ts +44 -0
- package/dist/analyzer/visual/element-analyzer.d.ts.map +1 -0
- package/dist/analyzer/visual/element-analyzer.js +176 -0
- package/dist/analyzer/visual/element-analyzer.js.map +1 -0
- package/dist/analyzer/visual/inspector.d.ts +49 -0
- package/dist/analyzer/visual/inspector.d.ts.map +1 -0
- package/dist/analyzer/visual/inspector.js +109 -0
- package/dist/analyzer/visual/inspector.js.map +1 -0
- package/dist/cli/commands/generate.d.ts +13 -0
- package/dist/cli/commands/generate.d.ts.map +1 -0
- package/dist/cli/commands/generate.js +417 -0
- package/dist/cli/commands/generate.js.map +1 -0
- package/dist/core/generator.d.ts +32 -0
- package/dist/core/generator.d.ts.map +1 -0
- package/dist/core/generator.js +173 -0
- package/dist/core/generator.js.map +1 -0
- package/dist/core/js-parser.d.ts +48 -0
- package/dist/core/js-parser.d.ts.map +1 -0
- package/dist/core/js-parser.js +244 -0
- package/dist/core/js-parser.js.map +1 -0
- package/dist/core/mock-intelligence.d.ts +14 -0
- package/dist/core/mock-intelligence.d.ts.map +1 -0
- package/dist/core/mock-intelligence.js +140 -0
- package/dist/core/mock-intelligence.js.map +1 -0
- package/dist/core/orchestrator.d.ts +49 -0
- package/dist/core/orchestrator.d.ts.map +1 -0
- package/dist/core/orchestrator.js +315 -0
- package/dist/core/orchestrator.js.map +1 -0
- package/dist/core/parser.d.ts +9 -0
- package/dist/core/parser.d.ts.map +1 -0
- package/dist/core/parser.js +120 -0
- package/dist/core/parser.js.map +1 -0
- package/dist/core/recording-intelligence.d.ts +15 -0
- package/dist/core/recording-intelligence.d.ts.map +1 -0
- package/dist/core/recording-intelligence.js +178 -0
- package/dist/core/recording-intelligence.js.map +1 -0
- package/dist/core/resolver.d.ts +58 -0
- package/dist/core/resolver.d.ts.map +1 -0
- package/dist/core/resolver.js +291 -0
- package/dist/core/resolver.js.map +1 -0
- package/dist/core/scanner.d.ts +51 -0
- package/dist/core/scanner.d.ts.map +1 -0
- package/dist/core/scanner.js +310 -0
- package/dist/core/scanner.js.map +1 -0
- package/dist/core/scorer.d.ts +8 -0
- package/dist/core/scorer.d.ts.map +1 -0
- package/dist/core/scorer.js +76 -0
- package/dist/core/scorer.js.map +1 -0
- package/dist/core/validator.d.ts +134 -0
- package/dist/core/validator.d.ts.map +1 -0
- package/dist/core/validator.js +44 -0
- package/dist/core/validator.js.map +1 -0
- package/dist/core/verifier.d.ts +10 -0
- package/dist/core/verifier.d.ts.map +1 -0
- package/dist/core/verifier.js +30 -0
- package/dist/core/verifier.js.map +1 -0
- package/dist/core/writer.d.ts +15 -0
- package/dist/core/writer.d.ts.map +1 -0
- package/dist/core/writer.js +43 -0
- package/dist/core/writer.js.map +1 -0
- package/dist/generator/mocks/builder.d.ts +47 -0
- package/dist/generator/mocks/builder.d.ts.map +1 -0
- package/dist/generator/mocks/builder.js +335 -0
- package/dist/generator/mocks/builder.js.map +1 -0
- package/dist/generator/transforms/dialog-transform.d.ts +35 -0
- package/dist/generator/transforms/dialog-transform.d.ts.map +1 -0
- package/dist/generator/transforms/dialog-transform.js +293 -0
- package/dist/generator/transforms/dialog-transform.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +18 -0
- package/dist/index.js.map +1 -0
- package/dist/learner/analyzer.d.ts +13 -0
- package/dist/learner/analyzer.d.ts.map +1 -0
- package/dist/learner/analyzer.js +484 -0
- package/dist/learner/analyzer.js.map +1 -0
- package/dist/learner/index.d.ts +66 -0
- package/dist/learner/index.d.ts.map +1 -0
- package/dist/learner/index.js +247 -0
- package/dist/learner/index.js.map +1 -0
- package/dist/learner/storage.d.ts +68 -0
- package/dist/learner/storage.d.ts.map +1 -0
- package/dist/learner/storage.js +201 -0
- package/dist/learner/storage.js.map +1 -0
- package/dist/learner/types.d.ts +41 -0
- package/dist/learner/types.d.ts.map +1 -0
- package/dist/learner/types.js +31 -0
- package/dist/learner/types.js.map +1 -0
- package/dist/parser/recorder-parser.d.ts +40 -0
- package/dist/parser/recorder-parser.d.ts.map +1 -0
- package/dist/parser/recorder-parser.js +139 -0
- package/dist/parser/recorder-parser.js.map +1 -0
- package/dist/parser/steps/deduplicator.d.ts +19 -0
- package/dist/parser/steps/deduplicator.d.ts.map +1 -0
- package/dist/parser/steps/deduplicator.js +75 -0
- package/dist/parser/steps/deduplicator.js.map +1 -0
- package/dist/parser/steps/dialog-detector.d.ts +38 -0
- package/dist/parser/steps/dialog-detector.d.ts.map +1 -0
- package/dist/parser/steps/dialog-detector.js +290 -0
- package/dist/parser/steps/dialog-detector.js.map +1 -0
- package/dist/parser/steps/noise-filter.d.ts +21 -0
- package/dist/parser/steps/noise-filter.d.ts.map +1 -0
- package/dist/parser/steps/noise-filter.js +138 -0
- package/dist/parser/steps/noise-filter.js.map +1 -0
- package/dist/scorer/index.d.ts +43 -0
- package/dist/scorer/index.d.ts.map +1 -0
- package/dist/scorer/index.js +82 -0
- package/dist/scorer/index.js.map +1 -0
- package/dist/scorer/post-verify.d.ts +17 -0
- package/dist/scorer/post-verify.d.ts.map +1 -0
- package/dist/scorer/post-verify.js +163 -0
- package/dist/scorer/post-verify.js.map +1 -0
- package/dist/scorer/pre-audit.d.ts +32 -0
- package/dist/scorer/pre-audit.d.ts.map +1 -0
- package/dist/scorer/pre-audit.js +99 -0
- package/dist/scorer/pre-audit.js.map +1 -0
- package/dist/scorer/quality-gates.d.ts +17 -0
- package/dist/scorer/quality-gates.d.ts.map +1 -0
- package/dist/scorer/quality-gates.js +304 -0
- package/dist/scorer/quality-gates.js.map +1 -0
- package/dist/scorer/types.d.ts +27 -0
- package/dist/scorer/types.d.ts.map +1 -0
- package/dist/scorer/types.js +5 -0
- package/dist/scorer/types.js.map +1 -0
- package/dist/templates/test-template.d.ts +21 -0
- package/dist/templates/test-template.d.ts.map +1 -0
- package/dist/templates/test-template.js +92 -0
- package/dist/templates/test-template.js.map +1 -0
- package/dist/types/conventions.d.ts +49 -0
- package/dist/types/conventions.d.ts.map +1 -0
- package/dist/types/conventions.js +13 -0
- package/dist/types/conventions.js.map +1 -0
- package/dist/types/recording.d.ts +143 -0
- package/dist/types/recording.d.ts.map +1 -0
- package/dist/types/recording.js +5 -0
- package/dist/types/recording.js.map +1 -0
- package/dist/types/score.d.ts +18 -0
- package/dist/types/score.d.ts.map +1 -0
- package/dist/types/score.js +2 -0
- package/dist/types/score.js.map +1 -0
- package/package.json +51 -0
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Test file filesystem writing
|
|
3
|
+
* Writes generated test code to the filesystem with proper naming and safety checks.
|
|
4
|
+
*/
|
|
5
|
+
export interface WriteOptions {
|
|
6
|
+
force?: boolean;
|
|
7
|
+
createDir?: boolean;
|
|
8
|
+
}
|
|
9
|
+
export interface WriteResult {
|
|
10
|
+
filePath: string;
|
|
11
|
+
created: boolean;
|
|
12
|
+
overwritten: boolean;
|
|
13
|
+
}
|
|
14
|
+
export declare function writeTestFile(content: string, outputPath: string, options?: WriteOptions): Promise<WriteResult>;
|
|
15
|
+
//# sourceMappingURL=writer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"writer.d.ts","sourceRoot":"","sources":["../../src/core/writer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,MAAM,WAAW,YAAY;IAC3B,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,SAAS,CAAC,EAAE,OAAO,CAAA;CACpB;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,MAAM,CAAA;IAChB,OAAO,EAAE,OAAO,CAAA;IAChB,WAAW,EAAE,OAAO,CAAA;CACrB;AAYD,wBAAsB,aAAa,CACjC,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,EAClB,OAAO,GAAE,YAAiB,GACzB,OAAO,CAAC,WAAW,CAAC,CAqCtB"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Test file filesystem writing
|
|
3
|
+
* Writes generated test code to the filesystem with proper naming and safety checks.
|
|
4
|
+
*/
|
|
5
|
+
import { access, mkdir, writeFile } from 'node:fs/promises';
|
|
6
|
+
import { dirname, extname, resolve } from 'node:path';
|
|
7
|
+
function isValidTestPath(filePath) {
|
|
8
|
+
const base = filePath.replace(/\?.*$/, '');
|
|
9
|
+
return (base.endsWith('.test.ts') ||
|
|
10
|
+
base.endsWith('.test.tsx') ||
|
|
11
|
+
base.endsWith('.spec.ts') ||
|
|
12
|
+
base.endsWith('.spec.tsx'));
|
|
13
|
+
}
|
|
14
|
+
export async function writeTestFile(content, outputPath, options = {}) {
|
|
15
|
+
const { force = false, createDir = true } = options;
|
|
16
|
+
const resolvedPath = resolve(outputPath);
|
|
17
|
+
if (!isValidTestPath(resolvedPath)) {
|
|
18
|
+
const ext = extname(resolvedPath);
|
|
19
|
+
throw new Error(`Output file must have a test extension (.test.ts, .test.tsx, .spec.ts, .spec.tsx). Got: "${ext || '(no extension)'}"`);
|
|
20
|
+
}
|
|
21
|
+
const dir = dirname(resolvedPath);
|
|
22
|
+
if (createDir) {
|
|
23
|
+
await mkdir(dir, { recursive: true });
|
|
24
|
+
}
|
|
25
|
+
let fileExists = false;
|
|
26
|
+
try {
|
|
27
|
+
await access(resolvedPath);
|
|
28
|
+
fileExists = true;
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
// ENOENT — file does not exist, proceed
|
|
32
|
+
}
|
|
33
|
+
if (fileExists && !force) {
|
|
34
|
+
throw new Error(`Output file already exists: ${resolvedPath}\nUse --force to overwrite.`);
|
|
35
|
+
}
|
|
36
|
+
await writeFile(resolvedPath, content, 'utf-8');
|
|
37
|
+
return {
|
|
38
|
+
filePath: resolvedPath,
|
|
39
|
+
created: !fileExists,
|
|
40
|
+
overwritten: fileExists,
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=writer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"writer.js","sourceRoot":"","sources":["../../src/core/writer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAC3D,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAarD,SAAS,eAAe,CAAC,QAAgB;IACvC,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAA;IAC1C,OAAO,CACL,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC;QACzB,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC;QAC1B,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC;QACzB,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,CAC3B,CAAA;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,OAAe,EACf,UAAkB,EAClB,UAAwB,EAAE;IAE1B,MAAM,EAAE,KAAK,GAAG,KAAK,EAAE,SAAS,GAAG,IAAI,EAAE,GAAG,OAAO,CAAA;IACnD,MAAM,YAAY,GAAG,OAAO,CAAC,UAAU,CAAC,CAAA;IAExC,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,EAAE,CAAC;QACnC,MAAM,GAAG,GAAG,OAAO,CAAC,YAAY,CAAC,CAAA;QACjC,MAAM,IAAI,KAAK,CACb,4FAA4F,GAAG,IAAI,gBAAgB,GAAG,CACvH,CAAA;IACH,CAAC;IAED,MAAM,GAAG,GAAG,OAAO,CAAC,YAAY,CAAC,CAAA;IACjC,IAAI,SAAS,EAAE,CAAC;QACd,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IACvC,CAAC;IAED,IAAI,UAAU,GAAG,KAAK,CAAA;IACtB,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,YAAY,CAAC,CAAA;QAC1B,UAAU,GAAG,IAAI,CAAA;IACnB,CAAC;IAAC,MAAM,CAAC;QACP,wCAAwC;IAC1C,CAAC;IAED,IAAI,UAAU,IAAI,CAAC,KAAK,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CACb,+BAA+B,YAAY,6BAA6B,CACzE,CAAA;IACH,CAAC;IAED,MAAM,SAAS,CAAC,YAAY,EAAE,OAAO,EAAE,OAAO,CAAC,CAAA;IAE/C,OAAO;QACL,QAAQ,EAAE,YAAY;QACtB,OAAO,EAAE,CAAC,UAAU;QACpB,WAAW,EAAE,UAAU;KACxB,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Mock Code Builder - Generates valid mock code for tests
|
|
3
|
+
*
|
|
4
|
+
* Takes mock targets and generates appropriate mock code based on the
|
|
5
|
+
* selected mock library (MSW, jest.fn, sinon, etc.)
|
|
6
|
+
*/
|
|
7
|
+
import type { MockTarget } from '../../analyzer/mocks/target-analyzer.js';
|
|
8
|
+
import type { ApiCallInfo } from '../../analyzer/mocks/detector.js';
|
|
9
|
+
/**
|
|
10
|
+
* Decision about how to generate the mock
|
|
11
|
+
*/
|
|
12
|
+
export interface MockDecision {
|
|
13
|
+
/** The mock target this decision applies to */
|
|
14
|
+
target: MockTarget;
|
|
15
|
+
/** The generated mock code */
|
|
16
|
+
code: string;
|
|
17
|
+
/** Whether this should be an inline or file mock */
|
|
18
|
+
isInline: boolean;
|
|
19
|
+
/** Import statements needed */
|
|
20
|
+
imports: string[];
|
|
21
|
+
/** Any setup required before using the mock */
|
|
22
|
+
setupCode?: string;
|
|
23
|
+
/** Cleanup code required */
|
|
24
|
+
teardownCode?: string;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Main function to build mock code from a mock target
|
|
28
|
+
*/
|
|
29
|
+
export declare function buildMock(target: MockTarget, apiCall: ApiCallInfo): MockDecision;
|
|
30
|
+
/**
|
|
31
|
+
* Build mocks for multiple targets
|
|
32
|
+
*/
|
|
33
|
+
export declare function buildMocks(targets: MockTarget[], apiCalls: Map<string, ApiCallInfo>): MockDecision[];
|
|
34
|
+
/**
|
|
35
|
+
* Generate complete mock file content
|
|
36
|
+
*/
|
|
37
|
+
export declare function generateMockFile(decisions: MockDecision[], options?: {
|
|
38
|
+
framework?: 'vitest' | 'jest';
|
|
39
|
+
filename?: string;
|
|
40
|
+
}): string;
|
|
41
|
+
/**
|
|
42
|
+
* Generate inline mock code for a single test
|
|
43
|
+
*/
|
|
44
|
+
export declare function generateInlineMock(decision: MockDecision, options?: {
|
|
45
|
+
framework?: 'vitest' | 'jest';
|
|
46
|
+
}): string;
|
|
47
|
+
//# sourceMappingURL=builder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"builder.d.ts","sourceRoot":"","sources":["../../../src/generator/mocks/builder.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yCAAyC,CAAC;AAC1E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AAEpE;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,+CAA+C;IAC/C,MAAM,EAAE,UAAU,CAAC;IACnB,8BAA8B;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,oDAAoD;IACpD,QAAQ,EAAE,OAAO,CAAC;IAClB,+BAA+B;IAC/B,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,+CAA+C;IAC/C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,4BAA4B;IAC5B,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAgPD;;GAEG;AACH,wBAAgB,SAAS,CAAC,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,WAAW,GAAG,YAAY,CAkBhF;AAED;;GAEG;AACH,wBAAgB,UAAU,CACxB,OAAO,EAAE,UAAU,EAAE,EACrB,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,GACjC,YAAY,EAAE,CAYhB;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,SAAS,EAAE,YAAY,EAAE,EACzB,OAAO,CAAC,EAAE;IACR,SAAS,CAAC,EAAE,QAAQ,GAAG,MAAM,CAAC;IAC9B,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,GACA,MAAM,CAuDR;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,YAAY,EACtB,OAAO,CAAC,EAAE;IACR,SAAS,CAAC,EAAE,QAAQ,GAAG,MAAM,CAAC;CAC/B,GACA,MAAM,CAwBR"}
|
|
@@ -0,0 +1,335 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Mock Code Builder - Generates valid mock code for tests
|
|
3
|
+
*
|
|
4
|
+
* Takes mock targets and generates appropriate mock code based on the
|
|
5
|
+
* selected mock library (MSW, jest.fn, sinon, etc.)
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Sample response data for common API patterns
|
|
9
|
+
*/
|
|
10
|
+
const SAMPLE_RESPONSES = {
|
|
11
|
+
// Generic success
|
|
12
|
+
success: { ok: true, message: 'Success' },
|
|
13
|
+
// JSON API
|
|
14
|
+
json: { data: {}, meta: { page: 1, total: 0 } },
|
|
15
|
+
// User data
|
|
16
|
+
user: { id: '1', email: 'user@example.com', name: 'Test User' },
|
|
17
|
+
// List data
|
|
18
|
+
list: { items: [], total: 0, page: 1, pageSize: 10 },
|
|
19
|
+
// Error
|
|
20
|
+
error: { error: { code: 'UNKNOWN', message: 'An error occurred' } },
|
|
21
|
+
};
|
|
22
|
+
/**
|
|
23
|
+
* Generate mock code for MSW (Mock Service Worker)
|
|
24
|
+
*/
|
|
25
|
+
function buildMswMock(target, apiCall) {
|
|
26
|
+
const imports = ['http', 'HttpResponse'];
|
|
27
|
+
const method = target.method.toLowerCase();
|
|
28
|
+
// Determine response type based on URL
|
|
29
|
+
const responseType = inferResponseType(target.url);
|
|
30
|
+
const sampleResponse = SAMPLE_RESPONSES[responseType] || SAMPLE_RESPONSES.json;
|
|
31
|
+
let handlerCode = '';
|
|
32
|
+
switch (method) {
|
|
33
|
+
case 'get':
|
|
34
|
+
handlerCode = `http.get('${target.url}', () => {
|
|
35
|
+
return HttpResponse.json(${JSON.stringify(sampleResponse, null, 2)});
|
|
36
|
+
})`;
|
|
37
|
+
break;
|
|
38
|
+
case 'post':
|
|
39
|
+
handlerCode = `http.post('${target.url}', () => {
|
|
40
|
+
return HttpResponse.json(${JSON.stringify(sampleResponse, null, 2)}, { status: 201 });
|
|
41
|
+
})`;
|
|
42
|
+
break;
|
|
43
|
+
case 'put':
|
|
44
|
+
case 'patch':
|
|
45
|
+
handlerCode = `http.${method}('${target.url}', () => {
|
|
46
|
+
return HttpResponse.json(${JSON.stringify(sampleResponse, null, 2)});
|
|
47
|
+
})`;
|
|
48
|
+
break;
|
|
49
|
+
case 'delete':
|
|
50
|
+
handlerCode = `http.delete('${target.url}', () => {
|
|
51
|
+
return HttpResponse.json({ ok: true });
|
|
52
|
+
})`;
|
|
53
|
+
break;
|
|
54
|
+
default:
|
|
55
|
+
handlerCode = `http.all('${target.url}', () => {
|
|
56
|
+
return HttpResponse.json(${JSON.stringify(sampleResponse, null, 2)});
|
|
57
|
+
})`;
|
|
58
|
+
}
|
|
59
|
+
return {
|
|
60
|
+
target,
|
|
61
|
+
code: handlerCode,
|
|
62
|
+
isInline: target.extractionRecommendation === 'inline',
|
|
63
|
+
imports,
|
|
64
|
+
setupCode: `// Add handlers to server in your test setup
|
|
65
|
+
// const server = setupServer(...handlers);`,
|
|
66
|
+
teardownCode: `// server.close(); // In afterAll hook`,
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Generate mock code for jest.fn()
|
|
71
|
+
*/
|
|
72
|
+
function buildJestFnMock(target, apiCall) {
|
|
73
|
+
const responseType = inferResponseType(target.url);
|
|
74
|
+
const sampleResponse = SAMPLE_RESPONSES[responseType] || SAMPLE_RESPONSES.json;
|
|
75
|
+
let mockCode = '';
|
|
76
|
+
let setupCode = '';
|
|
77
|
+
if (target.method === 'GET') {
|
|
78
|
+
mockCode = `jest.fn().mockResolvedValue(${JSON.stringify(sampleResponse, null, 2)})`;
|
|
79
|
+
setupCode = `global.fetch = ${mockCode};`;
|
|
80
|
+
}
|
|
81
|
+
else if (target.method === 'POST' || target.method === 'PUT' || target.method === 'PATCH') {
|
|
82
|
+
mockCode = `jest.fn().mockResolvedValue(${JSON.stringify(sampleResponse, null, 2)})`;
|
|
83
|
+
setupCode = `global.fetch = ${mockCode};`;
|
|
84
|
+
}
|
|
85
|
+
else if (target.method === 'DELETE') {
|
|
86
|
+
mockCode = `jest.fn().mockResolvedValue({ ok: true })`;
|
|
87
|
+
setupCode = `global.fetch = ${mockCode};`;
|
|
88
|
+
}
|
|
89
|
+
else {
|
|
90
|
+
mockCode = `jest.fn().mockResolvedValue(${JSON.stringify(sampleResponse, null, 2)})`;
|
|
91
|
+
setupCode = `global.fetch = ${mockCode};`;
|
|
92
|
+
}
|
|
93
|
+
return {
|
|
94
|
+
target,
|
|
95
|
+
code: mockCode,
|
|
96
|
+
isInline: true,
|
|
97
|
+
imports: [],
|
|
98
|
+
setupCode,
|
|
99
|
+
teardownCode: `global.fetch = jest.fn(); // Restore in afterEach`,
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Generate mock code for sinon
|
|
104
|
+
*/
|
|
105
|
+
function buildSinonMock(target, apiCall) {
|
|
106
|
+
const responseType = inferResponseType(target.url);
|
|
107
|
+
const sampleResponse = SAMPLE_RESPONSES[responseType] || SAMPLE_RESPONSES.json;
|
|
108
|
+
const mockCode = `sinon.stub().resolves(${JSON.stringify(sampleResponse, null, 2)})`;
|
|
109
|
+
return {
|
|
110
|
+
target,
|
|
111
|
+
code: mockCode,
|
|
112
|
+
isInline: true,
|
|
113
|
+
imports: ['sinon'],
|
|
114
|
+
setupCode: `// In beforeEach:
|
|
115
|
+
const fetchStub = ${mockCode};
|
|
116
|
+
sinon.stub(global, 'fetch').returns(fetchStub);`,
|
|
117
|
+
teardownCode: `// In afterEach:
|
|
118
|
+
sinon.restore();`,
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Generate mock code for fetch-mock
|
|
123
|
+
*/
|
|
124
|
+
function buildFetchMockMock(target, apiCall) {
|
|
125
|
+
const responseType = inferResponseType(target.url);
|
|
126
|
+
const sampleResponse = SAMPLE_RESPONSES[responseType] || SAMPLE_RESPONSES.json;
|
|
127
|
+
const mockCode = `fetchMock.${target.method.toLowerCase()}('${target.url}', ${JSON.stringify(sampleResponse, null, 2)})`;
|
|
128
|
+
return {
|
|
129
|
+
target,
|
|
130
|
+
code: mockCode,
|
|
131
|
+
isInline: false,
|
|
132
|
+
imports: ['fetch-mock'],
|
|
133
|
+
setupCode: `fetchMock.restore(); // Reset before each test
|
|
134
|
+
${mockCode};`,
|
|
135
|
+
teardownCode: `fetchMock.restore(); // After each test`,
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Generate mock code for nock
|
|
140
|
+
*/
|
|
141
|
+
function buildNockMock(target, apiCall) {
|
|
142
|
+
const responseType = inferResponseType(target.url);
|
|
143
|
+
const sampleResponse = SAMPLE_RESPONSES[responseType] || SAMPLE_RESPONSES.json;
|
|
144
|
+
const mockCode = `nock('${getBaseUrl(target.url)}')
|
|
145
|
+
.${target.method.toLowerCase()}('${getPath(target.url)}')
|
|
146
|
+
.reply(200, ${JSON.stringify(sampleResponse, null, 2)})`;
|
|
147
|
+
return {
|
|
148
|
+
target,
|
|
149
|
+
code: mockCode,
|
|
150
|
+
isInline: false,
|
|
151
|
+
imports: ['nock'],
|
|
152
|
+
setupCode: `// Before tests:
|
|
153
|
+
const scope = ${mockCode};`,
|
|
154
|
+
teardownCode: `// After tests:
|
|
155
|
+
nock.cleanAll();`,
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Generate mock code for undici MockAgent
|
|
160
|
+
*/
|
|
161
|
+
function buildUndiciMock(target, apiCall) {
|
|
162
|
+
const responseType = inferResponseType(target.url);
|
|
163
|
+
const sampleResponse = SAMPLE_RESPONSES[responseType] || SAMPLE_RESPONSES.json;
|
|
164
|
+
const mockCode = `const mockAgent = new MockAgent();
|
|
165
|
+
mockAgent.disableNetConnect();
|
|
166
|
+
const pool = mockAgent.get('${getBaseUrl(target.url)}');
|
|
167
|
+
pool.intercept({
|
|
168
|
+
method: '${target.method}',
|
|
169
|
+
path: '${getPath(target.url)}',
|
|
170
|
+
}).reply(200, ${JSON.stringify(sampleResponse, null, 2)});`;
|
|
171
|
+
return {
|
|
172
|
+
target,
|
|
173
|
+
code: mockCode,
|
|
174
|
+
isInline: false,
|
|
175
|
+
imports: ['undici'],
|
|
176
|
+
setupCode: mockCode,
|
|
177
|
+
teardownCode: `await mockAgent.close();`,
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Infer the response type from URL patterns
|
|
182
|
+
*/
|
|
183
|
+
function inferResponseType(url) {
|
|
184
|
+
const lowerUrl = url.toLowerCase();
|
|
185
|
+
if (lowerUrl.includes('/user') || lowerUrl.includes('/profile')) {
|
|
186
|
+
return 'user';
|
|
187
|
+
}
|
|
188
|
+
if (lowerUrl.includes('/list') || lowerUrl.includes('/all') || lowerUrl.includes('/search')) {
|
|
189
|
+
return 'list';
|
|
190
|
+
}
|
|
191
|
+
if (lowerUrl.includes('/error') || lowerUrl.includes('/fail')) {
|
|
192
|
+
return 'error';
|
|
193
|
+
}
|
|
194
|
+
if (lowerUrl.includes('/api')) {
|
|
195
|
+
return 'json';
|
|
196
|
+
}
|
|
197
|
+
return 'success';
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* Extract base URL from full URL
|
|
201
|
+
*/
|
|
202
|
+
function getBaseUrl(url) {
|
|
203
|
+
try {
|
|
204
|
+
const parsed = new URL(url);
|
|
205
|
+
return parsed.origin;
|
|
206
|
+
}
|
|
207
|
+
catch {
|
|
208
|
+
return 'http://localhost:3000';
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* Extract path from URL
|
|
213
|
+
*/
|
|
214
|
+
function getPath(url) {
|
|
215
|
+
try {
|
|
216
|
+
const parsed = new URL(url);
|
|
217
|
+
return parsed.pathname;
|
|
218
|
+
}
|
|
219
|
+
catch {
|
|
220
|
+
return url;
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* Main function to build mock code from a mock target
|
|
225
|
+
*/
|
|
226
|
+
export function buildMock(target, apiCall) {
|
|
227
|
+
switch (target.mockLibrary) {
|
|
228
|
+
case 'msw':
|
|
229
|
+
return buildMswMock(target, apiCall);
|
|
230
|
+
case 'jest.fn':
|
|
231
|
+
return buildJestFnMock(target, apiCall);
|
|
232
|
+
case 'sinon':
|
|
233
|
+
return buildSinonMock(target, apiCall);
|
|
234
|
+
case 'fetch-mock':
|
|
235
|
+
return buildFetchMockMock(target, apiCall);
|
|
236
|
+
case 'nock':
|
|
237
|
+
return buildNockMock(target, apiCall);
|
|
238
|
+
case 'undici':
|
|
239
|
+
return buildUndiciMock(target, apiCall);
|
|
240
|
+
default:
|
|
241
|
+
// Default to jest.fn
|
|
242
|
+
return buildJestFnMock(target, apiCall);
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
/**
|
|
246
|
+
* Build mocks for multiple targets
|
|
247
|
+
*/
|
|
248
|
+
export function buildMocks(targets, apiCalls) {
|
|
249
|
+
return targets.map(target => {
|
|
250
|
+
const apiCall = apiCalls.get(target.apiCallId);
|
|
251
|
+
return buildMock(target, apiCall || {
|
|
252
|
+
id: target.apiCallId,
|
|
253
|
+
method: 'fetch',
|
|
254
|
+
url: target.url,
|
|
255
|
+
isExternal: true,
|
|
256
|
+
source: 'codebase',
|
|
257
|
+
httpMethod: target.method,
|
|
258
|
+
});
|
|
259
|
+
});
|
|
260
|
+
}
|
|
261
|
+
/**
|
|
262
|
+
* Generate complete mock file content
|
|
263
|
+
*/
|
|
264
|
+
export function generateMockFile(decisions, options) {
|
|
265
|
+
const framework = options?.framework || 'jest';
|
|
266
|
+
const allImports = new Set();
|
|
267
|
+
const allSetupCode = [];
|
|
268
|
+
const allTeardownCode = [];
|
|
269
|
+
const mockExports = [];
|
|
270
|
+
// Collect imports and code from all decisions
|
|
271
|
+
for (const decision of decisions) {
|
|
272
|
+
decision.imports.forEach(i => allImports.add(i));
|
|
273
|
+
if (decision.setupCode) {
|
|
274
|
+
allSetupCode.push(`// ${decision.target.url}\n${decision.setupCode}`);
|
|
275
|
+
}
|
|
276
|
+
if (decision.teardownCode) {
|
|
277
|
+
allTeardownCode.push(`// ${decision.target.url}\n${decision.teardownCode}`);
|
|
278
|
+
}
|
|
279
|
+
if (!decision.isInline) {
|
|
280
|
+
mockExports.push(decision.code);
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
// Build the file content
|
|
284
|
+
let content = '';
|
|
285
|
+
// Imports
|
|
286
|
+
if (allImports.size > 0) {
|
|
287
|
+
content += `import { ${Array.from(allImports).join(', ')} } from 'msw';\n`;
|
|
288
|
+
}
|
|
289
|
+
if (mockExports.length > 0) {
|
|
290
|
+
content += '\n// API handlers\n';
|
|
291
|
+
content += mockExports.join('\n\n');
|
|
292
|
+
}
|
|
293
|
+
// Setup function
|
|
294
|
+
content += '\n\n';
|
|
295
|
+
content += `export function setupMocks() {\n`;
|
|
296
|
+
content += allSetupCode.join('\n\n');
|
|
297
|
+
content += '\n}';
|
|
298
|
+
// Teardown function
|
|
299
|
+
content += '\n\n';
|
|
300
|
+
content += `export function teardownMocks() {\n`;
|
|
301
|
+
content += allTeardownCode.join('\n\n');
|
|
302
|
+
content += '\n}';
|
|
303
|
+
// For vitest, add auto-setup via beforeAll/afterAll
|
|
304
|
+
if (framework === 'vitest') {
|
|
305
|
+
content += '\n\n';
|
|
306
|
+
content += `// Vitest hooks (optional - use if not calling setupMocks manually)\n`;
|
|
307
|
+
content += `beforeAll(() => setupMocks());\n`;
|
|
308
|
+
content += `afterAll(() => teardownMocks());`;
|
|
309
|
+
}
|
|
310
|
+
return content;
|
|
311
|
+
}
|
|
312
|
+
/**
|
|
313
|
+
* Generate inline mock code for a single test
|
|
314
|
+
*/
|
|
315
|
+
export function generateInlineMock(decision, options) {
|
|
316
|
+
const framework = options?.framework || 'jest';
|
|
317
|
+
let code = '';
|
|
318
|
+
// Add imports if inline
|
|
319
|
+
if (decision.imports.length > 0) {
|
|
320
|
+
code += `import { ${decision.imports.join(', ')} } from '${decision.target.mockLibrary === 'msw' ? 'msw' : decision.target.mockLibrary}';\n\n`;
|
|
321
|
+
}
|
|
322
|
+
// Setup code
|
|
323
|
+
if (decision.setupCode) {
|
|
324
|
+
code += `// Setup mock for ${decision.target.url}\n`;
|
|
325
|
+
code += decision.setupCode;
|
|
326
|
+
code += '\n\n';
|
|
327
|
+
}
|
|
328
|
+
// Teardown hint
|
|
329
|
+
if (decision.teardownCode) {
|
|
330
|
+
code += `// Cleanup after test\n`;
|
|
331
|
+
code += decision.teardownCode;
|
|
332
|
+
}
|
|
333
|
+
return code.trim();
|
|
334
|
+
}
|
|
335
|
+
//# sourceMappingURL=builder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"builder.js","sourceRoot":"","sources":["../../../src/generator/mocks/builder.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dialog transform - converts dialog flows into optimized test code
|
|
3
|
+
*
|
|
4
|
+
* This module transforms detected DialogFlow objects into cleaner,
|
|
5
|
+
* more maintainable test code with helper functions.
|
|
6
|
+
*
|
|
7
|
+
* Output:
|
|
8
|
+
* - openDialog() helper function
|
|
9
|
+
* - Test steps that call helper + fill fields
|
|
10
|
+
* - Optional close verification
|
|
11
|
+
*/
|
|
12
|
+
import type { DialogFlow } from '../../parser/steps/dialog-detector.js';
|
|
13
|
+
export interface TransformedStep {
|
|
14
|
+
type: 'helper' | 'action' | 'assertion';
|
|
15
|
+
code: string;
|
|
16
|
+
description: string;
|
|
17
|
+
}
|
|
18
|
+
export interface DialogTestTemplate {
|
|
19
|
+
helpers: TransformedStep[];
|
|
20
|
+
testSteps: TransformedStep[];
|
|
21
|
+
cleanup?: TransformedStep[];
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Transform dialog flows into optimized test code
|
|
25
|
+
*
|
|
26
|
+
* @param flows - Array of detected dialog flows
|
|
27
|
+
* @returns Transformed steps ready for code generation
|
|
28
|
+
*/
|
|
29
|
+
export declare function transformDialogFlows(flows: DialogFlow[]): DialogTestTemplate[];
|
|
30
|
+
/**
|
|
31
|
+
* Generate complete test code from a dialog template
|
|
32
|
+
*/
|
|
33
|
+
export declare function generateDialogTestCode(template: DialogTestTemplate): string;
|
|
34
|
+
export default transformDialogFlows;
|
|
35
|
+
//# sourceMappingURL=dialog-transform.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dialog-transform.d.ts","sourceRoot":"","sources":["../../../src/generator/transforms/dialog-transform.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,KAAK,EAAE,UAAU,EAAc,MAAM,uCAAuC,CAAC;AAEpF,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,QAAQ,GAAG,QAAQ,GAAG,WAAW,CAAC;IACxC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,eAAe,EAAE,CAAC;IAC3B,SAAS,EAAE,eAAe,EAAE,CAAC;IAC7B,OAAO,CAAC,EAAE,eAAe,EAAE,CAAC;CAC7B;AAqRD;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,UAAU,EAAE,GAAG,kBAAkB,EAAE,CAM9E;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,kBAAkB,GAAG,MAAM,CAuB3E;AAED,eAAe,oBAAoB,CAAC"}
|