#!/usr/bin/env bash # Запускаемый сквозной тест «жизнь магазина от регистрации до отчётов». # Один прогон = свои свежие данные против настоящего стенда, сверка ЧИСЕЛ и # инвариантов, markdown-отчёт со скриншотами. Выход != 0 если есть падения — # чтобы ночной прогон/quality-watchdog ловил регресс. # # Использование: # tests/e2e/full-chain.sh # режим C: свежая temp-орг (для ночного прогона) # tests/e2e/full-chain.sh --api-only # без браузера (быстрее, только API+инварианты) # FULLCHAIN_TARGET=demo tests/e2e/full-chain.sh # режим B: прогон в «Демо-магазине» # # Env: # E2E_ADMIN_URL — стенд (default https://test.admin.food-market.kz) # FULLCHAIN_TARGET — temp (default) | demo set -uo pipefail cd "$(dirname "$0")" export E2E_ADMIN_URL="${E2E_ADMIN_URL:-https://test.admin.food-market.kz}" if [ ! -d node_modules ]; then pnpm install --silent fi # chromium для UI-шагов (если не ставили) if [ "${1:-}" != "--api-only" ]; then pnpm exec playwright install chromium >/dev/null 2>&1 || true fi echo "[full-chain] стенд=$E2E_ADMIN_URL режим=${FULLCHAIN_TARGET:-temp} $*" pnpm exec tsx runner.ts full-chain "$@" RC=$? REPORT="$(ls -t reports/full-chain-*.md 2>/dev/null | head -1)" if [ -z "$REPORT" ]; then echo "[full-chain] ОТЧЁТ НЕ НАЙДЕН — прогон не состоялся" exit 2 fi echo "[full-chain] отчёт: $REPORT" # Итоговая строка: «**Итог:** N ✓ / M ✗ / ...» SUMMARY="$(grep -m1 '\*\*Итог:\*\*' "$REPORT" || true)" echo "[full-chain] $SUMMARY" FAILS="$(echo "$SUMMARY" | grep -oE '[0-9]+ ✗' | grep -oE '[0-9]+' || echo 0)" if [ "${FAILS:-0}" -gt 0 ] || [ "$RC" -ne 0 ]; then echo "[full-chain] РЕЗУЛЬТАТ: КРАСНЫЙ (падений: ${FAILS:-?})" exit 1 fi echo "[full-chain] РЕЗУЛЬТАТ: ЗЕЛЁНЫЙ" exit 0