Files
vector/scripts/test-mig-full.sh
Sadmin 5bdb345e33 B14+B15: чистый SearchEngine + слоистая модель данных
B14 (поведение-сохраняющий рефакторинг):
- services/search_engine.py — вся SAR-математика из analyze.py:
  SearchInput/SearchModel, build_search_model (чистая функция,
  без DB/auth/HTTP), деривации профилей/времени суток, unmodeled.
- analyze.py — тонкая обёртка: сборка SearchInput + запись БД.
- closed_cases.py — импорты хелперов из движка.
- 12 юнит-тестов движка (claude_analyze мокается).
- Контракт /analyze не изменён; регресс спеки подтверждён:
  bike 8yo 2h лес день -> 5.4 км.

B15 (слои данных, Alembic):
- backend/alembic (env из DATABASE_URL) + миграция 006_b15_layers.
- Слой 4: search_models (case_id, version, input_snapshot, model_json).
- Слой 3: search_teams, field_observations, areas_checked, found_events
  (geom JSONB GeoJSON, PostGIS в B16).
- Слой 1: reference_priors (пустой, B12 заблокирован).
- Бэкфилл: cases.analysis_log (объект с primary_zones) -> search_models v1;
  legacy-массивы и analysis_log-таблица не тронуты.
- Проверено на CT108 в одноразовых pg16-контейнерах: чистая БД (без
  данных и с ними), бэкфилл=1 из 3 seed-кейсов, downgrade->upgrade
  идемпотентен, check-constraints работают, источник не модифицирован.

pytest: 214 passed.
2026-09-09 15:48:29 +03:00

28 lines
2.3 KiB
Bash
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/bin/sh
# Тест 3: БД со схемой 001-003 + ВСЕ старые кейсы (23 шт, стенда-подобная) →
# upgrade + count бэкфилла + downgrade + upgrade (повторная идемпотентность)
set -e
docker rm -f vec-mig-full >/dev/null 2>&1 || true
docker run -d --name vec-mig-full -e POSTGRES_PASSWORD=postgres -e POSTGRES_DB=vector_mchs postgres:16 >/dev/null
sleep 6
docker rm -f vec-mig-run3 >/dev/null 2>&1 || true
docker run -d --name vec-mig-run3 --network container:vec-mig-full -v /root/vector-mig-test:/app -w /app -e DATABASE_URL=postgresql://postgres:postgres@localhost:5432/vector_mchs python:3.11-slim sleep 900 >/dev/null
docker exec vec-mig-run3 pip install -q alembic==1.14.0 sqlalchemy psycopg2-binary 2>/dev/null
docker exec vec-mig-full psql -U postgres -d vector_mchs -c "CREATE EXTENSION IF NOT EXISTS pgcrypto;" >/dev/null
cd /root/vector
for f in backend/migrations/001_create_cases_table.sql backend/migrations/002_add_detailed_fields.sql backend/migrations/003_create_users_and_analysis_log.sql; do
docker exec -i vec-mig-full psql -U postgres -d vector_mchs < "$f" >/dev/null 2>&1
done
# Реальный дамп данных со стенда
docker exec vec-mig-pg pg_dump -U postgres -d vector_mchs --data-only --table=cases --table=analysis_log > /tmp/stand-data.sql 2>/dev/null || true
# Данных со стенда нет в тестовом контейнере — seed вручную (3 кейса как на стенде):
docker exec -i vec-mig-full psql -U postgres -d vector_mchs < /tmp/test-mig-seed.sql >/dev/null 2>&1 || true
echo "=== upgrade:"
docker exec vec-mig-run3 sh -c "cd /app/backend && alembic upgrade head" 2>&1 | tail -1
echo "=== backfill count (ожидаем 1: только object с primary_zones):"
docker exec vec-mig-full psql -U postgres -d vector_mchs -t -c "select count(*) from search_models;"
echo "=== idempotent re-upgrade (down->up):"
docker exec vec-mig-run3 sh -c "cd /app/backend && alembic downgrade base -x" 2>&1 | tail -1
docker exec vec-mig-run3 sh -c "cd /app/backend && alembic upgrade head" 2>&1 | tail -1
echo "=== final count (ожидаем снова 1, без дублей):"
docker exec vec-mig-full psql -U postgres -d vector_mchs -t -c "select count(*) from search_models;"