Netpulse_SasS/scripts/dbtest.sh
byrsapty cedf1d261d
All checks were successful
CI / hygiene (push) Successful in 9s
CI / web (push) Successful in 1m18s
CI / server (push) Successful in 1m50s
CI / agent (push) Successful in 1m2s
Ескалації: журнал більше не бреше, ack не воскрешає драбину
Три вади, знайдені рецензією, яких щасливий шлях показати не міг:

* outcome='sent' писався до доставки; помилка читання каналів клала в
  кеш порожню мапу й з'їдала всі сходинки кабінету за тік — усі зі
  слідом «надіслано». Канали тепер читаються до просування стану,
  журнал пишеться після доставки, з правдою.
* UPDATE не мав stopped_at IS NULL — підтвердження алерту посеред
  партії не рятувало людину від дзвінка.
* час брався раз на партію.

Плюс суміжне: UpdateRule не гасив алертів вимкненого правила, сервер
домислював enabled на оновленні, channel_ids сходинок не звірялись із
каналами кабінету (зокрема чужого).

І scripts/dbtest.sh — тести проти бази перестали мовчки пропускатись.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-28 17:20:18 +03:00

70 lines
3.2 KiB
Bash
Raw 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
# Прогін тестів проти СПРАВЖНЬОЇ бази.
#
# ЧОМУ ЦЕ ОКРЕМИЙ СКРИПТ
#
# Тести проти бази мовчки пропускаються без NETPULSE_TEST_DSN — і саме
# тому вони півтора року нічого не перевіряли: `go test ./...` показував
# «ok», а всередині кожного з них стояв t.Skip. «Пропущено» в підсумку
# виглядає рівно як «пройдено», і це найдорожча тиха відмова в проєкті:
# перевірка ізоляції кабінетів, стелі тарифу, гасіння алертів і драбин
# ескалації існували, компілювались і не виконувались.
#
# scripts/check.sh лишається швидким (без Docker і без бази) — його
# ганяють на кожну правку. Цей скрипт повільніший і потребує Postgres,
# тож викликається окремо: перед розгортанням і в CI.
#
# БАЗА МУСИТЬ БУТИ ОДНОРАЗОВОЮ. Тести пишуть, видаляють і перемикають
# ролі; напрямляти їх на робочу базу не можна. Скрипт свою базу створює
# сам і дропає на початку кожного прогону.
#
# ВИКОРИСТАННЯ
# scripts/dbtest.sh # підніме свій Postgres у Docker
# NETPULSE_TEST_DSN=... scripts/dbtest.sh # проти готової бази
#
set -u
SRC="$(cd "$(dirname "$0")/.." && pwd)"
OWN_DB=0
if [ -z "${NETPULSE_TEST_DSN:-}" ]; then
# Своя база на час прогону. Порт випадковий-таки ні: фіксований, але
# нетиповий, щоб не зіткнутись із локальним Postgres розробника.
PORT=${NETPULSE_TEST_PORT:-55433}
NAME=netpulse-dbtest
echo "== піднімаю одноразовий Postgres :$PORT"
docker rm -f "$NAME" >/dev/null 2>&1
docker run -d --name "$NAME" -p "$PORT:5432" \
-e POSTGRES_USER=netpulse -e POSTGRES_PASSWORD=probe \
-e POSTGRES_DB=netpulse_probe \
timescale/timescaledb:2.17.2-pg16 >/dev/null || exit 1
OWN_DB=1
NETPULSE_TEST_DSN="postgres://netpulse:probe@127.0.0.1:$PORT/netpulse_probe?sslmode=disable"
export NETPULSE_TEST_DSN
n=0
until docker exec "$NAME" pg_isready -h 127.0.0.1 -U netpulse >/dev/null 2>&1; do
n=$((n+1)); [ "$n" -gt 60 ] && { echo "база не піднялась"; exit 1; }
sleep 1
done
fi
cleanup() {
[ "$OWN_DB" = 1 ] && docker rm -f netpulse-dbtest >/dev/null 2>&1
return 0
}
trap cleanup EXIT INT TERM
echo "== накат міграцій"
( cd "$SRC/server" && NETPULSE_DSN="$NETPULSE_TEST_DSN" go run ./cmd/netpulse-migrate ) || exit 1
echo "== тести"
( cd "$SRC/server" && go test ./internal/... -count=1 )
rc=$?
echo
if [ "$rc" = 0 ]; then
echo "усе зелене проти бази"
else
echo "!!! тести проти бази не пройшли"
fi
exit $rc