name: Tests CI

on:
  push:
    branches:
      - 'master'          # Default branch
      - 'feature-**'      # Feature branches
      - '[0-9]+.[0-9]+.x' # Release branches
    paths-ignore:
      - '**/*.md'
      - 'docs/**'
  pull_request:
    branches:
      - 'master'          # Default branch
      - 'feature-**'      # Feature branches
      - '[0-9]+.[0-9]+.x' # Release branches
    paths-ignore:
      - '**/*.md'
      - 'docs/**'
  workflow_dispatch:

# The following concurrency group cancels in-progress jobs or runs on pull_request events only;
# if github.head_ref is undefined, the concurrency group will fallback to the run ID,
# which is guaranteed to be both unique and defined for the run.
concurrency:
  group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
  cancel-in-progress: true

permissions: { }

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout repository
        uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # tag=v5.0.0

      - name: Set up JDK
        uses: actions/setup-java@dded0888837ed1f317902acf8a20df0ad188d165 # tag=v5.0.0
        with:
          distribution: 'temurin'
          java-version: '21'
          cache: 'maven'

      - name: Execute unit tests
        run: |-
          mvn -B --no-transfer-progress clean
          mvn -B --no-transfer-progress test -P enhance

      # Publishing coverage to Codacy is only possible for builds of push events.
      # PRs from forks do not get access to repository secrets.
      # https://securitylab.github.com/research/github-actions-preventing-pwn-requests/
      - name: Publish test coverage
        if: ${{ github.event_name != 'pull_request' && github.repository_owner == 'DependencyTrack' }}
        uses: codacy/codacy-coverage-reporter-action@v1.3.0
        with:
          project-token: ${{ secrets.CODACY_PROJECT_TOKEN }}
          language: Java
          coverage-reports: target/jacoco-ut/jacoco.xml

      - name: Save PR details
        if: ${{ github.event_name == 'pull_request' }}
        run: |-
          echo ${{ github.sha }} > pr-commit.txt
          echo ${{ github.event.number }} > pr-number.txt

      - name: Upload PR test coverage report
        if: ${{ github.event_name == 'pull_request' }}
        uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # tag=v4.6.2
        with:
          name: pr-test-coverage-report
          path: |-
            pr-commit.txt
            pr-number.txt
            target/jacoco-ut/jacoco.xml
