---
name: continuous-integration

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

jobs:
  lint:
    runs-on: ubuntu-latest
    env:
      GOLANGCI_LINT_VERSION: v1.61.0

    steps:
      - uses: actions/checkout@v4
      - name: Set up Go
        uses: actions/setup-go@v5
        with:
          go-version-file: 'go.mod'
          cache: true
      - name: Lint code
        uses: golangci/golangci-lint-action@v6
        with:
          version: ${{ env.GOLANGCI_LINT_VERSION }}

  build:
    env:
      ATHENS_MONGO_STORAGE_URL: mongodb://localhost:27017
      ATHENS_MINIO_ENDPOINT: http://localhost:9000
      REDIS_TEST_ENDPOINT: localhost:6379
      REDIS_SENTINEL_TEST_ENDPOINT: localhost:26379
      REDIS_SENTINEL_TEST_MASTER_NAME: redis-1
      REDIS_SENTINEL_TEST_PASSWORD: sekret
      PROTECTED_REDIS_TEST_ENDPOINT: localhost:6380
      ATHENS_PROTECTED_REDIS_PASSWORD: AthensPass1
      GA_PULL_REQUEST: ${{github.event.number}}
    runs-on: ubuntu-latest
    services:
      mongo:
        image: mongo
        ports:
          - 27017:27017
      minio:
        image: minio/minio:edge-cicd
        ports:
          - 9000:9000
        env:
          MINIO_ACCESS_KEY: minio
          MINIO_SECRET_KEY: minio123
      redis:
        image: redis
        ports:
          - 6379:6379
      redis-sentinel:
        image: bitnami/redis-sentinel
        env:
          REDIS_MASTER_HOST: redis
          REDIS_MASTER_SET: redis-1
          REDIS_SENTINEL_PASSWORD: sekret
          REDIS_SENTINEL_QUORUM: "1"
        ports:
          - 26379:26379
      protectedredis:
        image: bitnami/redis
        ports:
          - 6380:6380
        env:
          REDIS_PORT_NUMBER: 6380
          REDIS_PASSWORD: AthensPass1
    steps:
      - uses: actions/checkout@v4
      - name: Set up Go
        uses: actions/setup-go@v5
        with:
          go-version-file: 'go.mod'
          cache: true
      - name: Verify changes
        run: make verify
      - name: Unit tests
        run: go test -v -race ./...
      - name: End to end tests
        if: success() || failure()
        run: make test-e2e
