This commit is contained in:
Dusan Vojacek
2026-03-20 14:29:43 +01:00
parent 8b4af663d8
commit 2cc5ccfda7
4 changed files with 603 additions and 11 deletions

103
scripts/smoke_test.sh Executable file
View File

@@ -0,0 +1,103 @@
#!/bin/bash
set -euo pipefail
BASE="http://localhost:8000"
FRONT="http://localhost"
POSTGREST="http://localhost:3000"
echo "=== EMS Platform Smoke Test ==="
# 1. Health
echo -n "Health endpoint... "
curl -sf "$BASE/api/v1/health" | python3 -c "
import sys,json; d=json.load(sys.stdin)
assert d['status']=='ok', f'status={d[\"status\"]}'
assert d['db']=='ok', f'db={d[\"db\"]}'
print('OK')
"
# 2. Sites + první site_id (seed nemusí být vždy id=1)
echo -n "Sites endpoint... "
SITE_ID=$(curl -sf "$BASE/api/v1/sites" | python3 -c "
import sys,json; d=json.load(sys.stdin)
assert len(d)>0, 'no sites'
print(d[0]['id'])
")
echo "OK (site_id=$SITE_ID)"
# 3. Prices (dnes)
echo -n "Prices endpoint... "
STATUS=$(curl -s -o /dev/null -w "%{http_code}" "$BASE/api/v1/sites/${SITE_ID}/prices")
[ "$STATUS" = "200" ] && echo "OK" || echo "WARN (HTTP $STATUS ceny možná nejsou importovány)"
# 4. Plan current (může být 404 bez plánu)
echo -n "Plan current... "
STATUS=$(curl -s -o /dev/null -w "%{http_code}" "$BASE/api/v1/sites/${SITE_ID}/plan/current")
[ "$STATUS" = "200" ] && echo "OK (plán existuje)" || echo "OK (HTTP $STATUS zatím žádný plán)"
# 5. Import cen OTE (zítra)
echo -n "OTE price import... "
RESULT=$(curl -sf -X POST "$BASE/api/v1/sites/${SITE_ID}/prices/import" \
-H "Content-Type: application/json" 2>/dev/null) || RESULT=""
if echo "$RESULT" | python3 -c "import sys,json; d=json.load(sys.stdin); assert d.get('slots_imported',0)>0" 2>/dev/null; then
echo "OK ($(echo "$RESULT" | python3 -c "import sys,json; print(json.load(sys.stdin)['slots_imported'])") slotů)"
else
echo "WARN OTE API možná nemá data pro zítřek nebo je nedostupné"
fi
# 6. PV forecast
echo -n "PV forecast... "
RESULT=$(curl -sf -X POST "$BASE/api/v1/sites/${SITE_ID}/forecast/run" 2>/dev/null) || RESULT=""
if echo "$RESULT" | python3 -c "import sys,json; d=json.load(sys.stdin); assert d.get('intervals_saved',0)>0" 2>/dev/null; then
echo "OK"
else
echo "WARN forecast selhal (zkontroluj GPS souřadnice v seed datech)"
fi
# 7. Spustit plán (potřebuje ceny + forecast)
echo -n "Planning run... "
RESULT=$(curl -sf -X POST "$BASE/api/v1/sites/${SITE_ID}/plan/run?type=daily" 2>/dev/null) || RESULT=""
if echo "$RESULT" | python3 -c "import sys,json; d=json.load(sys.stdin); assert d.get('run_id') is not None" 2>/dev/null; then
echo "OK (run_id=$(echo "$RESULT" | python3 -c "import sys,json; print(json.load(sys.stdin)['run_id'])"))"
else
echo "WARN planning selhal: $RESULT"
fi
# 8. Přepnutí režimu a zpět (API + ověření přes PostgREST)
echo -n "Operating mode switch... "
curl -sf -X POST "$BASE/api/v1/sites/${SITE_ID}/mode" \
-H "Content-Type: application/json" \
-d '{"mode":"PRESERVE","notes":"smoke test","valid_until":null}' >/dev/null || true
RESULT=$(curl -sf "${POSTGREST}/vw_site_status?site_id=eq.${SITE_ID}" 2>/dev/null) || RESULT=""
MODE=$(echo "$RESULT" | python3 -c "import sys,json; print(json.load(sys.stdin)[0]['active_mode'])" 2>/dev/null) || MODE=""
if [ "$MODE" = "PRESERVE" ]; then
echo "OK"
else
echo "WARN (mode=$MODE)"
fi
curl -sf -X POST "$BASE/api/v1/sites/${SITE_ID}/mode" \
-H "Content-Type: application/json" \
-d '{"mode":"AUTO","notes":"smoke test restore","valid_until":null}' >/dev/null || true
# 9. EV sessions endpoint
echo -n "EV sessions endpoint... "
STATUS=$(curl -s -o /dev/null -w "%{http_code}" \
"$BASE/api/v1/sites/${SITE_ID}/ev/sessions/active")
[ "$STATUS" = "200" ] && echo "OK (HTTP 200)" || echo "FAIL (HTTP $STATUS)"
# 10. Frontend dostupný
echo -n "Frontend (nginx)... "
STATUS=$(curl -s -o /dev/null -w "%{http_code}" "$FRONT/")
[ "$STATUS" = "200" ] && echo "OK" || echo "FAIL (HTTP $STATUS)"
# 11. PostgREST přes nginx
echo -n "PostgREST přes nginx... "
if curl -sf "$FRONT/rest/vw_site_status?limit=1" | python3 -c "
import sys,json; d=json.load(sys.stdin); print(f'OK ({len(d)} rows)')
" 2>/dev/null; then
:
else
echo "WARN PostgREST možná potřebuje anon roli"
fi
echo ""
echo "=== Smoke test dokončen ==="