mirror of
https://github.com/proffesor-for-testing/agentic-qe.git
synced 2026-09-19 08:45:47 +08:00
5380421f1e
- Corrected MCP server implementation status from 0% to 100% - Added details of 52 MCP tools across 8 categories - Updated overall progress from 46% to 54% (7/13 areas complete) - Added MCP server architecture details (357 lines server, 1836 lines tools, 60+ handlers) - Updated integration metrics: MCP Tools 52/50 (104% - exceeded target) - Removed MCP server from future work (already production-ready) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
417 lines
16 KiB
TypeScript
417 lines
16 KiB
TypeScript
import { describe, it, expect, beforeEach, afterEach, vi } from '@jest/globals';
|
|
import { execSync } from 'child_process';
|
|
import * as fs from 'fs';
|
|
import * as path from 'path';
|
|
|
|
const CLI_PATH = path.join(__dirname, '../../src/cli/aqe.ts');
|
|
|
|
describe('AQE Test CLI Commands', () => {
|
|
beforeEach(() => {
|
|
vi.clearAllMocks();
|
|
});
|
|
|
|
afterEach(() => {
|
|
// Cleanup any test artifacts
|
|
const testDir = path.join(process.cwd(), '.aqe-test');
|
|
if (fs.existsSync(testDir)) {
|
|
fs.rmSync(testDir, { recursive: true, force: true });
|
|
}
|
|
});
|
|
|
|
describe('test retry', () => {
|
|
it('should retry failed tests', () => {
|
|
const result = execSync(`node ${CLI_PATH} test retry --help`, { encoding: 'utf-8' });
|
|
expect(result).toContain('Retry failed tests');
|
|
});
|
|
|
|
it('should retry with default max attempts', () => {
|
|
const result = execSync(`node ${CLI_PATH} test retry`, { encoding: 'utf-8' });
|
|
expect(result).toContain('Retrying failed tests');
|
|
});
|
|
|
|
it('should retry with custom max attempts', () => {
|
|
const result = execSync(`node ${CLI_PATH} test retry --max-attempts 5`, { encoding: 'utf-8' });
|
|
expect(result).toContain('max-attempts: 5');
|
|
});
|
|
|
|
it('should retry with exponential backoff', () => {
|
|
const result = execSync(`node ${CLI_PATH} test retry --backoff exponential`, { encoding: 'utf-8' });
|
|
expect(result).toContain('backoff: exponential');
|
|
});
|
|
|
|
it('should retry only specific patterns', () => {
|
|
const result = execSync(`node ${CLI_PATH} test retry --pattern "*.spec.ts"`, { encoding: 'utf-8' });
|
|
expect(result).toContain('pattern: *.spec.ts');
|
|
});
|
|
|
|
it('should fail when no failed tests found', () => {
|
|
expect(() => {
|
|
execSync(`node ${CLI_PATH} test retry --fail-on-none`, { encoding: 'utf-8' });
|
|
}).toThrow();
|
|
});
|
|
});
|
|
|
|
describe('test parallel', () => {
|
|
it('should show parallel execution help', () => {
|
|
const result = execSync(`node ${CLI_PATH} test parallel --help`, { encoding: 'utf-8' });
|
|
expect(result).toContain('Execute tests in parallel');
|
|
});
|
|
|
|
it('should run tests with default workers', () => {
|
|
const result = execSync(`node ${CLI_PATH} test parallel`, { encoding: 'utf-8' });
|
|
expect(result).toContain('Running tests in parallel');
|
|
});
|
|
|
|
it('should run tests with custom worker count', () => {
|
|
const result = execSync(`node ${CLI_PATH} test parallel --workers 8`, { encoding: 'utf-8' });
|
|
expect(result).toContain('workers: 8');
|
|
});
|
|
|
|
it('should distribute tests by file', () => {
|
|
const result = execSync(`node ${CLI_PATH} test parallel --strategy file`, { encoding: 'utf-8' });
|
|
expect(result).toContain('strategy: file');
|
|
});
|
|
|
|
it('should distribute tests by suite', () => {
|
|
const result = execSync(`node ${CLI_PATH} test parallel --strategy suite`, { encoding: 'utf-8' });
|
|
expect(result).toContain('strategy: suite');
|
|
});
|
|
|
|
it('should show worker status', () => {
|
|
const result = execSync(`node ${CLI_PATH} test parallel --show-workers`, { encoding: 'utf-8' });
|
|
expect(result).toContain('Worker');
|
|
});
|
|
|
|
it('should handle worker failures gracefully', () => {
|
|
const result = execSync(`node ${CLI_PATH} test parallel --fail-fast false`, { encoding: 'utf-8' });
|
|
expect(result).toContain('fail-fast: false');
|
|
});
|
|
});
|
|
|
|
describe('test queue', () => {
|
|
it('should show queue management help', () => {
|
|
const result = execSync(`node ${CLI_PATH} test queue --help`, { encoding: 'utf-8' });
|
|
expect(result).toContain('Manage test queue');
|
|
});
|
|
|
|
it('should show current queue status', () => {
|
|
const result = execSync(`node ${CLI_PATH} test queue status`, { encoding: 'utf-8' });
|
|
expect(result).toContain('Queue Status');
|
|
});
|
|
|
|
it('should add tests to queue', () => {
|
|
const result = execSync(`node ${CLI_PATH} test queue add "tests/*.test.ts"`, { encoding: 'utf-8' });
|
|
expect(result).toContain('Added to queue');
|
|
});
|
|
|
|
it('should remove tests from queue', () => {
|
|
execSync(`node ${CLI_PATH} test queue add "tests/sample.test.ts"`, { encoding: 'utf-8' });
|
|
const result = execSync(`node ${CLI_PATH} test queue remove "tests/sample.test.ts"`, { encoding: 'utf-8' });
|
|
expect(result).toContain('Removed from queue');
|
|
});
|
|
|
|
it('should clear entire queue', () => {
|
|
const result = execSync(`node ${CLI_PATH} test queue clear`, { encoding: 'utf-8' });
|
|
expect(result).toContain('Queue cleared');
|
|
});
|
|
|
|
it('should process queue with priority', () => {
|
|
const result = execSync(`node ${CLI_PATH} test queue process --priority high`, { encoding: 'utf-8' });
|
|
expect(result).toContain('priority: high');
|
|
});
|
|
|
|
it('should show queue statistics', () => {
|
|
const result = execSync(`node ${CLI_PATH} test queue stats`, { encoding: 'utf-8' });
|
|
expect(result).toContain('Total');
|
|
});
|
|
});
|
|
|
|
describe('test watch', () => {
|
|
it('should show watch mode help', () => {
|
|
const result = execSync(`node ${CLI_PATH} test watch --help`, { encoding: 'utf-8' });
|
|
expect(result).toContain('Watch mode for continuous testing');
|
|
});
|
|
|
|
it('should start watch mode', () => {
|
|
const result = execSync(`node ${CLI_PATH} test watch --no-interactive`, {
|
|
encoding: 'utf-8',
|
|
timeout: 2000
|
|
}).catch(() => 'Watch mode started');
|
|
expect(result).toBeTruthy();
|
|
});
|
|
|
|
it('should watch specific patterns', () => {
|
|
const result = execSync(`node ${CLI_PATH} test watch --pattern "*.test.ts" --no-interactive`, {
|
|
encoding: 'utf-8',
|
|
timeout: 2000
|
|
}).catch(() => 'Pattern watch started');
|
|
expect(result).toBeTruthy();
|
|
});
|
|
|
|
it('should run only changed tests', () => {
|
|
const result = execSync(`node ${CLI_PATH} test watch --changed-only --no-interactive`, {
|
|
encoding: 'utf-8',
|
|
timeout: 2000
|
|
}).catch(() => 'Changed watch started');
|
|
expect(result).toBeTruthy();
|
|
});
|
|
|
|
it('should run related tests on file change', () => {
|
|
const result = execSync(`node ${CLI_PATH} test watch --related --no-interactive`, {
|
|
encoding: 'utf-8',
|
|
timeout: 2000
|
|
}).catch(() => 'Related watch started');
|
|
expect(result).toBeTruthy();
|
|
});
|
|
});
|
|
|
|
describe('test clean', () => {
|
|
it('should show cleanup help', () => {
|
|
const result = execSync(`node ${CLI_PATH} test clean --help`, { encoding: 'utf-8' });
|
|
expect(result).toContain('Clean test artifacts');
|
|
});
|
|
|
|
it('should clean all artifacts', () => {
|
|
const result = execSync(`node ${CLI_PATH} test clean`, { encoding: 'utf-8' });
|
|
expect(result).toContain('Cleaning test artifacts');
|
|
});
|
|
|
|
it('should clean coverage only', () => {
|
|
const result = execSync(`node ${CLI_PATH} test clean --coverage`, { encoding: 'utf-8' });
|
|
expect(result).toContain('Cleaning coverage');
|
|
});
|
|
|
|
it('should clean snapshots only', () => {
|
|
const result = execSync(`node ${CLI_PATH} test clean --snapshots`, { encoding: 'utf-8' });
|
|
expect(result).toContain('Cleaning snapshots');
|
|
});
|
|
|
|
it('should clean cache only', () => {
|
|
const result = execSync(`node ${CLI_PATH} test clean --cache`, { encoding: 'utf-8' });
|
|
expect(result).toContain('Cleaning cache');
|
|
});
|
|
|
|
it('should show dry run results', () => {
|
|
const result = execSync(`node ${CLI_PATH} test clean --dry-run`, { encoding: 'utf-8' });
|
|
expect(result).toContain('Would clean');
|
|
});
|
|
|
|
it('should show cleaned file sizes', () => {
|
|
const result = execSync(`node ${CLI_PATH} test clean --show-size`, { encoding: 'utf-8' });
|
|
expect(result).toContain('Size');
|
|
});
|
|
});
|
|
|
|
describe('test debug', () => {
|
|
it('should show debug help', () => {
|
|
const result = execSync(`node ${CLI_PATH} test debug --help`, { encoding: 'utf-8' });
|
|
expect(result).toContain('Debug test failures');
|
|
});
|
|
|
|
it('should run debug mode for failed test', () => {
|
|
const result = execSync(`node ${CLI_PATH} test debug "tests/sample.test.ts"`, { encoding: 'utf-8' });
|
|
expect(result).toContain('Debugging test');
|
|
});
|
|
|
|
it('should attach debugger on failure', () => {
|
|
const result = execSync(`node ${CLI_PATH} test debug --break-on-failure`, { encoding: 'utf-8' });
|
|
expect(result).toContain('break-on-failure: true');
|
|
});
|
|
|
|
it('should show detailed error traces', () => {
|
|
const result = execSync(`node ${CLI_PATH} test debug --verbose`, { encoding: 'utf-8' });
|
|
expect(result).toContain('verbose: true');
|
|
});
|
|
|
|
it('should capture screenshots on failure', () => {
|
|
const result = execSync(`node ${CLI_PATH} test debug --screenshots`, { encoding: 'utf-8' });
|
|
expect(result).toContain('screenshots: true');
|
|
});
|
|
|
|
it('should save debug logs', () => {
|
|
const result = execSync(`node ${CLI_PATH} test debug --save-logs`, { encoding: 'utf-8' });
|
|
expect(result).toContain('Saving logs');
|
|
});
|
|
|
|
it('should replay failed test', () => {
|
|
const result = execSync(`node ${CLI_PATH} test debug --replay "test-id-123"`, { encoding: 'utf-8' });
|
|
expect(result).toContain('Replaying test');
|
|
});
|
|
});
|
|
|
|
describe('test profile', () => {
|
|
it('should show profiling help', () => {
|
|
const result = execSync(`node ${CLI_PATH} test profile --help`, { encoding: 'utf-8' });
|
|
expect(result).toContain('Profile test performance');
|
|
});
|
|
|
|
it('should profile test execution', () => {
|
|
const result = execSync(`node ${CLI_PATH} test profile`, { encoding: 'utf-8' });
|
|
expect(result).toContain('Profiling tests');
|
|
});
|
|
|
|
it('should show CPU profiling', () => {
|
|
const result = execSync(`node ${CLI_PATH} test profile --cpu`, { encoding: 'utf-8' });
|
|
expect(result).toContain('CPU profile');
|
|
});
|
|
|
|
it('should show memory profiling', () => {
|
|
const result = execSync(`node ${CLI_PATH} test profile --memory`, { encoding: 'utf-8' });
|
|
expect(result).toContain('Memory profile');
|
|
});
|
|
|
|
it('should show slowest tests', () => {
|
|
const result = execSync(`node ${CLI_PATH} test profile --slowest 10`, { encoding: 'utf-8' });
|
|
expect(result).toContain('Slowest tests');
|
|
});
|
|
|
|
it('should export profile data', () => {
|
|
const result = execSync(`node ${CLI_PATH} test profile --export profile.json`, { encoding: 'utf-8' });
|
|
expect(result).toContain('Exported');
|
|
});
|
|
|
|
it('should show flame graph', () => {
|
|
const result = execSync(`node ${CLI_PATH} test profile --flame-graph`, { encoding: 'utf-8' });
|
|
expect(result).toContain('flame graph');
|
|
});
|
|
});
|
|
|
|
describe('test trace', () => {
|
|
it('should show tracing help', () => {
|
|
const result = execSync(`node ${CLI_PATH} test trace --help`, { encoding: 'utf-8' });
|
|
expect(result).toContain('Trace test execution');
|
|
});
|
|
|
|
it('should trace test execution', () => {
|
|
const result = execSync(`node ${CLI_PATH} test trace`, { encoding: 'utf-8' });
|
|
expect(result).toContain('Tracing tests');
|
|
});
|
|
|
|
it('should show execution timeline', () => {
|
|
const result = execSync(`node ${CLI_PATH} test trace --timeline`, { encoding: 'utf-8' });
|
|
expect(result).toContain('Timeline');
|
|
});
|
|
|
|
it('should trace specific test', () => {
|
|
const result = execSync(`node ${CLI_PATH} test trace "tests/sample.test.ts"`, { encoding: 'utf-8' });
|
|
expect(result).toContain('Tracing test');
|
|
});
|
|
|
|
it('should save trace data', () => {
|
|
const result = execSync(`node ${CLI_PATH} test trace --save trace.json`, { encoding: 'utf-8' });
|
|
expect(result).toContain('Saved trace');
|
|
});
|
|
|
|
it('should show call stack', () => {
|
|
const result = execSync(`node ${CLI_PATH} test trace --call-stack`, { encoding: 'utf-8' });
|
|
expect(result).toContain('Call stack');
|
|
});
|
|
});
|
|
|
|
describe('test snapshot', () => {
|
|
it('should show snapshot help', () => {
|
|
const result = execSync(`node ${CLI_PATH} test snapshot --help`, { encoding: 'utf-8' });
|
|
expect(result).toContain('Snapshot testing');
|
|
});
|
|
|
|
it('should update snapshots', () => {
|
|
const result = execSync(`node ${CLI_PATH} test snapshot --update`, { encoding: 'utf-8' });
|
|
expect(result).toContain('Updating snapshots');
|
|
});
|
|
|
|
it('should update specific snapshots', () => {
|
|
const result = execSync(`node ${CLI_PATH} test snapshot --update --pattern "*.test.ts"`, { encoding: 'utf-8' });
|
|
expect(result).toContain('pattern: *.test.ts');
|
|
});
|
|
|
|
it('should show snapshot diff', () => {
|
|
const result = execSync(`node ${CLI_PATH} test snapshot --diff`, { encoding: 'utf-8' });
|
|
expect(result).toContain('Snapshot diff');
|
|
});
|
|
|
|
it('should clean obsolete snapshots', () => {
|
|
const result = execSync(`node ${CLI_PATH} test snapshot --clean`, { encoding: 'utf-8' });
|
|
expect(result).toContain('Cleaning obsolete snapshots');
|
|
});
|
|
|
|
it('should list all snapshots', () => {
|
|
const result = execSync(`node ${CLI_PATH} test snapshot --list`, { encoding: 'utf-8' });
|
|
expect(result).toContain('Snapshots');
|
|
});
|
|
|
|
it('should show snapshot coverage', () => {
|
|
const result = execSync(`node ${CLI_PATH} test snapshot --coverage`, { encoding: 'utf-8' });
|
|
expect(result).toContain('Snapshot coverage');
|
|
});
|
|
});
|
|
|
|
describe('test diff', () => {
|
|
it('should show diff help', () => {
|
|
const result = execSync(`node ${CLI_PATH} test diff --help`, { encoding: 'utf-8' });
|
|
expect(result).toContain('Compare test results');
|
|
});
|
|
|
|
it('should diff two test runs', () => {
|
|
const result = execSync(`node ${CLI_PATH} test diff run-1 run-2`, { encoding: 'utf-8' });
|
|
expect(result).toContain('Comparing test results');
|
|
});
|
|
|
|
it('should show detailed diff', () => {
|
|
const result = execSync(`node ${CLI_PATH} test diff --detailed`, { encoding: 'utf-8' });
|
|
expect(result).toContain('Detailed diff');
|
|
});
|
|
|
|
it('should diff coverage reports', () => {
|
|
const result = execSync(`node ${CLI_PATH} test diff --coverage`, { encoding: 'utf-8' });
|
|
expect(result).toContain('Coverage diff');
|
|
});
|
|
|
|
it('should diff performance metrics', () => {
|
|
const result = execSync(`node ${CLI_PATH} test diff --performance`, { encoding: 'utf-8' });
|
|
expect(result).toContain('Performance diff');
|
|
});
|
|
|
|
it('should show regression', () => {
|
|
const result = execSync(`node ${CLI_PATH} test diff --show-regression`, { encoding: 'utf-8' });
|
|
expect(result).toContain('Regression');
|
|
});
|
|
|
|
it('should export diff report', () => {
|
|
const result = execSync(`node ${CLI_PATH} test diff --export diff.json`, { encoding: 'utf-8' });
|
|
expect(result).toContain('Exported');
|
|
});
|
|
});
|
|
|
|
describe('Integration Tests', () => {
|
|
it('should chain retry and parallel execution', () => {
|
|
const result = execSync(`node ${CLI_PATH} test retry --max-attempts 3 && node ${CLI_PATH} test parallel --workers 4`, { encoding: 'utf-8' });
|
|
expect(result).toContain('Retrying');
|
|
expect(result).toContain('parallel');
|
|
});
|
|
|
|
it('should profile parallel execution', () => {
|
|
const result = execSync(`node ${CLI_PATH} test parallel --workers 4 && node ${CLI_PATH} test profile`, { encoding: 'utf-8' });
|
|
expect(result).toContain('workers: 4');
|
|
expect(result).toContain('Profiling');
|
|
});
|
|
|
|
it('should debug with tracing', () => {
|
|
const result = execSync(`node ${CLI_PATH} test debug --verbose && node ${CLI_PATH} test trace --timeline`, { encoding: 'utf-8' });
|
|
expect(result).toContain('verbose');
|
|
expect(result).toContain('Timeline');
|
|
});
|
|
|
|
it('should clean after profiling', () => {
|
|
const result = execSync(`node ${CLI_PATH} test profile && node ${CLI_PATH} test clean --cache`, { encoding: 'utf-8' });
|
|
expect(result).toContain('Profiling');
|
|
expect(result).toContain('Cleaning cache');
|
|
});
|
|
|
|
it('should update snapshots and show diff', () => {
|
|
const result = execSync(`node ${CLI_PATH} test snapshot --update && node ${CLI_PATH} test diff --coverage`, { encoding: 'utf-8' });
|
|
expect(result).toContain('snapshots');
|
|
expect(result).toContain('diff');
|
|
});
|
|
});
|
|
});
|