Migrated from design-system-swarm with fresh git history.
Old project history preserved in /home/overbits/apps/design-system-swarm
Core components:
- MCP Server (Python FastAPI with mcp 1.23.1)
- Claude Plugin (agents, commands, skills, strategies, hooks, core)
- DSS Backend (dss-mvp1 - token translation, Figma sync)
- Admin UI (Node.js/React)
- Server (Node.js/Express)
- Storybook integration (dss-mvp1/.storybook)
Self-contained configuration:
- All paths relative or use DSS_BASE_PATH=/home/overbits/dss
- PYTHONPATH configured for dss-mvp1 and dss-claude-plugin
- .env file with all configuration
- Claude plugin uses ${CLAUDE_PLUGIN_ROOT} for portability
Migration completed: $(date)
🤖 Clean migration with full functionality preserved
382 lines
16 KiB
Bash
Executable File
382 lines
16 KiB
Bash
Executable File
#!/bin/bash
|
||
#
|
||
# DSS Admin UI - Complete Test Automation Suite
|
||
# ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||
#
|
||
# Orchestrates Phase 1, Phase 2, and Phase 3 testing
|
||
# Framework: Pytest-Playwright
|
||
# Purpose: Complete validation of all 51 components and 79+ API endpoints
|
||
#
|
||
# Generated: 2025-12-08
|
||
# Author: Gemini 3 Pro Expert Analysis
|
||
# Status: Ready for Implementation
|
||
#
|
||
|
||
set -e
|
||
|
||
# Colors for output
|
||
RED='\033[0;31m'
|
||
GREEN='\033[0;32m'
|
||
YELLOW='\033[1;33m'
|
||
BLUE='\033[0;34m'
|
||
NC='\033[0m' # No Color
|
||
|
||
# Configuration
|
||
PROJECT_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
|
||
DSS_DIR="$PROJECT_ROOT/.dss"
|
||
ADMIN_UI_DIR="$PROJECT_ROOT/admin-ui"
|
||
LOG_DIR="$DSS_DIR/test-logs"
|
||
REPORT_FILE="$LOG_DIR/test-report-$(date +%Y%m%d-%H%M%S).txt"
|
||
|
||
# Ensure log directory exists
|
||
mkdir -p "$LOG_DIR"
|
||
|
||
# ────────────────────────────────────────────────────────────────────────────
|
||
# Helper Functions
|
||
# ────────────────────────────────────────────────────────────────────────────
|
||
|
||
print_header() {
|
||
echo -e "\n${BLUE}╔═══════════════════════════════════════════════════════════════════════════════╗${NC}"
|
||
echo -e "${BLUE}║${NC} $1"
|
||
echo -e "${BLUE}╚═══════════════════════════════════════════════════════════════════════════════╝${NC}\n"
|
||
}
|
||
|
||
print_section() {
|
||
echo -e "\n${YELLOW}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
|
||
echo -e "${YELLOW}$1${NC}"
|
||
echo -e "${YELLOW}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}\n"
|
||
}
|
||
|
||
print_success() {
|
||
echo -e "${GREEN}✅ $1${NC}"
|
||
}
|
||
|
||
print_error() {
|
||
echo -e "${RED}❌ $1${NC}"
|
||
}
|
||
|
||
print_info() {
|
||
echo -e "${BLUE}ℹ️ $1${NC}"
|
||
}
|
||
|
||
check_command() {
|
||
if ! command -v "$1" &> /dev/null; then
|
||
print_error "Required command not found: $1"
|
||
exit 1
|
||
fi
|
||
}
|
||
|
||
wait_for_service() {
|
||
local url=$1
|
||
local max_attempts=30
|
||
local attempt=0
|
||
|
||
print_info "Waiting for service: $url"
|
||
|
||
while [ $attempt -lt $max_attempts ]; do
|
||
if curl -s "$url" > /dev/null 2>&1; then
|
||
print_success "Service available: $url"
|
||
return 0
|
||
fi
|
||
attempt=$((attempt + 1))
|
||
echo -n "."
|
||
sleep 1
|
||
done
|
||
|
||
print_error "Service timeout: $url"
|
||
return 1
|
||
}
|
||
|
||
# ────────────────────────────────────────────────────────────────────────────
|
||
# Pre-flight Checks
|
||
# ────────────────────────────────────────────────────────────────────────────
|
||
|
||
print_header "DSS Admin UI - Complete Test Automation Suite"
|
||
|
||
echo "Checking prerequisites..."
|
||
|
||
# Check Python
|
||
check_command "python3"
|
||
print_success "Python 3 found"
|
||
|
||
# Check pytest
|
||
if ! python3 -m pytest --version &> /dev/null; then
|
||
print_error "pytest not installed"
|
||
echo "Installing: pip3 install pytest pytest-playwright pytest-asyncio"
|
||
pip3 install pytest pytest-playwright pytest-asyncio httpx
|
||
fi
|
||
print_success "pytest available"
|
||
|
||
# Check Playwright
|
||
if ! python3 -c "from playwright.sync_api import sync_playwright" &> /dev/null; then
|
||
print_error "Playwright not installed"
|
||
echo "Installing: pip3 install playwright"
|
||
pip3 install playwright
|
||
python3 -m playwright install
|
||
fi
|
||
print_success "Playwright available"
|
||
|
||
# Check Node/npm
|
||
check_command "node"
|
||
print_success "Node.js found"
|
||
|
||
check_command "npm"
|
||
print_success "npm found"
|
||
|
||
print_success "All prerequisites met\n"
|
||
|
||
# ────────────────────────────────────────────────────────────────────────────
|
||
# Environment Setup
|
||
# ────────────────────────────────────────────────────────────────────────────
|
||
|
||
print_section "PHASE 0: Environment Setup"
|
||
|
||
print_info "Project directory: $PROJECT_ROOT"
|
||
print_info "Admin UI directory: $ADMIN_UI_DIR"
|
||
print_info "Test directory: $DSS_DIR"
|
||
print_info "Log directory: $LOG_DIR"
|
||
|
||
# Check if services are already running
|
||
DEV_SERVER_RUNNING=false
|
||
API_SERVER_RUNNING=false
|
||
|
||
if curl -s http://localhost:5173 > /dev/null 2>&1; then
|
||
print_success "Dev server (Vite) already running on :5173"
|
||
DEV_SERVER_RUNNING=true
|
||
else
|
||
print_info "Starting Vite dev server..."
|
||
cd "$ADMIN_UI_DIR"
|
||
npm run dev > "$LOG_DIR/vite.log" 2>&1 &
|
||
VITE_PID=$!
|
||
print_info "Vite PID: $VITE_PID"
|
||
if wait_for_service "http://localhost:5173"; then
|
||
DEV_SERVER_RUNNING=true
|
||
else
|
||
print_error "Failed to start Vite dev server"
|
||
exit 1
|
||
fi
|
||
cd - > /dev/null
|
||
fi
|
||
|
||
if curl -s http://localhost:8002/api/system/status > /dev/null 2>&1; then
|
||
print_success "API server (FastAPI) already running on :8002"
|
||
API_SERVER_RUNNING=true
|
||
else
|
||
print_info "Note: FastAPI backend not running on :8002"
|
||
print_info "Some API tests may be skipped"
|
||
fi
|
||
|
||
# ────────────────────────────────────────────────────────────────────────────
|
||
# Phase 1: Smoke Test (Component Loading)
|
||
# ────────────────────────────────────────────────────────────────────────────
|
||
|
||
print_section "PHASE 1: Smoke Test - Component Loading"
|
||
|
||
print_info "Testing all 51 components for load success and console errors"
|
||
print_info "Timeout per component: 3000ms"
|
||
print_info "Expected result: 51/51 components load without critical errors"
|
||
|
||
PHASE1_LOG="$LOG_DIR/phase1-smoke-test.log"
|
||
PHASE1_REPORT="$LOG_DIR/phase1-report.txt"
|
||
|
||
if python3 -m pytest "$DSS_DIR/test_smoke_phase1.py" \
|
||
-v \
|
||
--tb=short \
|
||
--html="$LOG_DIR/phase1-report.html" \
|
||
--self-contained-html \
|
||
2>&1 | tee "$PHASE1_LOG"; then
|
||
print_success "Phase 1 Smoke Test: PASSED"
|
||
PHASE1_RESULT="PASSED"
|
||
else
|
||
print_error "Phase 1 Smoke Test: FAILED"
|
||
PHASE1_RESULT="FAILED"
|
||
fi
|
||
|
||
# ────────────────────────────────────────────────────────────────────────────
|
||
# Phase 2: Category-Based Testing
|
||
# ────────────────────────────────────────────────────────────────────────────
|
||
|
||
print_section "PHASE 2: Category-Based Testing"
|
||
|
||
print_info "Testing component categories with specific interactions:"
|
||
print_info " - Tools: Input → Execute → Result validation"
|
||
print_info " - Metrics: Chart rendering, data validation"
|
||
print_info " - Layout: Navigation, sidebar, panels"
|
||
print_info " - Admin: CRUD operations, permissions"
|
||
print_info " - UI Elements: Component behavior"
|
||
|
||
PHASE2_LOG="$LOG_DIR/phase2-category-test.log"
|
||
PHASE2_REPORT="$LOG_DIR/phase2-report.txt"
|
||
|
||
if python3 -m pytest "$DSS_DIR/test_category_phase2.py" \
|
||
-v \
|
||
--tb=short \
|
||
--html="$LOG_DIR/phase2-report.html" \
|
||
--self-contained-html \
|
||
2>&1 | tee "$PHASE2_LOG"; then
|
||
print_success "Phase 2 Category Testing: PASSED"
|
||
PHASE2_RESULT="PASSED"
|
||
else
|
||
print_error "Phase 2 Category Testing: FAILED"
|
||
PHASE2_RESULT="FAILED"
|
||
fi
|
||
|
||
# ────────────────────────────────────────────────────────────────────────────
|
||
# Phase 3: API Integration Testing
|
||
# ────────────────────────────────────────────────────────────────────────────
|
||
|
||
print_section "PHASE 3: API Integration Testing"
|
||
|
||
if [ "$API_SERVER_RUNNING" = true ]; then
|
||
print_info "Testing all 79+ API endpoints:"
|
||
print_info " - Authentication endpoints"
|
||
print_info " - Project management"
|
||
print_info " - Browser logging"
|
||
print_info " - Figma integration"
|
||
print_info " - MCP tools"
|
||
print_info " - System & admin"
|
||
print_info " - Audit & discovery"
|
||
|
||
PHASE3_LOG="$LOG_DIR/phase3-api-test.log"
|
||
PHASE3_REPORT="$LOG_DIR/phase3-report.txt"
|
||
|
||
if python3 -m pytest "$DSS_DIR/test_api_phase3.py" \
|
||
-v \
|
||
--tb=short \
|
||
--html="$LOG_DIR/phase3-report.html" \
|
||
--self-contained-html \
|
||
2>&1 | tee "$PHASE3_LOG"; then
|
||
print_success "Phase 3 API Testing: PASSED"
|
||
PHASE3_RESULT="PASSED"
|
||
else
|
||
print_error "Phase 3 API Testing: FAILED"
|
||
PHASE3_RESULT="FAILED"
|
||
fi
|
||
else
|
||
print_error "FastAPI backend not running - skipping Phase 3"
|
||
print_info "To run Phase 3: Start FastAPI backend on localhost:8002"
|
||
PHASE3_RESULT="SKIPPED"
|
||
fi
|
||
|
||
# ────────────────────────────────────────────────────────────────────────────
|
||
# Generate Final Report
|
||
# ────────────────────────────────────────────────────────────────────────────
|
||
|
||
print_section "TEST EXECUTION COMPLETE"
|
||
|
||
cat > "$REPORT_FILE" << EOF
|
||
╔═══════════════════════════════════════════════════════════════════════════════╗
|
||
║ ║
|
||
║ DSS Admin UI - Complete Test Automation Report ║
|
||
║ ║
|
||
╚═══════════════════════════════════════════════════════════════════════════════╝
|
||
|
||
Execution Date: $(date)
|
||
Project: Design System Admin UI
|
||
Framework: Pytest-Playwright (Python)
|
||
|
||
═══════════════════════════════════════════════════════════════════════════════
|
||
|
||
PHASE 1: SMOKE TEST (Component Loading)
|
||
Status: $PHASE1_RESULT
|
||
Purpose: Verify all 51 components load without critical errors
|
||
Coverage: Component loading, DOM rendering, console error detection
|
||
Log: $PHASE1_LOG
|
||
|
||
PHASE 2: CATEGORY-BASED TESTING
|
||
Status: $PHASE2_RESULT
|
||
Purpose: Validate component categories with specific interactions
|
||
Coverage: Tools, Metrics, Layout, Admin, UI Elements
|
||
Log: $PHASE2_LOG
|
||
|
||
PHASE 3: API INTEGRATION TESTING
|
||
Status: $PHASE3_RESULT
|
||
Purpose: Verify all 79+ API endpoints are functional
|
||
Coverage: Authentication, Projects, Logs, Figma, MCP, Admin, Audit
|
||
Log: $PHASE3_LOG
|
||
|
||
═══════════════════════════════════════════════════════════════════════════════
|
||
|
||
SUMMARY:
|
||
Phase 1 (Components): $PHASE1_RESULT
|
||
Phase 2 (Categories): $PHASE2_RESULT
|
||
Phase 3 (API): $PHASE3_RESULT
|
||
|
||
Test Reports:
|
||
Phase 1: $LOG_DIR/phase1-report.html
|
||
Phase 2: $LOG_DIR/phase2-report.html
|
||
Phase 3: $LOG_DIR/phase3-report.html
|
||
|
||
Log Files:
|
||
Vite Dev Server: $LOG_DIR/vite.log
|
||
Phase 1 Details: $PHASE1_LOG
|
||
Phase 2 Details: $PHASE2_LOG
|
||
Phase 3 Details: $PHASE3_LOG
|
||
|
||
═══════════════════════════════════════════════════════════════════════════════
|
||
|
||
NEXT STEPS:
|
||
1. Review HTML reports in browser:
|
||
file://$LOG_DIR/phase1-report.html
|
||
file://$LOG_DIR/phase2-report.html
|
||
file://$LOG_DIR/phase3-report.html
|
||
|
||
2. Check log files for details:
|
||
cat $PHASE1_LOG
|
||
cat $PHASE2_LOG
|
||
cat $PHASE3_LOG
|
||
|
||
3. Fix any failing tests:
|
||
pytest <test-file> -k <test-name> -v
|
||
|
||
4. Run specific category:
|
||
pytest test_category_phase2.py::TestToolsCategory -v
|
||
|
||
═══════════════════════════════════════════════════════════════════════════════
|
||
|
||
Generated: $(date)
|
||
Report saved to: $REPORT_FILE
|
||
EOF
|
||
|
||
# Print summary to console
|
||
echo -e "\n${BLUE}╔═══════════════════════════════════════════════════════════════════════════════╗${NC}"
|
||
echo -e "${BLUE}║ TEST EXECUTION SUMMARY ║${NC}"
|
||
echo -e "${BLUE}╚═══════════════════════════════════════════════════════════════════════════════╝${NC}\n"
|
||
|
||
echo "Phase 1 - Smoke Test: $PHASE1_RESULT"
|
||
echo "Phase 2 - Category Testing: $PHASE2_RESULT"
|
||
echo "Phase 3 - API Testing: $PHASE3_RESULT"
|
||
|
||
echo -e "\n${BLUE}Log Files:${NC}"
|
||
echo " $REPORT_FILE"
|
||
echo " $PHASE1_LOG"
|
||
echo " $PHASE2_LOG"
|
||
echo " $PHASE3_LOG"
|
||
|
||
echo -e "\n${BLUE}HTML Reports:${NC}"
|
||
echo " $LOG_DIR/phase1-report.html"
|
||
echo " $LOG_DIR/phase2-report.html"
|
||
echo " $LOG_DIR/phase3-report.html"
|
||
|
||
# ────────────────────────────────────────────────────────────────────────────
|
||
# Cleanup
|
||
# ────────────────────────────────────────────────────────────────────────────
|
||
|
||
if [ "$DEV_SERVER_RUNNING" = false ] && [ ! -z "$VITE_PID" ]; then
|
||
print_info "Cleaning up: Stopping Vite dev server (PID: $VITE_PID)"
|
||
kill $VITE_PID 2>/dev/null || true
|
||
fi
|
||
|
||
# ────────────────────────────────────────────────────────────────────────────
|
||
# Final Status
|
||
# ────────────────────────────────────────────────────────────────────────────
|
||
|
||
if [ "$PHASE1_RESULT" = "PASSED" ] && [ "$PHASE2_RESULT" = "PASSED" ] && \
|
||
([ "$PHASE3_RESULT" = "PASSED" ] || [ "$PHASE3_RESULT" = "SKIPPED" ]); then
|
||
print_success "\nAll tests completed successfully!\n"
|
||
exit 0
|
||
else
|
||
print_error "\nSome tests failed. Review logs for details.\n"
|
||
exit 1
|
||
fi
|