#!/bin/bash # BDD Test Runner Script # Runs all BDD tests and fails if there are undefined, pending, or skipped steps set -e echo "๐Ÿงช Running BDD Tests..." SCRIPTS_DIR=$(dirname `realpath ${BASH_SOURCE[0]}`) cd $SCRIPTS_DIR/.. # Check if we're in CI environment if [ -n "$GITHUB_ACTIONS" ] || [ -n "$GITEA_ACTIONS" ]; then # CI environment - PostgreSQL is already running as a service echo "๐Ÿ—๏ธ CI environment detected" echo "๐Ÿ‹ PostgreSQL service is already running" # Check if database is accessible echo "๐Ÿ“ฆ Checking PostgreSQL connectivity..." if ! pg_isready -h postgres -p 5432 -U postgres -d dance_lessons_coach_bdd_test; then echo "โŒ PostgreSQL is not ready or accessible" exit 1 fi echo "โœ… PostgreSQL is ready!" else # Local environment - use docker compose echo "๐Ÿ’ป Local environment detected" # Check if PostgreSQL container is running, start it if not echo "๐Ÿ‹ Checking PostgreSQL container..." if ! docker ps --format '{{.Names}}' | grep -q "^dance-lessons-coach-postgres$"; then echo "๐Ÿ‹ Starting PostgreSQL container..." docker compose up -d postgres # Wait for PostgreSQL to be ready echo "โณ Waiting for PostgreSQL to be ready..." max_attempts=30 attempt=0 while [ $attempt -lt $max_attempts ]; do if docker exec dance-lessons-coach-postgres pg_isready -U postgres 2>/dev/null; then echo "โœ… PostgreSQL is ready!" break fi attempt=$((attempt + 1)) sleep 1 done if [ $attempt -eq $max_attempts ]; then echo "โŒ PostgreSQL failed to start" exit 1 fi # Create BDD test database (separate from development database) echo "๐Ÿ“ฆ Creating BDD test database..." # Drop database if it exists, then create fresh docker exec dance-lessons-coach-postgres psql -U postgres -c "DROP DATABASE IF EXISTS dance_lessons_coach_bdd_test;" if docker exec dance-lessons-coach-postgres createdb -U postgres dance_lessons_coach_bdd_test; then echo "โœ… BDD test database created successfully!" else echo "โŒ Failed to create BDD test database" exit 1 fi else echo "โœ… PostgreSQL container is already running" # Check if BDD test database exists, create if not echo "๐Ÿ“ฆ Checking BDD test database..." if docker exec dance-lessons-coach-postgres psql -U postgres -lqt | cut -d \| -f 1 | grep -qw "dance_lessons_coach_bdd_test"; then echo "โœ… BDD test database already exists" else echo "๐Ÿ“ฆ Creating BDD test database..." if docker exec dance-lessons-coach-postgres createdb -U postgres dance_lessons_coach_bdd_test; then echo "โœ… BDD test database created successfully!" else echo "โŒ Failed to create BDD test database" exit 1 fi fi fi fi # Run the BDD tests # For local environment, set database environment variables to use localhost # For CI environment, the database is already configured as a service if [ -z "$GITHUB_ACTIONS" ] && [ -z "$GITEA_ACTIONS" ]; then echo "๐Ÿ”ง Setting database environment variables for local environment..." export DLC_DATABASE_HOST="localhost" export DLC_DATABASE_PORT="5432" export DLC_DATABASE_USER="postgres" export DLC_DATABASE_PASSWORD="postgres" export DLC_DATABASE_NAME="dance_lessons_coach_bdd_test" export DLC_DATABASE_SSL_MODE="disable" else echo "๐Ÿ—๏ธ CI environment detected, using service configuration" fi # Run tests with proper coverage measurement test_output=$(go test ./features/... -v -cover -coverpkg=./... -coverprofile=coverage.out 2>&1) test_exit_code=$? echo "$test_output" # Check for undefined steps if echo "$test_output" | grep -q "undefined"; then echo "โŒ FAILED: Found undefined steps" exit 1 fi # Check for pending steps if echo "$test_output" | grep -q "pending"; then echo "โŒ FAILED: Found pending steps" exit 1 fi # Check for skipped steps if echo "$test_output" | grep -q "skipped"; then echo "โŒ FAILED: Found skipped steps" exit 1 fi # Check if tests passed if [ $test_exit_code -eq 0 ]; then echo "โœ… All BDD tests passed successfully!" exit 0 else echo "โŒ BDD tests failed" echo echo 'DLC_DATABASE_HOST=localhost DLC_DATABASE_PORT=5432 DLC_DATABASE_USER=postgres DLC_DATABASE_PASSWORD=postgres DLC_DATABASE_NAME=dance_lessons_coach_bdd_test DLC_DATABASE_SSL_MODE=disable go test ./features/... -v' exit 1 fi