#!/usr/bin/env bun /** * CLI Test Runner: Excessive Project Creation Bug * * This script runs comprehensive tests to validate the excessive project creation bug * and can be executed from the command line like `cargo test`. * * Usage: * bun run scripts/test-excessive-projects.ts * bun run test:excessive-projects */ import { spawn } from 'child_process' import { existsSync } from 'fs' import path from 'path' interface TestResult { name: string passed: boolean duration: number error?: string } class ExcessiveProjectsTestRunner { private results: TestResult[] = [] private startTime: number = 0 constructor() { console.log('๐Ÿงช Excessive Project Creation Bug - Test Runner') console.log('=' .repeat(60)) } async runAllTests(): Promise { this.startTime = Date.now() try { // Check if test files exist await this.validateTestEnvironment() // Run unit tests await this.runUnitTests() // Run integration tests await this.runIntegrationTests() // Run specific excessive projects tests await this.runExcessiveProjectsTests() // Generate report this.generateReport() } catch (error) { console.error('โŒ Test runner failed:', error) process.exit(1) } } private async validateTestEnvironment(): Promise { console.log('๐Ÿ” Validating test environment...') const requiredFiles = [ 'src/__tests__/setup.ts', 'src/__tests__/excessive-projects.test.ts', 'src/__tests__/editor-page-integration.test.tsx', 'vitest.config.ts' ] for (const file of requiredFiles) { if (!existsSync(path.join(process.cwd(), file))) { throw new Error(`Required test file not found: ${file}`) } } console.log('โœ… Test environment validated') } private async runUnitTests(): Promise { console.log('\n๐Ÿ“‹ Running Unit Tests...') const result = await this.runVitest([ 'src/__tests__/excessive-projects.test.ts', '--reporter=verbose' ]) this.results.push({ name: 'Unit Tests - Excessive Projects Logic', passed: result.success, duration: result.duration, error: result.error }) } private async runIntegrationTests(): Promise { console.log('\n๐Ÿ”— Running Integration Tests...') const result = await this.runVitest([ 'src/__tests__/editor-page-integration.test.tsx', '--reporter=verbose' ]) this.results.push({ name: 'Integration Tests - Editor Page Component', passed: result.success, duration: result.duration, error: result.error }) } private async runExcessiveProjectsTests(): Promise { console.log('\n๐Ÿšจ Running Excessive Projects Bug Tests...') const result = await this.runVitest([ 'src/__tests__/excessive-projects.test.ts', 'src/__tests__/editor-page-integration.test.tsx', '--reporter=verbose', '--run' ]) this.results.push({ name: 'Bug Reproduction Tests - All Scenarios', passed: result.success, duration: result.duration, error: result.error }) } private async runVitest(args: string[]): Promise<{ success: boolean; duration: number; error?: string }> { const startTime = Date.now() return new Promise((resolve) => { const vitestProcess = spawn('bunx', ['vitest', ...args], { stdio: 'inherit', cwd: process.cwd() }) vitestProcess.on('close', (code) => { const duration = Date.now() - startTime resolve({ success: code === 0, duration, error: code !== 0 ? `Process exited with code ${code}` : undefined }) }) vitestProcess.on('error', (error) => { const duration = Date.now() - startTime resolve({ success: false, duration, error: error.message }) }) }) } private generateReport(): void { const totalDuration = Date.now() - this.startTime const passedTests = this.results.filter(r => r.passed).length const totalTests = this.results.length console.log('\n' + '='.repeat(60)) console.log('๐Ÿ“Š TEST RESULTS SUMMARY') console.log('='.repeat(60)) this.results.forEach((result, index) => { const status = result.passed ? 'โœ… PASS' : 'โŒ FAIL' const duration = `${result.duration}ms` console.log(`${index + 1}. ${status} ${result.name} (${duration})`) if (result.error) { console.log(` Error: ${result.error}`) } }) console.log('\n' + '-'.repeat(60)) console.log(`๐Ÿ“ˆ Overall: ${passedTests}/${totalTests} tests passed`) console.log(`โฑ๏ธ Total duration: ${totalDuration}ms`) if (passedTests === totalTests) { console.log('๐ŸŽ‰ All tests passed! Bug reproduction confirmed.') } else { console.log('โš ๏ธ Some tests failed. Check the output above.') process.exit(1) } console.log('\n๐Ÿ’ก To run individual test suites:') console.log(' bun run test src/__tests__/excessive-projects.test.ts') console.log(' bun run test src/__tests__/editor-page-integration.test.tsx') console.log('\n๐Ÿ”ง To run with coverage:') console.log(' bun run test:coverage') } } // CLI execution if (import.meta.main) { const runner = new ExcessiveProjectsTestRunner() runner.runAllTests().catch((error) => { console.error('Fatal error:', error) process.exit(1) }) } export { ExcessiveProjectsTestRunner }