From 09ef5f8fe6601b8d2ea740605dd482f0c74f980d Mon Sep 17 00:00:00 2001 From: Max Mayfield Date: Sun, 1 Mar 2026 04:08:53 +0000 Subject: [PATCH] Add smoke test script for docker compose stack --- products/smoke-test.sh | 194 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 194 insertions(+) create mode 100755 products/smoke-test.sh diff --git a/products/smoke-test.sh b/products/smoke-test.sh new file mode 100755 index 0000000..9e8f95d --- /dev/null +++ b/products/smoke-test.sh @@ -0,0 +1,194 @@ +#!/bin/bash + +# Smoke Test Script for Docker Compose Stack +# Tests health endpoints, tenant creation, and key API endpoints for all services + +set -e + +# Colors +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +NC='\033[0m' # No Color + +# Configuration +BASE_URL="${BASE_URL:-localhost}" +PROTOCOL="${PROTOCOL:-http}" +TEST_EMAIL="smoke@dd0c.dev" +TEST_PASSWORD="smoketest123!" +TEST_TENANT="smoke-test" + +# Counters +TOTAL_CHECKS=0 +PASSED_CHECKS=0 + +# Help function +show_help() { + cat << EOF +Smoke Test Script for Docker Compose Stack + +Usage: $0 [OPTIONS] + +Options: + --help Show this help message + --base-url URL Set base URL (default: localhost) + --protocol PROTO Set protocol (default: http) + +Environment Variables: + BASE_URL Override base URL (default: localhost) + PROTOCOL Override protocol (default: http) + +Examples: + $0 + $0 --base-url example.com --protocol https + BASE_URL=192.168.1.100 $0 + +EOF +} + +# Parse arguments +while [[ $# -gt 0 ]]; do + case $1 in + --help) + show_help + exit 0 + ;; + --base-url) + BASE_URL="$2" + shift 2 + ;; + --protocol) + PROTOCOL="$2" + shift 2 + ;; + *) + echo "Unknown option: $1" + show_help + exit 1 + ;; + esac +done + +# Helper functions +log_check() { + local name=$1 + local status=$2 + ((TOTAL_CHECKS++)) + + if [ "$status" = "pass" ]; then + echo -e "${GREEN}✓${NC} $name" + ((PASSED_CHECKS++)) + else + echo -e "${RED}✗${NC} $name" + fi +} + +check_health() { + local service=$1 + local check_cmd=$2 + + if eval "$check_cmd" > /dev/null 2>&1; then + log_check "Health: $service" "pass" + else + log_check "Health: $service" "fail" + fi +} + +create_tenant() { + local port=$1 + local service=$2 + + local response=$(curl -s -X POST \ + "${PROTOCOL}://${BASE_URL}:${port}/api/v1/auth/signup" \ + -H "Content-Type: application/json" \ + -d "{ + \"email\": \"${TEST_EMAIL}\", + \"password\": \"${TEST_PASSWORD}\", + \"tenant_name\": \"${TEST_TENANT}\" + }" 2>/dev/null || echo "") + + local token=$(echo "$response" | grep -o '"token":"[^"]*' | cut -d'"' -f4 || echo "") + + if [ -n "$token" ]; then + log_check "Tenant Creation: $service (port $port)" "pass" + echo "$token" + else + log_check "Tenant Creation: $service (port $port)" "fail" + echo "" + fi +} + +test_endpoint() { + local port=$1 + local service=$2 + local endpoint=$3 + local token=$4 + + if [ -z "$token" ]; then + log_check "Endpoint: $service - $endpoint" "fail" + return + fi + + local http_code=$(curl -s -o /dev/null -w "%{http_code}" \ + -H "Authorization: Bearer $token" \ + "${PROTOCOL}://${BASE_URL}:${port}${endpoint}" 2>/dev/null || echo "000") + + if [ "$http_code" = "200" ] || [ "$http_code" = "201" ]; then + log_check "Endpoint: $service - $endpoint" "pass" + else + log_check "Endpoint: $service - $endpoint (HTTP $http_code)" "fail" + fi +} + +# Main execution +echo -e "${YELLOW}=== Smoke Test Starting ===${NC}\n" + +# 1. Health Checks +echo -e "${YELLOW}--- Health Checks ---${NC}" +check_health "PostgreSQL" "pg_isready -h ${BASE_URL} 2>/dev/null" +check_health "Redis" "redis-cli -h ${BASE_URL} ping > /dev/null 2>&1" + +for port in 3003 3004 3005 3006; do + check_health "HTTP Service (port $port)" "curl -s -o /dev/null -w '%{http_code}' ${PROTOCOL}://${BASE_URL}:${port}/health 2>/dev/null | grep -q '200'" +done + +echo "" + +# 2. Tenant Creation & API Tests +echo -e "${YELLOW}--- Tenant Creation & API Tests ---${NC}" + +# P3 (port 3003) +echo -e "\n${YELLOW}P3 (port 3003):${NC}" +P3_TOKEN=$(create_tenant 3003 "P3") +test_endpoint 3003 "P3" "/api/v1/incidents" "$P3_TOKEN" +test_endpoint 3003 "P3" "/api/v1/summary" "$P3_TOKEN" + +# P4 (port 3004) +echo -e "\n${YELLOW}P4 (port 3004):${NC}" +P4_TOKEN=$(create_tenant 3004 "P4") +test_endpoint 3004 "P4" "/api/v1/services" "$P4_TOKEN" +test_endpoint 3004 "P4" "/api/v1/discovery/history" "$P4_TOKEN" + +# P5 (port 3005) +echo -e "\n${YELLOW}P5 (port 3005):${NC}" +P5_TOKEN=$(create_tenant 3005 "P5") +test_endpoint 3005 "P5" "/api/v1/anomalies" "$P5_TOKEN" +test_endpoint 3005 "P5" "/api/v1/baselines" "$P5_TOKEN" +test_endpoint 3005 "P5" "/api/v1/governance" "$P5_TOKEN" + +# P6 (port 3006) +echo -e "\n${YELLOW}P6 (port 3006):${NC}" +P6_TOKEN=$(create_tenant 3006 "P6") +test_endpoint 3006 "P6" "/api/v1/runbooks" "$P6_TOKEN" +test_endpoint 3006 "P6" "/api/v1/approvals" "$P6_TOKEN" + +# Summary +echo "" +echo -e "${YELLOW}=== Summary ===${NC}" +if [ $PASSED_CHECKS -eq $TOTAL_CHECKS ]; then + echo -e "${GREEN}$PASSED_CHECKS/$TOTAL_CHECKS passed${NC}" + exit 0 +else + echo -e "${RED}$PASSED_CHECKS/$TOTAL_CHECKS passed${NC}" + exit 1 +fi