name: Build and run tests

on:
  pull_request:
  push:
    branches:
      - master

jobs:
  lint:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
        with:
          ref: master # for ratchet
      - uses: actions/checkout@v4
      - uses: ./.github/actions/setup-java
      - run: ./gradlew spotlessApply
      - uses: reviewdog/action-suggester@v1
        with:
          tool_name: spotless

  unit-test:
    runs-on: ubuntu-latest
    services:
      app:
        image: ghcr.io/deploygate/gradle-plugin-mock-server
        ports:
          - 3000/tcp
        options: >-
          --health-cmd "curl -fI http://localhost:3000"
          --health-interval 15s
          --health-timeout 5s
          --health-retries 5
          --health-start-period 20s
    steps:
      - uses: actions/checkout@v4
      - uses: ./.github/actions/setup-java
      - run: ./gradlew publishToMavenLocal test
        env:
          TEST_SERVER_URL: http://localhost:${{ job.services.app.ports[3000] }}
      - uses: actions/upload-artifact@v4
        if: always()
        with:
          name: test-reports
          path: build/reports/tests/test
      - uses: actions/upload-artifact@v4
        if: always()
        with:
          name: test-results
          path: build/test-results/tests/test

  acceptance-test:
    runs-on: ubuntu-latest
    services:
      app:
        image: ghcr.io/deploygate/gradle-plugin-mock-server
        ports:
          - 3000/tcp
        options: >-
          --health-cmd "curl -fI http://localhost:3000"
          --health-interval 15s
          --health-timeout 5s
          --health-retries 5
          --health-start-period 20s
    steps:
      - uses: actions/checkout@v4
      - uses: ./.github/actions/setup-java
      - run: ./gradlew testUnrollAcceptanceTest
        env:
          TEST_SERVER_URL: http://localhost:3000
      - uses: actions/upload-artifact@v4
        if: always()
        with:
          name: test-reports
          path: build/reports/tests/testUnrollAcceptanceTest
      - uses: actions/upload-artifact@v4
        if: always()
        with:
          name: test-results
          path: build/test-results/tests/testUnrollAcceptanceTest

  acceptance-test-runtime-env:
    runs-on: ubuntu-latest
    services:
      app:
        image: ghcr.io/deploygate/gradle-plugin-mock-server
        ports:
          - 3000/tcp
        options: >-
          --health-cmd "curl -fI http://localhost:3000"
          --health-interval 15s
          --health-timeout 5s
          --health-retries 5
          --health-start-period 20s
    strategy:
      fail-fast: false
      matrix:
        agp_version:
          - '7.0.0'
          - '7.1.0'
          - '7.2.0'
          - '7.3.0'
          - '7.4.0'
          - '8.0.0'
          - '8.1.0'
          - '8.2.0'
          - '8.3.0'
        include:
          - agp_version: '4.2.0'
            gradle_version: '6.7.1'
          - agp_version: '4.2.0'
            gradle_version: '7.0.2'
          - agp_version: '7.0.0'
            gradle_version: '7.0.2'
          - agp_version: '7.1.0'
            gradle_version: '7.2'
          - agp_version: '7.2.0'
            gradle_version: '7.3.3'
          - agp_version: '7.3.0'
            gradle_version: '7.4.2'
          - agp_version: '7.4.0'
            gradle_version: '7.5'
          - agp_version: '8.0.0'
            gradle_version: '8.0'
            java_version: '17'
          - agp_version: '8.1.0'
            gradle_version: '8.0'
            java_version: '17'
          - agp_version: '8.2.0'
            gradle_version: '8.2'
            java_version: '17'
          - agp_version: '8.3.0'
            gradle_version: '8.4'
            java_version: '17'

    steps:
      - uses: actions/checkout@v4
      - uses: ./.github/actions/setup-java
        with:
          java-version: ${{ matrix.java_version }}
      - uses: gradle/gradle-build-action@v3
        with:
          gradle-version: ${{ matrix.gradle_version }}
      - run: gradle testPluginAcceptanceTest
        env:
          TEST_AGP_VERSION: ${{ matrix.agp_version }}
          TEST_GRADLE_VERSION: ${{ matrix.gradle_version }}
          TEST_SERVER_URL: http://localhost:${{ job.services.app.ports[3000] }}
      - uses: actions/upload-artifact@v4
        if: always()
        with:
          name: test-reports-${{ matrix.agp_version }}-with-${{ matrix.gradle_version }}
          path: build/reports/tests/testPluginAcceptanceTest
      - uses: actions/upload-artifact@v4
        if: always()
        with:
          name: test-results-${{ matrix.agp_version }}-with-${{ matrix.gradle_version }}
          path: build/test-results/tests/testPluginAcceptanceTest