#!/usr/bin/env bash # # Smoke test for PillChecker API. # Waits for the API to become healthy, then tests all endpoints. # # Prerequisites: curl, jq # Usage: ./scripts/smoke-test.sh [BASE_URL] set -euo pipefail BASE_URL="${1:-http://localhost:8000}" MAX_WAIT=120 INTERVAL=2 PASSED=0 FAILED=0 fail() { echo " FAIL: $1" FAILED=$((FAILED + 1)) } pass() { echo " PASS: $1" PASSED=$((PASSED + 1)) } assert_eq() { local desc="$1" actual="$2" expected="$3" if [ "$actual" = "$expected" ]; then pass "$desc" else fail "$desc (expected '$expected', got '$actual')" fi } assert_not_empty() { local desc="$1" value="$2" if [ -n "$value" ] && [ "$value" != "null" ]; then pass "$desc" else fail "$desc (got empty or null)" fi } # --- Wait for API --- echo "Waiting for API at $BASE_URL (max ${MAX_WAIT}s)..." elapsed=0 while true; do if curl -sf "$BASE_URL/health" > /dev/null 2>&1; then echo "API ready after ${elapsed}s." break fi if [ "$elapsed" -ge "$MAX_WAIT" ]; then echo "ERROR: API not healthy within ${MAX_WAIT}s." exit 1 fi sleep "$INTERVAL" elapsed=$((elapsed + INTERVAL)) done # --- Test 1: GET /health --- echo "" echo "=== GET /health ===" HEALTH=$(curl -sf "$BASE_URL/health") assert_eq "status" "$(echo "$HEALTH" | jq -r '.status')" "ok" echo "" echo "=== GET /health/data ===" DATA_HEALTH=$(curl -sf "$BASE_URL/health/data") assert_eq "status" "$(echo "$DATA_HEALTH" | jq -r '.status')" "ready" assert_eq "ddinter" "$(echo "$DATA_HEALTH" | jq -r '.ddinter')" "connected" # --- Test 2: POST /analyze --- echo "" echo "=== POST /analyze ===" ANALYZE=$(curl -sf -X POST "$BASE_URL/analyze" \ -H "Content-Type: application/json" \ -d '{"text": "Ibuprofen 400 mg tablets"}') assert_eq "drugs[0].name" "$(echo "$ANALYZE" | jq -r '.drugs[0].name')" "Ibuprofen" assert_eq "drugs[0].rxcui" "$(echo "$ANALYZE" | jq -r '.drugs[0].rxcui')" "5640" assert_eq "drugs[0].source" "$(echo "$ANALYZE" | jq -r '.drugs[0].source')" "ner" assert_not_empty "drugs[0].dosage" "$(echo "$ANALYZE" | jq -r '.drugs[0].dosage')" # --- Test 3: POST /interactions --- echo "" echo "=== POST /interactions ===" INTERACTIONS=$(curl -sf -X POST "$BASE_URL/interactions" \ -H "Content-Type: application/json" \ -d '{"drugs": ["warfarin", "apixaban"]}') assert_eq "safe" "$(echo "$INTERACTIONS" | jq -r '.safe')" "false" assert_not_empty "severity" "$(echo "$INTERACTIONS" | jq -r '.interactions[0].severity')" assert_eq "source" "$(echo "$INTERACTIONS" | jq -r '.interactions[0].source')" "ddinter" assert_not_empty "description" "$(echo "$INTERACTIONS" | jq -r '.interactions[0].description')" # --- Summary --- echo "" echo "================================" echo "Results: $PASSED passed, $FAILED failed" echo "================================" [ "$FAILED" -eq 0 ] || exit 1