name: Check library

on:
  workflow_dispatch:
  push:
    branches:
      - main
      - dev

jobs:
  test:
      name: Build and test on Python ${{ matrix.python-version }}
      runs-on: ubuntu-latest

      strategy:
        matrix:
          python-version: ["3.8.12", "3.9.12", "3.10.4"]

      steps:
        - name: Checkout
          uses: actions/checkout@v2

        - name: Setup Python ${{ matrix.python-version }}
          uses: actions/setup-python@v2
          with:
            python-version: ${{ matrix.python-version }}

        - name: Install dependencies
          run: |
            python3 -m pip install --upgrade pip setuptools pytest pytest-cov pytest-subtests pytest-asyncio
            (pip install --editable .) || true
            (test -f requirements.txt && pip install -r requirements.txt --upgrade) || true
            (test -f dev-requirements.txt && pip install -r dev-requirements.txt --upgrade) || true

        - name: Check code and formatting
          run: scripts/check-python.sh .

        - name: Run tests
          run: python3 -m pytest --cov=. --cov-report=xml --junit-xml pytest.xml --asyncio-mode=strict || true

        - name: Upload results
          if: always()
          uses: actions/upload-artifact@v2
          with:
            name: Unit test coverage (Python ${{ matrix.python-version }})
            path: *.xml

  sonar:
    name: Analyse Python project with SonarQube
    needs: test
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v2
        with:
          fetch-depth: 0

      - name: Install dependencies
        run: |
          python -m pip install --upgrade pip
          pip install -r requirements.txt --upgrade

      - name: Download test results
        uses: actions/download-artifact@v2
        with:
          path: artifacts

      - uses: sonarsource/sonarqube-scan-action@master
        env:
          SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
          SONAR_HOST_URL: ${{ secrets.SONAR_HOST_URL }}
        with:
          args: >
            -Dsonar.projectKey=great-ai
            -Dsonar.login=${{ secrets.SONAR_TOKEN }}
            -Dsonar.verbose=true
            -Dsonar.python.coverage.reportPaths=artifacts/*/coverage.xml
            -Dsonar.coverage.exclusions=**/external/**/*
            -Dsonar.exclusions=**/external/**/*,artifacts/**/*

  publish-test-results:
    name: Publish unit test results
    needs: test
    runs-on: ubuntu-latest
    if: always()
    steps:
      - name: Download artifacts
        uses: actions/download-artifact@v2
        with:
          path: artifacts

      - name: Publish results
        uses: EnricoMi/publish-unit-test-result-action@v1
        with:
          files: artifacts/*/pytest.xml
