Apply Composer changes: comprehensive API updates, migrations, middleware, and infrastructure improvements
- Add comprehensive database migrations (001-024) for schema evolution - Enhance API schema with expanded type definitions and resolvers - Add new middleware: audit logging, rate limiting, MFA enforcement, security, tenant auth - Implement new services: AI optimization, billing, blockchain, compliance, marketplace - Add adapter layer for cloud integrations (Cloudflare, Kubernetes, Proxmox, storage) - Update Crossplane provider with enhanced VM management capabilities - Add comprehensive test suite for API endpoints and services - Update frontend components with improved GraphQL subscriptions and real-time updates - Enhance security configurations and headers (CSP, CORS, etc.) - Update documentation and configuration files - Add new CI/CD workflows and validation scripts - Implement design system improvements and UI enhancements
This commit is contained in:
220
scripts/smoke-tests.sh
Executable file
220
scripts/smoke-tests.sh
Executable file
@@ -0,0 +1,220 @@
|
||||
#!/bin/bash
|
||||
# Smoke Tests for Sankofa Phoenix
|
||||
# Run critical user flows to verify system health
|
||||
|
||||
set -e
|
||||
|
||||
# Colors for output
|
||||
RED='\033[0;31m'
|
||||
GREEN='\033[0;32m'
|
||||
YELLOW='\033[1;33m'
|
||||
NC='\033[0m' # No Color
|
||||
|
||||
# Configuration
|
||||
API_URL="${API_URL:-https://api.sankofa.nexus}"
|
||||
PORTAL_URL="${PORTAL_URL:-https://portal.sankofa.nexus}"
|
||||
KEYCLOAK_URL="${KEYCLOAK_URL:-https://keycloak.sankofa.nexus}"
|
||||
|
||||
# Test results
|
||||
PASSED=0
|
||||
FAILED=0
|
||||
SKIPPED=0
|
||||
|
||||
# Helper functions
|
||||
log_info() {
|
||||
echo -e "${GREEN}[INFO]${NC} $1"
|
||||
}
|
||||
|
||||
log_error() {
|
||||
echo -e "${RED}[ERROR]${NC} $1"
|
||||
}
|
||||
|
||||
log_warn() {
|
||||
echo -e "${YELLOW}[WARN]${NC} $1"
|
||||
}
|
||||
|
||||
test_pass() {
|
||||
log_info "✓ $1"
|
||||
((PASSED++))
|
||||
}
|
||||
|
||||
test_fail() {
|
||||
log_error "✗ $1"
|
||||
((FAILED++))
|
||||
}
|
||||
|
||||
test_skip() {
|
||||
log_warn "⊘ $1 (skipped)"
|
||||
((SKIPPED++))
|
||||
}
|
||||
|
||||
# Test functions
|
||||
test_api_health() {
|
||||
log_info "Testing API health endpoint..."
|
||||
if curl -sf "${API_URL}/health" > /dev/null; then
|
||||
test_pass "API health check"
|
||||
else
|
||||
test_fail "API health check"
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
test_api_graphql() {
|
||||
log_info "Testing GraphQL endpoint..."
|
||||
RESPONSE=$(curl -sf -X POST "${API_URL}/graphql" \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{"query": "{ __typename }"}' || echo "ERROR")
|
||||
|
||||
if [[ "$RESPONSE" == *"__typename"* ]] || [[ "$RESPONSE" == *"data"* ]]; then
|
||||
test_pass "GraphQL endpoint"
|
||||
else
|
||||
test_fail "GraphQL endpoint"
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
test_portal_health() {
|
||||
log_info "Testing Portal health endpoint..."
|
||||
if curl -sf "${PORTAL_URL}/api/health" > /dev/null; then
|
||||
test_pass "Portal health check"
|
||||
else
|
||||
test_fail "Portal health check"
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
test_keycloak_health() {
|
||||
log_info "Testing Keycloak health endpoint..."
|
||||
if curl -sf "${KEYCLOAK_URL}/health" > /dev/null; then
|
||||
test_pass "Keycloak health check"
|
||||
else
|
||||
test_fail "Keycloak health check"
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
test_database_connectivity() {
|
||||
log_info "Testing database connectivity..."
|
||||
# This requires kubectl access
|
||||
if command -v kubectl &> /dev/null; then
|
||||
if kubectl exec -n api deployment/api -- \
|
||||
psql "${DATABASE_URL}" -c "SELECT 1" > /dev/null 2>&1; then
|
||||
test_pass "Database connectivity"
|
||||
else
|
||||
test_fail "Database connectivity"
|
||||
return 1
|
||||
fi
|
||||
else
|
||||
test_skip "Database connectivity (kubectl not available)"
|
||||
fi
|
||||
}
|
||||
|
||||
test_authentication() {
|
||||
log_info "Testing authentication flow..."
|
||||
# Test Keycloak OIDC discovery
|
||||
if curl -sf "${KEYCLOAK_URL}/.well-known/openid-configuration" > /dev/null; then
|
||||
test_pass "Keycloak OIDC discovery"
|
||||
else
|
||||
test_fail "Keycloak OIDC discovery"
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
test_rate_limiting() {
|
||||
log_info "Testing rate limiting..."
|
||||
# Make multiple rapid requests
|
||||
local count=0
|
||||
for i in {1..10}; do
|
||||
if curl -sf "${API_URL}/health" > /dev/null; then
|
||||
((count++))
|
||||
fi
|
||||
done
|
||||
|
||||
if [ $count -gt 0 ]; then
|
||||
test_pass "Rate limiting (health endpoint accessible)"
|
||||
else
|
||||
test_fail "Rate limiting"
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
test_cors_headers() {
|
||||
log_info "Testing CORS headers..."
|
||||
RESPONSE=$(curl -sf -X OPTIONS "${API_URL}/graphql" \
|
||||
-H "Origin: https://portal.sankofa.nexus" \
|
||||
-H "Access-Control-Request-Method: POST" \
|
||||
-v 2>&1 || echo "ERROR")
|
||||
|
||||
if [[ "$RESPONSE" == *"access-control-allow-origin"* ]]; then
|
||||
test_pass "CORS headers"
|
||||
else
|
||||
test_skip "CORS headers (may not be configured)"
|
||||
fi
|
||||
}
|
||||
|
||||
test_security_headers() {
|
||||
log_info "Testing security headers..."
|
||||
RESPONSE=$(curl -sf -I "${API_URL}/health" || echo "ERROR")
|
||||
|
||||
local has_csp=false
|
||||
local has_hsts=false
|
||||
|
||||
if [[ "$RESPONSE" == *"content-security-policy"* ]] || [[ "$RESPONSE" == *"Content-Security-Policy"* ]]; then
|
||||
has_csp=true
|
||||
fi
|
||||
|
||||
if [[ "$RESPONSE" == *"strict-transport-security"* ]] || [[ "$RESPONSE" == *"Strict-Transport-Security"* ]]; then
|
||||
has_hsts=true
|
||||
fi
|
||||
|
||||
if [ "$has_csp" = true ] || [ "$has_hsts" = true ]; then
|
||||
test_pass "Security headers"
|
||||
else
|
||||
test_skip "Security headers (may not be configured)"
|
||||
fi
|
||||
}
|
||||
|
||||
# Main execution
|
||||
main() {
|
||||
echo "=========================================="
|
||||
echo "Sankofa Phoenix Smoke Tests"
|
||||
echo "=========================================="
|
||||
echo ""
|
||||
echo "API URL: ${API_URL}"
|
||||
echo "Portal URL: ${PORTAL_URL}"
|
||||
echo "Keycloak URL: ${KEYCLOAK_URL}"
|
||||
echo ""
|
||||
|
||||
# Run tests
|
||||
test_api_health
|
||||
test_api_graphql
|
||||
test_portal_health
|
||||
test_keycloak_health
|
||||
test_database_connectivity
|
||||
test_authentication
|
||||
test_rate_limiting
|
||||
test_cors_headers
|
||||
test_security_headers
|
||||
|
||||
# Summary
|
||||
echo ""
|
||||
echo "=========================================="
|
||||
echo "Test Summary"
|
||||
echo "=========================================="
|
||||
echo "Passed: ${GREEN}${PASSED}${NC}"
|
||||
echo "Failed: ${RED}${FAILED}${NC}"
|
||||
echo "Skipped: ${YELLOW}${SKIPPED}${NC}"
|
||||
echo ""
|
||||
|
||||
if [ $FAILED -eq 0 ]; then
|
||||
log_info "All critical tests passed!"
|
||||
exit 0
|
||||
else
|
||||
log_error "Some tests failed. Please investigate."
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
# Run main function
|
||||
main "$@"
|
||||
|
||||
Reference in New Issue
Block a user