#!/bin/bash

# Lance les tests unitaires de l'API
# Ce script lance un serveur scodoc sur le port 5555
# attend qu'il soit initialisé puis lance les tests client API.
#
# On peut aussi le lancer avec l'option --dont-start-server
# auquel cas il utilise un serveur existant, qui doit avoir été lancé
# par ailleurs, par exemple via le script:
#     tests/api/start_api_server.sh -p 5555
#
# Toutes les autres options sont passées telles qu'elles à pytest
#
# Exemples:
# - lancer tous les tests API: tools/test_api.sh
# - lancer tous les tests, en mode debug (arrêt pdb sur le 1er):
#       tools/test_api.sh -x --pdb tests/api
# - lancer un module de test, en utilisant un server dev existant:
#       tools/test_api.sh --dont-start-server  -x --pdb tests/api/test_api_evaluations.py
#
#
# E. Viennet, Fev 2023

cd /opt/scodoc || exit 1
# suppose que le virtual env est bien configuré

# Utilise un port spécifique pour pouvoir lancer ce test sans couper
# le serveur de dev
PORT=5555
SERVER_LOG=/tmp/test_api_server.log

export SCODOC_URL="http://localhost:${PORT}"

if [ "$1" = "--dont-start-server" ]
then
  START_SERVER=0
  shift
  echo "Using existing scodoc server on port $PORT"
else
  START_SERVER=1
fi

if [ "$START_SERVER" -eq 1 ]
then
  # ------- Check pas de serveur déjà lancé
  if nc -z localhost "$PORT"
  then
      fuser -v "$PORT"/tcp
      echo Server already running on port "$PORT"
      echo You may want to try: fuser -k "$PORT"/tcp
      echo aborting tests
      exit 1
  fi

  tests/api/start_api_server.sh -p "$PORT" &> "$SERVER_LOG" &
  pid=$!
  echo "ScoDoc test server logs are in $SERVER_LOG"
  # Wait for server setup
  echo -n "Waiting for server"
  while ! nc -z localhost "$PORT"; do
    echo -n .
    sleep 1
  done
  echo
  echo Server PID "$pid" running on port "$PORT"
  # ------------------
fi

if [ "$#" -eq 0 ]
then
  echo "Starting pytest tests/api"
  pytest tests/api
else
  echo "Starting pytest $@"
  pytest "$@"
fi

# ------------------
if [ "$START_SERVER" -eq 1 ]
then
  echo "Killing test server"
  kill "$pid"
  fuser -k "$PORT"/tcp
fi