name: Integration Testing

on:
  workflow_dispatch:
  push:
    branches:
      - "main"
    paths:
      - ".github/workflows/integration-test.yml" # this file
      - "src/services/ldap-directory.service*" # we only have integration for LDAP testing at the moment
      - "./openldap*" # any change to test fixtures
      - "./docker-compose.yml" # any change to Docker configuration
  pull_request:
    paths:
      - ".github/workflows/integration-test.yml" # this file
      - "src/services/ldap-directory.service*" # we only have integration for LDAP testing at the moment
      - "./openldap*" # any change to test fixtures
      - "./docker-compose.yml" # any change to Docker configuration

jobs:
  check-test-secrets:
    name: Check for test secrets
    runs-on: ubuntu-22.04
    outputs:
      available: ${{ steps.check-test-secrets.outputs.available }}
    permissions:
      contents: read

    steps:
      - name: Check
        id: check-test-secrets
        run: |
          if [ "${{ secrets.CODECOV_TOKEN }}" != '' ]; then
            echo "available=true" >> $GITHUB_OUTPUT;
          else
            echo "available=false" >> $GITHUB_OUTPUT;
          fi

  testing:
    name: Run tests
    if: ${{ startsWith(github.head_ref, 'version_bump_') == false }}
    runs-on: ubuntu-22.04
    needs: check-test-secrets
    permissions:
      checks: write
      contents: read
      pull-requests: write

    steps:
      - name: Check out repo
        uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7

      - name: Get Node version
        id: retrieve-node-version
        run: |
          NODE_NVMRC=$(cat .nvmrc)
          NODE_VERSION=${NODE_NVMRC/v/''}
          echo "node_version=$NODE_VERSION" >> $GITHUB_OUTPUT

      - name: Set up Node
        uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v4.0.2
        with:
          cache: 'npm'
          cache-dependency-path: '**/package-lock.json'
          node-version: ${{ steps.retrieve-node-version.outputs.node_version }}

      - name: Install Node dependencies
        run: npm ci

      - name: Install mkcert
        run: |
          sudo apt-get update
          sudo apt-get -y install mkcert

      - name: Setup integration tests
        run: npm run test:integration:setup

      - name: Run integration tests
        run: npm run test:integration --coverage

      - name: Report test results
        uses: dorny/test-reporter@31a54ee7ebcacc03a09ea97a7e5465a47b84aea5 # v1.9.1
        if: ${{ needs.check-test-secrets.outputs.available == 'true' && !cancelled() }}
        with:
          name: Test Results
          path: "junit.xml"
          reporter: jest-junit
          fail-on-error: true

      - name: Upload coverage to codecov.io
        uses: codecov/codecov-action@1e68e06f1dbfde0e4cefc87efeba9e4643565303 # v5.1.2
        if: ${{ needs.check-test-secrets.outputs.available == 'true' }}
        env:
          CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}

      - name: Upload results to codecov.io
        uses: codecov/test-results-action@1b5b448b98e58ba90d1a1a1d9fcb72ca2263be46 # v1.0.0
        if: ${{ needs.check-test-secrets.outputs.available == 'true' }}
        env:
          CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
