name: Integration Tests

on:
  push:
    branches: [ main, develop ]
  pull_request:
    branches: [ main, develop ]

jobs:
  integration-tests:
    runs-on: ubuntu-latest

    services:
      postgres:
        image: postgres:16-alpine
        env:
          POSTGRES_USER: meldestelle
          POSTGRES_PASSWORD: meldestelle
          POSTGRES_DB: meldestelle
        ports:
          - 5432:5432
        options: >-
          --health-cmd pg_isready
          --health-interval 10s
          --health-timeout 5s
          --health-retries 5

      redis:
        image: redis:7-alpine
        ports:
          - 6379:6379
        options: >-
          --health-cmd "redis-cli ping"
          --health-interval 10s
          --health-timeout 5s
          --health-retries 5

      keycloak:
        image: quay.io/keycloak/keycloak:23.0
        env:
          KEYCLOAK_ADMIN: admin
          KEYCLOAK_ADMIN_PASSWORD: admin
          KC_DB: postgres
          KC_DB_URL: jdbc:postgresql://postgres:5432/keycloak
          KC_DB_USERNAME: meldestelle
          KC_DB_PASSWORD: meldestelle
        ports:
          - 8180:8080
        options: >-
          --health-cmd "curl --fail http://localhost:8080/health/ready || exit 1"
          --health-interval 10s
          --health-timeout 5s
          --health-retries 5
          --health-start-period 30s

      zookeeper:
        image: confluentinc/cp-zookeeper:7.5.0
        env:
          ZOOKEEPER_CLIENT_PORT: 2181
        ports:
          - 2181:2181
        options: >-
          --health-cmd "nc -z localhost 2181 || exit 1"
          --health-interval 10s
          --health-timeout 5s
          --health-retries 3
          --health-start-period 10s

      kafka:
        image: confluentinc/cp-kafka:7.5.0
        env:
          KAFKA_BROKER_ID: 1
          KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
          KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka:29092,PLAINTEXT_HOST://localhost:9092
          KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT
          KAFKA_INTER_BROKER_LISTENER_NAME: PLAINTEXT
          KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
        ports:
          - 9092:9092
        options: >-
          --health-cmd "kafka-topics --bootstrap-server localhost:9092 --list || exit 1"
          --health-interval 10s
          --health-timeout 5s
          --health-retries 3
          --health-start-period 30s

      zipkin:
        image: openzipkin/zipkin:2
        ports:
          - 9411:9411
        options: >-
          --health-cmd "wget -q -O - http://localhost:9411/health || exit 1"
          --health-interval 10s
          --health-timeout 5s
          --health-retries 3
          --health-start-period 10s

    steps:
    - uses: actions/checkout@v3

    - name: Set up JDK 21
      uses: actions/setup-java@v3
      with:
        java-version: 21
        distribution: 'temurin'
        cache: 'gradle'

    - name: Setup Gradle
      uses: gradle/gradle-build-action@v2
      with:
        gradle-version: wrapper
        cache-read-only: ${{ github.ref != 'refs/heads/main' && github.ref != 'refs/heads/develop' }}
        cache-overwrite-existing: true
        gradle-home-cache-includes: |
          caches
          notifications
          jdks
          wrapper

    - name: Grant execute permission for gradlew
      run: chmod +x gradlew

    - name: Run integration tests
      run: ./gradlew integrationTest --no-daemon --parallel
      env:
        # Environment variables for Redis connection
        REDIS_HOST: localhost
        REDIS_PORT: 6379
        # Spring profile for integration tests
        SPRING_PROFILES_ACTIVE: integration-test

    - name: Upload test reports
      uses: actions/upload-artifact@v3
      if: always()
      with:
        name: integration-test-reports
        path: |
          **/build/reports/tests/integrationTest/
          **/build/test-results/integrationTest/
        retention-days: 7
