name: API Endpoint Tests on: push: branches: [main, develop] paths: - 'apps/coordinator-api/**' - 'apps/exchange/**' - 'apps/wallet/**' - 'scripts/ci/test_api_endpoints.py' - '.gitea/workflows/api-endpoint-tests.yml' pull_request: branches: [main, develop] workflow_dispatch: concurrency: group: api-endpoint-tests-${{ github.ref }} cancel-in-progress: true jobs: test-api-endpoints: runs-on: debian timeout-minutes: 10 steps: - name: Clone repository run: | WORKSPACE="/var/lib/aitbc-workspaces/api-tests" rm -rf "$WORKSPACE" mkdir -p "$WORKSPACE" cd "$WORKSPACE" git clone --depth 1 http://gitea.bubuit.net:3000/oib/aitbc.git repo - name: Setup test environment run: | cd /var/lib/aitbc-workspaces/api-tests/repo python3 -m venv venv venv/bin/pip install -q requests pytest httpx # Ensure standard directories exist mkdir -p /var/lib/aitbc/data /var/lib/aitbc/keystore /etc/aitbc /var/log/aitbc - name: Wait for services id: wait-services continue-on-error: true run: | echo "Waiting for AITBC services..." gateway_host=$(ip route 2>/dev/null | awk '/default/ {print $3; exit}') host_candidates=(localhost host.docker.internal) if [[ -n "$gateway_host" ]]; then host_candidates+=("$gateway_host") fi service_host="" for candidate in "${host_candidates[@]}"; do code=$(curl -so /dev/null -w '%{http_code}' "http://$candidate:8000/health" 2>/dev/null) || code=0 if [ "$code" -gt 0 ] && [ "$code" -lt 600 ]; then service_host="$candidate" break fi code=$(curl -so /dev/null -w '%{http_code}' "http://$candidate:8000/v1/health" 2>/dev/null) || code=0 if [ "$code" -gt 0 ] && [ "$code" -lt 600 ]; then service_host="$candidate" break fi done if [[ -z "$service_host" ]]; then echo "⚠️ Could not find a reachable API host - skipping API endpoint tests" echo "services_available=false" > /var/lib/aitbc-workspaces/api-tests/status exit 0 fi echo "$service_host" > /var/lib/aitbc-workspaces/api-tests/service_host echo "Using service host: $service_host" echo "services_available=true" > /var/lib/aitbc-workspaces/api-tests/status for port in 8000 8001 8003 8006; do port_ready=0 for i in $(seq 1 15); do code=$(curl -so /dev/null -w '%{http_code}' "http://$service_host:$port/health" 2>/dev/null) || code=0 if [ "$code" -gt 0 ] && [ "$code" -lt 600 ]; then echo "✅ Port $port ready (HTTP $code)" port_ready=1 break fi code=$(curl -so /dev/null -w '%{http_code}' "http://$service_host:$port/api/health" 2>/dev/null) || code=0 if [ "$code" -gt 0 ] && [ "$code" -lt 600 ]; then echo "✅ Port $port ready (HTTP $code)" port_ready=1 break fi code=$(curl -so /dev/null -w '%{http_code}' "http://$service_host:$port/" 2>/dev/null) || code=0 if [ "$code" -gt 0 ] && [ "$code" -lt 600 ]; then echo "✅ Port $port ready (HTTP $code)" port_ready=1 break fi [ "$i" -eq 15 ] && echo "❌ Port $port not ready" sleep 2 done if [[ $port_ready -ne 1 ]]; then echo "⚠️ Not all services ready - skipping API endpoint tests" echo "services_available=false" > /var/lib/aitbc-workspaces/api-tests/status exit 0 fi done - name: Run API endpoint tests run: | cd /var/lib/aitbc-workspaces/api-tests/repo if [ ! -f /var/lib/aitbc-workspaces/api-tests/status ] || [ "$(cat /var/lib/aitbc-workspaces/api-tests/status)" != "true" ]; then echo "⚠️ Services not available - skipping API endpoint tests" exit 0 fi service_host=$(cat /var/lib/aitbc-workspaces/api-tests/service_host) AITBC_API_HOST="$service_host" venv/bin/python scripts/ci/test_api_endpoints.py echo "✅ API endpoint tests completed" - name: Cleanup if: always() run: rm -rf /var/lib/aitbc-workspaces/api-tests