#!/usr/bin/env node const { spawn } = require("child_process"); const path = require("path"); // ANSI color codes for better output const colors = { reset: "\x1b[0m", bright: "\x1b[1m", red: "\x1b[31m", green: "\x1b[32m", yellow: "\x1b[33m", blue: "\x1b[34m", magenta: "\x1b[35m", cyan: "\x1b[36m", }; function log(message, color = "reset") { console.log(`${colors[color]}${message}${colors.reset}`); } function logHeader(message) { console.log("\n" + "=".repeat(60)); log(` ${message}`, "bright"); console.log("=".repeat(60)); } function runCommand(command, args = [], description = "") { return new Promise((resolve, reject) => { if (description) { log(`\nšŸš€ ${description}`, "cyan"); log(` Command: ${command} ${args.join(" ")}`, "yellow"); } const child = spawn(command, args, { stdio: "inherit", shell: true, }); child.on("close", (code) => { if (code === 0) { if (description) { log(`āœ… ${description} completed successfully`, "green"); } resolve(); } else { if (description) { log(`āŒ ${description} failed with code ${code}`, "red"); } reject(new Error(`Command failed with code ${code}`)); } }); child.on("error", (error) => { log(`āŒ Error running ${description}: ${error.message}`, "red"); reject(error); }); }); } async function runTestSuite() { const args = process.argv.slice(2); const command = args[0]; logHeader("Ticket Microservice Test Runner"); log("Comprehensive testing suite for the ticket microservice", "blue"); try { switch (command) { case "all": logHeader("Running Complete Test Suite"); await runCommand("npm", ["test"], "Complete test suite"); break; case "unit": logHeader("Running Unit Tests"); await runCommand("npm", ["run", "test:unit"], "Unit tests"); break; case "integration": logHeader("Running Integration Tests"); await runCommand( "npm", ["run", "test:integration"], "Integration tests" ); break; case "performance": logHeader("Running Performance Tests"); await runCommand( "npm", ["run", "test:performance"], "Performance tests" ); break; case "duplicate": logHeader("Running Critical Duplicate Prevention Tests"); await runCommand( "npm", ["run", "test:duplicate-prevention"], "Duplicate prevention tests" ); break; case "api": logHeader("Running API Endpoint Tests"); await runCommand("npm", ["run", "test:api"], "API endpoint tests"); break; case "security": logHeader("Running Security Tests"); await runCommand("npm", ["run", "test:security"], "Security tests"); break; case "fallback": logHeader("Running Fallback Store Tests"); await runCommand( "npm", ["run", "test:fallback"], "Fallback store tests" ); break; case "coverage": logHeader("Running Tests with Coverage Report"); await runCommand("npm", ["run", "test:coverage"], "Coverage tests"); break; case "load": logHeader("Running Load Tests"); await runCommand("npm", ["run", "test:load"], "Load tests"); break; case "quick": logHeader("Running Quick Test Suite (Critical Paths Only)"); log("Running duplicate prevention tests...", "yellow"); await runCommand( "npm", ["run", "test:duplicate-prevention"], "Duplicate prevention tests" ); log("Running API endpoint tests...", "yellow"); await runCommand("npm", ["run", "test:api"], "API endpoint tests"); log("Running security tests...", "yellow"); await runCommand("npm", ["run", "test:security"], "Security tests"); break; case "validate": logHeader("Running Validation Tests (Core Requirements)"); log("1. Duplicate Prevention Tests", "cyan"); await runCommand( "npm", ["run", "test:duplicate-prevention"], "Duplicate prevention validation" ); log("2. High Concurrency Tests", "cyan"); await runCommand( "npm", ["run", "test:load-performance"], "High concurrency validation" ); log("3. API Endpoint Tests", "cyan"); await runCommand("npm", ["run", "test:api"], "API endpoint validation"); log("4. Security Tests", "cyan"); await runCommand( "npm", ["run", "test:security"], "Security validation" ); break; default: logHeader("Available Test Commands"); log("Usage: node run-tests.js ", "bright"); console.log(""); log("Commands:", "bright"); log(" all - Run complete test suite", "green"); log(" unit - Run unit tests only", "green"); log(" integration- Run integration tests only", "green"); log(" performance- Run performance tests only", "green"); log(" duplicate - Run duplicate prevention tests", "green"); log(" api - Run API endpoint tests", "green"); log(" security - Run security tests", "green"); log(" fallback - Run fallback store tests", "green"); log(" coverage - Run tests with coverage report", "green"); log(" load - Run load tests", "green"); log(" quick - Run quick test suite (critical paths)", "green"); log(" validate - Run validation tests (core requirements)", "green"); console.log(""); log("Examples:", "bright"); log(" node run-tests.js all", "yellow"); log(" node run-tests.js duplicate", "yellow"); log(" node run-tests.js validate", "yellow"); console.log(""); log( "Note: Make sure Redis is running and the application is properly configured.", "cyan" ); break; } if (command && command !== "help") { logHeader("Test Suite Completed Successfully"); log("šŸŽ‰ All tests passed! The system is working correctly.", "green"); } } catch (error) { logHeader("Test Suite Failed"); log(`āŒ Error: ${error.message}`, "red"); log("Please check the test output above for details.", "yellow"); process.exit(1); } } // Handle process termination process.on("SIGINT", () => { log("\n\nāš ļø Test execution interrupted by user", "yellow"); process.exit(0); }); process.on("SIGTERM", () => { log("\n\nāš ļø Test execution terminated", "yellow"); process.exit(0); }); // Run the test suite runTestSuite().catch((error) => { log(`\nšŸ’„ Fatal error: ${error.message}`, "red"); process.exit(1); });