#!/usr/bin/env bash # ROA2WEB Comprehensive Test Execution and Reporting Script # Executes all tests, identifies errors, and generates detailed reports # Created: 2025-08-04 set -e # Colors for output RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' PURPLE='\033[0;35m' CYAN='\033[0;36m' NC='\033[0m' # No Color # Configuration SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" FRONTEND_DIR="$SCRIPT_DIR" BACKEND_DIR="$SCRIPT_DIR/../backend" TIMESTAMP=$(date +"%Y%m%d_%H%M%S") REPORT_DIR="test-reports-$TIMESTAMP" DETAILED_LOG="$REPORT_DIR/detailed-test-log.txt" # Test execution flags RUN_CLEANUP=true RUN_BASIC_TESTS=true RUN_REAL_WORLD_TESTS=true RUN_DEBUGGING_TESTS=true GENERATE_SCREENSHOTS=true CHECK_SERVICES=true # Results tracking TOTAL_TESTS=0 PASSED_TESTS=0 FAILED_TESTS=0 ISSUES_FOUND=() RECOMMENDATIONS=() echo -e "${PURPLE}" echo "╔══════════════════════════════════════════════════════════════╗" echo "║ ROA2WEB Comprehensive Test Execution Suite ║" echo "║ ║" echo "║ • Error Detection & Analysis ║" echo "║ • Performance Monitoring ║" echo "║ • Real-World Scenario Testing ║" echo "║ • Detailed Reporting & Recommendations ║" echo "╚══════════════════════════════════════════════════════════════╝" echo -e "${NC}" echo "" # Logging functions log_info() { echo -e "${BLUE}ℹ️ $1${NC}" echo "[$(date '+%Y-%m-%d %H:%M:%S')] INFO: $1" >> "$DETAILED_LOG" } log_success() { echo -e "${GREEN}✅ $1${NC}" echo "[$(date '+%Y-%m-%d %H:%M:%S')] SUCCESS: $1" >> "$DETAILED_LOG" } log_warning() { echo -e "${YELLOW}⚠️ $1${NC}" echo "[$(date '+%Y-%m-%d %H:%M:%S')] WARNING: $1" >> "$DETAILED_LOG" } log_error() { echo -e "${RED}❌ $1${NC}" echo "[$(date '+%Y-%m-%d %H:%M:%S')] ERROR: $1" >> "$DETAILED_LOG" ISSUES_FOUND+=("$1") } log_test() { echo -e "${CYAN}🧪 $1${NC}" echo "[$(date '+%Y-%m-%d %H:%M:%S')] TEST: $1" >> "$DETAILED_LOG" } add_recommendation() { RECOMMENDATIONS+=("$1") echo "[$(date '+%Y-%m-%d %H:%M:%S')] RECOMMENDATION: $1" >> "$DETAILED_LOG" } # Create report directory mkdir -p "$REPORT_DIR" touch "$DETAILED_LOG" # Initialize log echo "ROA2WEB Comprehensive Test Execution Log" > "$DETAILED_LOG" echo "Started: $(date)" >> "$DETAILED_LOG" echo "=========================================" >> "$DETAILED_LOG" echo "" >> "$DETAILED_LOG" main() { local start_time=$(date +%s) log_info "Starting comprehensive test execution..." log_info "Report directory: $REPORT_DIR" echo "" # Step 1: Cleanup previous test artifacts if [ "$RUN_CLEANUP" = true ]; then log_test "Step 1: Cleaning up previous test artifacts" if [ -f "./cleanup-tests.sh" ]; then ./cleanup-tests.sh 2>&1 | tee -a "$DETAILED_LOG" else log_warning "Cleanup script not found, skipping cleanup" fi echo "" fi # Step 2: Environment and Service Check if [ "$CHECK_SERVICES" = true ]; then log_test "Step 2: Checking service availability" check_services echo "" fi # Step 3: Execute Basic Test Suite if [ "$RUN_BASIC_TESTS" = true ]; then log_test "Step 3: Executing basic test suite" execute_basic_tests echo "" fi # Step 4: Execute Real-World Tests if [ "$RUN_REAL_WORLD_TESTS" = true ]; then log_test "Step 4: Executing real-world comprehensive tests" execute_real_world_tests echo "" fi # Step 5: Execute Debugging Tests if [ "$RUN_DEBUGGING_TESTS" = true ]; then log_test "Step 5: Executing debugging and issue detection tests" execute_debugging_tests echo "" fi # Step 6: Performance Analysis log_test "Step 6: Analyzing performance metrics" analyze_performance echo "" # Step 7: Generate Comprehensive Report log_test "Step 7: Generating comprehensive report" generate_comprehensive_report # Calculate execution time local end_time=$(date +%s) local execution_time=$((end_time - start_time)) local minutes=$((execution_time / 60)) local seconds=$((execution_time % 60)) echo "" echo -e "${PURPLE}╔══════════════════════════════════════════════════════════════╗${NC}" echo -e "${PURPLE}║ Execution Summary ║${NC}" echo -e "${PURPLE}╚══════════════════════════════════════════════════════════════╝${NC}" echo "" log_info "Total Execution Time: ${minutes}m ${seconds}s" log_info "Total Tests: $TOTAL_TESTS" log_success "Passed Tests: $PASSED_TESTS" if [ $FAILED_TESTS -gt 0 ]; then log_error "Failed Tests: $FAILED_TESTS" else log_success "Failed Tests: $FAILED_TESTS" fi log_info "Issues Found: ${#ISSUES_FOUND[@]}" log_info "Recommendations: ${#RECOMMENDATIONS[@]}" echo "" log_success "📊 Comprehensive test report generated: $REPORT_DIR/comprehensive-test-report.md" log_info "📋 Detailed log available: $DETAILED_LOG" if [ ${#ISSUES_FOUND[@]} -gt 0 ]; then echo "" log_warning "🚨 Issues found - check the detailed report for recommendations" exit 1 else echo "" log_success "🎉 All tests completed successfully - no critical issues found!" exit 0 fi } check_services() { log_info "Checking required services..." # Check backend if curl -s http://localhost:8000/health > /dev/null 2>&1; then log_success "Backend service (port 8000) is available" else log_error "Backend service (port 8000) is not available" add_recommendation "Start backend service: cd ../backend && uvicorn app.main:app --reload --host 0.0.0.0 --port 8000" fi # Check frontend if curl -s http://localhost:3001 > /dev/null 2>&1; then log_success "Frontend service (port 3001) is available" else log_error "Frontend service (port 3001) is not available" add_recommendation "Start frontend service: npm run dev" fi # Check SSH tunnel (Oracle database) if nc -z localhost 1521 2>/dev/null; then log_success "SSH tunnel (port 1521) appears to be active" else log_warning "SSH tunnel (port 1521) may not be active" add_recommendation "Start SSH tunnel: cd ../../../.. && ./ssh_tunnel.sh start" fi # Check Node.js and npm if command -v node &> /dev/null && command -v npm &> /dev/null; then local node_version=$(node --version) local npm_version=$(npm --version) log_success "Node.js $node_version and npm $npm_version are available" else log_error "Node.js or npm not found" add_recommendation "Install Node.js and npm" fi } execute_basic_tests() { log_info "Running basic authentication and UI tests..." local basic_result=0 # Run login tests if npx playwright test auth/login.spec.js --project=chromium --reporter=json > "$REPORT_DIR/basic-tests-result.json" 2>&1; then log_success "Basic authentication tests passed" PASSED_TESTS=$((PASSED_TESTS + 10)) else log_error "Basic authentication tests failed" FAILED_TESTS=$((FAILED_TESTS + 10)) basic_result=1 fi TOTAL_TESTS=$((TOTAL_TESTS + 10)) # Analyze basic test results if [ -f "$REPORT_DIR/basic-tests-result.json" ]; then analyze_test_results "$REPORT_DIR/basic-tests-result.json" "Basic Tests" fi return $basic_result } execute_real_world_tests() { log_info "Running real-world comprehensive tests..." local real_world_result=0 if npx playwright test e2e/real-world-comprehensive.spec.js --project=chromium --reporter=json > "$REPORT_DIR/real-world-tests-result.json" 2>&1; then log_success "Real-world comprehensive tests passed" PASSED_TESTS=$((PASSED_TESTS + 4)) else log_error "Real-world comprehensive tests failed" FAILED_TESTS=$((FAILED_TESTS + 4)) real_world_result=1 fi TOTAL_TESTS=$((TOTAL_TESTS + 4)) # Analyze real-world test results if [ -f "$REPORT_DIR/real-world-tests-result.json" ]; then analyze_test_results "$REPORT_DIR/real-world-tests-result.json" "Real-World Tests" fi return $real_world_result } execute_debugging_tests() { log_info "Running debugging and issue detection tests..." local debug_result=0 if npx playwright test e2e/debugging-real-issues.spec.js --project=chromium --reporter=json > "$REPORT_DIR/debugging-tests-result.json" 2>&1; then log_success "Debugging tests passed" PASSED_TESTS=$((PASSED_TESTS + 4)) else log_error "Debugging tests failed" FAILED_TESTS=$((FAILED_TESTS + 4)) debug_result=1 fi TOTAL_TESTS=$((TOTAL_TESTS + 4)) # Analyze debugging test results if [ -f "$REPORT_DIR/debugging-tests-result.json" ]; then analyze_test_results "$REPORT_DIR/debugging-tests-result.json" "Debugging Tests" fi return $debug_result } analyze_test_results() { local result_file="$1" local test_category="$2" if [ ! -f "$result_file" ]; then log_warning "Result file $result_file not found for $test_category" return fi log_info "Analyzing $test_category results..." # Extract key information from JSON results if command -v jq &> /dev/null; then local total_tests=$(jq -r '.stats.total // 0' "$result_file") local passed_tests=$(jq -r '.stats.passed // 0' "$result_file") local failed_tests=$(jq -r '.stats.failed // 0' "$result_file") local duration=$(jq -r '.stats.duration // 0' "$result_file") log_info "$test_category: $passed_tests/$total_tests passed (${duration}ms)" # Extract failed test details local failed_test_titles=$(jq -r '.tests[] | select(.status == "failed") | .title' "$result_file" 2>/dev/null || echo "") if [ -n "$failed_test_titles" ]; then log_warning "Failed tests in $test_category:" echo "$failed_test_titles" | while read -r title; do log_error " - $title" done fi else log_warning "jq not available for detailed JSON analysis" add_recommendation "Install jq for better test result analysis: sudo apt-get install jq" fi } analyze_performance() { log_info "Analyzing application performance..." # Check if we have performance data from tests local perf_issues=() # Look for performance-related issues in logs if grep -q "slow" "$DETAILED_LOG" 2>/dev/null; then perf_issues+=("Slow requests detected") fi if grep -q "timeout" "$DETAILED_LOG" 2>/dev/null; then perf_issues+=("Timeout issues detected") fi if [ ${#perf_issues[@]} -gt 0 ]; then log_warning "Performance issues found:" for issue in "${perf_issues[@]}"; do log_warning " - $issue" ISSUES_FOUND+=("Performance: $issue") done add_recommendation "Review performance bottlenecks and optimize slow endpoints" else log_success "No significant performance issues detected" fi } generate_comprehensive_report() { local report_file="$REPORT_DIR/comprehensive-test-report.md" cat > "$report_file" << EOF # 🧪 ROA2WEB Comprehensive Test Report **Generated:** $(date) **Execution Time:** Total execution logged in detailed log **Test Environment:** Development (localhost) ## 📊 Executive Summary | Metric | Value | |--------|-------| | Total Tests | $TOTAL_TESTS | | Passed Tests | $PASSED_TESTS | | Failed Tests | $FAILED_TESTS | | Success Rate | $(( PASSED_TESTS * 100 / (TOTAL_TESTS > 0 ? TOTAL_TESTS : 1) ))% | | Issues Found | ${#ISSUES_FOUND[@]} | | Recommendations | ${#RECOMMENDATIONS[@]} | ## 🚨 Issues Identified EOF if [ ${#ISSUES_FOUND[@]} -gt 0 ]; then echo "### Critical Issues:" >> "$report_file" for issue in "${ISSUES_FOUND[@]}"; do echo "- ❌ $issue" >> "$report_file" done echo "" >> "$report_file" else echo "✅ **No critical issues found!**" >> "$report_file" echo "" >> "$report_file" fi cat >> "$report_file" << EOF ## 💡 Recommendations EOF if [ ${#RECOMMENDATIONS[@]} -gt 0 ]; then for rec in "${RECOMMENDATIONS[@]}"; do echo "- 🔧 $rec" >> "$report_file" done else echo "✅ **No specific recommendations - application is performing well!**" >> "$report_file" fi cat >> "$report_file" << EOF ## 📋 Test Categories Executed ### 1. 🔐 Authentication Tests - Login form validation - Authentication flow - Error handling - Session management ### 2. 🌍 Real-World Tests - Complete user journeys - Network performance analysis - Error handling stress tests - Responsive design validation ### 3. 🔍 Debugging Tests - API request format validation - Button state logic verification - Error message format checking - Network monitoring ## 📁 Report Files - **Detailed Log:** \`$(basename "$DETAILED_LOG")\` - **Basic Tests:** \`basic-tests-result.json\` - **Real-World Tests:** \`real-world-tests-result.json\` - **Debugging Tests:** \`debugging-tests-result.json\` ## 🎯 Next Steps 1. **Address Critical Issues:** Review and fix any issues listed above 2. **Implement Recommendations:** Follow the recommendations for optimal performance 3. **Regular Testing:** Run this comprehensive test suite regularly 4. **Monitor Performance:** Keep track of response times and error rates --- *Report generated by ROA2WEB Comprehensive Test Suite* EOF log_success "Comprehensive report generated: $report_file" } # Handle cleanup on exit cleanup_on_exit() { if [ -d "$REPORT_DIR" ]; then log_info "Test reports saved in: $REPORT_DIR" fi } trap cleanup_on_exit EXIT # Show usage if help requested if [ "$1" = "--help" ] || [ "$1" = "-h" ]; then echo "ROA2WEB Comprehensive Test Execution Script" echo "" echo "Usage: $0 [options]" echo "" echo "Options:" echo " --no-cleanup Skip cleanup of previous test artifacts" echo " --no-basic Skip basic test suite" echo " --no-real-world Skip real-world tests" echo " --no-debugging Skip debugging tests" echo " --no-services Skip service availability check" echo " --help, -h Show this help message" echo "" echo "Prerequisites:" echo " - SSH tunnel active: ./ssh_tunnel.sh start" echo " - Backend running: uvicorn app.main:app --reload --host 0.0.0.0 --port 8000" echo " - Frontend running: npm run dev" echo "" exit 0 fi # Parse command line arguments while [[ $# -gt 0 ]]; do case $1 in --no-cleanup) RUN_CLEANUP=false shift ;; --no-basic) RUN_BASIC_TESTS=false shift ;; --no-real-world) RUN_REAL_WORLD_TESTS=false shift ;; --no-debugging) RUN_DEBUGGING_TESTS=false shift ;; --no-services) CHECK_SERVICES=false shift ;; *) log_warning "Unknown option: $1" shift ;; esac done # Execute main function main "$@"