#!/usr/bin/env bash

set -e

export CHROMA_PORT=8000

function cleanup {
  docker compose -f docker-compose.test.yml down --rmi local --volumes
  rm server.htpasswd .chroma_env
}

function setup_auth {
  local auth_type="$1"
  case "$auth_type" in
    basic)
      docker run --rm --entrypoint htpasswd httpd:2 -Bbn admin admin > server.htpasswd
      cat <<EOF > .chroma_env
CHROMA_SERVER_AUTH_CREDENTIALS_FILE="/chroma/server.htpasswd"
CHROMA_SERVER_AUTH_CREDENTIALS_PROVIDER="chromadb.auth.providers.HtpasswdFileServerAuthCredentialsProvider"
CHROMA_SERVER_AUTH_PROVIDER="chromadb.auth.basic.BasicAuthServerProvider"
EOF
      ;;
    token)
      cat <<EOF > .chroma_env
CHROMA_SERVER_AUTH_CREDENTIALS="test-token"
CHROMA_SERVER_AUTH_TOKEN_TRANSPORT_HEADER="AUTHORIZATION"
CHROMA_SERVER_AUTH_CREDENTIALS_PROVIDER="chromadb.auth.token.TokenConfigServerAuthCredentialsProvider"
CHROMA_SERVER_AUTH_PROVIDER="chromadb.auth.token.TokenAuthServerProvider"
EOF
      ;;
    xtoken)
          cat <<EOF > .chroma_env
CHROMA_SERVER_AUTH_CREDENTIALS="test-token"
CHROMA_SERVER_AUTH_TOKEN_TRANSPORT_HEADER="X_CHROMA_TOKEN"
CHROMA_SERVER_AUTH_CREDENTIALS_PROVIDER="chromadb.auth.token.TokenConfigServerAuthCredentialsProvider"
CHROMA_SERVER_AUTH_PROVIDER="chromadb.auth.token.TokenAuthServerProvider"
EOF
    ;;
    *)
      echo "Unknown auth type: $auth_type"
      exit 1
      ;;
  esac
}

trap cleanup EXIT

docker compose -f docker-compose.test.yml up --build -d

export CHROMA_INTEGRATION_TEST_ONLY=1
export CHROMA_API_IMPL=chromadb.api.fastapi.FastAPI
export CHROMA_SERVER_HOST=localhost
export CHROMA_SERVER_HTTP_PORT=8000
export CHROMA_SERVER_NOFILE=65535

echo testing: python -m pytest "$@"
python -m pytest "$@"

cd clients/js

# moved off of yarn to npm to fix issues with jackspeak/cliui/string-width versions #1314
npm install
npm run test:run

docker compose down
cd ../..
for auth_type in basic token xtoken; do
  echo "Testing $auth_type auth"
  setup_auth "$auth_type"
  cd clients/js
  docker compose --env-file ../../.chroma_env -f ../../docker-compose.test-auth.yml up --build -d
  yarn test:run-auth-"$auth_type"
  cd ../..
  docker compose down
done