188 lines
5.0 KiB
Bash
188 lines
5.0 KiB
Bash
#!/usr/bin/env bash
|
|
# Test runner for Claude Code skills
|
|
# Tests skills by invoking Claude Code CLI and verifying behavior
|
|
set -euo pipefail
|
|
|
|
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
|
cd "$SCRIPT_DIR"
|
|
|
|
echo "========================================"
|
|
echo " Claude Code Skills Test Suite"
|
|
echo "========================================"
|
|
echo ""
|
|
echo "Repository: $(cd ../.. && pwd)"
|
|
echo "Test time: $(date)"
|
|
echo "Claude version: $(claude --version 2>/dev/null || echo 'not found')"
|
|
echo ""
|
|
|
|
# Check if Claude Code is available
|
|
if ! command -v claude &> /dev/null; then
|
|
echo "ERROR: Claude Code CLI not found"
|
|
echo "Install Claude Code first: https://code.claude.com"
|
|
exit 1
|
|
fi
|
|
|
|
# Parse command line arguments
|
|
VERBOSE=false
|
|
SPECIFIC_TEST=""
|
|
TIMEOUT=300 # Default 5 minute timeout per test
|
|
RUN_INTEGRATION=false
|
|
|
|
while [[ $# -gt 0 ]]; do
|
|
case $1 in
|
|
--verbose|-v)
|
|
VERBOSE=true
|
|
shift
|
|
;;
|
|
--test|-t)
|
|
SPECIFIC_TEST="$2"
|
|
shift 2
|
|
;;
|
|
--timeout)
|
|
TIMEOUT="$2"
|
|
shift 2
|
|
;;
|
|
--integration|-i)
|
|
RUN_INTEGRATION=true
|
|
shift
|
|
;;
|
|
--help|-h)
|
|
echo "Usage: $0 [options]"
|
|
echo ""
|
|
echo "Options:"
|
|
echo " --verbose, -v Show verbose output"
|
|
echo " --test, -t NAME Run only the specified test"
|
|
echo " --timeout SECONDS Set timeout per test (default: 300)"
|
|
echo " --integration, -i Run integration tests (slow, 10-30 min)"
|
|
echo " --help, -h Show this help"
|
|
echo ""
|
|
echo "Tests:"
|
|
echo " test-subagent-driven-development.sh Test skill loading and requirements"
|
|
echo ""
|
|
echo "Integration Tests (use --integration):"
|
|
echo " test-subagent-driven-development-integration.sh Full workflow execution"
|
|
exit 0
|
|
;;
|
|
*)
|
|
echo "Unknown option: $1"
|
|
echo "Use --help for usage information"
|
|
exit 1
|
|
;;
|
|
esac
|
|
done
|
|
|
|
# List of skill tests to run (fast unit tests)
|
|
tests=(
|
|
"test-subagent-driven-development.sh"
|
|
)
|
|
|
|
# Integration tests (slow, full execution)
|
|
integration_tests=(
|
|
"test-subagent-driven-development-integration.sh"
|
|
)
|
|
|
|
# Add integration tests if requested
|
|
if [ "$RUN_INTEGRATION" = true ]; then
|
|
tests+=("${integration_tests[@]}")
|
|
fi
|
|
|
|
# Filter to specific test if requested
|
|
if [ -n "$SPECIFIC_TEST" ]; then
|
|
tests=("$SPECIFIC_TEST")
|
|
fi
|
|
|
|
# Track results
|
|
passed=0
|
|
failed=0
|
|
skipped=0
|
|
|
|
# Run each test
|
|
for test in "${tests[@]}"; do
|
|
echo "----------------------------------------"
|
|
echo "Running: $test"
|
|
echo "----------------------------------------"
|
|
|
|
test_path="$SCRIPT_DIR/$test"
|
|
|
|
if [ ! -f "$test_path" ]; then
|
|
echo " [SKIP] Test file not found: $test"
|
|
skipped=$((skipped + 1))
|
|
continue
|
|
fi
|
|
|
|
if [ ! -x "$test_path" ]; then
|
|
echo " Making $test executable..."
|
|
chmod +x "$test_path"
|
|
fi
|
|
|
|
start_time=$(date +%s)
|
|
|
|
if [ "$VERBOSE" = true ]; then
|
|
if timeout "$TIMEOUT" bash "$test_path"; then
|
|
end_time=$(date +%s)
|
|
duration=$((end_time - start_time))
|
|
echo ""
|
|
echo " [PASS] $test (${duration}s)"
|
|
passed=$((passed + 1))
|
|
else
|
|
exit_code=$?
|
|
end_time=$(date +%s)
|
|
duration=$((end_time - start_time))
|
|
echo ""
|
|
if [ $exit_code -eq 124 ]; then
|
|
echo " [FAIL] $test (timeout after ${TIMEOUT}s)"
|
|
else
|
|
echo " [FAIL] $test (${duration}s)"
|
|
fi
|
|
failed=$((failed + 1))
|
|
fi
|
|
else
|
|
# Capture output for non-verbose mode
|
|
if output=$(timeout "$TIMEOUT" bash "$test_path" 2>&1); then
|
|
end_time=$(date +%s)
|
|
duration=$((end_time - start_time))
|
|
echo " [PASS] (${duration}s)"
|
|
passed=$((passed + 1))
|
|
else
|
|
exit_code=$?
|
|
end_time=$(date +%s)
|
|
duration=$((end_time - start_time))
|
|
if [ $exit_code -eq 124 ]; then
|
|
echo " [FAIL] (timeout after ${TIMEOUT}s)"
|
|
else
|
|
echo " [FAIL] (${duration}s)"
|
|
fi
|
|
echo ""
|
|
echo " Output:"
|
|
echo "$output" | sed 's/^/ /'
|
|
failed=$((failed + 1))
|
|
fi
|
|
fi
|
|
|
|
echo ""
|
|
done
|
|
|
|
# Print summary
|
|
echo "========================================"
|
|
echo " Test Results Summary"
|
|
echo "========================================"
|
|
echo ""
|
|
echo " Passed: $passed"
|
|
echo " Failed: $failed"
|
|
echo " Skipped: $skipped"
|
|
echo ""
|
|
|
|
if [ "$RUN_INTEGRATION" = false ] && [ ${#integration_tests[@]} -gt 0 ]; then
|
|
echo "Note: Integration tests were not run (they take 10-30 minutes)."
|
|
echo "Use --integration flag to run full workflow execution tests."
|
|
echo ""
|
|
fi
|
|
|
|
if [ $failed -gt 0 ]; then
|
|
echo "STATUS: FAILED"
|
|
exit 1
|
|
else
|
|
echo "STATUS: PASSED"
|
|
exit 0
|
|
fi
|