diff --git a/deploy/test-production-bootstrap.sh b/deploy/test-production-bootstrap.sh index 180bdfe..edda2f2 100755 --- a/deploy/test-production-bootstrap.sh +++ b/deploy/test-production-bootstrap.sh @@ -26,9 +26,38 @@ curl -fsS "http://127.0.0.1:$BOOTSTRAP_API_PORT/ready" >/dev/null curl -fsS "http://127.0.0.1:$BOOTSTRAP_WEB_PORT/" >/dev/null curl -fsS -D - -o /dev/null "http://127.0.0.1:$BOOTSTRAP_API_PORT/health" | grep -qi '^x-frame-options: DENY' curl -fsS -D - -o /dev/null "http://127.0.0.1:$BOOTSTRAP_API_PORT/health" | grep -qi '^cross-origin-opener-policy: same-origin' -# A10: Check actual Alembic head dynamically, not hardcoded revision -ALEMBIC_HEAD=$($compose exec -T api alembic heads 2>/dev/null | tail -1) -test "$($compose exec -T db psql -At -U rf4 -d rf4_spotter -c 'select version_num from alembic_version')" = "$ALEMBIC_HEAD" + +# A10: Extract Alembic revision ID programmatically, handle multiple heads +ALEMBIC_HEADS_OUTPUT=$($compose exec -T api alembic heads 2>/dev/null || true) +# Extract revision IDs (first field before space or '(head)'), handle multiple heads +ALEMBIC_HEAD=$(echo "$ALEMBIC_HEADS_OUTPUT" | grep -oE '^[a-f0-9]+' | head -1) +DB_VERSION=$($compose exec -T db psql -At -U rf4 -d rf4_spotter -c 'select version_num from alembic_version') + +if [ -z "$ALEMBIC_HEAD" ]; then + echo "ERROR: alembic heads returned empty or invalid output: $ALEMBIC_HEADS_OUTPUT" >&2 + exit 1 +fi + +if [ -z "$DB_VERSION" ]; then + echo "ERROR: alembic_version table is empty" >&2 + exit 1 +fi + +# Handle multiple heads: check if DB version matches any head +HEAD_COUNT=$(echo "$ALEMBIC_HEADS_OUTPUT" | grep -cE '^[a-f0-9]+' || true) +if [ "$HEAD_COUNT" -gt 1 ]; then + echo "WARNING: Multiple Alembic heads detected ($HEAD_COUNT), checking if DB version matches any..." + if ! echo "$ALEMBIC_HEADS_OUTPUT" | grep -q "^$DB_VERSION"; then + echo "ERROR: DB version $DB_VERSION does not match any head. Heads: $ALEMBIC_HEADS_OUTPUT" >&2 + exit 1 + fi +else + # Single head: exact match required + test "$DB_VERSION" = "$ALEMBIC_HEAD" +fi + +echo "Alembic head: $ALEMBIC_HEAD, DB version: $DB_VERSION ✓" + index_count=$($compose exec -T db psql -At -U rf4 -d rf4_spotter -c "select count(*) from pg_indexes where schemaname = 'public' and indexname in ('ix_catch_report_activity_lookup','ix_catch_report_spot_feed','ix_catch_report_moderation_queue','ix_catch_report_official_records','ix_official_import_source_status_started','ix_external_observation_review_queue','ix_submission_attempt_client_created','ix_moderation_event_created_at')") test "$index_count" = "8" test "$($compose exec -T db psql -At -U rf4 -d rf4_spotter -c 'select count(*) from fish')" = "2"