resume/tests/run-tests.sh

193 lines
5.6 KiB
Bash
Executable File

#!/bin/bash
# =====================================================================
# run-tests.sh - Main test runner for the resume site
# =====================================================================
# This script starts a local Caddy server and runs all tests against it
# =====================================================================
set -e # Exit on any error
# Define constants
TEST_PORT=8080
CADDY_DIR="docker/resume"
CADDY_FILE="Caddyfile.local"
TESTS_DIR="$(dirname "$0")"
LOG_FILE="$TESTS_DIR/test-run.log"
# Function to clean up processes on exit
cleanup() {
echo "Cleaning up..."
# Find and kill any Caddy processes we started
if [ -f "$TESTS_DIR/.caddy.pid" ]; then
CADDY_PID=$(cat "$TESTS_DIR/.caddy.pid")
if ps -p $CADDY_PID > /dev/null; then
echo "Stopping Caddy server (PID: $CADDY_PID)"
kill $CADDY_PID
fi
rm "$TESTS_DIR/.caddy.pid"
fi
echo "Cleanup complete"
}
# Register the cleanup function to run on exit
trap cleanup EXIT
# Start the Caddy server
start_caddy() {
echo "Starting Caddy server on port $TEST_PORT..."
# Navigate to the Caddy directory
cd "$CADDY_DIR"
# Check if Caddyfile.local exists, if not, create it from Caddyfile
if [ ! -f "$CADDY_FILE" ]; then
echo "Creating $CADDY_FILE from Caddyfile..."
cp Caddyfile "$CADDY_FILE"
# Modify the Caddyfile.local to use the test port
sed -i '' "s/:80/:$TEST_PORT/g" "$CADDY_FILE"
fi
# Start Caddy in the background using the local config
echo "Running: caddy run --config $CADDY_FILE"
mkdir -p $(dirname "$LOG_FILE") && caddy run --config "$CADDY_FILE" > "$LOG_FILE" 2>&1 &
CADDY_PID=$!
mkdir -p "$TESTS_DIR" && echo $CADDY_PID > "$TESTS_DIR/.caddy.pid"
# Return to the original directory
cd - > /dev/null
# Wait for Caddy to start
echo "Waiting for Caddy to start..."
sleep 2
# Check if Caddy is running
if ! ps -p $CADDY_PID > /dev/null; then
echo "Failed to start Caddy server. Check $LOG_FILE for details."
exit 1
fi
echo "Caddy server started with PID: $CADDY_PID"
# Wait a bit more to ensure Caddy is fully initialized
sleep 3
}
# Run Node.js server for tests that require it
start_node_server() {
if [ -f "$TESTS_DIR/serve.js" ]; then
echo "Starting Node.js server for tests..."
node "$TESTS_DIR/serve.js" > "$TESTS_DIR/node-server.log" 2>&1 &
NODE_SERVER_PID=$!
echo $NODE_SERVER_PID > "$TESTS_DIR/.node-server.pid"
# Wait for Node.js server to start
sleep 2
# Check if Node.js server is running
if ! ps -p $NODE_SERVER_PID > /dev/null; then
echo "Failed to start Node.js server. Check $TESTS_DIR/node-server.log for details."
exit 1
fi
echo "Node.js server started with PID: $NODE_SERVER_PID"
fi
}
# Clean up Node.js server
cleanup_node_server() {
if [ -f "$TESTS_DIR/.node-server.pid" ]; then
NODE_SERVER_PID=$(cat "$TESTS_DIR/.node-server.pid")
if ps -p $NODE_SERVER_PID > /dev/null; then
echo "Stopping Node.js server (PID: $NODE_SERVER_PID)"
kill $NODE_SERVER_PID
fi
rm "$TESTS_DIR/.node-server.pid"
fi
}
# Run shell script tests
run_shell_tests() {
echo "Running shell script tests..."
# Run unit tests
echo "Running unit tests..."
if [ -d "$TESTS_DIR/unit" ] && [ "$(ls -A "$TESTS_DIR/unit")" ]; then
for test in "$TESTS_DIR/unit"/*.sh; do
if [ -f "$test" ] && [ -x "$test" ]; then
echo "Running unit test: $(basename "$test")"
"$test" || echo "FAILED: $(basename "$test")"
fi
done
else
echo "No unit tests found."
fi
# Run integration tests
echo "Running integration tests..."
if [ -d "$TESTS_DIR/integration" ] && [ "$(ls -A "$TESTS_DIR/integration")" ]; then
for test in "$TESTS_DIR/integration"/*.sh; do
if [ -f "$test" ] && [ -x "$test" ]; then
echo "Running integration test: $(basename "$test")"
"$test" "http://localhost:$TEST_PORT" || echo "FAILED: $(basename "$test")"
fi
done
# Check for subdirectories
for dir in "$TESTS_DIR/integration"/*/; do
if [ -d "$dir" ]; then
for test in "$dir"*.sh; do
if [ -f "$test" ] && [ -x "$test" ]; then
echo "Running integration test: $(basename "$test")"
"$test" "http://localhost:$TEST_PORT" || echo "FAILED: $(basename "$test")"
fi
done
fi
done
else
echo "No integration tests found."
fi
# Run e2e tests
echo "Running e2e tests..."
if [ -d "$TESTS_DIR/e2e" ] && [ "$(ls -A "$TESTS_DIR/e2e")" ]; then
for test in "$TESTS_DIR/e2e"/*.sh; do
if [ -f "$test" ] && [ -x "$test" ]; then
echo "Running e2e test: $(basename "$test")"
"$test" "http://localhost:$TEST_PORT" || echo "FAILED: $(basename "$test")"
fi
done
else
echo "No e2e tests found."
fi
}
# Run JavaScript tests
run_js_tests() {
echo "Running JavaScript tests..."
# Check if Playwright is installed
if command -v npx &> /dev/null && npx playwright --version &> /dev/null; then
# Run Playwright tests
echo "Running Playwright tests..."
npx playwright test || echo "FAILED: Playwright tests"
else
echo "Playwright not found, skipping Playwright tests."
fi
# Run Lighthouse tests if available
if [ -f "$TESTS_DIR/lighthouse.js" ]; then
echo "Running Lighthouse tests..."
node "$TESTS_DIR/lighthouse.js" "http://localhost:$TEST_PORT" || echo "FAILED: Lighthouse tests"
fi
}
# Main execution
echo "=== Starting Test Suite ==="
start_caddy
start_node_server
run_shell_tests
run_js_tests
cleanup_node_server
echo "=== Test Suite Completed ==="