#!/bin/sh
. "$(dirname "$0")/_/husky.sh"

RED_COLOR='\033[1;31m'
GREEN_COLOR='\033[1;32m'
YELLOW_COLOR='\033[1;33m'
BLUE_COLOR='\033[1;34m'
EMPTY_COLOR='\033[0m'

echo -e "${YELLOW_COLOR}Запуск тестов перед push.${EMPTY_COLOR}"

# TODO: игнорирует packages (из за изменений в нем вызываются все тесты во всех сервисах)

# список измененных файлов относительно origin/develop
CHANGED_FILES=$(git diff --name-only origin/develop...HEAD)

# фильтруем сервисы, в которых были изменения (лерна не подходит, отображает изменения во всех сервисах, если изменены пакеты)
CHANGED_SERVICES=$(echo "$CHANGED_FILES" | grep -E '^services/[^/]+/' | awk -F'/' '{print $2}' | sort | uniq)

if [ -z "$CHANGED_SERVICES" ]; then
  echo -e "${BLUE_COLOR}Нет измененных сервисов для тестирования.${EMPTY_COLOR}"
  exit 0
fi

# формируем scope для запуска тестов по сервисам
SCOPE_ARGS=""
for service in $CHANGED_SERVICES; do
  SCOPE_ARGS="$SCOPE_ARGS --scope $service"
done

TEST_OUTPUT_FILE=$(mktemp)

echo -e "${BLUE_COLOR}Запуск тестов в сервисе: $(echo $CHANGED_SERVICES | tr '\n' ' ')${EMPTY_COLOR}"

npx lerna run test $SCOPE_ARGS 2>&1 | grep -E "(PASS|FAIL).*\.(test|spec)\.|(✓|√|×|✕)" > "$TEST_OUTPUT_FILE" || true

# вывод отформатированных упавших тест-кейсов, если такие есть
if [ ${PIPESTATUS[0]} -ne 0 ]; then
  echo -e "${RED_COLOR}Упавшие тест-кейсы:${EMPTY_COLOR}"
  
  grep -A 10 "FAIL" "$TEST_OUTPUT_FILE" | grep -E "FAIL|[✕×]" | while read line; do
    if echo "$line" | grep -q "FAIL"; then
      FILE=$(echo "$line" | sed 's/FAIL[[:space:]]*//')
      echo -e "\n$FILE:"
    else
      TEST=$(echo "$line" | sed 's/.*[✕×] //' | sed 's/ ([0-9].*//')
      echo -e "  ✗ $TEST"
    fi
  done
  
  rm "$TEST_OUTPUT_FILE"
  echo -e "${RED_COLOR}Push прерван из-за упавших тест-кейсов.${EMPTY_COLOR}"
  exit 1
fi

rm "$TEST_OUTPUT_FILE"
echo -e "${GREEN_COLOR}Тесты пройдены успешно.${EMPTY_COLOR}"