Три вади, знайдені рецензією, яких щасливий шлях показати не міг: * outcome='sent' писався до доставки; помилка читання каналів клала в кеш порожню мапу й з'їдала всі сходинки кабінету за тік — усі зі слідом «надіслано». Канали тепер читаються до просування стану, журнал пишеться після доставки, з правдою. * UPDATE не мав stopped_at IS NULL — підтвердження алерту посеред партії не рятувало людину від дзвінка. * час брався раз на партію. Плюс суміжне: UpdateRule не гасив алертів вимкненого правила, сервер домислював enabled на оновленні, channel_ids сходинок не звірялись із каналами кабінету (зокрема чужого). І scripts/dbtest.sh — тести проти бази перестали мовчки пропускатись. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
70 lines
3.2 KiB
Bash
70 lines
3.2 KiB
Bash
#!/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
|