Files
wehub-resource-sync 3a28426bf4
Lint and Format Check / lint-and-format (push) Failing after 0s
Check Migrations / Check for duplicate migration numbers (push) Failing after 1s
CI Pre-merge Check / CI Pre-merge Check (push) Failing after 2m17s
chore: import upstream snapshot with attribution
2026-07-13 12:23:40 +08:00

135 lines
3.9 KiB
Bash

#!/bin/bash
print_setup_help() {
echo ""
echo -e "${BLUE}Local setup:${NC}"
echo " cp .env.example .env"
echo " docker compose -f docker-compose.prod.yml up"
echo ""
echo "Then rerun:"
echo " npm run test:e2e"
echo ""
echo "If your backend runs elsewhere, set:"
echo " export TEST_API_BASE=http://localhost:7130/api"
echo " export ROOT_ADMIN_USERNAME=admin"
echo " export ROOT_ADMIN_PASSWORD=change-this-password"
echo " export ACCESS_API_KEY=ik_..."
}
extract_json_value() {
local json="$1"
local key="$2"
if command -v jq >/dev/null 2>&1; then
echo "$json" | jq -r --arg key "$key" '.[$key] // empty' 2>/dev/null
return
fi
echo "$json" | grep -o "\"$key\"[[:space:]]*:[[:space:]]*\"[^\"]*\"" | head -1 | cut -d'"' -f4
}
json_escape() {
local value="$1"
value="${value//\\/\\\\}"
value="${value//\"/\\\"}"
value="${value//$'\n'/\\n}"
value="${value//$'\r'/\\r}"
value="${value//$'\t'/\\t}"
echo "$value"
}
build_admin_login_body() {
if command -v jq >/dev/null 2>&1; then
jq -n --arg username "$TEST_ADMIN_USERNAME" --arg password "$TEST_ADMIN_PASSWORD" \
'{username: $username, password: $password}'
return
fi
local escaped_username
local escaped_password
escaped_username=$(json_escape "$TEST_ADMIN_USERNAME")
escaped_password=$(json_escape "$TEST_ADMIN_PASSWORD")
printf '{"username":"%s","password":"%s"}' "$escaped_username" "$escaped_password"
}
preflight_curl() {
curl -sS --connect-timeout "${PREFLIGHT_CONNECT_TIMEOUT:-5}" --max-time "${PREFLIGHT_MAX_TIME:-10}" "$@"
}
get_admin_token() {
local body
local response
body=$(build_admin_login_body)
response=$(preflight_curl -X POST "$TEST_API_BASE/auth/admin/sessions" \
-H "Content-Type: application/json" \
-d "$body" 2>/dev/null)
extract_json_value "$response" "accessToken"
}
get_api_key_from_metadata() {
local admin_token="$1"
local response
response=$(preflight_curl "$TEST_API_BASE/metadata/api-key" \
-H "Authorization: Bearer $admin_token" 2>/dev/null)
extract_json_value "$response" "apiKey"
}
run_preflight() {
echo -e "${YELLOW}=== Running E2E Preflight ===${NC}"
if ! command -v curl >/dev/null 2>&1; then
echo -e "${RED}Preflight failed: curl is required but was not found.${NC}"
return 1
fi
local health_response
local health_status
health_response=$(preflight_curl -w "\n%{http_code}" "$TEST_API_BASE/health" 2>/dev/null)
health_status=$(echo "$health_response" | tail -n 1)
if [ "$health_status" != "200" ]; then
echo -e "${RED}Preflight failed: backend health check did not return 200.${NC}"
echo "Checked: $TEST_API_BASE/health"
echo "Status: ${health_status:-unreachable}"
print_setup_help
return 1
fi
echo -e "${GREEN}✓ Backend health check passed${NC}"
local admin_token
admin_token=$(get_admin_token)
if [ -z "$admin_token" ]; then
echo -e "${RED}Preflight failed: admin login did not return an access token.${NC}"
echo "Checked: $TEST_API_BASE/auth/admin/sessions"
echo "Admin username: $TEST_ADMIN_USERNAME"
print_setup_help
return 1
fi
echo -e "${GREEN}✓ Admin login passed${NC}"
local resolved_api_key="${TEST_API_KEY:-${ACCESS_API_KEY:-}}"
if [ -z "$resolved_api_key" ]; then
resolved_api_key=$(get_api_key_from_metadata "$admin_token")
fi
if [ -z "$resolved_api_key" ]; then
echo -e "${RED}Preflight failed: no API key was available.${NC}"
echo "Set TEST_API_KEY or ACCESS_API_KEY, or ensure /metadata/api-key works for the admin session."
print_setup_help
return 1
fi
export ACCESS_API_KEY="$resolved_api_key"
echo -e "${GREEN}✓ API key is available${NC}"
echo -e "${GREEN}Preflight passed.${NC}"
echo ""
return 0
}