Files
api/scripts/ci/run-php-suite.sh
T

185 lines
4.9 KiB
Bash
Executable File

#!/usr/bin/env bash
set -euo pipefail
suite="${1:-}"
if [[ -z "$suite" ]]; then
echo "Usage: $0 <unit|integration|api>" >&2
exit 1
fi
repo_root="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
cd "$repo_root"
if [[ -f .env ]]; then
set -a
# shellcheck disable=SC1091
. ./.env
set +a
fi
export AUTO_COMPOSER_INSTALL=false
cleanup() {
docker compose down -v --remove-orphans || true
}
wait_for_container_running() {
local name="$1"
local status=""
for _ in $(seq 1 90); do
status="$(docker inspect -f '{{.State.Status}}' "$name" 2>/dev/null || true)"
if [[ "$status" == "running" ]]; then
return 0
fi
sleep 1
done
docker logs "$name" || true
echo "Container $name did not reach running state." >&2
exit 1
}
wait_for_container_healthy() {
local name="$1"
local status=""
for _ in $(seq 1 90); do
status="$(docker inspect -f '{{if .State.Health}}{{.State.Health.Status}}{{else}}{{.State.Status}}{{end}}' "$name" 2>/dev/null || true)"
if [[ "$status" == "healthy" || "$status" == "running" ]]; then
return 0
fi
sleep 2
done
docker logs "$name" || true
echo "Container $name did not reach a healthy state." >&2
exit 1
}
docker_exec_php1() {
docker exec "$@" php1 sh -lc "cd /var/www/html && ${PHP_COMMAND}"
}
run_php_command() {
local -a env_args=()
while [[ $# -gt 0 ]]; do
env_args+=(-e "$1")
shift
done
docker exec "${env_args[@]}" php1 sh -lc "cd /var/www/html && ${PHP_COMMAND}"
}
sync_php_app_into_container() {
docker exec php1 sh -lc 'mkdir -p /var/www/html && find /var/www/html -mindepth 1 -maxdepth 1 -exec rm -rf {} +'
docker cp "${repo_root}/services/nginx/app/." php1:/var/www/html/
}
install_php_dependencies() {
PHP_COMMAND="composer install --no-interaction --prefer-dist"
docker_exec_php1
docker exec php1 sh -lc '
module_dir="/var/www/html/modules/washcertificates"
if [ -f "$module_dir/composer.json" ]; then
cd "$module_dir"
composer install --no-interaction --prefer-dist
fi
'
}
docker compose down -v --remove-orphans || true
trap cleanup EXIT
services=(redis edge-broker php1)
if [[ "$suite" != "unit" ]]; then
services+=(mysql-debug)
fi
docker compose up -d --build "${services[@]}"
wait_for_container_running php1
wait_for_container_healthy redis
if [[ "$suite" != "unit" ]]; then
wait_for_container_healthy mysql-debug
fi
sync_php_app_into_container
install_php_dependencies
case "$suite" in
unit)
PHP_COMMAND="composer test:unit"
docker_exec_php1
PHP_COMMAND="composer test:coverage"
docker_exec_php1
mkdir -p "${repo_root}/services/nginx/app/build/logs"
docker cp php1:/var/www/html/build/logs/clover.xml "${repo_root}/services/nginx/app/build/logs/clover.xml" 2>/dev/null || true
;;
integration)
PHP_COMMAND="composer test:integration"
run_php_command \
"RUN_INTEGRATION_TESTS=1" \
"USE_ENV=true" \
"DEBUG=0" \
"ENCRYPTION_KEY=test-key" \
"CORS=*" \
"CONFIG_TIMEZONE=Europe/Copenhagen" \
"ECONOMIC_API_APP_ACCESS_GRANT=test" \
"ECONOMIC_API_APP_ACCESS_GRANT2=test" \
"ECONOMIC_API_APP_SECRET_TOKEN=test" \
"WORDPRESS_STATIC_TOKEN=" \
"EMAIL_WASH_CERTIFICATE_TOKEN=" \
"WORDPRESS_API_URL=http://localhost" \
"MINIO_ENDPOINT=" \
"MINIO_ACCESS_KEY=" \
"MINIO_SECRET_KEY=" \
"SLACK_DEFAULT_WEBHOOK=" \
"REDIS_CONFIG_HOST=redis" \
"REDIS_CONFIG_DATABASE=0" \
"REDIS_CONFIG_PASSWORD=" \
"REDIS_CONFIG_PORT=6379" \
"CONFIG_DB_TARGET=debug" \
"CONFIG_DB_DEBUG_HOST=mysql-debug" \
"CONFIG_DB_DEBUG_USER=root" \
"CONFIG_DB_DEBUG_PASSWORD=${CONFIG_DB_DEBUG_PASSWORD:-debug_root_password}" \
"CONFIG_DB_DEBUG_DATABASE=${CONFIG_DB_DEBUG_DATABASE:-nnks_db_debug}" \
"CONFIG_DB_DEBUG_PORT=3306"
;;
api)
PHP_COMMAND="composer test:api"
run_php_command \
"RUN_API_TESTS=1" \
"API_TEST_BOOTSTRAP_SCHEMA=1" \
"USE_ENV=true" \
"DEBUG=0" \
"ENCRYPTION_KEY=test-key" \
"CORS=*" \
"CONFIG_TIMEZONE=Europe/Copenhagen" \
"ECONOMIC_API_APP_ACCESS_GRANT=test" \
"ECONOMIC_API_APP_ACCESS_GRANT2=test" \
"ECONOMIC_API_APP_SECRET_TOKEN=test" \
"WORDPRESS_STATIC_TOKEN=" \
"EMAIL_WASH_CERTIFICATE_TOKEN=" \
"WORDPRESS_API_URL=http://localhost" \
"MINIO_ENDPOINT=" \
"MINIO_ACCESS_KEY=" \
"MINIO_SECRET_KEY=" \
"SLACK_DEFAULT_WEBHOOK=" \
"REDIS_CONFIG_HOST=redis" \
"REDIS_CONFIG_DATABASE=0" \
"REDIS_CONFIG_PASSWORD=" \
"REDIS_CONFIG_PORT=6379" \
"CONFIG_DB_TARGET=debug" \
"CONFIG_DB_DEBUG_HOST=mysql-debug" \
"CONFIG_DB_DEBUG_USER=root" \
"CONFIG_DB_DEBUG_PASSWORD=${CONFIG_DB_DEBUG_PASSWORD:-debug_root_password}" \
"CONFIG_DB_DEBUG_DATABASE=${CONFIG_DB_DEBUG_DATABASE:-nnks_db_debug}" \
"CONFIG_DB_DEBUG_PORT=3306"
;;
*)
echo "Unsupported suite: $suite" >&2
exit 1
;;
esac