Files
attune/tests/run_e2e_tests.sh
2026-02-04 17:46:30 -06:00

322 lines
8.2 KiB
Bash
Executable File
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/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