322 lines
8.2 KiB
Bash
Executable File
322 lines
8.2 KiB
Bash
Executable File
#!/usr/bin/env bash
|
||
#
|
||
# End-to-End Integration Test Runner
|
||
#
|
||
# This script runs the E2E integration tests for Attune.
|
||
# It assumes all services are already running.
|
||
#
|
||
# Usage:
|
||
# ./tests/run_e2e_tests.sh [options]
|
||
#
|
||
# Options:
|
||
# -v, --verbose Verbose test output
|
||
# -s, --stop-on-fail Stop on first test failure
|
||
# -k EXPRESSION Only run tests matching expression
|
||
# -m MARKER Only run tests with given marker
|
||
# --tier TIER Run specific tier (1, 2, or 3)
|
||
# --setup Set up test environment (install deps, create venv)
|
||
# --teardown Clean up after tests
|
||
# --coverage Run with coverage reporting
|
||
# -h, --help Show this help message
|
||
#
|
||
|
||
set -e
|
||
|
||
# Colors for output
|
||
RED='\033[0;31m'
|
||
GREEN='\033[0;32m'
|
||
YELLOW='\033[1;33m'
|
||
BLUE='\033[0;34m'
|
||
CYAN='\033[0;36m'
|
||
NC='\033[0m' # No Color
|
||
|
||
# Script directory
|
||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||
PROJECT_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
|
||
VENV_DIR="$SCRIPT_DIR/venvs/e2e"
|
||
|
||
# Default values
|
||
VERBOSE=""
|
||
STOP_ON_FAIL=""
|
||
TEST_PATTERN=""
|
||
MARKER=""
|
||
TIER=""
|
||
COVERAGE=""
|
||
SETUP=false
|
||
TEARDOWN=false
|
||
|
||
# Parse arguments
|
||
while [[ $# -gt 0 ]]; do
|
||
case $1 in
|
||
-v|--verbose)
|
||
VERBOSE="-v -s"
|
||
shift
|
||
;;
|
||
-s|--stop-on-fail)
|
||
STOP_ON_FAIL="-x"
|
||
shift
|
||
;;
|
||
-k)
|
||
TEST_PATTERN="-k $2"
|
||
shift 2
|
||
;;
|
||
-m)
|
||
MARKER="-m $2"
|
||
shift 2
|
||
;;
|
||
--tier)
|
||
TIER="$2"
|
||
shift 2
|
||
;;
|
||
--coverage)
|
||
COVERAGE="--cov=../crates --cov-report=html --cov-report=term"
|
||
shift
|
||
;;
|
||
--setup)
|
||
SETUP=true
|
||
shift
|
||
;;
|
||
--teardown)
|
||
TEARDOWN=true
|
||
shift
|
||
;;
|
||
-h|--help)
|
||
head -n 22 "$0" | tail -n +3 | sed 's/^# //'
|
||
exit 0
|
||
;;
|
||
*)
|
||
echo -e "${RED}Error: Unknown option $1${NC}"
|
||
exit 1
|
||
;;
|
||
esac
|
||
done
|
||
|
||
# Functions
|
||
log_info() {
|
||
echo -e "${BLUE}ℹ${NC} $1"
|
||
}
|
||
|
||
log_success() {
|
||
echo -e "${GREEN}✓${NC} $1"
|
||
}
|
||
|
||
log_warning() {
|
||
echo -e "${YELLOW}⚠${NC} $1"
|
||
}
|
||
|
||
log_error() {
|
||
echo -e "${RED}✗${NC} $1"
|
||
}
|
||
|
||
log_header() {
|
||
echo -e "${CYAN}═══${NC} $1"
|
||
}
|
||
|
||
setup_environment() {
|
||
log_info "Setting up E2E test environment..."
|
||
|
||
# Create virtual environment if it doesn't exist
|
||
if [[ ! -d "$VENV_DIR" ]]; then
|
||
log_info "Creating virtual environment at $VENV_DIR"
|
||
python3 -m venv "$VENV_DIR"
|
||
fi
|
||
|
||
# Activate virtual environment
|
||
source "$VENV_DIR/bin/activate"
|
||
|
||
# Install dependencies
|
||
log_info "Installing test dependencies..."
|
||
pip install -q --upgrade pip
|
||
pip install -q -r "$SCRIPT_DIR/requirements.txt"
|
||
|
||
log_success "Test environment ready"
|
||
}
|
||
|
||
check_services() {
|
||
log_info "Checking if Attune services are running..."
|
||
|
||
local api_url="${ATTUNE_API_URL:-http://localhost:8080}"
|
||
|
||
# Check API health
|
||
if curl -s -f "${api_url}/health" > /dev/null 2>&1; then
|
||
log_success "API service is running at ${api_url}"
|
||
else
|
||
log_error "API service is not reachable at ${api_url}"
|
||
log_warning "Make sure all services are running before running E2E tests"
|
||
log_info "Start services with:"
|
||
echo " Terminal 1: cd crates/api && cargo run"
|
||
echo " Terminal 2: cd crates/executor && cargo run"
|
||
echo " Terminal 3: cd crates/worker && cargo run"
|
||
echo " Terminal 4: cd crates/sensor && cargo run"
|
||
echo " Terminal 5: cd crates/notifier && cargo run"
|
||
exit 1
|
||
fi
|
||
}
|
||
|
||
run_tests() {
|
||
log_info "Running E2E integration tests..."
|
||
|
||
cd "$SCRIPT_DIR"
|
||
|
||
# Activate virtual environment
|
||
source "$VENV_DIR/bin/activate"
|
||
|
||
# Set environment variables
|
||
export ATTUNE_API_URL="${ATTUNE_API_URL:-http://localhost:8080}"
|
||
export TEST_TIMEOUT="${TEST_TIMEOUT:-60}"
|
||
export PYTHONPATH="$SCRIPT_DIR:$PROJECT_ROOT:$PYTHONPATH"
|
||
|
||
# Determine test path
|
||
local test_path="e2e/"
|
||
if [[ -n "$TIER" ]]; then
|
||
test_path="e2e/tier${TIER}/"
|
||
MARKER="-m tier${TIER}"
|
||
log_header "Running Tier ${TIER} Tests"
|
||
else
|
||
log_header "Running All E2E Tests"
|
||
fi
|
||
|
||
# Build pytest command
|
||
local pytest_args=()
|
||
pytest_args+=("$test_path")
|
||
|
||
if [[ -n "$VERBOSE" ]]; then
|
||
pytest_args+=($VERBOSE)
|
||
else
|
||
pytest_args+=("-v")
|
||
fi
|
||
|
||
if [[ -n "$STOP_ON_FAIL" ]]; then
|
||
pytest_args+=("$STOP_ON_FAIL")
|
||
fi
|
||
|
||
if [[ -n "$TEST_PATTERN" ]]; then
|
||
pytest_args+=($TEST_PATTERN)
|
||
fi
|
||
|
||
if [[ -n "$MARKER" ]]; then
|
||
pytest_args+=($MARKER)
|
||
fi
|
||
|
||
if [[ -n "$COVERAGE" ]]; then
|
||
pytest_args+=($COVERAGE)
|
||
fi
|
||
|
||
log_info "Command: pytest ${pytest_args[*]}"
|
||
echo ""
|
||
|
||
# Run tests
|
||
if pytest "${pytest_args[@]}"; then
|
||
echo ""
|
||
log_success "All tests passed!"
|
||
return 0
|
||
else
|
||
echo ""
|
||
log_error "Some tests failed"
|
||
return 1
|
||
fi
|
||
}
|
||
|
||
teardown_environment() {
|
||
log_info "Cleaning up test artifacts..."
|
||
|
||
# Remove test artifacts
|
||
rm -rf "$SCRIPT_DIR/artifacts/*"
|
||
rm -rf "$SCRIPT_DIR/logs/*"
|
||
rm -rf "$SCRIPT_DIR/.pytest_cache"
|
||
rm -rf "$SCRIPT_DIR/__pycache__"
|
||
rm -rf "$SCRIPT_DIR/e2e/__pycache__"
|
||
rm -rf "$SCRIPT_DIR/e2e/*/__pycache__"
|
||
rm -rf "$SCRIPT_DIR/helpers/__pycache__"
|
||
rm -rf "$SCRIPT_DIR/htmlcov"
|
||
rm -rf "$SCRIPT_DIR/.coverage"
|
||
|
||
log_success "Cleanup complete"
|
||
}
|
||
|
||
print_banner() {
|
||
echo ""
|
||
echo "╔════════════════════════════════════════════════════════╗"
|
||
echo "║ Attune E2E Integration Test Suite ║"
|
||
echo "╚════════════════════════════════════════════════════════╝"
|
||
echo ""
|
||
}
|
||
|
||
print_tier_info() {
|
||
if [[ -n "$TIER" ]]; then
|
||
case "$TIER" in
|
||
1)
|
||
echo " Tier 1: Core Automation Flows (MVP Essential)"
|
||
echo " Tests: Timers, Webhooks, Basic Workflows"
|
||
;;
|
||
2)
|
||
echo " Tier 2: Orchestration & Data Flow"
|
||
echo " Tests: Workflows, Inquiries, Error Handling"
|
||
;;
|
||
3)
|
||
echo " Tier 3: Advanced Features & Edge Cases"
|
||
echo " Tests: Performance, Security, Edge Cases"
|
||
;;
|
||
esac
|
||
else
|
||
echo " Running all test tiers (1, 2, 3)"
|
||
fi
|
||
echo ""
|
||
}
|
||
|
||
# Main execution
|
||
main() {
|
||
print_banner
|
||
print_tier_info
|
||
|
||
# Setup if requested
|
||
if [[ "$SETUP" == true ]]; then
|
||
setup_environment
|
||
echo ""
|
||
fi
|
||
|
||
# Ensure environment is set up
|
||
if [[ ! -d "$VENV_DIR" ]]; then
|
||
log_warning "Virtual environment not found. Setting up..."
|
||
setup_environment
|
||
echo ""
|
||
fi
|
||
|
||
# Check services
|
||
check_services
|
||
echo ""
|
||
|
||
# Run tests
|
||
if run_tests; then
|
||
TEST_EXIT_CODE=0
|
||
else
|
||
TEST_EXIT_CODE=1
|
||
fi
|
||
|
||
echo ""
|
||
|
||
# Teardown if requested
|
||
if [[ "$TEARDOWN" == true ]]; then
|
||
teardown_environment
|
||
echo ""
|
||
fi
|
||
|
||
# Final summary
|
||
echo "╔════════════════════════════════════════════════════════╗"
|
||
if [[ $TEST_EXIT_CODE -eq 0 ]]; then
|
||
echo "║ ${GREEN}✓ All E2E tests passed successfully${NC} ║"
|
||
else
|
||
echo "║ ${RED}✗ Some E2E tests failed${NC} ║"
|
||
echo "║ ║"
|
||
echo "║ Check test output above for details ║"
|
||
echo "║ Logs may be available in tests/logs/ ║"
|
||
fi
|
||
echo "╚════════════════════════════════════════════════════════╝"
|
||
echo ""
|
||
|
||
exit $TEST_EXIT_CODE
|
||
}
|
||
|
||
# Run main function
|
||
main
|