agentic-qe 2.6.0 → 2.6.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +156 -0
- package/README.md +222 -159
- package/dist/agents/BaseAgent.d.ts +19 -0
- package/dist/agents/BaseAgent.d.ts.map +1 -1
- package/dist/agents/BaseAgent.js +41 -1
- package/dist/agents/BaseAgent.js.map +1 -1
- package/dist/agents/CodeIntelligenceAgent.d.ts +14 -0
- package/dist/agents/CodeIntelligenceAgent.d.ts.map +1 -1
- package/dist/agents/CodeIntelligenceAgent.js +66 -0
- package/dist/agents/CodeIntelligenceAgent.js.map +1 -1
- package/dist/agents/CoverageAnalyzerAgent.d.ts +8 -0
- package/dist/agents/CoverageAnalyzerAgent.d.ts.map +1 -1
- package/dist/agents/CoverageAnalyzerAgent.js +65 -1
- package/dist/agents/CoverageAnalyzerAgent.js.map +1 -1
- package/dist/agents/TestGeneratorAgent.d.ts +2 -2
- package/dist/agents/TestGeneratorAgent.d.ts.map +1 -1
- package/dist/agents/TestGeneratorAgent.js +16 -6
- package/dist/agents/TestGeneratorAgent.js.map +1 -1
- package/dist/agents/adapters/AgentLLMAdapter.d.ts +127 -0
- package/dist/agents/adapters/AgentLLMAdapter.d.ts.map +1 -0
- package/dist/agents/adapters/AgentLLMAdapter.js +366 -0
- package/dist/agents/adapters/AgentLLMAdapter.js.map +1 -0
- package/dist/agents/adapters/index.d.ts +1 -0
- package/dist/agents/adapters/index.d.ts.map +1 -1
- package/dist/agents/adapters/index.js +5 -1
- package/dist/agents/adapters/index.js.map +1 -1
- package/dist/agents/interfaces/IAgentLLM.d.ts +257 -0
- package/dist/agents/interfaces/IAgentLLM.d.ts.map +1 -0
- package/dist/agents/interfaces/IAgentLLM.js +39 -0
- package/dist/agents/interfaces/IAgentLLM.js.map +1 -0
- package/dist/agents/interfaces/index.d.ts +10 -0
- package/dist/agents/interfaces/index.d.ts.map +1 -0
- package/dist/agents/interfaces/index.js +14 -0
- package/dist/agents/interfaces/index.js.map +1 -0
- package/dist/agents/n8n/N8nBaseAgent.d.ts +18 -0
- package/dist/agents/n8n/N8nBaseAgent.d.ts.map +1 -1
- package/dist/agents/n8n/N8nBaseAgent.js +80 -0
- package/dist/agents/n8n/N8nBaseAgent.js.map +1 -1
- package/dist/agents/pool/AgentPool.d.ts +112 -0
- package/dist/agents/pool/AgentPool.d.ts.map +1 -0
- package/dist/agents/pool/AgentPool.js +573 -0
- package/dist/agents/pool/AgentPool.js.map +1 -0
- package/dist/agents/pool/QEAgentPoolFactory.d.ts +118 -0
- package/dist/agents/pool/QEAgentPoolFactory.d.ts.map +1 -0
- package/dist/agents/pool/QEAgentPoolFactory.js +251 -0
- package/dist/agents/pool/QEAgentPoolFactory.js.map +1 -0
- package/dist/agents/pool/index.d.ts +34 -0
- package/dist/agents/pool/index.d.ts.map +1 -0
- package/dist/agents/pool/index.js +44 -0
- package/dist/agents/pool/index.js.map +1 -0
- package/dist/agents/pool/types.d.ts +227 -0
- package/dist/agents/pool/types.d.ts.map +1 -0
- package/dist/agents/pool/types.js +28 -0
- package/dist/agents/pool/types.js.map +1 -0
- package/dist/cli/commands/providers.d.ts +50 -0
- package/dist/cli/commands/providers.d.ts.map +1 -0
- package/dist/cli/commands/providers.js +403 -0
- package/dist/cli/commands/providers.js.map +1 -0
- package/dist/cli/index.js +62 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/code-intelligence/indexing/FileWatcher.d.ts.map +1 -1
- package/dist/code-intelligence/indexing/FileWatcher.js +11 -8
- package/dist/code-intelligence/indexing/FileWatcher.js.map +1 -1
- package/dist/config/ConfigLoader.d.ts +85 -0
- package/dist/config/ConfigLoader.d.ts.map +1 -0
- package/dist/config/ConfigLoader.js +420 -0
- package/dist/config/ConfigLoader.js.map +1 -0
- package/dist/config/ProviderConfig.d.ts +153 -0
- package/dist/config/ProviderConfig.d.ts.map +1 -0
- package/dist/config/ProviderConfig.js +155 -0
- package/dist/config/ProviderConfig.js.map +1 -0
- package/dist/config/index.d.ts +35 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +45 -0
- package/dist/config/index.js.map +1 -0
- package/dist/core/memory/HNSWVectorMemory.js +1 -1
- package/dist/mcp/handlers/agent-spawn.d.ts +71 -5
- package/dist/mcp/handlers/agent-spawn.d.ts.map +1 -1
- package/dist/mcp/handlers/agent-spawn.js +336 -110
- package/dist/mcp/handlers/agent-spawn.js.map +1 -1
- package/dist/mcp/handlers/fleet-init.d.ts +24 -0
- package/dist/mcp/handlers/fleet-init.d.ts.map +1 -1
- package/dist/mcp/handlers/fleet-init.js +56 -4
- package/dist/mcp/handlers/fleet-init.js.map +1 -1
- package/dist/mcp/server-instructions.d.ts +1 -1
- package/dist/mcp/server-instructions.js +1 -1
- package/dist/mcp/server.d.ts +1 -0
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/memory/HNSWPatternStore.d.ts.map +1 -1
- package/dist/memory/HNSWPatternStore.js +23 -0
- package/dist/memory/HNSWPatternStore.js.map +1 -1
- package/dist/memory/RuVectorPatternStore.d.ts +5 -0
- package/dist/memory/RuVectorPatternStore.d.ts.map +1 -1
- package/dist/memory/RuVectorPatternStore.js +11 -0
- package/dist/memory/RuVectorPatternStore.js.map +1 -1
- package/dist/plugins/BasePlugin.d.ts +111 -0
- package/dist/plugins/BasePlugin.d.ts.map +1 -0
- package/dist/plugins/BasePlugin.js +154 -0
- package/dist/plugins/BasePlugin.js.map +1 -0
- package/dist/plugins/PluginManager.d.ts +145 -0
- package/dist/plugins/PluginManager.d.ts.map +1 -0
- package/dist/plugins/PluginManager.js +862 -0
- package/dist/plugins/PluginManager.js.map +1 -0
- package/dist/plugins/adapters/McpToolsPlugin.d.ts +98 -0
- package/dist/plugins/adapters/McpToolsPlugin.d.ts.map +1 -0
- package/dist/plugins/adapters/McpToolsPlugin.js +518 -0
- package/dist/plugins/adapters/McpToolsPlugin.js.map +1 -0
- package/dist/plugins/adapters/PlaywrightPlugin.d.ts +63 -0
- package/dist/plugins/adapters/PlaywrightPlugin.d.ts.map +1 -0
- package/dist/plugins/adapters/PlaywrightPlugin.js +451 -0
- package/dist/plugins/adapters/PlaywrightPlugin.js.map +1 -0
- package/dist/plugins/adapters/VitestPlugin.d.ts +74 -0
- package/dist/plugins/adapters/VitestPlugin.d.ts.map +1 -0
- package/dist/plugins/adapters/VitestPlugin.js +589 -0
- package/dist/plugins/adapters/VitestPlugin.js.map +1 -0
- package/dist/plugins/adapters/index.d.ts +8 -0
- package/dist/plugins/adapters/index.d.ts.map +1 -0
- package/dist/plugins/adapters/index.js +17 -0
- package/dist/plugins/adapters/index.js.map +1 -0
- package/dist/plugins/index.d.ts +32 -0
- package/dist/plugins/index.d.ts.map +1 -0
- package/dist/plugins/index.js +48 -0
- package/dist/plugins/index.js.map +1 -0
- package/dist/plugins/types.d.ts +528 -0
- package/dist/plugins/types.d.ts.map +1 -0
- package/dist/plugins/types.js +61 -0
- package/dist/plugins/types.js.map +1 -0
- package/dist/providers/CostOptimizationStrategies.d.ts +297 -0
- package/dist/providers/CostOptimizationStrategies.d.ts.map +1 -0
- package/dist/providers/CostOptimizationStrategies.js +831 -0
- package/dist/providers/CostOptimizationStrategies.js.map +1 -0
- package/dist/providers/HybridRouter.d.ts +142 -5
- package/dist/providers/HybridRouter.d.ts.map +1 -1
- package/dist/providers/HybridRouter.js +472 -6
- package/dist/providers/HybridRouter.js.map +1 -1
- package/dist/providers/HybridRouterComplexityIntegration.d.ts +169 -0
- package/dist/providers/HybridRouterComplexityIntegration.d.ts.map +1 -0
- package/dist/providers/HybridRouterComplexityIntegration.js +319 -0
- package/dist/providers/HybridRouterComplexityIntegration.js.map +1 -0
- package/dist/providers/HybridRouterModelSelection.d.ts +106 -0
- package/dist/providers/HybridRouterModelSelection.d.ts.map +1 -0
- package/dist/providers/HybridRouterModelSelection.js +420 -0
- package/dist/providers/HybridRouterModelSelection.js.map +1 -0
- package/dist/providers/LLMProviderFactory.d.ts +23 -9
- package/dist/providers/LLMProviderFactory.d.ts.map +1 -1
- package/dist/providers/LLMProviderFactory.js +54 -11
- package/dist/providers/LLMProviderFactory.js.map +1 -1
- package/dist/providers/OllamaProvider.d.ts +122 -0
- package/dist/providers/OllamaProvider.d.ts.map +1 -0
- package/dist/providers/OllamaProvider.js +425 -0
- package/dist/providers/OllamaProvider.js.map +1 -0
- package/dist/providers/index.d.ts +6 -1
- package/dist/providers/index.d.ts.map +1 -1
- package/dist/providers/index.js +17 -1
- package/dist/providers/index.js.map +1 -1
- package/dist/routing/ComplexityClassifier.d.ts +266 -0
- package/dist/routing/ComplexityClassifier.d.ts.map +1 -0
- package/dist/routing/ComplexityClassifier.js +567 -0
- package/dist/routing/ComplexityClassifier.js.map +1 -0
- package/dist/routing/ModelCapabilityRegistry.d.ts +98 -0
- package/dist/routing/ModelCapabilityRegistry.d.ts.map +1 -0
- package/dist/routing/ModelCapabilityRegistry.js +216 -0
- package/dist/routing/ModelCapabilityRegistry.js.map +1 -0
- package/dist/routing/index.d.ts +13 -0
- package/dist/routing/index.d.ts.map +1 -0
- package/dist/routing/index.js +24 -0
- package/dist/routing/index.js.map +1 -0
- package/docs/reference/model-capability-registry.md +402 -0
- package/docs/reference/provider-config-schema.md +608 -0
- package/package.json +21 -3
|
@@ -0,0 +1,451 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Playwright Test Framework Plugin
|
|
4
|
+
* Phase 3 B2: Reference Plugin Implementation
|
|
5
|
+
*
|
|
6
|
+
* Provides Playwright test generation, parsing, and execution capabilities.
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.PlaywrightPlugin = void 0;
|
|
10
|
+
exports.createPlaywrightPlugin = createPlaywrightPlugin;
|
|
11
|
+
const child_process_1 = require("child_process");
|
|
12
|
+
const types_1 = require("../types");
|
|
13
|
+
const BasePlugin_1 = require("../BasePlugin");
|
|
14
|
+
/**
|
|
15
|
+
* Playwright Plugin - Test framework adapter for Playwright
|
|
16
|
+
*/
|
|
17
|
+
class PlaywrightPlugin extends BasePlugin_1.BasePlugin {
|
|
18
|
+
constructor() {
|
|
19
|
+
super(...arguments);
|
|
20
|
+
this.metadata = (0, BasePlugin_1.createPluginMetadata)({
|
|
21
|
+
id: '@agentic-qe/playwright-adapter',
|
|
22
|
+
name: 'Playwright Test Adapter',
|
|
23
|
+
version: '1.0.0',
|
|
24
|
+
description: 'Generate, parse, and execute Playwright tests',
|
|
25
|
+
author: 'Agentic QE Team',
|
|
26
|
+
category: types_1.PluginCategory.TEST_FRAMEWORK,
|
|
27
|
+
minAgenticQEVersion: '2.6.0',
|
|
28
|
+
});
|
|
29
|
+
this.filePatterns = [
|
|
30
|
+
'**/*.spec.ts',
|
|
31
|
+
'**/*.spec.js',
|
|
32
|
+
'**/*.test.ts',
|
|
33
|
+
'**/*.test.js',
|
|
34
|
+
'**/e2e/**/*.ts',
|
|
35
|
+
];
|
|
36
|
+
this.frameworkId = 'playwright';
|
|
37
|
+
this.initialized = false;
|
|
38
|
+
}
|
|
39
|
+
async onActivate(context) {
|
|
40
|
+
await super.onActivate(context);
|
|
41
|
+
// Register as test framework service
|
|
42
|
+
this.registerService('testFramework:playwright', this);
|
|
43
|
+
this.initialized = true;
|
|
44
|
+
this.log('info', 'Playwright adapter ready');
|
|
45
|
+
}
|
|
46
|
+
async onDeactivate(context) {
|
|
47
|
+
this.initialized = false;
|
|
48
|
+
await super.onDeactivate(context);
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Generate Playwright test from specification
|
|
52
|
+
*/
|
|
53
|
+
async generateTest(spec) {
|
|
54
|
+
this.log('debug', 'Generating Playwright test', { sourceFile: spec.sourceFilePath });
|
|
55
|
+
const imports = this.generateImports(spec);
|
|
56
|
+
const testCode = this.generateTestCode(spec);
|
|
57
|
+
const filePath = spec.targetFilePath || this.inferTestFilePath(spec.sourceFilePath);
|
|
58
|
+
return {
|
|
59
|
+
code: `${imports}\n\n${testCode}`,
|
|
60
|
+
filePath,
|
|
61
|
+
imports: ['@playwright/test'],
|
|
62
|
+
dependencies: [
|
|
63
|
+
{ name: '@playwright/test', version: '^1.40.0', dev: true },
|
|
64
|
+
],
|
|
65
|
+
metadata: {
|
|
66
|
+
testCount: this.countTests(testCode),
|
|
67
|
+
coveredFunctions: this.extractCoveredFunctions(spec.sourceCode),
|
|
68
|
+
coverageEstimate: 0.7, // Estimate
|
|
69
|
+
},
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Parse existing Playwright test file
|
|
74
|
+
*/
|
|
75
|
+
async parseTestFile(filePath, content) {
|
|
76
|
+
this.log('debug', 'Parsing Playwright test file', { filePath });
|
|
77
|
+
const suites = [];
|
|
78
|
+
const imports = [];
|
|
79
|
+
const hooks = [];
|
|
80
|
+
const lines = content.split('\n');
|
|
81
|
+
// Extract imports
|
|
82
|
+
for (let i = 0; i < lines.length; i++) {
|
|
83
|
+
const line = lines[i];
|
|
84
|
+
if (line.match(/^import\s/)) {
|
|
85
|
+
imports.push(line);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
// Parse test structure using regex (simplified)
|
|
89
|
+
const describeRegex = /test\.describe\s*\(\s*['"`](.+?)['"`]/g;
|
|
90
|
+
const testRegex = /test\s*\(\s*['"`](.+?)['"`]/g;
|
|
91
|
+
const beforeAllRegex = /test\.beforeAll/g;
|
|
92
|
+
const afterAllRegex = /test\.afterAll/g;
|
|
93
|
+
const beforeEachRegex = /test\.beforeEach/g;
|
|
94
|
+
const afterEachRegex = /test\.afterEach/g;
|
|
95
|
+
// Find describes (suites)
|
|
96
|
+
let match;
|
|
97
|
+
while ((match = describeRegex.exec(content)) !== null) {
|
|
98
|
+
const line = content.substring(0, match.index).split('\n').length;
|
|
99
|
+
suites.push({
|
|
100
|
+
name: match[1],
|
|
101
|
+
tests: [],
|
|
102
|
+
nestedSuites: [],
|
|
103
|
+
hooks: [],
|
|
104
|
+
line,
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
// Find standalone tests
|
|
108
|
+
const standaloneTests = [];
|
|
109
|
+
while ((match = testRegex.exec(content)) !== null) {
|
|
110
|
+
const line = content.substring(0, match.index).split('\n').length;
|
|
111
|
+
const isSkipped = content.substring(match.index - 10, match.index).includes('.skip');
|
|
112
|
+
const isOnly = content.substring(match.index - 10, match.index).includes('.only');
|
|
113
|
+
standaloneTests.push({
|
|
114
|
+
name: match[1],
|
|
115
|
+
line,
|
|
116
|
+
isSkipped,
|
|
117
|
+
isOnly,
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
// Find hooks
|
|
121
|
+
const hookPatterns = [
|
|
122
|
+
[beforeAllRegex, 'beforeAll'],
|
|
123
|
+
[afterAllRegex, 'afterAll'],
|
|
124
|
+
[beforeEachRegex, 'beforeEach'],
|
|
125
|
+
[afterEachRegex, 'afterEach'],
|
|
126
|
+
];
|
|
127
|
+
for (const [regex, type] of hookPatterns) {
|
|
128
|
+
while ((match = regex.exec(content)) !== null) {
|
|
129
|
+
const line = content.substring(0, match.index).split('\n').length;
|
|
130
|
+
hooks.push({ type, line });
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
// If no suites found, create a default one with standalone tests
|
|
134
|
+
if (suites.length === 0 && standaloneTests.length > 0) {
|
|
135
|
+
suites.push({
|
|
136
|
+
name: 'Default Suite',
|
|
137
|
+
tests: standaloneTests,
|
|
138
|
+
nestedSuites: [],
|
|
139
|
+
hooks: [],
|
|
140
|
+
line: 1,
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
return { suites, imports, hooks };
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Execute Playwright tests - REAL IMPLEMENTATION
|
|
147
|
+
*/
|
|
148
|
+
async executeTests(options) {
|
|
149
|
+
this.log('info', 'Executing Playwright tests', {
|
|
150
|
+
files: options.testFiles.length,
|
|
151
|
+
parallel: options.parallel,
|
|
152
|
+
});
|
|
153
|
+
const startTime = Date.now();
|
|
154
|
+
try {
|
|
155
|
+
// Build command arguments
|
|
156
|
+
const args = ['playwright', 'test', '--reporter=json'];
|
|
157
|
+
if (options.testFiles.length > 0) {
|
|
158
|
+
args.push(...options.testFiles);
|
|
159
|
+
}
|
|
160
|
+
if (options.testNamePattern) {
|
|
161
|
+
args.push('--grep', options.testNamePattern);
|
|
162
|
+
}
|
|
163
|
+
if (options.parallel === false) {
|
|
164
|
+
args.push('--workers=1');
|
|
165
|
+
}
|
|
166
|
+
else if (options.maxWorkers) {
|
|
167
|
+
args.push(`--workers=${options.maxWorkers}`);
|
|
168
|
+
}
|
|
169
|
+
if (options.timeout) {
|
|
170
|
+
args.push(`--timeout=${options.timeout}`);
|
|
171
|
+
}
|
|
172
|
+
// Actually execute via child process
|
|
173
|
+
const result = await this.spawnProcess('npx', args, options.env);
|
|
174
|
+
const duration = Date.now() - startTime;
|
|
175
|
+
// Parse JSON output from Playwright
|
|
176
|
+
const testResults = this.parsePlaywrightOutput(result.stdout, result.stderr);
|
|
177
|
+
return {
|
|
178
|
+
success: result.exitCode === 0,
|
|
179
|
+
tests: testResults,
|
|
180
|
+
duration,
|
|
181
|
+
output: result.stdout || result.stderr,
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
catch (error) {
|
|
185
|
+
return {
|
|
186
|
+
success: false,
|
|
187
|
+
tests: [],
|
|
188
|
+
duration: Date.now() - startTime,
|
|
189
|
+
output: `Error: ${error instanceof Error ? error.message : String(error)}`,
|
|
190
|
+
};
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* Spawn a child process and capture output
|
|
195
|
+
*/
|
|
196
|
+
spawnProcess(command, args, env) {
|
|
197
|
+
return new Promise((resolve, reject) => {
|
|
198
|
+
const child = (0, child_process_1.spawn)(command, args, {
|
|
199
|
+
env: { ...process.env, ...env },
|
|
200
|
+
shell: true,
|
|
201
|
+
cwd: process.cwd(),
|
|
202
|
+
});
|
|
203
|
+
let stdout = '';
|
|
204
|
+
let stderr = '';
|
|
205
|
+
child.stdout?.on('data', (data) => {
|
|
206
|
+
stdout += data.toString();
|
|
207
|
+
});
|
|
208
|
+
child.stderr?.on('data', (data) => {
|
|
209
|
+
stderr += data.toString();
|
|
210
|
+
});
|
|
211
|
+
child.on('close', (code) => {
|
|
212
|
+
resolve({
|
|
213
|
+
stdout,
|
|
214
|
+
stderr,
|
|
215
|
+
exitCode: code ?? 1,
|
|
216
|
+
});
|
|
217
|
+
});
|
|
218
|
+
child.on('error', (error) => {
|
|
219
|
+
reject(error);
|
|
220
|
+
});
|
|
221
|
+
});
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* Parse Playwright JSON output into TestResult array
|
|
225
|
+
*/
|
|
226
|
+
parsePlaywrightOutput(stdout, stderr) {
|
|
227
|
+
const results = [];
|
|
228
|
+
try {
|
|
229
|
+
// Try to parse JSON output
|
|
230
|
+
const jsonMatch = stdout.match(/\{[\s\S]*"suites"[\s\S]*\}/);
|
|
231
|
+
if (jsonMatch) {
|
|
232
|
+
const report = JSON.parse(jsonMatch[0]);
|
|
233
|
+
// Extract test results from Playwright JSON format
|
|
234
|
+
const extractTests = (suites) => {
|
|
235
|
+
for (const suite of suites || []) {
|
|
236
|
+
for (const spec of suite.specs || []) {
|
|
237
|
+
for (const test of spec.tests || []) {
|
|
238
|
+
const result = test.results?.[0];
|
|
239
|
+
results.push({
|
|
240
|
+
name: spec.title,
|
|
241
|
+
suite: suite.title,
|
|
242
|
+
status: this.mapPlaywrightStatus(result?.status || 'skipped'),
|
|
243
|
+
duration: result?.duration || 0,
|
|
244
|
+
error: result?.error ? {
|
|
245
|
+
message: result.error.message || 'Unknown error',
|
|
246
|
+
stack: result.error.stack,
|
|
247
|
+
} : undefined,
|
|
248
|
+
});
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
// Recurse into nested suites
|
|
252
|
+
if (suite.suites) {
|
|
253
|
+
extractTests(suite.suites);
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
};
|
|
257
|
+
extractTests(report.suites || []);
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
catch {
|
|
261
|
+
// If JSON parsing fails, try to parse text output
|
|
262
|
+
this.log('debug', 'Failed to parse JSON, falling back to text parsing');
|
|
263
|
+
const passedMatch = stdout.match(/(\d+) passed/);
|
|
264
|
+
const failedMatch = stdout.match(/(\d+) failed/);
|
|
265
|
+
const skippedMatch = stdout.match(/(\d+) skipped/);
|
|
266
|
+
if (passedMatch || failedMatch || skippedMatch) {
|
|
267
|
+
const passed = parseInt(passedMatch?.[1] || '0', 10);
|
|
268
|
+
const failed = parseInt(failedMatch?.[1] || '0', 10);
|
|
269
|
+
const skipped = parseInt(skippedMatch?.[1] || '0', 10);
|
|
270
|
+
for (let i = 0; i < passed; i++) {
|
|
271
|
+
results.push({ name: `Test ${i + 1}`, suite: 'Suite', status: 'passed', duration: 0 });
|
|
272
|
+
}
|
|
273
|
+
for (let i = 0; i < failed; i++) {
|
|
274
|
+
results.push({ name: `Failed Test ${i + 1}`, suite: 'Suite', status: 'failed', duration: 0 });
|
|
275
|
+
}
|
|
276
|
+
for (let i = 0; i < skipped; i++) {
|
|
277
|
+
results.push({ name: `Skipped Test ${i + 1}`, suite: 'Suite', status: 'skipped', duration: 0 });
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
return results;
|
|
282
|
+
}
|
|
283
|
+
/**
|
|
284
|
+
* Map Playwright status to our status type
|
|
285
|
+
*/
|
|
286
|
+
mapPlaywrightStatus(status) {
|
|
287
|
+
switch (status) {
|
|
288
|
+
case 'passed':
|
|
289
|
+
case 'expected':
|
|
290
|
+
return 'passed';
|
|
291
|
+
case 'failed':
|
|
292
|
+
case 'unexpected':
|
|
293
|
+
case 'timedOut':
|
|
294
|
+
return 'failed';
|
|
295
|
+
case 'skipped':
|
|
296
|
+
return 'skipped';
|
|
297
|
+
default:
|
|
298
|
+
return 'pending';
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
/**
|
|
302
|
+
* Get Playwright framework configuration
|
|
303
|
+
*/
|
|
304
|
+
getFrameworkConfig() {
|
|
305
|
+
return {
|
|
306
|
+
configFileName: 'playwright.config.ts',
|
|
307
|
+
defaultTestDir: 'tests',
|
|
308
|
+
configTemplate: this.getConfigTemplate(),
|
|
309
|
+
dependencies: [
|
|
310
|
+
{ name: '@playwright/test', version: '^1.40.0', dev: true },
|
|
311
|
+
],
|
|
312
|
+
};
|
|
313
|
+
}
|
|
314
|
+
// === Private Methods ===
|
|
315
|
+
generateImports(spec) {
|
|
316
|
+
const imports = ["import { test, expect } from '@playwright/test';"];
|
|
317
|
+
if (spec.testType === 'e2e') {
|
|
318
|
+
imports.push("import { Page } from '@playwright/test';");
|
|
319
|
+
}
|
|
320
|
+
return imports.join('\n');
|
|
321
|
+
}
|
|
322
|
+
generateTestCode(spec) {
|
|
323
|
+
const functionNames = this.extractFunctionNames(spec.sourceCode);
|
|
324
|
+
const className = this.extractClassName(spec.sourceCode);
|
|
325
|
+
const tests = [];
|
|
326
|
+
if (spec.testType === 'e2e') {
|
|
327
|
+
tests.push(this.generateE2ETests(spec));
|
|
328
|
+
}
|
|
329
|
+
else if (spec.testType === 'component') {
|
|
330
|
+
tests.push(this.generateComponentTests(spec, className, functionNames));
|
|
331
|
+
}
|
|
332
|
+
else {
|
|
333
|
+
tests.push(this.generateUnitTests(spec, className, functionNames));
|
|
334
|
+
}
|
|
335
|
+
const suiteName = className || 'Module';
|
|
336
|
+
return `test.describe('${suiteName}', () => {\n${tests.join('\n\n')}\n});`;
|
|
337
|
+
}
|
|
338
|
+
generateE2ETests(spec) {
|
|
339
|
+
return ` test('should load the page successfully', async ({ page }) => {
|
|
340
|
+
await page.goto('/');
|
|
341
|
+
await expect(page).toHaveTitle(/./);
|
|
342
|
+
});
|
|
343
|
+
|
|
344
|
+
test('should navigate correctly', async ({ page }) => {
|
|
345
|
+
await page.goto('/');
|
|
346
|
+
// Add navigation tests based on the source
|
|
347
|
+
await expect(page.locator('body')).toBeVisible();
|
|
348
|
+
});`;
|
|
349
|
+
}
|
|
350
|
+
generateComponentTests(spec, className, functionNames) {
|
|
351
|
+
const tests = [];
|
|
352
|
+
tests.push(` test('should render ${className || 'component'} correctly', async ({ page }) => {
|
|
353
|
+
// Component render test
|
|
354
|
+
await expect(page.locator('[data-testid="${(className || 'component').toLowerCase()}"]')).toBeVisible();
|
|
355
|
+
});`);
|
|
356
|
+
for (const fn of functionNames.slice(0, 3)) {
|
|
357
|
+
tests.push(` test('should handle ${fn} interaction', async ({ page }) => {
|
|
358
|
+
// Interaction test for ${fn}
|
|
359
|
+
await expect(page.locator('body')).toBeVisible();
|
|
360
|
+
});`);
|
|
361
|
+
}
|
|
362
|
+
return tests.join('\n\n');
|
|
363
|
+
}
|
|
364
|
+
generateUnitTests(spec, className, functionNames) {
|
|
365
|
+
const tests = [];
|
|
366
|
+
for (const fn of functionNames) {
|
|
367
|
+
tests.push(` test('${fn} should work correctly', async ({ page }) => {
|
|
368
|
+
// Unit test for ${fn}
|
|
369
|
+
// Note: Playwright is typically for E2E, consider using Vitest for unit tests
|
|
370
|
+
await expect(true).toBe(true);
|
|
371
|
+
});`);
|
|
372
|
+
}
|
|
373
|
+
if (tests.length === 0) {
|
|
374
|
+
tests.push(` test('should pass basic validation', async ({ page }) => {
|
|
375
|
+
await expect(true).toBe(true);
|
|
376
|
+
});`);
|
|
377
|
+
}
|
|
378
|
+
return tests.join('\n\n');
|
|
379
|
+
}
|
|
380
|
+
extractFunctionNames(sourceCode) {
|
|
381
|
+
const patterns = [
|
|
382
|
+
/function\s+(\w+)/g,
|
|
383
|
+
/(\w+)\s*=\s*(?:async\s*)?\(/g,
|
|
384
|
+
/(\w+)\s*\([^)]*\)\s*{/g,
|
|
385
|
+
/async\s+(\w+)\s*\(/g,
|
|
386
|
+
];
|
|
387
|
+
const names = new Set();
|
|
388
|
+
for (const pattern of patterns) {
|
|
389
|
+
let match;
|
|
390
|
+
while ((match = pattern.exec(sourceCode)) !== null) {
|
|
391
|
+
if (match[1] && !['if', 'for', 'while', 'switch', 'catch'].includes(match[1])) {
|
|
392
|
+
names.add(match[1]);
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
return Array.from(names);
|
|
397
|
+
}
|
|
398
|
+
extractClassName(sourceCode) {
|
|
399
|
+
const match = sourceCode.match(/class\s+(\w+)/);
|
|
400
|
+
return match ? match[1] : null;
|
|
401
|
+
}
|
|
402
|
+
extractCoveredFunctions(sourceCode) {
|
|
403
|
+
return this.extractFunctionNames(sourceCode);
|
|
404
|
+
}
|
|
405
|
+
countTests(testCode) {
|
|
406
|
+
const matches = testCode.match(/test\s*\(/g);
|
|
407
|
+
return matches ? matches.length : 0;
|
|
408
|
+
}
|
|
409
|
+
inferTestFilePath(sourceFilePath) {
|
|
410
|
+
const dir = sourceFilePath.replace(/\/[^/]+$/, '');
|
|
411
|
+
const fileName = sourceFilePath.replace(/^.*\//, '').replace(/\.(ts|js|tsx|jsx)$/, '');
|
|
412
|
+
return `${dir}/__tests__/${fileName}.spec.ts`;
|
|
413
|
+
}
|
|
414
|
+
getConfigTemplate() {
|
|
415
|
+
return `import { defineConfig, devices } from '@playwright/test';
|
|
416
|
+
|
|
417
|
+
export default defineConfig({
|
|
418
|
+
testDir: './tests',
|
|
419
|
+
fullyParallel: true,
|
|
420
|
+
forbidOnly: !!process.env.CI,
|
|
421
|
+
retries: process.env.CI ? 2 : 0,
|
|
422
|
+
workers: process.env.CI ? 1 : undefined,
|
|
423
|
+
reporter: 'html',
|
|
424
|
+
use: {
|
|
425
|
+
trace: 'on-first-retry',
|
|
426
|
+
},
|
|
427
|
+
projects: [
|
|
428
|
+
{
|
|
429
|
+
name: 'chromium',
|
|
430
|
+
use: { ...devices['Desktop Chrome'] },
|
|
431
|
+
},
|
|
432
|
+
{
|
|
433
|
+
name: 'firefox',
|
|
434
|
+
use: { ...devices['Desktop Firefox'] },
|
|
435
|
+
},
|
|
436
|
+
{
|
|
437
|
+
name: 'webkit',
|
|
438
|
+
use: { ...devices['Desktop Safari'] },
|
|
439
|
+
},
|
|
440
|
+
],
|
|
441
|
+
});`;
|
|
442
|
+
}
|
|
443
|
+
}
|
|
444
|
+
exports.PlaywrightPlugin = PlaywrightPlugin;
|
|
445
|
+
/**
|
|
446
|
+
* Factory function for plugin registration
|
|
447
|
+
*/
|
|
448
|
+
function createPlaywrightPlugin() {
|
|
449
|
+
return new PlaywrightPlugin();
|
|
450
|
+
}
|
|
451
|
+
//# sourceMappingURL=PlaywrightPlugin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PlaywrightPlugin.js","sourceRoot":"","sources":["../../../src/plugins/adapters/PlaywrightPlugin.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Vitest Test Framework Plugin
|
|
3
|
+
* Phase 3 B2: Reference Plugin Implementation
|
|
4
|
+
*
|
|
5
|
+
* Provides Vitest test generation, parsing, and execution capabilities.
|
|
6
|
+
* Designed as a Jest alternative with modern ESM support.
|
|
7
|
+
*/
|
|
8
|
+
import { TestFrameworkPlugin, PluginMetadata, PluginContext, TestGenerationSpec, GeneratedTest, ParsedTestFile, TestExecutionOptions, TestExecutionResult, FrameworkConfig } from '../types';
|
|
9
|
+
import { BasePlugin } from '../BasePlugin';
|
|
10
|
+
/**
|
|
11
|
+
* Vitest Plugin - Test framework adapter for Vitest
|
|
12
|
+
*/
|
|
13
|
+
export declare class VitestPlugin extends BasePlugin implements TestFrameworkPlugin {
|
|
14
|
+
readonly metadata: PluginMetadata;
|
|
15
|
+
readonly filePatterns: string[];
|
|
16
|
+
readonly frameworkId = "vitest";
|
|
17
|
+
private initialized;
|
|
18
|
+
onActivate(context: PluginContext): Promise<void>;
|
|
19
|
+
onDeactivate(context: PluginContext): Promise<void>;
|
|
20
|
+
/**
|
|
21
|
+
* Generate Vitest test from specification
|
|
22
|
+
*/
|
|
23
|
+
generateTest(spec: TestGenerationSpec): Promise<GeneratedTest>;
|
|
24
|
+
/**
|
|
25
|
+
* Parse existing Vitest test file
|
|
26
|
+
*/
|
|
27
|
+
parseTestFile(filePath: string, content: string): Promise<ParsedTestFile>;
|
|
28
|
+
/**
|
|
29
|
+
* Execute Vitest tests - REAL IMPLEMENTATION
|
|
30
|
+
*/
|
|
31
|
+
executeTests(options: TestExecutionOptions): Promise<TestExecutionResult>;
|
|
32
|
+
/**
|
|
33
|
+
* Spawn a child process and capture output
|
|
34
|
+
*/
|
|
35
|
+
private spawnProcess;
|
|
36
|
+
/**
|
|
37
|
+
* Parse Vitest JSON output into TestResult array and CoverageData
|
|
38
|
+
*/
|
|
39
|
+
private parseVitestOutput;
|
|
40
|
+
/**
|
|
41
|
+
* Parse coverage map from Vitest JSON output
|
|
42
|
+
*/
|
|
43
|
+
private parseCoverageMap;
|
|
44
|
+
/**
|
|
45
|
+
* Parse coverage from text output (fallback)
|
|
46
|
+
*/
|
|
47
|
+
private parseCoverageFromText;
|
|
48
|
+
/**
|
|
49
|
+
* Map Vitest status to our status type
|
|
50
|
+
*/
|
|
51
|
+
private mapVitestStatus;
|
|
52
|
+
/**
|
|
53
|
+
* Get Vitest framework configuration
|
|
54
|
+
*/
|
|
55
|
+
getFrameworkConfig(): FrameworkConfig;
|
|
56
|
+
private generateImports;
|
|
57
|
+
private generateTestCode;
|
|
58
|
+
private generateUnitTests;
|
|
59
|
+
private generateIntegrationTests;
|
|
60
|
+
private generateGenericTests;
|
|
61
|
+
private extractFunctionNames;
|
|
62
|
+
private extractClassName;
|
|
63
|
+
private extractModuleName;
|
|
64
|
+
private extractCoveredFunctions;
|
|
65
|
+
private countTests;
|
|
66
|
+
private inferTestFilePath;
|
|
67
|
+
private getRelativeImportPath;
|
|
68
|
+
private getConfigTemplate;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Factory function for plugin registration
|
|
72
|
+
*/
|
|
73
|
+
export declare function createVitestPlugin(): VitestPlugin;
|
|
74
|
+
//# sourceMappingURL=VitestPlugin.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"VitestPlugin.d.ts","sourceRoot":"","sources":["../../../src/plugins/adapters/VitestPlugin.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EACL,mBAAmB,EACnB,cAAc,EACd,aAAa,EAEb,kBAAkB,EAClB,aAAa,EACb,cAAc,EAId,oBAAoB,EACpB,mBAAmB,EAGnB,eAAe,EAChB,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,UAAU,EAAwB,MAAM,eAAe,CAAC;AAEjE;;GAEG;AACH,qBAAa,YAAa,SAAQ,UAAW,YAAW,mBAAmB;IACzE,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAQ9B;IAEH,QAAQ,CAAC,YAAY,WAOnB;IAEF,QAAQ,CAAC,WAAW,YAAY;IAEhC,OAAO,CAAC,WAAW,CAAS;IAEtB,UAAU,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAUjD,YAAY,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAKzD;;OAEG;IACG,YAAY,CAAC,IAAI,EAAE,kBAAkB,GAAG,OAAO,CAAC,aAAa,CAAC;IAsBpE;;OAEG;IACG,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAwF/E;;OAEG;IACG,YAAY,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAmE/E;;OAEG;IACH,OAAO,CAAC,YAAY;IAqCpB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAmEzB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IA2DxB;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAmB7B;;OAEG;IACH,OAAO,CAAC,eAAe;IAevB;;OAEG;IACH,kBAAkB,IAAI,eAAe;IAcrC,OAAO,CAAC,eAAe;IAkBvB,OAAO,CAAC,gBAAgB;IAkBxB,OAAO,CAAC,iBAAiB;IA0CzB,OAAO,CAAC,wBAAwB;IA+BhC,OAAO,CAAC,oBAAoB;IAuB5B,OAAO,CAAC,oBAAoB;IAqB5B,OAAO,CAAC,gBAAgB;IAKxB,OAAO,CAAC,iBAAiB;IAKzB,OAAO,CAAC,uBAAuB;IAI/B,OAAO,CAAC,UAAU;IAKlB,OAAO,CAAC,iBAAiB;IAMzB,OAAO,CAAC,qBAAqB;IAc7B,OAAO,CAAC,iBAAiB;CAwB1B;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,YAAY,CAEjD"}
|