Compare commits
2 Commits
f34a41a1c7
...
5bfb08abc7
| Author | SHA1 | Date | |
|---|---|---|---|
| 5bfb08abc7 | |||
| f013a1771d |
@@ -183,10 +183,24 @@ jobs:
|
||||
exit 1
|
||||
fi
|
||||
|
||||
- name: Run tests with coverage
|
||||
- name: Run BDD tests with strict validation
|
||||
run: |
|
||||
echo "Running tests with PostgreSQL service..."
|
||||
go test ./... -coverprofile=coverage.out -v && go tool cover -func=coverage.out > coverage.txt
|
||||
echo "Running BDD tests with strict validation..."
|
||||
# Use the run-bdd-tests.sh script which fails on undefined/pending steps
|
||||
# In CI environment, PostgreSQL is already running as a service
|
||||
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
|
||||
./scripts/run-bdd-tests.sh
|
||||
|
||||
- name: Run unit tests with coverage
|
||||
run: |
|
||||
echo "Running unit tests with PostgreSQL service..."
|
||||
# Run unit tests excluding BDD tests (already run above)
|
||||
go test ./pkg/... ./cmd/... -coverprofile=coverage.out -v && go tool cover -func=coverage.out > coverage.txt
|
||||
|
||||
# Extract coverage percentage
|
||||
COVERAGE=$(grep "total:" coverage.txt | grep -oP '\d+\.\d+' | head -1)
|
||||
|
||||
373
.gitea/workflows/ci-cd.yaml.backup
Normal file
373
.gitea/workflows/ci-cd.yaml.backup
Normal file
@@ -0,0 +1,373 @@
|
||||
---
|
||||
# dance-lessons-coach Unified CI/CD Workflow
|
||||
# Single, optimized workflow that replaces all previous workflows
|
||||
# Fast execution with minimal repetition and maximum artifact sharing
|
||||
|
||||
name: CI/CD Pipeline
|
||||
|
||||
on:
|
||||
workflow_dispatch: {}
|
||||
push:
|
||||
branches:
|
||||
- main
|
||||
- 'ci/**'
|
||||
- 'feature/**'
|
||||
- 'fix/**'
|
||||
- 'refactor/**'
|
||||
paths-ignore:
|
||||
- 'README.md'
|
||||
- 'doc/**'
|
||||
- 'adr/**'
|
||||
- '.gitea/**'
|
||||
- 'documentation/**'
|
||||
- '*.md'
|
||||
- '.vibe/**'
|
||||
- 'features/**'
|
||||
pull_request:
|
||||
branches:
|
||||
- main
|
||||
types: [opened, synchronize, reopened, labeled]
|
||||
# Only run PR CI if the commit doesn't already have passing branch CI
|
||||
if: |
|
||||
github.event_name == 'pull_request' &&
|
||||
(github.event.action == 'opened' ||
|
||||
github.event.action == 'synchronize' ||
|
||||
github.event.action == 'reopened')
|
||||
paths-ignore:
|
||||
- 'README.md'
|
||||
- 'doc/**'
|
||||
- 'adr/**'
|
||||
- '.gitea/**'
|
||||
- 'documentation/**'
|
||||
- '*.md'
|
||||
- '.vibe/**'
|
||||
- 'features/**'
|
||||
|
||||
# cancel any previously-started runs of this workflow on the same branch
|
||||
concurrency:
|
||||
group: ${{ github.ref }}-${{ github.workflow }}
|
||||
cancel-in-progress: true
|
||||
|
||||
# Arcodange-specific environment variables
|
||||
env:
|
||||
GITEA_INTERNAL: "https://gitea.arcodange.lab/"
|
||||
GITEA_EXTERNAL: "https://gitea.arcodange.fr/"
|
||||
GITEA_ORG: "arcodange"
|
||||
GITEA_REPO: "dance-lessons-coach"
|
||||
CI_REGISTRY: "gitea.arcodange.lab"
|
||||
|
||||
jobs:
|
||||
build-cache:
|
||||
name: Build Docker Cache
|
||||
runs-on: ubuntu-latest-ca
|
||||
if: "!contains(github.event.head_commit.message, '[skip ci]') && github.actor != 'ci-bot'"
|
||||
outputs:
|
||||
deps_hash: ${{ steps.calculate_hash.outputs.deps_hash }}
|
||||
cache_hit: ${{ steps.check_cache.outputs.cache_hit }}
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Calculate dependency hash
|
||||
id: calculate_hash
|
||||
run: |
|
||||
# Calculate hash of go.mod + go.sum (inline, no script needed)
|
||||
DEPS_HASH=$(sha256sum go.mod go.sum | sha256sum | cut -d' ' -f1 | head -c 12)
|
||||
echo "Dependency hash: $DEPS_HASH"
|
||||
echo "deps_hash=$DEPS_HASH" >> $GITHUB_OUTPUT
|
||||
|
||||
- name: Check for existing cache
|
||||
id: check_cache
|
||||
run: |
|
||||
# Check if image exists in registry
|
||||
IMAGE_NAME="${{ env.CI_REGISTRY }}/${{ env.GITEA_ORG }}/${{ env.GITEA_REPO }}-build-cache:${{ steps.calculate_hash.outputs.deps_hash }}"
|
||||
|
||||
# Try to pull the image to see if it exists
|
||||
if docker pull "$IMAGE_NAME" >/dev/null 2>&1; then
|
||||
echo "✅ Cache hit - using existing build cache"
|
||||
echo "cache_hit=true" >> $GITHUB_OUTPUT
|
||||
else
|
||||
echo "⚠️ Cache miss - will build new cache image"
|
||||
echo "cache_hit=false" >> $GITHUB_OUTPUT
|
||||
fi
|
||||
|
||||
- name: Login to Gitea Container Registry
|
||||
if: steps.check_cache.outputs.cache_hit == 'false'
|
||||
uses: docker/login-action@v3
|
||||
with:
|
||||
registry: ${{ env.CI_REGISTRY }}
|
||||
username: ${{ github.actor }}
|
||||
password: ${{ secrets.PACKAGES_TOKEN }}
|
||||
|
||||
|
||||
|
||||
- name: Build and push Docker cache image
|
||||
if: steps.check_cache.outputs.cache_hit == 'false'
|
||||
run: |
|
||||
IMAGE_NAME="${{ env.CI_REGISTRY }}/${{ env.GITEA_ORG }}/${{ env.GITEA_REPO }}-build-cache:${{ steps.calculate_hash.outputs.deps_hash }}"
|
||||
echo "Building cache image: $IMAGE_NAME"
|
||||
|
||||
# Build the image using traditional docker build
|
||||
docker build \
|
||||
--file docker/Dockerfile.build \
|
||||
--tag "$IMAGE_NAME" \
|
||||
.
|
||||
|
||||
# Push the image
|
||||
docker push "$IMAGE_NAME"
|
||||
|
||||
echo "✅ Build cache image pushed successfully"
|
||||
|
||||
ci-pipeline:
|
||||
name: CI Pipeline
|
||||
needs: build-cache
|
||||
runs-on: ubuntu-latest-ca
|
||||
if: "!contains(github.event.head_commit.message, '[skip ci]') && github.actor != 'ci-bot'"
|
||||
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Install Docker Compose
|
||||
run: sudo apt-get update && sudo apt-get install -y docker-compose-plugin
|
||||
|
||||
- name: Start PostgreSQL with Docker Compose
|
||||
run: docker compose -f docker-compose.yml up -d postgres
|
||||
|
||||
- name: Wait for PostgreSQL to be ready
|
||||
run: |
|
||||
echo "Waiting for PostgreSQL to be ready..."
|
||||
for i in {1..30}; do
|
||||
if docker exec dance-lessons-coach-postgres pg_isready -U postgres; then
|
||||
echo "✅ PostgreSQL is ready!"
|
||||
break
|
||||
fi
|
||||
echo "Waiting for PostgreSQL... ($i/30)"
|
||||
sleep 2
|
||||
done
|
||||
|
||||
# Verify PostgreSQL is accessible
|
||||
if ! docker exec dance-lessons-coach-postgres pg_isready -U postgres; then
|
||||
echo "❌ PostgreSQL failed to start"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- uses: docker/login-action@v3
|
||||
with:
|
||||
registry: ${{ env.CI_REGISTRY }}
|
||||
username: ${{ github.actor }}
|
||||
password: ${{ secrets.PACKAGES_TOKEN }}
|
||||
|
||||
- name: Set up build environment
|
||||
run: |
|
||||
IMAGE_NAME="${{ env.CI_REGISTRY }}/${{ env.GITEA_ORG }}/${{ env.GITEA_REPO }}-build-cache:${{ needs.build-cache.outputs.deps_hash }}"
|
||||
echo "Build cache image: $IMAGE_NAME"
|
||||
|
||||
# Try to use Docker cache if available
|
||||
if docker pull "$IMAGE_NAME" >/dev/null 2>&1; then
|
||||
echo "✅ Using Docker build cache"
|
||||
echo "CACHE_AVAILABLE=true" >> $GITHUB_ENV
|
||||
echo "CACHE_IMAGE=$IMAGE_NAME" >> $GITHUB_ENV
|
||||
else
|
||||
echo "⚠️ Building without cache (first run or new dependencies)"
|
||||
echo "CACHE_AVAILABLE=false" >> $GITHUB_ENV
|
||||
fi
|
||||
|
||||
- name: Check dependencies
|
||||
run: |
|
||||
if [ "${{ env.CACHE_AVAILABLE }}" = "true" ]; then
|
||||
echo "✅ Using pre-installed dependencies from Docker cache"
|
||||
# No need to run go mod tidy - dependencies are already in the cache
|
||||
else
|
||||
echo "Running natively - ensuring dependencies are up to date..."
|
||||
go mod tidy
|
||||
fi
|
||||
|
||||
- name: Start build cache container with Docker Compose
|
||||
run: |
|
||||
if [ "${{ env.CACHE_AVAILABLE }}" = "true" ]; then
|
||||
echo "Starting build cache container..."
|
||||
export DEPS_HASH="${{ needs.build-cache.outputs.deps_hash }}"
|
||||
docker compose -f docker-compose.build.yml up -d build-cache
|
||||
fi
|
||||
|
||||
- name: Generate Swagger Docs using Docker Compose
|
||||
run: |
|
||||
if [ "${{ env.CACHE_AVAILABLE }}" = "true" ]; then
|
||||
echo "Running in Docker Compose container..."
|
||||
docker compose -f docker-compose.build.yml exec -w /workspace/pkg/server build-cache sh -c "go generate"
|
||||
else
|
||||
echo "Running natively..."
|
||||
cd pkg/server && go generate
|
||||
fi
|
||||
|
||||
- name: Build all packages using Docker Compose
|
||||
run: |
|
||||
if [ "${{ env.CACHE_AVAILABLE }}" = "true" ]; then
|
||||
echo "Running in Docker Compose container..."
|
||||
docker compose -f docker-compose.build.yml exec -w /workspace build-cache sh -c "go build ./..."
|
||||
else
|
||||
echo "Running natively..."
|
||||
go build ./...
|
||||
fi
|
||||
|
||||
- name: Wait for PostgreSQL to be ready
|
||||
run: |
|
||||
echo "Waiting for PostgreSQL to be ready..."
|
||||
for i in {1..30}; do
|
||||
if pg_isready -h localhost -p 5432 -U postgres -d dance_lessons_coach_bdd_test; then
|
||||
echo "✅ PostgreSQL is ready!"
|
||||
break
|
||||
fi
|
||||
echo "Waiting for PostgreSQL... ($i/30)"
|
||||
sleep 2
|
||||
done
|
||||
|
||||
# Verify PostgreSQL is accessible
|
||||
if ! pg_isready -h localhost -p 5432 -U postgres -d dance_lessons_coach_bdd_test; then
|
||||
echo "❌ PostgreSQL failed to start"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
- name: Run tests with coverage using Docker Compose
|
||||
run: |
|
||||
if [ "${{ env.CACHE_AVAILABLE }}" = "true" ]; then
|
||||
echo "Running in Docker Compose container with PostgreSQL..."
|
||||
docker compose -f docker-compose.build.yml exec \
|
||||
-e PGHOST=dance-lessons-coach-postgres \
|
||||
-e PGPORT=5432 \
|
||||
-e PGUSER=postgres \
|
||||
-e PGPASSWORD=postgres \
|
||||
-e PGDATABASE=dance_lessons_coach_bdd_test \
|
||||
-w /workspace \
|
||||
build-cache \
|
||||
sh -c "go test ./... -coverprofile=coverage.out -v && go tool cover -func=coverage.out > coverage.txt"
|
||||
else
|
||||
echo "Running natively with Docker Compose PostgreSQL..."
|
||||
export PGHOST=dance-lessons-coach-postgres
|
||||
export PGPORT=5432
|
||||
export PGUSER=postgres
|
||||
export PGPASSWORD=postgres
|
||||
export PGDATABASE=dance_lessons_coach_bdd_test
|
||||
go test ./... -coverprofile=coverage.out -v
|
||||
go tool cover -func=coverage.out > coverage.txt
|
||||
fi
|
||||
|
||||
# Extract coverage percentage
|
||||
COVERAGE=$(grep "total:" coverage.txt | grep -oP '\d+\.\d+' | head -1)
|
||||
echo "Coverage: ${COVERAGE}%"
|
||||
|
||||
# Update coverage badge using script
|
||||
export PACKAGES_TOKEN="${{ secrets.PACKAGES_TOKEN }}"
|
||||
export GITHUB_REF_NAME="${{ github.ref_name }}"
|
||||
./scripts/ci-update-coverage-badge.sh "$COVERAGE"
|
||||
|
||||
- name: Run go fmt
|
||||
run: go fmt ./...
|
||||
|
||||
- name: Run swag fmt
|
||||
run: swag fmt
|
||||
|
||||
- name: Build binaries
|
||||
run: |
|
||||
if [ "${{ env.CACHE_AVAILABLE }}" = "true" ]; then
|
||||
echo "Running in Docker Compose container..."
|
||||
docker compose -f docker-compose.build.yml exec -w /workspace build-cache sh -c "./scripts/build.sh"
|
||||
else
|
||||
echo "Running natively..."
|
||||
./scripts/build.sh
|
||||
fi
|
||||
|
||||
# NOTE: Artifact upload disabled - actions/upload-artifact@v4 not available on Gitea
|
||||
# TODO: Replace with Gitea-specific upload action when available
|
||||
# - name: Upload Swagger documentation
|
||||
# uses: actions/upload-artifact@v4
|
||||
# with:
|
||||
# name: swagger-docs
|
||||
# path: pkg/server/docs/swagger.json
|
||||
# retention-days: 1
|
||||
|
||||
# Docker build and push (main branch only)
|
||||
- name: Login to Gitea Container Registry
|
||||
if: github.ref == 'refs/heads/main'
|
||||
uses: docker/login-action@v3
|
||||
with:
|
||||
registry: ${{ env.CI_REGISTRY }}
|
||||
username: ${{ github.actor }}
|
||||
password: ${{ secrets.PACKAGES_TOKEN }}
|
||||
|
||||
- name: Build and push Docker image
|
||||
if: github.ref == 'refs/heads/main'
|
||||
run: |
|
||||
source VERSION
|
||||
IMAGE_VERSION="$MAJOR.$MINOR.$PATCH${PRERELEASE:+-$PRERELEASE}"
|
||||
|
||||
# Generate Dockerfile.prod with correct dependency hash
|
||||
DEPS_HASH="${{ needs.build-cache.outputs.deps_hash }}"
|
||||
echo "Using dependency hash: $DEPS_HASH"
|
||||
|
||||
# Create Dockerfile.prod with the correct cache image tag
|
||||
cat > docker/Dockerfile.prod << EOF
|
||||
# dance-lessons-coach Production Docker Image
|
||||
# Generated by CI/CD pipeline with dependency hash: $DEPS_HASH
|
||||
|
||||
# Use the build cache image as base
|
||||
FROM gitea.arcodange.lab/arcodange/dance-lessons-coach-build-cache:$DEPS_HASH AS builder
|
||||
|
||||
# Final minimal image
|
||||
FROM alpine:3.18
|
||||
|
||||
WORKDIR /app
|
||||
|
||||
# Install minimal dependencies
|
||||
RUN apk add --no-cache ca-certificates tzdata
|
||||
|
||||
# Copy binary from builder
|
||||
COPY --from=builder /workspace/dance-lessons-coach /app/dance-lessons-coach
|
||||
|
||||
# Copy configuration
|
||||
COPY config.yaml /app/config.yaml
|
||||
|
||||
# Set permissions
|
||||
RUN chmod +x /app/dance-lessons-coach
|
||||
|
||||
# Set timezone
|
||||
ENV TZ=UTC
|
||||
|
||||
# Expose port
|
||||
EXPOSE 8080
|
||||
|
||||
# Health check
|
||||
HEALTHCHECK --interval=30s --timeout=3s \
|
||||
CMD wget -q --spider http://localhost:8080/api/health || exit 1
|
||||
|
||||
# Entry point
|
||||
ENTRYPOINT ["/app/dance-lessons-coach"]
|
||||
EOF
|
||||
|
||||
TAGS="$IMAGE_VERSION latest ${{ github.sha }}"
|
||||
echo "Building Docker image with tags: $TAGS"
|
||||
|
||||
# Build the production image
|
||||
docker build -t dance-lessons-coach -f docker/Dockerfile.prod .
|
||||
|
||||
for TAG in $TAGS; do
|
||||
IMAGE_NAME="${{ env.CI_REGISTRY }}/${{ env.GITEA_ORG }}/${{ env.GITEA_REPO }}:$TAG"
|
||||
echo "Tagging and pushing: $IMAGE_NAME"
|
||||
docker tag dance-lessons-coach "$IMAGE_NAME"
|
||||
docker push "$IMAGE_NAME"
|
||||
done
|
||||
|
||||
- name: Show published images
|
||||
if: github.ref == 'refs/heads/main'
|
||||
run: |
|
||||
source VERSION
|
||||
IMAGE_VERSION="$MAJOR.$MINOR.$PATCH${PRERELEASE:+-$PRERELEASE}"
|
||||
echo "📦 Published Docker images:"
|
||||
echo " - ${{ env.CI_REGISTRY }}/${{ env.GITEA_ORG }}/${{ env.GITEA_REPO }}:$IMAGE_VERSION"
|
||||
echo " - ${{ env.CI_REGISTRY }}/${{ env.GITEA_ORG }}/${{ env.GITEA_REPO }}:latest"
|
||||
echo " - ${{ env.CI_REGISTRY }}/${{ env.GITEA_ORG }}/${{ env.GITEA_REPO }}:${{ github.sha }}"
|
||||
@@ -15,7 +15,12 @@ Feature: Greet Service
|
||||
Then the response should be "..." # ??? UNDEFINED STEP
|
||||
```
|
||||
|
||||
**Root Cause:** Step patterns don't match Godog's exact expectations.
|
||||
**Root Cause:** Step patterns don't match Godog's exact expectations. Godog is very particular about regex escaping.
|
||||
|
||||
**Common Pattern Issues:**
|
||||
- `\"` vs `\\"` (single vs double escaping)
|
||||
- Exact quote handling in JSON patterns
|
||||
- Parameter capture group syntax
|
||||
|
||||
**Debugging Steps:**
|
||||
|
||||
@@ -28,25 +33,30 @@ Feature: Greet Service
|
||||
```
|
||||
You can implement step definitions for the undefined steps with these snippets:
|
||||
|
||||
func theServerIsRunning() error {
|
||||
func theResponseShouldBe(arg1, arg2 string) error {
|
||||
return godog.ErrPending
|
||||
}
|
||||
|
||||
func iRequestTheDefaultGreeting() error {
|
||||
return godog.ErrPending
|
||||
func InitializeScenario(ctx *godog.ScenarioContext) {
|
||||
ctx.Step(`^the response should be "{\\"([^"]*)\\":\\"([^"]*)\\"}"$`, theResponseShouldBe)
|
||||
}
|
||||
```
|
||||
|
||||
3. **Compare with your implementation:**
|
||||
```go
|
||||
// ❌ Wrong pattern
|
||||
ctx.Step(`^the server is running$`, sc.theServerIsRunning)
|
||||
// ❌ Wrong pattern (single escaping)
|
||||
ctx.Step(`^the response should be "{\"([^"]*)\":\"([^"]*)\"}"$`, sc.commonSteps.theResponseShouldBe)
|
||||
|
||||
// ✅ Correct pattern (matches Godog's suggestion)
|
||||
ctx.Step(`^the server is running$`, sc.theServerIsRunning)
|
||||
// ✅ Correct pattern (double escaping - matches Godog's suggestion)
|
||||
ctx.Step(`^the response should be "{\\"([^"]*)\\":\\"([^"]*)\\"}"$`, sc.commonSteps.theResponseShouldBe)
|
||||
```
|
||||
|
||||
**Solution:** Use Godog's EXACT regex patterns.
|
||||
**Key Insight:** Godog expects `\\"` (four backslashes + quote) for escaped quotes in JSON patterns, not `\"` (two backslashes + quote).
|
||||
|
||||
**Solution:** Use Godog's EXACT regex patterns, paying special attention to:
|
||||
- JSON escaping: `\\"` not `\"`
|
||||
- Parameter names: Use `arg1, arg2` as suggested
|
||||
- Capture groups: Match Godog's exact regex syntax
|
||||
|
||||
### 2. JSON Comparison Failures
|
||||
|
||||
|
||||
@@ -88,3 +88,9 @@ Godog's step matching is **very specific by design**:
|
||||
- Following its suggestions guarantees your steps will be recognized
|
||||
|
||||
**Remember**: The "undefined" warnings are Godog telling you exactly how to fix your step definitions!
|
||||
## Critical Pattern Fix
|
||||
|
||||
**File:** `pkg/bdd/steps/steps.go`
|
||||
**Line:** 80
|
||||
**Issue:** Step pattern must use double escaping (4 backslashes + quote) not single escaping (2 backslashes + quote)
|
||||
**Pattern:** `^the response should be "{\\"([^"]*)\\":\\"([^"]*)\\"}"$`
|
||||
|
||||
206
coverage.txt
Normal file
206
coverage.txt
Normal file
@@ -0,0 +1,206 @@
|
||||
dance-lessons-coach/cmd/cli/main.go:63: init 0.0%
|
||||
dance-lessons-coach/cmd/cli/main.go:74: main 0.0%
|
||||
dance-lessons-coach/cmd/greet/main.go:11: main 0.0%
|
||||
dance-lessons-coach/cmd/server/main.go:38: main 0.0%
|
||||
dance-lessons-coach/pkg/bdd/steps/auth_steps.go:20: NewAuthSteps 0.0%
|
||||
dance-lessons-coach/pkg/bdd/steps/auth_steps.go:25: aUserExistsWithPassword 0.0%
|
||||
dance-lessons-coach/pkg/bdd/steps/auth_steps.go:34: iAuthenticateWithUsernameAndPassword 0.0%
|
||||
dance-lessons-coach/pkg/bdd/steps/auth_steps.go:39: theAuthenticationShouldBeSuccessful 0.0%
|
||||
dance-lessons-coach/pkg/bdd/steps/auth_steps.go:54: iShouldReceiveAValidJWTToken 0.0%
|
||||
dance-lessons-coach/pkg/bdd/steps/auth_steps.go:78: parseAndStoreJWT 0.0%
|
||||
dance-lessons-coach/pkg/bdd/steps/auth_steps.go:105: theAuthenticationShouldFail 0.0%
|
||||
dance-lessons-coach/pkg/bdd/steps/auth_steps.go:120: iAuthenticateAsAdminWithMasterPassword 0.0%
|
||||
dance-lessons-coach/pkg/bdd/steps/auth_steps.go:125: theTokenShouldContainAdminClaims 0.0%
|
||||
dance-lessons-coach/pkg/bdd/steps/auth_steps.go:161: iRegisterANewUserWithPassword 0.0%
|
||||
dance-lessons-coach/pkg/bdd/steps/auth_steps.go:166: theRegistrationShouldBeSuccessful 0.0%
|
||||
dance-lessons-coach/pkg/bdd/steps/auth_steps.go:181: iShouldBeAbleToAuthenticateWithTheNewCredentials 0.0%
|
||||
dance-lessons-coach/pkg/bdd/steps/auth_steps.go:186: iAmAuthenticatedAsAdmin 0.0%
|
||||
dance-lessons-coach/pkg/bdd/steps/auth_steps.go:191: iRequestPasswordResetForUser 0.0%
|
||||
dance-lessons-coach/pkg/bdd/steps/auth_steps.go:196: thePasswordResetShouldBeAllowed 0.0%
|
||||
dance-lessons-coach/pkg/bdd/steps/auth_steps.go:211: theUserShouldBeFlaggedForPasswordReset 0.0%
|
||||
dance-lessons-coach/pkg/bdd/steps/auth_steps.go:216: iCompletePasswordResetForWithNewPassword 0.0%
|
||||
dance-lessons-coach/pkg/bdd/steps/auth_steps.go:221: aUserExistsAndIsFlaggedForPasswordReset 0.0%
|
||||
dance-lessons-coach/pkg/bdd/steps/auth_steps.go:235: thePasswordResetShouldBeSuccessful 0.0%
|
||||
dance-lessons-coach/pkg/bdd/steps/auth_steps.go:250: iShouldBeAbleToAuthenticateWithTheNewPassword 0.0%
|
||||
dance-lessons-coach/pkg/bdd/steps/auth_steps.go:255: thePasswordResetShouldFail 0.0%
|
||||
dance-lessons-coach/pkg/bdd/steps/auth_steps.go:270: theRegistrationShouldFail 0.0%
|
||||
dance-lessons-coach/pkg/bdd/steps/auth_steps.go:286: theAuthenticationShouldFailWithValidationError 0.0%
|
||||
dance-lessons-coach/pkg/bdd/steps/auth_steps.go:302: iUseAnExpiredJWTTokenForAuthentication 0.0%
|
||||
dance-lessons-coach/pkg/bdd/steps/auth_steps.go:313: iUseAJWTTokenSignedWithWrongSecretForAuthentication 0.0%
|
||||
dance-lessons-coach/pkg/bdd/steps/auth_steps.go:324: iUseAMalformedJWTTokenForAuthentication 0.0%
|
||||
dance-lessons-coach/pkg/bdd/steps/auth_steps.go:336: iValidateTheReceivedJWTToken 0.0%
|
||||
dance-lessons-coach/pkg/bdd/steps/auth_steps.go:341: theTokenShouldBeValid 0.0%
|
||||
dance-lessons-coach/pkg/bdd/steps/auth_steps.go:362: itShouldContainTheCorrectUserID 0.0%
|
||||
dance-lessons-coach/pkg/bdd/steps/auth_steps.go:377: iShouldReceiveADifferentJWTToken 0.0%
|
||||
dance-lessons-coach/pkg/bdd/steps/auth_steps.go:417: iAuthenticateWithUsernameAndPasswordAgain 0.0%
|
||||
dance-lessons-coach/pkg/bdd/steps/common_steps.go:15: NewCommonSteps 0.0%
|
||||
dance-lessons-coach/pkg/bdd/steps/common_steps.go:20: theResponseShouldBe 0.0%
|
||||
dance-lessons-coach/pkg/bdd/steps/common_steps.go:34: theResponseShouldContainError 0.0%
|
||||
dance-lessons-coach/pkg/bdd/steps/common_steps.go:53: theStatusCodeShouldBe 0.0%
|
||||
dance-lessons-coach/pkg/bdd/steps/greet_steps.go:13: NewGreetSteps 0.0%
|
||||
dance-lessons-coach/pkg/bdd/steps/greet_steps.go:17: RegisterSteps 0.0%
|
||||
dance-lessons-coach/pkg/bdd/steps/greet_steps.go:25: iRequestAGreetingFor 0.0%
|
||||
dance-lessons-coach/pkg/bdd/steps/greet_steps.go:29: iRequestTheDefaultGreeting 0.0%
|
||||
dance-lessons-coach/pkg/bdd/steps/greet_steps.go:33: iSendPOSTRequestToV2GreetWithName 0.0%
|
||||
dance-lessons-coach/pkg/bdd/steps/greet_steps.go:39: iSendPOSTRequestToV2GreetWithInvalidJSON 0.0%
|
||||
dance-lessons-coach/pkg/bdd/steps/greet_steps.go:44: theServerIsRunningWithV2Enabled 0.0%
|
||||
dance-lessons-coach/pkg/bdd/steps/health_steps.go:12: NewHealthSteps 0.0%
|
||||
dance-lessons-coach/pkg/bdd/steps/health_steps.go:17: iRequestTheHealthEndpoint 0.0%
|
||||
dance-lessons-coach/pkg/bdd/steps/health_steps.go:21: theServerIsRunning 0.0%
|
||||
dance-lessons-coach/pkg/bdd/steps/steps.go:19: NewStepContext 0.0%
|
||||
dance-lessons-coach/pkg/bdd/steps/steps.go:30: InitializeAllSteps 0.0%
|
||||
dance-lessons-coach/pkg/bdd/suite.go:13: InitializeTestSuite 0.0%
|
||||
dance-lessons-coach/pkg/bdd/suite.go:36: InitializeScenario 0.0%
|
||||
dance-lessons-coach/pkg/bdd/testserver/client.go:18: NewClient 0.0%
|
||||
dance-lessons-coach/pkg/bdd/testserver/client.go:24: Request 0.0%
|
||||
dance-lessons-coach/pkg/bdd/testserver/client.go:71: CustomRequest 0.0%
|
||||
dance-lessons-coach/pkg/bdd/testserver/client.go:119: RequestWithHeader 0.0%
|
||||
dance-lessons-coach/pkg/bdd/testserver/client.go:171: ExpectResponseBody 0.0%
|
||||
dance-lessons-coach/pkg/bdd/testserver/client.go:188: GetLastResponse 0.0%
|
||||
dance-lessons-coach/pkg/bdd/testserver/client.go:192: GetLastBody 0.0%
|
||||
dance-lessons-coach/pkg/bdd/testserver/client.go:196: GetLastStatusCode 0.0%
|
||||
dance-lessons-coach/pkg/bdd/testserver/server.go:27: NewServer 0.0%
|
||||
dance-lessons-coach/pkg/bdd/testserver/server.go:33: Start 0.0%
|
||||
dance-lessons-coach/pkg/bdd/testserver/server.go:64: initDBConnection 0.0%
|
||||
dance-lessons-coach/pkg/bdd/testserver/server.go:93: CleanupDatabase 0.0%
|
||||
dance-lessons-coach/pkg/bdd/testserver/server.go:198: CloseDatabase 0.0%
|
||||
dance-lessons-coach/pkg/bdd/testserver/server.go:205: waitForServerReady 0.0%
|
||||
dance-lessons-coach/pkg/bdd/testserver/server.go:225: Stop 0.0%
|
||||
dance-lessons-coach/pkg/bdd/testserver/server.go:237: GetBaseURL 0.0%
|
||||
dance-lessons-coach/pkg/bdd/testserver/server.go:241: createTestConfig 0.0%
|
||||
dance-lessons-coach/pkg/config/config.go:17: NewZerologWriter 0.0%
|
||||
dance-lessons-coach/pkg/config/config.go:98: VersionCommand 0.0%
|
||||
dance-lessons-coach/pkg/config/config.go:113: LoadConfig 0.0%
|
||||
dance-lessons-coach/pkg/config/config.go:225: GetServerAddress 0.0%
|
||||
dance-lessons-coach/pkg/config/config.go:230: GetTelemetryEnabled 0.0%
|
||||
dance-lessons-coach/pkg/config/config.go:235: GetOTLPEndpoint 0.0%
|
||||
dance-lessons-coach/pkg/config/config.go:240: GetServiceName 0.0%
|
||||
dance-lessons-coach/pkg/config/config.go:245: GetPersistenceTelemetryEnabled 0.0%
|
||||
dance-lessons-coach/pkg/config/config.go:250: GetTelemetryInsecure 0.0%
|
||||
dance-lessons-coach/pkg/config/config.go:255: GetSamplerType 0.0%
|
||||
dance-lessons-coach/pkg/config/config.go:260: GetSamplerRatio 0.0%
|
||||
dance-lessons-coach/pkg/config/config.go:265: GetV2Enabled 0.0%
|
||||
dance-lessons-coach/pkg/config/config.go:270: GetJWTSecret 0.0%
|
||||
dance-lessons-coach/pkg/config/config.go:275: GetAdminMasterPassword 0.0%
|
||||
dance-lessons-coach/pkg/config/config.go:280: GetLoggingJSON 0.0%
|
||||
dance-lessons-coach/pkg/config/config.go:285: GetLogLevel 0.0%
|
||||
dance-lessons-coach/pkg/config/config.go:290: GetLogOutput 0.0%
|
||||
dance-lessons-coach/pkg/config/config.go:295: GetDatabaseHost 0.0%
|
||||
dance-lessons-coach/pkg/config/config.go:303: GetDatabasePort 0.0%
|
||||
dance-lessons-coach/pkg/config/config.go:311: GetDatabaseUser 0.0%
|
||||
dance-lessons-coach/pkg/config/config.go:319: GetDatabasePassword 0.0%
|
||||
dance-lessons-coach/pkg/config/config.go:324: GetDatabaseName 0.0%
|
||||
dance-lessons-coach/pkg/config/config.go:332: GetDatabaseSSLMode 0.0%
|
||||
dance-lessons-coach/pkg/config/config.go:340: GetDatabaseMaxOpenConns 0.0%
|
||||
dance-lessons-coach/pkg/config/config.go:348: GetDatabaseMaxIdleConns 0.0%
|
||||
dance-lessons-coach/pkg/config/config.go:356: GetDatabaseConnMaxLifetime 0.0%
|
||||
dance-lessons-coach/pkg/config/config.go:364: SetupLogging 0.0%
|
||||
dance-lessons-coach/pkg/config/config.go:376: parseLogLevel 0.0%
|
||||
dance-lessons-coach/pkg/config/config.go:399: setupLogOutput 0.0%
|
||||
dance-lessons-coach/pkg/greet/api_v1.go:72: NewApiV1GreetHandler 0.0%
|
||||
dance-lessons-coach/pkg/greet/api_v1.go:76: RegisterRoutes 0.0%
|
||||
dance-lessons-coach/pkg/greet/api_v1.go:93: handleGreetQuery 0.0%
|
||||
dance-lessons-coach/pkg/greet/api_v1.go:110: handleGreetPath 0.0%
|
||||
dance-lessons-coach/pkg/greet/api_v1.go:115: writeJSONResponse 0.0%
|
||||
dance-lessons-coach/pkg/greet/api_v2.go:30: NewApiV2GreetHandler 0.0%
|
||||
dance-lessons-coach/pkg/greet/api_v2.go:34: RegisterRoutes 0.0%
|
||||
dance-lessons-coach/pkg/greet/api_v2.go:60: handleGreetPost 0.0%
|
||||
dance-lessons-coach/pkg/greet/api_v2.go:93: handleValidationError 0.0%
|
||||
dance-lessons-coach/pkg/greet/api_v2.go:121: writeJSONResponse 0.0%
|
||||
dance-lessons-coach/pkg/greet/greet.go:21: NewService 100.0%
|
||||
dance-lessons-coach/pkg/greet/greet.go:26: GetAuthenticatedUserFromContext 100.0%
|
||||
dance-lessons-coach/pkg/greet/greet.go:35: Greet 75.0%
|
||||
dance-lessons-coach/pkg/greet/greet_v2.go:11: NewServiceV2 100.0%
|
||||
dance-lessons-coach/pkg/greet/greet_v2.go:18: GreetV2 100.0%
|
||||
dance-lessons-coach/pkg/server/docs/docs.go:342: init 0.0%
|
||||
dance-lessons-coach/pkg/server/middleware.go:19: NewAuthMiddleware 0.0%
|
||||
dance-lessons-coach/pkg/server/middleware.go:26: Middleware 0.0%
|
||||
dance-lessons-coach/pkg/server/server.go:47: NewServer 0.0%
|
||||
dance-lessons-coach/pkg/server/server.go:76: initializeUserServices 0.0%
|
||||
dance-lessons-coach/pkg/server/server.go:96: setupRoutes 0.0%
|
||||
dance-lessons-coach/pkg/server/server.go:143: registerApiV1Routes 0.0%
|
||||
dance-lessons-coach/pkg/server/server.go:173: registerApiV2Routes 0.0%
|
||||
dance-lessons-coach/pkg/server/server.go:182: getAllMiddlewares 0.0%
|
||||
dance-lessons-coach/pkg/server/server.go:206: handleHealth 0.0%
|
||||
dance-lessons-coach/pkg/server/server.go:221: handleReadiness 0.0%
|
||||
dance-lessons-coach/pkg/server/server.go:296: handleVersion 0.0%
|
||||
dance-lessons-coach/pkg/server/server.go:327: Router 0.0%
|
||||
dance-lessons-coach/pkg/server/server.go:332: Run 0.0%
|
||||
dance-lessons-coach/pkg/telemetry/telemetry.go:28: InitializeTracing 0.0%
|
||||
dance-lessons-coach/pkg/telemetry/telemetry.go:70: Shutdown 0.0%
|
||||
dance-lessons-coach/pkg/telemetry/telemetry.go:78: getSampler 0.0%
|
||||
dance-lessons-coach/pkg/telemetry/telemetry.go:100: GetTracer 0.0%
|
||||
dance-lessons-coach/pkg/user/api/auth_handler.go:24: NewAuthHandler 0.0%
|
||||
dance-lessons-coach/pkg/user/api/auth_handler.go:33: RegisterRoutes 0.0%
|
||||
dance-lessons-coach/pkg/user/api/auth_handler.go:42: writeValidationError 0.0%
|
||||
dance-lessons-coach/pkg/user/api/auth_handler.go:88: handleLogin 0.0%
|
||||
dance-lessons-coach/pkg/user/api/auth_handler.go:157: handleRegister 0.0%
|
||||
dance-lessons-coach/pkg/user/api/auth_handler.go:230: handlePasswordResetRequest 0.0%
|
||||
dance-lessons-coach/pkg/user/api/auth_handler.go:278: handlePasswordResetComplete 0.0%
|
||||
dance-lessons-coach/pkg/user/api/auth_handler.go:326: handleValidateToken 0.0%
|
||||
dance-lessons-coach/pkg/user/api/password_handler.go:19: NewPasswordResetHandler 0.0%
|
||||
dance-lessons-coach/pkg/user/api/password_handler.go:26: RegisterRoutes 0.0%
|
||||
dance-lessons-coach/pkg/user/api/password_handler.go:34: handlePasswordResetRequest 0.0%
|
||||
dance-lessons-coach/pkg/user/api/password_handler.go:59: handlePasswordResetComplete 0.0%
|
||||
dance-lessons-coach/pkg/user/api/user_handler.go:20: NewUserHandler 0.0%
|
||||
dance-lessons-coach/pkg/user/api/user_handler.go:28: RegisterRoutes 0.0%
|
||||
dance-lessons-coach/pkg/user/api/user_handler.go:35: handleRegister 0.0%
|
||||
dance-lessons-coach/pkg/user/auth_service.go:28: NewUserService 100.0%
|
||||
dance-lessons-coach/pkg/user/auth_service.go:37: Authenticate 81.8%
|
||||
dance-lessons-coach/pkg/user/auth_service.go:63: GenerateJWT 83.3%
|
||||
dance-lessons-coach/pkg/user/auth_service.go:87: ValidateJWT 66.7%
|
||||
dance-lessons-coach/pkg/user/auth_service.go:134: HashPassword 75.0%
|
||||
dance-lessons-coach/pkg/user/auth_service.go:143: AdminAuthenticate 100.0%
|
||||
dance-lessons-coach/pkg/user/auth_service.go:160: UserExists 0.0%
|
||||
dance-lessons-coach/pkg/user/auth_service.go:165: CreateUser 0.0%
|
||||
dance-lessons-coach/pkg/user/auth_service.go:170: RequestPasswordReset 66.7%
|
||||
dance-lessons-coach/pkg/user/auth_service.go:185: CompletePasswordReset 75.0%
|
||||
dance-lessons-coach/pkg/user/auth_service.go:203: NewPasswordResetService 0.0%
|
||||
dance-lessons-coach/pkg/user/auth_service.go:211: RequestPasswordReset 0.0%
|
||||
dance-lessons-coach/pkg/user/auth_service.go:226: CompletePasswordReset 0.0%
|
||||
dance-lessons-coach/pkg/user/postgres_repository.go:27: Printf 0.0%
|
||||
dance-lessons-coach/pkg/user/postgres_repository.go:50: containsErrorIndicators 0.0%
|
||||
dance-lessons-coach/pkg/user/postgres_repository.go:61: containsSlowQueryIndicators 0.0%
|
||||
dance-lessons-coach/pkg/user/postgres_repository.go:72: containsIgnoreCase 0.0%
|
||||
dance-lessons-coach/pkg/user/postgres_repository.go:77: containsIgnoreCaseBytes 0.0%
|
||||
dance-lessons-coach/pkg/user/postgres_repository.go:100: toLower 0.0%
|
||||
dance-lessons-coach/pkg/user/postgres_repository.go:115: NewPostgresRepository 0.0%
|
||||
dance-lessons-coach/pkg/user/postgres_repository.go:129: initializeDatabase 0.0%
|
||||
dance-lessons-coach/pkg/user/postgres_repository.go:207: CreateUser 0.0%
|
||||
dance-lessons-coach/pkg/user/postgres_repository.go:225: GetUserByUsername 0.0%
|
||||
dance-lessons-coach/pkg/user/postgres_repository.go:248: GetUserByID 0.0%
|
||||
dance-lessons-coach/pkg/user/postgres_repository.go:261: UpdateUser 0.0%
|
||||
dance-lessons-coach/pkg/user/postgres_repository.go:270: DeleteUser 0.0%
|
||||
dance-lessons-coach/pkg/user/postgres_repository.go:279: AllowPasswordReset 0.0%
|
||||
dance-lessons-coach/pkg/user/postgres_repository.go:293: CompletePasswordReset 0.0%
|
||||
dance-lessons-coach/pkg/user/postgres_repository.go:312: UserExists 0.0%
|
||||
dance-lessons-coach/pkg/user/postgres_repository.go:322: Close 0.0%
|
||||
dance-lessons-coach/pkg/user/postgres_repository.go:331: CheckDatabaseHealth 0.0%
|
||||
dance-lessons-coach/pkg/user/postgres_repository.go:342: createSpan 0.0%
|
||||
dance-lessons-coach/pkg/user/sqlite_repository.go:31: NewSQLiteRepository 75.0%
|
||||
dance-lessons-coach/pkg/user/sqlite_repository.go:46: initializeDatabase 72.7%
|
||||
dance-lessons-coach/pkg/user/sqlite_repository.go:81: CreateUser 66.7%
|
||||
dance-lessons-coach/pkg/user/sqlite_repository.go:99: GetUserByUsername 76.9%
|
||||
dance-lessons-coach/pkg/user/sqlite_repository.go:122: GetUserByID 57.1%
|
||||
dance-lessons-coach/pkg/user/sqlite_repository.go:135: UpdateUser 75.0%
|
||||
dance-lessons-coach/pkg/user/sqlite_repository.go:144: DeleteUser 75.0%
|
||||
dance-lessons-coach/pkg/user/sqlite_repository.go:153: AllowPasswordReset 71.4%
|
||||
dance-lessons-coach/pkg/user/sqlite_repository.go:167: CompletePasswordReset 70.0%
|
||||
dance-lessons-coach/pkg/user/sqlite_repository.go:186: UserExists 80.0%
|
||||
dance-lessons-coach/pkg/user/sqlite_repository.go:196: Close 75.0%
|
||||
dance-lessons-coach/pkg/user/sqlite_repository.go:205: CheckDatabaseHealth 0.0%
|
||||
dance-lessons-coach/pkg/user/sqlite_repository.go:216: createSpan 40.0%
|
||||
dance-lessons-coach/pkg/validation/validator.go:23: NewValidator 0.0%
|
||||
dance-lessons-coach/pkg/validation/validator.go:49: Validate 0.0%
|
||||
dance-lessons-coach/pkg/validation/validator.go:75: formatValidationErrors 0.0%
|
||||
dance-lessons-coach/pkg/validation/validator.go:104: Error 0.0%
|
||||
dance-lessons-coach/pkg/validation/validator.go:109: registerCustomValidations 0.0%
|
||||
dance-lessons-coach/pkg/validation/validator.go:119: GetValidatorFromConfig 0.0%
|
||||
dance-lessons-coach/pkg/version/version.go:21: init 0.0%
|
||||
dance-lessons-coach/pkg/version/version.go:30: readVersionFromFile 0.0%
|
||||
dance-lessons-coach/pkg/version/version.go:75: getGitCommit 0.0%
|
||||
dance-lessons-coach/pkg/version/version.go:84: getBuildDate 0.0%
|
||||
dance-lessons-coach/pkg/version/version.go:93: Info 0.0%
|
||||
dance-lessons-coach/pkg/version/version.go:98: Short 0.0%
|
||||
dance-lessons-coach/pkg/version/version.go:103: Full 0.0%
|
||||
total: (statements) 8.5%
|
||||
@@ -77,7 +77,7 @@ func InitializeAllSteps(ctx *godog.ScenarioContext, client *testserver.Client) {
|
||||
ctx.Step(`^I authenticate with username "([^"]*)" and password "([^"]*)" again$`, sc.authSteps.iAuthenticateWithUsernameAndPasswordAgain)
|
||||
|
||||
// Common steps
|
||||
ctx.Step(`^the response should be "{\"([^"]*)\":\"([^"]*)"}"$`, sc.commonSteps.theResponseShouldBe)
|
||||
ctx.Step(`^the response should be "{\\"([^"]*)":\\"([^"]*)"}"$`, sc.commonSteps.theResponseShouldBe)
|
||||
ctx.Step(`^the response should contain error "([^"]*)"$`, sc.commonSteps.theResponseShouldContainError)
|
||||
ctx.Step(`^the status code should be (\d+)$`, sc.commonSteps.theStatusCodeShouldBe)
|
||||
}
|
||||
|
||||
@@ -6,57 +6,75 @@
|
||||
set -e
|
||||
|
||||
echo "🧪 Running BDD Tests..."
|
||||
cd /Users/gabrielradureau/Work/Vibe/dance-lessons-coach
|
||||
cd /Users/gabrielradureau/Work/Vibe/DanceLessonsCoach
|
||||
|
||||
# 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
|
||||
# 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"
|
||||
|
||||
# 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"
|
||||
# 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
|
||||
echo "✅ PostgreSQL container is already running"
|
||||
# Local environment - use docker compose
|
||||
echo "💻 Local environment detected"
|
||||
|
||||
# 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
|
||||
# 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
|
||||
|
||||
|
||||
177
scripts/run-bdd-tests.sh.backup
Executable file
177
scripts/run-bdd-tests.sh.backup
Executable file
@@ -0,0 +1,177 @@
|
||||
#!/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..."
|
||||
cd /Users/gabrielradureau/Work/Vibe/DanceLessonsCoach
|
||||
|
||||
# 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
|
||||
else
|
||||
# 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
|
||||
# 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
|
||||
test_output=$(go test ./features/... -v 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 '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
|
||||
Reference in New Issue
Block a user