driftdetect 0.4.6 → 0.5.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/LICENSE +21 -0
- package/dist/bin/drift.js +27 -1
- package/dist/bin/drift.js.map +1 -1
- package/dist/commands/approve.d.ts +20 -0
- package/dist/commands/approve.d.ts.map +1 -1
- package/dist/commands/approve.js +38 -72
- package/dist/commands/approve.js.map +1 -1
- package/dist/commands/callgraph.js +4 -4
- package/dist/commands/callgraph.js.map +1 -1
- package/dist/commands/check.d.ts +41 -0
- package/dist/commands/check.d.ts.map +1 -1
- package/dist/commands/check.js +21 -11
- package/dist/commands/check.js.map +1 -1
- package/dist/commands/coupling.d.ts +17 -0
- package/dist/commands/coupling.d.ts.map +1 -0
- package/dist/commands/coupling.js +726 -0
- package/dist/commands/coupling.js.map +1 -0
- package/dist/commands/error-handling.d.ts +15 -0
- package/dist/commands/error-handling.d.ts.map +1 -0
- package/dist/commands/error-handling.js +608 -0
- package/dist/commands/error-handling.js.map +1 -0
- package/dist/commands/export.d.ts +16 -0
- package/dist/commands/export.d.ts.map +1 -1
- package/dist/commands/export.js +46 -50
- package/dist/commands/export.js.map +1 -1
- package/dist/commands/files.d.ts +15 -0
- package/dist/commands/files.d.ts.map +1 -1
- package/dist/commands/files.js +27 -48
- package/dist/commands/files.js.map +1 -1
- package/dist/commands/ignore.d.ts +20 -0
- package/dist/commands/ignore.d.ts.map +1 -1
- package/dist/commands/ignore.js +25 -48
- package/dist/commands/ignore.js.map +1 -1
- package/dist/commands/index.d.ts +6 -0
- package/dist/commands/index.d.ts.map +1 -1
- package/dist/commands/index.js +7 -0
- package/dist/commands/index.js.map +1 -1
- package/dist/commands/migrate-storage.d.ts +23 -0
- package/dist/commands/migrate-storage.d.ts.map +1 -0
- package/dist/commands/migrate-storage.js +337 -0
- package/dist/commands/migrate-storage.js.map +1 -0
- package/dist/commands/report.d.ts +22 -0
- package/dist/commands/report.d.ts.map +1 -1
- package/dist/commands/report.js +19 -10
- package/dist/commands/report.js.map +1 -1
- package/dist/commands/scan.d.ts +37 -0
- package/dist/commands/scan.d.ts.map +1 -1
- package/dist/commands/scan.js +233 -8
- package/dist/commands/scan.js.map +1 -1
- package/dist/commands/skills.d.ts +16 -0
- package/dist/commands/skills.d.ts.map +1 -0
- package/dist/commands/skills.js +409 -0
- package/dist/commands/skills.js.map +1 -0
- package/dist/commands/status.d.ts +20 -0
- package/dist/commands/status.d.ts.map +1 -1
- package/dist/commands/status.js +74 -72
- package/dist/commands/status.js.map +1 -1
- package/dist/commands/test-topology.d.ts +15 -0
- package/dist/commands/test-topology.d.ts.map +1 -0
- package/dist/commands/test-topology.js +589 -0
- package/dist/commands/test-topology.js.map +1 -0
- package/dist/commands/where.d.ts +15 -0
- package/dist/commands/where.d.ts.map +1 -1
- package/dist/commands/where.js +41 -88
- package/dist/commands/where.js.map +1 -1
- package/dist/commands/wrappers.d.ts +16 -0
- package/dist/commands/wrappers.d.ts.map +1 -0
- package/dist/commands/wrappers.js +181 -0
- package/dist/commands/wrappers.js.map +1 -0
- package/dist/services/pattern-service-factory.d.ts +37 -0
- package/dist/services/pattern-service-factory.d.ts.map +1 -0
- package/dist/services/pattern-service-factory.js +41 -0
- package/dist/services/pattern-service-factory.js.map +1 -0
- package/dist/services/scanner-service.d.ts +210 -0
- package/dist/services/scanner-service.d.ts.map +1 -1
- package/dist/services/scanner-service.js +298 -102
- package/dist/services/scanner-service.js.map +1 -1
- package/dist/workers/detector-worker.d.ts +107 -0
- package/dist/workers/detector-worker.d.ts.map +1 -0
- package/dist/workers/detector-worker.js +293 -0
- package/dist/workers/detector-worker.js.map +1 -0
- package/package.json +18 -17
|
@@ -0,0 +1,589 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Test Topology Command - drift test-topology
|
|
3
|
+
*
|
|
4
|
+
* Analyze test-to-code mappings, mock patterns, and test quality.
|
|
5
|
+
* Answers: "Which tests cover this code?" and "What's the minimum test set?"
|
|
6
|
+
*/
|
|
7
|
+
import { Command } from 'commander';
|
|
8
|
+
import * as fs from 'node:fs/promises';
|
|
9
|
+
import * as path from 'node:path';
|
|
10
|
+
import chalk from 'chalk';
|
|
11
|
+
import { createTestTopologyAnalyzer, createCallGraphAnalyzer, } from 'driftdetect-core';
|
|
12
|
+
import { createSpinner } from '../ui/spinner.js';
|
|
13
|
+
const DRIFT_DIR = '.drift';
|
|
14
|
+
const TEST_TOPOLOGY_DIR = 'test-topology';
|
|
15
|
+
/**
|
|
16
|
+
* Test file patterns (regex)
|
|
17
|
+
*/
|
|
18
|
+
const TEST_FILE_PATTERNS = [
|
|
19
|
+
/\.test\.[jt]sx?$/,
|
|
20
|
+
/\.spec\.[jt]sx?$/,
|
|
21
|
+
/_test\.py$/,
|
|
22
|
+
/test_.*\.py$/,
|
|
23
|
+
/Test\.java$/,
|
|
24
|
+
/Tests\.java$/,
|
|
25
|
+
/Test\.cs$/,
|
|
26
|
+
/Tests\.cs$/,
|
|
27
|
+
/Test\.php$/,
|
|
28
|
+
];
|
|
29
|
+
/**
|
|
30
|
+
* Directories to skip
|
|
31
|
+
*/
|
|
32
|
+
const SKIP_DIRS = new Set([
|
|
33
|
+
'node_modules', 'vendor', 'dist', 'build', '.git', '.drift',
|
|
34
|
+
'__pycache__', '.venv', 'venv', 'target', 'bin', 'obj',
|
|
35
|
+
]);
|
|
36
|
+
/**
|
|
37
|
+
* Check if a filename matches test file patterns
|
|
38
|
+
*/
|
|
39
|
+
function isTestFile(filename) {
|
|
40
|
+
return TEST_FILE_PATTERNS.some(pattern => pattern.test(filename));
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Recursively find test files
|
|
44
|
+
*/
|
|
45
|
+
async function findTestFiles(rootDir, subDir = '') {
|
|
46
|
+
const testFiles = [];
|
|
47
|
+
const currentDir = path.join(rootDir, subDir);
|
|
48
|
+
try {
|
|
49
|
+
const entries = await fs.readdir(currentDir, { withFileTypes: true });
|
|
50
|
+
for (const entry of entries) {
|
|
51
|
+
if (SKIP_DIRS.has(entry.name))
|
|
52
|
+
continue;
|
|
53
|
+
const relativePath = path.join(subDir, entry.name);
|
|
54
|
+
if (entry.isDirectory()) {
|
|
55
|
+
const subFiles = await findTestFiles(rootDir, relativePath);
|
|
56
|
+
testFiles.push(...subFiles);
|
|
57
|
+
}
|
|
58
|
+
else if (entry.isFile() && isTestFile(entry.name)) {
|
|
59
|
+
testFiles.push(relativePath);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
// Directory not readable, skip
|
|
65
|
+
}
|
|
66
|
+
return testFiles;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Check if test topology data exists
|
|
70
|
+
*/
|
|
71
|
+
async function topologyExists(rootDir) {
|
|
72
|
+
try {
|
|
73
|
+
await fs.access(path.join(rootDir, DRIFT_DIR, TEST_TOPOLOGY_DIR, 'summary.json'));
|
|
74
|
+
return true;
|
|
75
|
+
}
|
|
76
|
+
catch {
|
|
77
|
+
return false;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Show helpful message when topology not built
|
|
82
|
+
*/
|
|
83
|
+
function showNotBuiltMessage() {
|
|
84
|
+
console.log();
|
|
85
|
+
console.log(chalk.yellow('⚠️ No test topology built yet.'));
|
|
86
|
+
console.log();
|
|
87
|
+
console.log(chalk.gray('Build test topology to analyze test coverage:'));
|
|
88
|
+
console.log();
|
|
89
|
+
console.log(chalk.cyan(' drift test-topology build'));
|
|
90
|
+
console.log();
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Build subcommand - analyze test files and build mappings
|
|
94
|
+
*/
|
|
95
|
+
async function buildAction(options) {
|
|
96
|
+
const rootDir = process.cwd();
|
|
97
|
+
const format = options.format ?? 'text';
|
|
98
|
+
const isTextFormat = format === 'text';
|
|
99
|
+
try {
|
|
100
|
+
if (isTextFormat) {
|
|
101
|
+
console.log();
|
|
102
|
+
console.log(chalk.bold('🧪 Building Test Topology'));
|
|
103
|
+
console.log(chalk.gray('═'.repeat(50)));
|
|
104
|
+
}
|
|
105
|
+
const spinner = isTextFormat ? createSpinner('Initializing...') : null;
|
|
106
|
+
spinner?.start();
|
|
107
|
+
// Initialize analyzer with available parsers
|
|
108
|
+
spinner?.text('Loading parsers...');
|
|
109
|
+
const analyzer = createTestTopologyAnalyzer({});
|
|
110
|
+
// Try to load call graph for transitive analysis
|
|
111
|
+
spinner?.text('Loading call graph...');
|
|
112
|
+
try {
|
|
113
|
+
const callGraphAnalyzer = createCallGraphAnalyzer({ rootDir });
|
|
114
|
+
await callGraphAnalyzer.initialize();
|
|
115
|
+
const graph = callGraphAnalyzer.getGraph();
|
|
116
|
+
if (graph) {
|
|
117
|
+
analyzer.setCallGraph(graph);
|
|
118
|
+
if (isTextFormat) {
|
|
119
|
+
spinner?.text('Call graph loaded for transitive analysis');
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
catch {
|
|
124
|
+
if (isTextFormat) {
|
|
125
|
+
spinner?.text('No call graph found, using direct analysis only');
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
// Find test files
|
|
129
|
+
spinner?.text('Finding test files...');
|
|
130
|
+
const testFiles = await findTestFiles(rootDir);
|
|
131
|
+
if (testFiles.length === 0) {
|
|
132
|
+
spinner?.stop();
|
|
133
|
+
if (format === 'json') {
|
|
134
|
+
console.log(JSON.stringify({ error: 'No test files found' }));
|
|
135
|
+
}
|
|
136
|
+
else {
|
|
137
|
+
console.log(chalk.yellow('\n⚠️ No test files found matching common patterns.'));
|
|
138
|
+
}
|
|
139
|
+
return;
|
|
140
|
+
}
|
|
141
|
+
// Extract tests from each file
|
|
142
|
+
spinner?.text(`Extracting tests from ${testFiles.length} files...`);
|
|
143
|
+
let extractedCount = 0;
|
|
144
|
+
let errorCount = 0;
|
|
145
|
+
for (const testFile of testFiles) {
|
|
146
|
+
try {
|
|
147
|
+
const content = await fs.readFile(path.join(rootDir, testFile), 'utf-8');
|
|
148
|
+
const extraction = analyzer.extractFromFile(content, testFile);
|
|
149
|
+
if (extraction) {
|
|
150
|
+
extractedCount++;
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
catch (err) {
|
|
154
|
+
errorCount++;
|
|
155
|
+
if (options.verbose) {
|
|
156
|
+
console.error(`Error extracting ${testFile}:`, err);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
// Build mappings
|
|
161
|
+
spinner?.text('Building test-to-code mappings...');
|
|
162
|
+
analyzer.buildMappings();
|
|
163
|
+
// Get results
|
|
164
|
+
const summary = analyzer.getSummary();
|
|
165
|
+
const mockAnalysis = analyzer.analyzeMocks();
|
|
166
|
+
// Save results
|
|
167
|
+
spinner?.text('Saving results...');
|
|
168
|
+
const topologyDir = path.join(rootDir, DRIFT_DIR, TEST_TOPOLOGY_DIR);
|
|
169
|
+
await fs.mkdir(topologyDir, { recursive: true });
|
|
170
|
+
await fs.writeFile(path.join(topologyDir, 'summary.json'), JSON.stringify({ summary, mockAnalysis, generatedAt: new Date().toISOString() }, null, 2));
|
|
171
|
+
spinner?.stop();
|
|
172
|
+
// Output
|
|
173
|
+
if (format === 'json') {
|
|
174
|
+
console.log(JSON.stringify({
|
|
175
|
+
success: true,
|
|
176
|
+
filesScanned: testFiles.length,
|
|
177
|
+
filesExtracted: extractedCount,
|
|
178
|
+
errors: errorCount,
|
|
179
|
+
summary,
|
|
180
|
+
mockAnalysis,
|
|
181
|
+
}, null, 2));
|
|
182
|
+
return;
|
|
183
|
+
}
|
|
184
|
+
// Text output
|
|
185
|
+
console.log();
|
|
186
|
+
console.log(chalk.green.bold('✓ Test topology built successfully'));
|
|
187
|
+
console.log();
|
|
188
|
+
formatSummary(summary);
|
|
189
|
+
formatMockAnalysis(mockAnalysis);
|
|
190
|
+
console.log(chalk.gray('─'.repeat(50)));
|
|
191
|
+
console.log(chalk.bold('📌 Next Steps:'));
|
|
192
|
+
console.log(chalk.gray(` • drift test-topology status ${chalk.white('View test coverage summary')}`));
|
|
193
|
+
console.log(chalk.gray(` • drift test-topology uncovered ${chalk.white('Find untested functions')}`));
|
|
194
|
+
console.log(chalk.gray(` • drift test-topology mocks ${chalk.white('Analyze mock patterns')}`));
|
|
195
|
+
console.log(chalk.gray(` • drift test-topology affected ${chalk.white('Get minimum test set for changes')}`));
|
|
196
|
+
console.log();
|
|
197
|
+
}
|
|
198
|
+
catch (error) {
|
|
199
|
+
if (format === 'json') {
|
|
200
|
+
console.log(JSON.stringify({ error: String(error) }));
|
|
201
|
+
}
|
|
202
|
+
else {
|
|
203
|
+
console.log(chalk.red(`\n❌ Error: ${error}`));
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
/**
|
|
208
|
+
* Status subcommand - show test topology overview
|
|
209
|
+
*/
|
|
210
|
+
async function statusAction(options) {
|
|
211
|
+
const rootDir = process.cwd();
|
|
212
|
+
const format = options.format ?? 'text';
|
|
213
|
+
if (!(await topologyExists(rootDir))) {
|
|
214
|
+
if (format === 'json') {
|
|
215
|
+
console.log(JSON.stringify({ error: 'No test topology found' }));
|
|
216
|
+
}
|
|
217
|
+
else {
|
|
218
|
+
showNotBuiltMessage();
|
|
219
|
+
}
|
|
220
|
+
return;
|
|
221
|
+
}
|
|
222
|
+
try {
|
|
223
|
+
const data = JSON.parse(await fs.readFile(path.join(rootDir, DRIFT_DIR, TEST_TOPOLOGY_DIR, 'summary.json'), 'utf-8'));
|
|
224
|
+
if (format === 'json') {
|
|
225
|
+
console.log(JSON.stringify(data, null, 2));
|
|
226
|
+
return;
|
|
227
|
+
}
|
|
228
|
+
console.log();
|
|
229
|
+
console.log(chalk.bold('🧪 Test Topology Status'));
|
|
230
|
+
console.log(chalk.gray('─'.repeat(60)));
|
|
231
|
+
console.log();
|
|
232
|
+
formatSummary(data.summary);
|
|
233
|
+
formatMockAnalysis(data.mockAnalysis);
|
|
234
|
+
}
|
|
235
|
+
catch (error) {
|
|
236
|
+
if (format === 'json') {
|
|
237
|
+
console.log(JSON.stringify({ error: String(error) }));
|
|
238
|
+
}
|
|
239
|
+
else {
|
|
240
|
+
console.log(chalk.red(`Error: ${error}`));
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
/**
|
|
245
|
+
* Uncovered subcommand - find untested functions
|
|
246
|
+
*/
|
|
247
|
+
async function uncoveredAction(options) {
|
|
248
|
+
const rootDir = process.cwd();
|
|
249
|
+
const format = options.format ?? 'text';
|
|
250
|
+
const limit = options.limit ?? 20;
|
|
251
|
+
const minRisk = options.minRisk ?? 'medium';
|
|
252
|
+
const spinner = format === 'text' ? createSpinner('Analyzing uncovered functions...') : null;
|
|
253
|
+
spinner?.start();
|
|
254
|
+
try {
|
|
255
|
+
// Re-run analysis to get uncovered functions
|
|
256
|
+
const analyzer = createTestTopologyAnalyzer({});
|
|
257
|
+
// Load call graph
|
|
258
|
+
const callGraphAnalyzer = createCallGraphAnalyzer({ rootDir });
|
|
259
|
+
await callGraphAnalyzer.initialize();
|
|
260
|
+
const graph = callGraphAnalyzer.getGraph();
|
|
261
|
+
if (!graph) {
|
|
262
|
+
spinner?.stop();
|
|
263
|
+
if (format === 'json') {
|
|
264
|
+
console.log(JSON.stringify({ error: 'Call graph required for uncovered analysis' }));
|
|
265
|
+
}
|
|
266
|
+
else {
|
|
267
|
+
console.log(chalk.yellow('\n⚠️ Call graph required. Run: drift callgraph build'));
|
|
268
|
+
}
|
|
269
|
+
return;
|
|
270
|
+
}
|
|
271
|
+
analyzer.setCallGraph(graph);
|
|
272
|
+
// Extract tests
|
|
273
|
+
const testFiles = await findTestFiles(rootDir);
|
|
274
|
+
for (const testFile of testFiles) {
|
|
275
|
+
try {
|
|
276
|
+
const content = await fs.readFile(path.join(rootDir, testFile), 'utf-8');
|
|
277
|
+
analyzer.extractFromFile(content, testFile);
|
|
278
|
+
}
|
|
279
|
+
catch {
|
|
280
|
+
// Skip files that can't be read
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
analyzer.buildMappings();
|
|
284
|
+
const uncovered = analyzer.getUncoveredFunctions({
|
|
285
|
+
minRisk,
|
|
286
|
+
limit,
|
|
287
|
+
includeReasons: true,
|
|
288
|
+
});
|
|
289
|
+
spinner?.stop();
|
|
290
|
+
if (format === 'json') {
|
|
291
|
+
console.log(JSON.stringify({ uncovered }, null, 2));
|
|
292
|
+
return;
|
|
293
|
+
}
|
|
294
|
+
console.log();
|
|
295
|
+
console.log(chalk.bold('🔍 Uncovered Functions'));
|
|
296
|
+
console.log(chalk.gray('─'.repeat(60)));
|
|
297
|
+
console.log();
|
|
298
|
+
if (uncovered.length === 0) {
|
|
299
|
+
console.log(chalk.green('✓ All functions have test coverage!'));
|
|
300
|
+
console.log();
|
|
301
|
+
return;
|
|
302
|
+
}
|
|
303
|
+
formatUncoveredFunctions(uncovered);
|
|
304
|
+
}
|
|
305
|
+
catch (error) {
|
|
306
|
+
spinner?.stop();
|
|
307
|
+
if (format === 'json') {
|
|
308
|
+
console.log(JSON.stringify({ error: String(error) }));
|
|
309
|
+
}
|
|
310
|
+
else {
|
|
311
|
+
console.log(chalk.red(`Error: ${error}`));
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
/**
|
|
316
|
+
* Mocks subcommand - analyze mock patterns
|
|
317
|
+
*/
|
|
318
|
+
async function mocksAction(options) {
|
|
319
|
+
const rootDir = process.cwd();
|
|
320
|
+
const format = options.format ?? 'text';
|
|
321
|
+
if (!(await topologyExists(rootDir))) {
|
|
322
|
+
if (format === 'json') {
|
|
323
|
+
console.log(JSON.stringify({ error: 'No test topology found' }));
|
|
324
|
+
}
|
|
325
|
+
else {
|
|
326
|
+
showNotBuiltMessage();
|
|
327
|
+
}
|
|
328
|
+
return;
|
|
329
|
+
}
|
|
330
|
+
try {
|
|
331
|
+
const data = JSON.parse(await fs.readFile(path.join(rootDir, DRIFT_DIR, TEST_TOPOLOGY_DIR, 'summary.json'), 'utf-8'));
|
|
332
|
+
if (format === 'json') {
|
|
333
|
+
console.log(JSON.stringify({ mockAnalysis: data.mockAnalysis }, null, 2));
|
|
334
|
+
return;
|
|
335
|
+
}
|
|
336
|
+
console.log();
|
|
337
|
+
console.log(chalk.bold('🎭 Mock Analysis'));
|
|
338
|
+
console.log(chalk.gray('─'.repeat(60)));
|
|
339
|
+
console.log();
|
|
340
|
+
formatMockAnalysisDetailed(data.mockAnalysis);
|
|
341
|
+
}
|
|
342
|
+
catch (error) {
|
|
343
|
+
if (format === 'json') {
|
|
344
|
+
console.log(JSON.stringify({ error: String(error) }));
|
|
345
|
+
}
|
|
346
|
+
else {
|
|
347
|
+
console.log(chalk.red(`Error: ${error}`));
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
/**
|
|
352
|
+
* Affected subcommand - get minimum test set for changed files
|
|
353
|
+
*/
|
|
354
|
+
async function affectedAction(files, options) {
|
|
355
|
+
const rootDir = process.cwd();
|
|
356
|
+
const format = options.format ?? 'text';
|
|
357
|
+
if (files.length === 0) {
|
|
358
|
+
if (format === 'json') {
|
|
359
|
+
console.log(JSON.stringify({ error: 'No files specified' }));
|
|
360
|
+
}
|
|
361
|
+
else {
|
|
362
|
+
console.log(chalk.yellow('Usage: drift test-topology affected <file1> [file2] ...'));
|
|
363
|
+
}
|
|
364
|
+
return;
|
|
365
|
+
}
|
|
366
|
+
const spinner = format === 'text' ? createSpinner('Calculating affected tests...') : null;
|
|
367
|
+
spinner?.start();
|
|
368
|
+
try {
|
|
369
|
+
const analyzer = createTestTopologyAnalyzer({});
|
|
370
|
+
// Load call graph
|
|
371
|
+
const callGraphAnalyzer = createCallGraphAnalyzer({ rootDir });
|
|
372
|
+
await callGraphAnalyzer.initialize();
|
|
373
|
+
const graph = callGraphAnalyzer.getGraph();
|
|
374
|
+
if (graph) {
|
|
375
|
+
analyzer.setCallGraph(graph);
|
|
376
|
+
}
|
|
377
|
+
// Extract tests
|
|
378
|
+
const testFiles = await findTestFiles(rootDir);
|
|
379
|
+
for (const testFile of testFiles) {
|
|
380
|
+
try {
|
|
381
|
+
const content = await fs.readFile(path.join(rootDir, testFile), 'utf-8');
|
|
382
|
+
analyzer.extractFromFile(content, testFile);
|
|
383
|
+
}
|
|
384
|
+
catch {
|
|
385
|
+
// Skip
|
|
386
|
+
}
|
|
387
|
+
}
|
|
388
|
+
analyzer.buildMappings();
|
|
389
|
+
const result = analyzer.getMinimumTestSet(files);
|
|
390
|
+
spinner?.stop();
|
|
391
|
+
if (format === 'json') {
|
|
392
|
+
console.log(JSON.stringify(result, null, 2));
|
|
393
|
+
return;
|
|
394
|
+
}
|
|
395
|
+
console.log();
|
|
396
|
+
console.log(chalk.bold('🎯 Minimum Test Set'));
|
|
397
|
+
console.log(chalk.gray('─'.repeat(60)));
|
|
398
|
+
console.log();
|
|
399
|
+
formatMinimumTestSet(result, files);
|
|
400
|
+
}
|
|
401
|
+
catch (error) {
|
|
402
|
+
spinner?.stop();
|
|
403
|
+
if (format === 'json') {
|
|
404
|
+
console.log(JSON.stringify({ error: String(error) }));
|
|
405
|
+
}
|
|
406
|
+
else {
|
|
407
|
+
console.log(chalk.red(`Error: ${error}`));
|
|
408
|
+
}
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
// ============================================================================
|
|
412
|
+
// Formatters
|
|
413
|
+
// ============================================================================
|
|
414
|
+
function formatSummary(summary) {
|
|
415
|
+
console.log(chalk.bold('📊 Test Summary'));
|
|
416
|
+
console.log(chalk.gray('─'.repeat(50)));
|
|
417
|
+
console.log(` Test Files: ${chalk.cyan.bold(summary.testFiles)}`);
|
|
418
|
+
console.log(` Test Cases: ${chalk.cyan.bold(summary.testCases)}`);
|
|
419
|
+
console.log(` Avg Quality: ${getQualityColor(summary.avgQualityScore)}`);
|
|
420
|
+
console.log();
|
|
421
|
+
if (summary.totalFiles > 0) {
|
|
422
|
+
console.log(chalk.bold('📈 Coverage'));
|
|
423
|
+
console.log(chalk.gray('─'.repeat(50)));
|
|
424
|
+
console.log(` Files: ${chalk.cyan(summary.coveredFiles)}/${summary.totalFiles} (${getCoverageColor(summary.coveragePercent)})`);
|
|
425
|
+
console.log(` Functions: ${chalk.cyan(summary.coveredFunctions)}/${summary.totalFunctions} (${getCoverageColor(summary.functionCoveragePercent)})`);
|
|
426
|
+
console.log();
|
|
427
|
+
}
|
|
428
|
+
// Framework breakdown
|
|
429
|
+
const frameworks = Object.entries(summary.byFramework)
|
|
430
|
+
.filter(([, count]) => count > 0)
|
|
431
|
+
.sort((a, b) => b[1] - a[1]);
|
|
432
|
+
if (frameworks.length > 0) {
|
|
433
|
+
console.log(chalk.bold('🔧 By Framework'));
|
|
434
|
+
console.log(chalk.gray('─'.repeat(50)));
|
|
435
|
+
for (const [framework, count] of frameworks) {
|
|
436
|
+
const icon = getFrameworkIcon(framework);
|
|
437
|
+
console.log(` ${icon} ${framework.padEnd(12)} ${chalk.cyan(count)} tests`);
|
|
438
|
+
}
|
|
439
|
+
console.log();
|
|
440
|
+
}
|
|
441
|
+
}
|
|
442
|
+
function formatMockAnalysis(analysis) {
|
|
443
|
+
if (analysis.totalMocks === 0)
|
|
444
|
+
return;
|
|
445
|
+
console.log(chalk.bold('🎭 Mock Summary'));
|
|
446
|
+
console.log(chalk.gray('─'.repeat(50)));
|
|
447
|
+
console.log(` Total Mocks: ${chalk.cyan(analysis.totalMocks)}`);
|
|
448
|
+
console.log(` External: ${chalk.green(analysis.externalMocks)} (${analysis.externalPercent}%)`);
|
|
449
|
+
console.log(` Internal: ${chalk.yellow(analysis.internalMocks)} (${analysis.internalPercent}%)`);
|
|
450
|
+
console.log(` Avg Mock Ratio: ${getMockRatioColor(analysis.avgMockRatio)}`);
|
|
451
|
+
console.log();
|
|
452
|
+
}
|
|
453
|
+
function formatMockAnalysisDetailed(analysis) {
|
|
454
|
+
formatMockAnalysis(analysis);
|
|
455
|
+
if (analysis.topMockedModules.length > 0) {
|
|
456
|
+
console.log(chalk.bold('📦 Most Mocked Modules'));
|
|
457
|
+
console.log(chalk.gray('─'.repeat(50)));
|
|
458
|
+
for (const { module, count } of analysis.topMockedModules.slice(0, 10)) {
|
|
459
|
+
const bar = '█'.repeat(Math.min(20, Math.ceil(count / analysis.topMockedModules[0].count * 20)));
|
|
460
|
+
console.log(` ${module.padEnd(25)} ${chalk.cyan(bar)} ${count}`);
|
|
461
|
+
}
|
|
462
|
+
console.log();
|
|
463
|
+
}
|
|
464
|
+
if (analysis.highMockRatioTests.length > 0) {
|
|
465
|
+
console.log(chalk.bold.yellow('⚠️ High Mock Ratio Tests'));
|
|
466
|
+
console.log(chalk.gray('─'.repeat(50)));
|
|
467
|
+
for (const { file, testName, mockRatio } of analysis.highMockRatioTests.slice(0, 10)) {
|
|
468
|
+
console.log(` ${chalk.yellow('●')} ${testName}`);
|
|
469
|
+
console.log(chalk.gray(` ${file} (${Math.round(mockRatio * 100)}% mocked)`));
|
|
470
|
+
}
|
|
471
|
+
console.log();
|
|
472
|
+
}
|
|
473
|
+
}
|
|
474
|
+
function formatUncoveredFunctions(uncovered) {
|
|
475
|
+
for (const func of uncovered) {
|
|
476
|
+
const riskColor = func.riskScore >= 60 ? chalk.red :
|
|
477
|
+
func.riskScore >= 30 ? chalk.yellow : chalk.gray;
|
|
478
|
+
console.log(`${riskColor('●')} ${chalk.white(func.qualifiedName)}`);
|
|
479
|
+
console.log(chalk.gray(` ${func.file}:${func.line}`));
|
|
480
|
+
console.log(` Risk: ${riskColor(func.riskScore + '/100')}`);
|
|
481
|
+
if (func.isEntryPoint) {
|
|
482
|
+
console.log(chalk.magenta(' 🚪 Entry point'));
|
|
483
|
+
}
|
|
484
|
+
if (func.accessesSensitiveData) {
|
|
485
|
+
console.log(chalk.yellow(' 💾 Accesses data'));
|
|
486
|
+
}
|
|
487
|
+
if (func.possibleReasons.length > 0) {
|
|
488
|
+
console.log(chalk.gray(` Possible reasons: ${func.possibleReasons.join(', ')}`));
|
|
489
|
+
}
|
|
490
|
+
console.log();
|
|
491
|
+
}
|
|
492
|
+
}
|
|
493
|
+
function formatMinimumTestSet(result, changedFiles) {
|
|
494
|
+
console.log(`Changed Files: ${chalk.cyan(changedFiles.length)}`);
|
|
495
|
+
console.log(`Changed Code Coverage: ${getCoverageColor(result.changedCodeCoverage)}`);
|
|
496
|
+
console.log();
|
|
497
|
+
console.log(`Tests to Run: ${chalk.cyan.bold(result.selectedTests)}/${result.totalTests}`);
|
|
498
|
+
console.log(`Time Saved: ${chalk.green('~' + result.timeSaved)}`);
|
|
499
|
+
console.log();
|
|
500
|
+
if (result.tests.length > 0) {
|
|
501
|
+
console.log(chalk.bold('Selected Tests:'));
|
|
502
|
+
for (const test of result.tests.slice(0, 20)) {
|
|
503
|
+
console.log(` ${chalk.green('✓')} ${test.name}`);
|
|
504
|
+
console.log(chalk.gray(` ${test.file}`));
|
|
505
|
+
}
|
|
506
|
+
if (result.tests.length > 20) {
|
|
507
|
+
console.log(chalk.gray(` ... and ${result.tests.length - 20} more`));
|
|
508
|
+
}
|
|
509
|
+
}
|
|
510
|
+
else {
|
|
511
|
+
console.log(chalk.yellow('No tests found covering the changed files.'));
|
|
512
|
+
}
|
|
513
|
+
console.log();
|
|
514
|
+
}
|
|
515
|
+
// ============================================================================
|
|
516
|
+
// Helpers
|
|
517
|
+
// ============================================================================
|
|
518
|
+
function getQualityColor(score) {
|
|
519
|
+
if (score >= 70)
|
|
520
|
+
return chalk.green(`${score}/100`);
|
|
521
|
+
if (score >= 50)
|
|
522
|
+
return chalk.yellow(`${score}/100`);
|
|
523
|
+
return chalk.red(`${score}/100`);
|
|
524
|
+
}
|
|
525
|
+
function getCoverageColor(percent) {
|
|
526
|
+
if (percent >= 80)
|
|
527
|
+
return chalk.green(`${percent}%`);
|
|
528
|
+
if (percent >= 50)
|
|
529
|
+
return chalk.yellow(`${percent}%`);
|
|
530
|
+
return chalk.red(`${percent}%`);
|
|
531
|
+
}
|
|
532
|
+
function getMockRatioColor(ratio) {
|
|
533
|
+
if (ratio <= 0.3)
|
|
534
|
+
return chalk.green(`${Math.round(ratio * 100)}%`);
|
|
535
|
+
if (ratio <= 0.5)
|
|
536
|
+
return chalk.yellow(`${Math.round(ratio * 100)}%`);
|
|
537
|
+
return chalk.red(`${Math.round(ratio * 100)}%`);
|
|
538
|
+
}
|
|
539
|
+
function getFrameworkIcon(framework) {
|
|
540
|
+
const icons = {
|
|
541
|
+
jest: '🃏',
|
|
542
|
+
vitest: '⚡',
|
|
543
|
+
mocha: '☕',
|
|
544
|
+
pytest: '🐍',
|
|
545
|
+
unittest: '🐍',
|
|
546
|
+
junit4: '☕',
|
|
547
|
+
junit5: '☕',
|
|
548
|
+
testng: '☕',
|
|
549
|
+
xunit: '🟣',
|
|
550
|
+
nunit: '🟣',
|
|
551
|
+
mstest: '🟣',
|
|
552
|
+
phpunit: '🐘',
|
|
553
|
+
pest: '🐘',
|
|
554
|
+
};
|
|
555
|
+
return icons[framework] ?? '📋';
|
|
556
|
+
}
|
|
557
|
+
// ============================================================================
|
|
558
|
+
// Command Registration
|
|
559
|
+
// ============================================================================
|
|
560
|
+
export function createTestTopologyCommand() {
|
|
561
|
+
const cmd = new Command('test-topology')
|
|
562
|
+
.description('Analyze test-to-code mappings and test quality')
|
|
563
|
+
.option('-f, --format <format>', 'Output format (text, json)', 'text')
|
|
564
|
+
.option('-v, --verbose', 'Enable verbose output');
|
|
565
|
+
cmd
|
|
566
|
+
.command('build')
|
|
567
|
+
.description('Build test topology from test files')
|
|
568
|
+
.action(() => buildAction(cmd.opts()));
|
|
569
|
+
cmd
|
|
570
|
+
.command('status')
|
|
571
|
+
.description('Show test topology overview')
|
|
572
|
+
.action(() => statusAction(cmd.opts()));
|
|
573
|
+
cmd
|
|
574
|
+
.command('uncovered')
|
|
575
|
+
.description('Find functions without test coverage')
|
|
576
|
+
.option('-l, --limit <number>', 'Maximum results', '20')
|
|
577
|
+
.option('-r, --min-risk <level>', 'Minimum risk level (low, medium, high)', 'medium')
|
|
578
|
+
.action((opts) => uncoveredAction({ ...cmd.opts(), ...opts }));
|
|
579
|
+
cmd
|
|
580
|
+
.command('mocks')
|
|
581
|
+
.description('Analyze mock patterns')
|
|
582
|
+
.action(() => mocksAction(cmd.opts()));
|
|
583
|
+
cmd
|
|
584
|
+
.command('affected <files...>')
|
|
585
|
+
.description('Get minimum test set for changed files')
|
|
586
|
+
.action((files) => affectedAction(files, cmd.opts()));
|
|
587
|
+
return cmd;
|
|
588
|
+
}
|
|
589
|
+
//# sourceMappingURL=test-topology.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-topology.js","sourceRoot":"","sources":["../../src/commands/test-topology.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Where Command - Find pattern locations
|
|
3
|
+
*
|
|
4
|
+
* Quickly find where patterns are located in the codebase.
|
|
5
|
+
*
|
|
6
|
+
* MIGRATION: Now uses IPatternService for pattern operations.
|
|
7
|
+
*
|
|
8
|
+
* Usage:
|
|
9
|
+
* drift where auth # Find patterns matching "auth"
|
|
10
|
+
* drift where middleware # Find middleware patterns
|
|
11
|
+
* drift where --json # Output as JSON
|
|
12
|
+
*/
|
|
13
|
+
import { Command } from 'commander';
|
|
14
|
+
export declare const whereCommand: Command;
|
|
15
|
+
//# sourceMappingURL=where.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"where.d.ts","sourceRoot":"","sources":["../../src/commands/where.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"where.d.ts","sourceRoot":"","sources":["../../src/commands/where.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC,eAAO,MAAM,YAAY,SA4HrB,CAAC"}
|