#!/bin/bash # Enhanced BDD Test Runner Script # Supports subcommands: list-tags, run [tags...] set -e SCRIPTS_DIR=$(dirname `realpath ${BASH_SOURCE[0]}`) cd $SCRIPTS_DIR/.. # Function to list all available tags list_available_tags() { echo "๐Ÿท๏ธ Available BDD Test Tags" echo "============================" echo # Find all feature files and extract unique tags echo "Feature Tags:" grep -h "^@" features/*/*.feature | sort -u | sed 's/^/ /' echo echo "Scenario Tags:" grep -h " @" features/*/*.feature | sort -u | sed 's/^/ /' echo echo "๐Ÿ“– See BDD_TAGS.md for detailed tag documentation" echo "๐Ÿ’ก Usage: ./scripts/run-bdd-tests.sh run @smoke @critical" } # Function to run tests with specific tags run_tests_with_tags() { local tags="" # Check if any tags were provided if [ $# -gt 0 ]; then tags="--tags=$(IFS=,; echo "$*")" echo "๐Ÿงช Running BDD tests with tags: $*" else echo "๐Ÿงช Running all BDD tests (no tag filtering)" fi # 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 # Set database environment variables 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" echo "๐Ÿ”ง Setting database environment variables for CI environment..." export DLC_DATABASE_HOST="postgres" 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" fi # Run tests with proper coverage measurement and tag exclusion set +e if [ -n "$tags" ]; then # Use godog directly for tag filtering with exclusion echo "๐Ÿš€ Running: godog $tags --tags=~@flaky --tags=~@todo --tags=~@skip features/" test_output=$(godog $tags --tags=~@flaky --tags=~@todo --tags=~@skip features/ 2>&1) else # Use go test for full test suite with tag exclusion echo "๐Ÿš€ Running: go test ./features/... -tags=~@flaky,~@todo,~@skip" test_output=$(go test ./features/... -tags=~@flaky,~@todo,~@skip -v -cover -coverpkg=./... -coverprofile=coverage.out 2>&1) fi test_exit_code=$? set -e echo "$test_output" # Check for undefined steps if echo "$test_output" | grep -q "undefined"; then echo "โŒ FAILED: Found undefined steps" if [ -n "$tags" ]; then echo "Command: godog $tags features/ -v" else 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' fi exit 1 fi # Check for pending steps if echo "$test_output" | grep -q "pending"; then echo "โŒ FAILED: Found pending steps" if [ -n "$tags" ]; then echo "Command: godog $tags features/ -v" else 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' fi exit 1 fi # Check for skipped steps (only for go test output) if [ -z "$tags" ] && echo "$test_output" | grep -q "skipped"; then echo "โŒ FAILED: Found skipped steps" 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 # Check if tests passed if [ $test_exit_code -eq 0 ]; then if [ -n "$tags" ]; then echo "โœ… BDD tests with tags '$*' passed successfully!" echo "Command: godog $tags features/ -v" else echo "โœ… All BDD tests passed successfully!" 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' fi exit 0 else if [ -n "$tags" ]; then echo "โŒ BDD tests with tags '$*' failed" echo "Command: godog $tags features/ -v" else echo "โŒ BDD tests failed" 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' fi exit 1 fi } # Main script logic if [ $# -eq 0 ]; then # Default behavior: run all tests run_tests_with_tags elif [ "$1" = "list-tags" ]; then # List available tags list_available_tags elif [ "$1" = "run" ]; then # Run tests with specific tags shift run_tests_with_tags "$@" else # Unknown command or direct tag specification echo "โŒ Unknown command or invalid arguments" echo echo "Usage: $0 [command] [tags...]" echo echo "Commands:" echo " list-tags List all available BDD test tags" echo " run [tags...] Run tests with specific tags (e.g., @smoke @critical)" echo " [no arguments] Run all tests (default behavior)" echo echo "Examples:" echo " $0 # Run all tests" echo " $0 list-tags # List available tags" echo " $0 run @smoke # Run smoke tests only" echo " $0 run @smoke @critical # Run smoke and critical tests" echo " $0 run @auth # Run authentication tests" exit 1 fi