- 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
221 lines
5.2 KiB
Bash
Executable File
221 lines
5.2 KiB
Bash
Executable File
#!/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 "$@"
|
|
|