✨ feat: add feature-based test organization per ADR 0024 🐛 fix: resolve compilation errors in suite_feature.go 📝 docs: add comprehensive BDD framework documentation ♻️ refactor: split monolithic tests into modular features 🧪 test: implement synchronization helpers and context management ⚡ perf: add parallel test execution capability 🔧 chore: add feature-specific test scripts and validation 📚 docs: move BDD_TAGS.md to features/ for better organization Generated by Mistral Vibe. Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
169 lines
5.5 KiB
Bash
Executable File
169 lines
5.5 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
# Feature-Specific Test Runner Script
|
|
# Runs BDD tests for a specific feature with proper isolation
|
|
|
|
set -e
|
|
|
|
# Check if feature name is provided
|
|
if [ $# -eq 0 ]; then
|
|
echo "❌ Usage: $0 <feature-name>"
|
|
echo "Available features: auth, config, greet, health, jwt"
|
|
exit 1
|
|
fi
|
|
|
|
FEATURE=$1
|
|
SCRIPTS_DIR=$(dirname `realpath ${BASH_SOURCE[0]}`)
|
|
cd $SCRIPTS_DIR/..
|
|
|
|
# Validate feature name
|
|
case $FEATURE in
|
|
auth|config|greet|health|jwt)
|
|
echo "🧪 Setting up ${FEATURE} feature tests..."
|
|
;;
|
|
*)
|
|
echo "❌ Invalid feature: $FEATURE"
|
|
echo "Available features: auth, config, greet, health, jwt"
|
|
exit 1
|
|
;;
|
|
esac
|
|
|
|
# Feature-specific configuration
|
|
DATABASE="dance_lessons_coach_${FEATURE}_test"
|
|
CONFIG="features/${FEATURE}/${FEATURE}-test-config.yaml"
|
|
PORT=$(grep "port:" "$CONFIG" | awk '{print $2}')
|
|
|
|
# Setup function
|
|
setup_feature_environment() {
|
|
echo "🧪 Setting up ${FEATURE} feature tests..."
|
|
|
|
# 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"
|
|
|
|
# Create database if it doesn't exist
|
|
if ! psql -h postgres -p 5432 -U postgres -lqt | cut -d \| -f 1 | grep -qw "${DATABASE}"; then
|
|
echo "📦 Creating ${FEATURE} test database..."
|
|
createdb -h postgres -p 5432 -U postgres "${DATABASE}"
|
|
echo "✅ ${FEATURE} test database created successfully!"
|
|
else
|
|
echo "✅ ${FEATURE} test database already exists"
|
|
fi
|
|
else
|
|
# Local environment - use docker compose
|
|
echo "💻 Local environment detected"
|
|
|
|
# Check if PostgreSQL container is running, start it if not
|
|
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
|
|
else
|
|
echo "✅ PostgreSQL container is already running"
|
|
fi
|
|
|
|
# Create feature-specific database
|
|
if docker exec dance-lessons-coach-postgres psql -U postgres -lqt | cut -d \| -f 1 | grep -qw "${DATABASE}"; then
|
|
echo "✅ ${FEATURE} test database already exists"
|
|
else
|
|
echo "📦 Creating ${FEATURE} test database..."
|
|
if docker exec dance-lessons-coach-postgres createdb -U postgres "${DATABASE}"; then
|
|
echo "✅ ${FEATURE} test database created successfully!"
|
|
else
|
|
echo "❌ Failed to create ${FEATURE} test database"
|
|
exit 1
|
|
fi
|
|
fi
|
|
fi
|
|
}
|
|
|
|
# Run tests function
|
|
run_feature_tests() {
|
|
echo "🚀 Running ${FEATURE} feature tests..."
|
|
|
|
# Set feature-specific environment variables
|
|
export DLC_DATABASE_HOST="localhost"
|
|
export DLC_DATABASE_PORT="5432"
|
|
export DLC_DATABASE_USER="postgres"
|
|
export DLC_DATABASE_PASSWORD="postgres"
|
|
export DLC_DATABASE_NAME="${DATABASE}"
|
|
export DLC_DATABASE_SSL_MODE="disable"
|
|
export DLC_CONFIG_FILE="${CONFIG}"
|
|
|
|
# Run tests with proper coverage measurement
|
|
set +e
|
|
test_output=$(go test ./features/${FEATURE}/... -v -cover -coverpkg=./... -coverprofile=coverage-${FEATURE}.out 2>&1)
|
|
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 in ${FEATURE} tests"
|
|
exit 1
|
|
fi
|
|
|
|
# Check for pending steps
|
|
if echo "$test_output" | grep -q "pending"; then
|
|
echo "❌ FAILED: Found pending steps in ${FEATURE} tests"
|
|
exit 1
|
|
fi
|
|
|
|
# Check for skipped steps
|
|
if echo "$test_output" | grep -q "skipped"; then
|
|
echo "❌ FAILED: Found skipped steps in ${FEATURE} tests"
|
|
exit 1
|
|
fi
|
|
|
|
# Check if tests passed
|
|
if [ $test_exit_code -eq 0 ]; then
|
|
echo "✅ All ${FEATURE} feature tests passed successfully!"
|
|
return 0
|
|
else
|
|
echo "❌ ${FEATURE} feature tests failed"
|
|
return 1
|
|
fi
|
|
}
|
|
|
|
# Cleanup function
|
|
cleanup_feature_environment() {
|
|
echo "🧹 Cleaning up ${FEATURE} feature tests..."
|
|
|
|
# Check if we're in CI environment
|
|
if [ -n "$GITHUB_ACTIONS" ] || [ -n "$GITEA_ACTIONS" ]; then
|
|
# CI environment - drop database
|
|
echo "🗑️ Dropping ${FEATURE} test database..."
|
|
dropdb -h postgres -p 5432 -U postgres "${DATABASE}" 2>/dev/null || true
|
|
echo "✅ ${FEATURE} test database cleaned up"
|
|
else
|
|
# Local environment - drop database
|
|
echo "🗑️ Dropping ${FEATURE} test database..."
|
|
docker exec dance-lessons-coach-postgres dropdb -U postgres "${DATABASE}" 2>/dev/null || true
|
|
echo "✅ ${FEATURE} test database cleaned up"
|
|
fi
|
|
}
|
|
|
|
# Main execution
|
|
setup_feature_environment
|
|
run_feature_tests
|
|
cleanup_feature_environment
|