name: Test

on:
  push:
    branches:
      - "main"
      - "rc"
      - "hotfix-rc"
  pull_request:
    types: [opened, synchronize]
  merge_group:
    types: [checks_requested]
  workflow_dispatch:

env:
  _JAVA_VERSION: 17
  _GITHUB_ACTION_RUN_URL: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}/attempts/${{ github.run_attempt }}


jobs:
  test:
    name: Test
    runs-on: ubuntu-24.04
    permissions:
      packages: read
      pull-requests: write

    steps:
      - name: Check out repo
        uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2

      - name: Validate Gradle wrapper
        uses: gradle/actions/wrapper-validation@06832c7b30a0129d7fb559bcc6e43d26f6374244 # v4.3.1

      - name: Cache Gradle files
        uses: actions/cache@5a3ec84eff668545956fd18022155c47e93e2684 # v4.2.3
        with:
          path: |
            ~/.gradle/caches
            ~/.gradle/wrapper
          key: ${{ runner.os }}-gradle-v2-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties', '**/libs.versions.toml') }}
          restore-keys: |
            ${{ runner.os }}-gradle-v2-

      - name: Cache build output
        uses: actions/cache@5a3ec84eff668545956fd18022155c47e93e2684 # v4.2.3
        with:
          path: |
            ${{ github.workspace }}/build-cache
          key: ${{ runner.os }}-build-cache-${{ github.sha }}
          restore-keys: |
            ${{ runner.os }}-build-

      - name: Configure Ruby
        uses: ruby/setup-ruby@ca041f971d66735f3e5ff1e21cc13e2d51e7e535 # v1.233.0
        with:
          bundler-cache: true

      - name: Configure JDK
        uses: actions/setup-java@c5195efecf7bdfc987ee8bae7a71cb8b11521c00 # v4.7.1
        with:
          distribution: "temurin"
          java-version: ${{ env._JAVA_VERSION }}

      - name: Install Fastlane
        run: |
          gem install bundler:2.2.27
          bundle config path vendor/bundle
          bundle install --jobs 4 --retry 3

      - name: Build and test
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # Used in settings.gradle.kts to download the SDK from GitHub Maven Packages
        run: |
          bundle exec fastlane check

      - name: Upload test reports
        uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
        if: always()
        with:
          name: test-reports
          path: |
            build/reports/kover/reportMergedCoverage.xml
            app/build/reports/tests/
            authenticator/build/reports/tests/
            authenticatorbridge/build/reports/tests/
            core/build/reports/tests/
            data/build/reports/tests/
            network/build/reports/tests/
            ui/build/reports/tests/

      - name: Upload to codecov.io
        id: upload-to-codecov
        uses: codecov/codecov-action@ad3126e916f78f00edff4ed0317cf185271ccc2d # v5.4.2
        if: github.event_name == 'push' || github.event_name == 'pull_request'
        continue-on-error: true
        with:
          os: linux
          files: build/reports/kover/reportMergedCoverage.xml
          fail_ci_if_error: true
          disable_search: true

      - name: Comment PR if tests failed
        if: steps.upload-to-codecov.outcome == 'failure' && (github.event_name == 'push' || github.event_name == 'pull_request')
        env:
            PR_NUMBER: ${{ github.event.number }}
            GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
            RUN_ACTOR: ${{ github.triggering_actor }}
        run: |
          echo "> [!WARNING]" >> $GITHUB_STEP_SUMMARY
          echo "> Uploading code coverage report failed. Please check the \"Upload to codecov.io\" step of \"Process Test Reports\" job for more details." >> $GITHUB_STEP_SUMMARY

          if [ -n "$PR_NUMBER" ]; then
            message=$'> [!WARNING]\n> @'$RUN_ACTOR' Uploading code coverage report failed. Please check the "Upload to codecov.io" step of [Process Test Reports job]('$_GITHUB_ACTION_RUN_URL') for more details.'
            gh pr comment --repo $GITHUB_REPOSITORY $PR_NUMBER --body "$message"
          fi
