210 lines
6.5 KiB
Bash
Executable File
210 lines
6.5 KiB
Bash
Executable File
#!/bin/bash
|
|
# Integration test: Fresh developer onboarding experience
|
|
# Measures time and verifies each step of the onboarding flow
|
|
|
|
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
|
|
|
|
# Timing utilities
|
|
start_time=$(date +%s)
|
|
step_start=0
|
|
|
|
start_step() {
|
|
echo -e "\n${BLUE}▶ $1${NC}"
|
|
step_start=$(date +%s)
|
|
}
|
|
|
|
end_step() {
|
|
local step_end=$(date +%s)
|
|
local duration=$((step_end - step_start))
|
|
echo -e "${GREEN}✓ $1 (${duration}s)${NC}"
|
|
}
|
|
|
|
fail_step() {
|
|
echo -e "${RED}✗ $1${NC}"
|
|
exit 1
|
|
}
|
|
|
|
# Test starts here
|
|
echo -e "${BLUE}╔════════════════════════════════════════════════════════╗${NC}"
|
|
echo -e "${BLUE}║ Agent Orchestrator - Onboarding Integration Test ║${NC}"
|
|
echo -e "${BLUE}╔════════════════════════════════════════════════════════╗${NC}"
|
|
echo ""
|
|
|
|
# Step 1: Simulate git clone (already done by Docker COPY, but we cd into it)
|
|
start_step "Step 1: Navigate to repository"
|
|
cd /workspace/agent-orchestrator || fail_step "Repository not found"
|
|
end_step "Step 1: Repository accessible"
|
|
|
|
# Step 2: Run setup script
|
|
start_step "Step 2: Running ./scripts/setup.sh"
|
|
if ! ./scripts/setup.sh; then
|
|
fail_step "Step 2: Setup script failed"
|
|
fi
|
|
end_step "Step 2: Setup completed"
|
|
|
|
# Step 3: Verify ao command is available
|
|
start_step "Step 3: Verify ao command"
|
|
if ! command -v ao &> /dev/null; then
|
|
fail_step "Step 3: ao command not found (npm link failed?)"
|
|
fi
|
|
ao --version || fail_step "Step 3: ao --version failed"
|
|
end_step "Step 3: ao command available"
|
|
|
|
# Step 4: Create minimal test config
|
|
start_step "Step 4: Create test configuration"
|
|
mkdir -p /tmp/ao-test-project
|
|
cd /tmp/ao-test-project
|
|
git init
|
|
git config user.email "test@example.com"
|
|
git config user.name "Test User"
|
|
|
|
cat > agent-orchestrator.yaml << 'EOF'
|
|
dataDir: /tmp/ao-test-data
|
|
worktreeDir: /tmp/ao-test-worktrees
|
|
port: 9000
|
|
|
|
projects:
|
|
test-project:
|
|
repo: test/repo
|
|
path: /tmp/ao-test-project
|
|
defaultBranch: main
|
|
EOF
|
|
|
|
end_step "Step 4: Configuration created"
|
|
|
|
# Step 5: Verify config is valid
|
|
start_step "Step 5: Validate configuration"
|
|
# ao init would fail if run again, so we just verify the file is readable
|
|
if [ ! -f agent-orchestrator.yaml ]; then
|
|
fail_step "Step 5: Config file not found"
|
|
fi
|
|
end_step "Step 5: Configuration validated"
|
|
|
|
# Step 6: Start orchestrator (in background)
|
|
start_step "Step 6: Start orchestrator"
|
|
# Start in background and capture PID
|
|
ao start --no-orchestrator & # Only start dashboard, not the orchestrator session
|
|
DASHBOARD_PID=$!
|
|
|
|
# Wait for dashboard to be ready (max 30 seconds)
|
|
echo " Waiting for dashboard to start..."
|
|
for i in {1..30}; do
|
|
if curl -s http://localhost:9000 > /dev/null 2>&1; then
|
|
break
|
|
fi
|
|
if ! kill -0 $DASHBOARD_PID 2>/dev/null; then
|
|
fail_step "Step 6: Dashboard process died"
|
|
fi
|
|
sleep 1
|
|
done
|
|
|
|
if ! curl -s http://localhost:9000 > /dev/null 2>&1; then
|
|
fail_step "Step 6: Dashboard not responding after 30s"
|
|
fi
|
|
|
|
end_step "Step 6: Dashboard started successfully"
|
|
|
|
# Step 7: Verify dashboard endpoints
|
|
start_step "Step 7: Verify dashboard API"
|
|
|
|
# Test /api/sessions endpoint
|
|
if ! curl -sf http://localhost:9000/api/sessions > /dev/null; then
|
|
fail_step "Step 7: /api/sessions endpoint failed"
|
|
fi
|
|
|
|
# Test SSE events endpoint (just verify it responds, don't wait for events)
|
|
if ! timeout 2 curl -sf http://localhost:9000/api/events > /dev/null 2>&1; then
|
|
# SSE might timeout, that's ok - we just want to verify it exists
|
|
:
|
|
fi
|
|
|
|
end_step "Step 7: Dashboard API responding"
|
|
|
|
# Step 8: Verify WebSocket terminal servers
|
|
start_step "Step 8: Verify WebSocket servers"
|
|
|
|
# Check if direct terminal WebSocket server is running (required for terminal feature)
|
|
# Default port is 14801 (14800 range chosen to avoid conflicts with dev tools)
|
|
DIRECT_TERMINAL_PORT="${DIRECT_TERMINAL_PORT:-14801}"
|
|
echo " Checking WebSocket server on port $DIRECT_TERMINAL_PORT..."
|
|
max_retries=10
|
|
for i in $(seq 1 $max_retries); do
|
|
if curl -sf "http://localhost:$DIRECT_TERMINAL_PORT/health" > /dev/null 2>&1; then
|
|
echo " ✓ WebSocket server responding"
|
|
break
|
|
fi
|
|
if [ $i -eq $max_retries ]; then
|
|
fail_step "Step 8: WebSocket terminal server not responding (bug: ao start didn't launch all services)"
|
|
fi
|
|
sleep 1
|
|
done
|
|
|
|
end_step "Step 8: WebSocket servers verified"
|
|
|
|
# Step 9: Verify orchestrator terminal page (end-to-end test)
|
|
start_step "Step 9: Verify orchestrator terminal feature"
|
|
|
|
# Create orchestrator session first (so we have something to test)
|
|
echo " Creating test orchestrator session..."
|
|
tmux new-session -d -s test-project-orchestrator || true
|
|
|
|
# Write minimal metadata
|
|
mkdir -p /tmp/ao-test-data
|
|
cat > /tmp/ao-test-data/test-project-orchestrator << 'EOF'
|
|
worktree=/tmp/ao-test-project
|
|
branch=main
|
|
status=working
|
|
project=test-project
|
|
EOF
|
|
|
|
# Test that the session detail page loads (where terminal would be)
|
|
if ! curl -sf http://localhost:9000/sessions/test-project-orchestrator > /dev/null; then
|
|
fail_step "Step 9: Orchestrator session page failed to load"
|
|
fi
|
|
|
|
# Cleanup test session
|
|
tmux kill-session -t test-project-orchestrator 2>/dev/null || true
|
|
|
|
end_step "Step 9: Orchestrator terminal page accessible"
|
|
|
|
# Step 10: Cleanup
|
|
start_step "Step 10: Cleanup"
|
|
kill $DASHBOARD_PID 2>/dev/null || true
|
|
# Wait for process to exit
|
|
sleep 2
|
|
# Force kill if still running
|
|
kill -9 $DASHBOARD_PID 2>/dev/null || true
|
|
|
|
# Kill any remaining Node processes (dashboard, websocket servers)
|
|
pkill -f "node.*next.*dev" || true
|
|
pkill -f "tsx.*terminal" || true
|
|
|
|
end_step "Step 10: Cleanup completed"
|
|
|
|
# Calculate total time
|
|
end_time=$(date +%s)
|
|
total_duration=$((end_time - start_time))
|
|
|
|
# Summary
|
|
echo ""
|
|
echo -e "${GREEN}╔════════════════════════════════════════════════════════╗${NC}"
|
|
echo -e "${GREEN}║ 🎉 All Tests Passed! ║${NC}"
|
|
echo -e "${GREEN}╔════════════════════════════════════════════════════════╗${NC}"
|
|
echo ""
|
|
echo -e "${BLUE}Total onboarding time: ${total_duration}s${NC}"
|
|
echo ""
|
|
|
|
# Export metrics for CI
|
|
if [ -n "$GITHUB_ACTIONS" ]; then
|
|
echo "onboarding_time_seconds=$total_duration" >> "$GITHUB_OUTPUT"
|
|
fi
|
|
|
|
exit 0
|