name: Test & Build

on:
  pull_request:
  pull_request_target:
  push:
    paths:
    - '*.py'
    - poetry.lock
    - pyproject.toml

jobs:
  test:
    runs-on: ubuntu-latest
    timeout-minutes: 10

    steps:
    - name: Check out repository code
      uses: actions/checkout@v3
    - name: Setup Python
      uses: actions/setup-python@v4
      with:
        python-version: 3.11
    - name: Install and configure Poetry
      uses: snok/install-poetry@v1
      with:
        version: 1.4.2
        virtualenvs-path: ~/local/share/virtualenvs
    - id: cache-pipenv
      uses: actions/cache@v3
      with:
        path: ~/.local/share/virtualenvs
        key: venv
    - run: poetry install --without develop,doc,lint
    - name: Run test suite
      run: |
        poetry run pytest --junit-xml=unit-test-results.xml --cov-report "xml:coverage.xml" --cov=src tests/
    - name: Archive code coverage results
      uses: actions/upload-artifact@v3
      with:
        name: code-coverage-report
        path: |
          coverage.xml
          .coverage
    - name: Archive code coverage results
      uses: actions/upload-artifact@v3
      with:
        name: test-report
        path: |
          unit-test-results.xml
        if-no-files-found: error

  coverage_pull_request:
    if: ${{ github.event_name == 'pull_request' }}
    runs-on: ubuntu-latest
    needs: test
    steps:
    - uses: actions/download-artifact@v3
      with:
        name: code-coverage-report
    - name: Get Cover
      uses: orgoro/coverage@v3.1
      with:
        coverageFile: coverage.xml
        token: ${{ secrets.GITHUB_TOKEN }}
        thresholdAll: 0.8
        thresholdNew: 0.8
        thresholdModified: 0.8

  coverage_report:
    runs-on: ubuntu-latest
    needs: test
    steps:
    - name: Check out repository code
      uses: actions/checkout@v3
    - name: Setup Python
      uses: actions/setup-python@v4
      with:
        python-version: 3.11
    - id: cache-pipenv
      uses: actions/cache@v3
      with:
        path: ~/.local/share/virtualenvs
        key: venv
    - name: Install and configure Poetry
      uses: snok/install-poetry@v1
      with:
        version: 1.4.2
        virtualenvs-path: ~/local/share/virtualenvs
    - run: |
        poetry install --only test
    - uses: actions/download-artifact@v3
      with:
        name: code-coverage-report
    - name: Make Coverage Report
      run: |
        poetry run coverage html
    - name: Archive builds
      uses: actions/upload-artifact@v3
      with:
        name: Coverage Report HTML
        path: htmlcov/

  build:
    runs-on: ubuntu-latest
    needs: test
    steps:
    - name: Setup Python
      uses: actions/setup-python@v4
      with:
        python-version: 3.11
    - name: Install and configure Poetry
      uses: snok/install-poetry@v1
      with:
        version: 1.4.2
        virtualenvs-path: ~/local/share/virtualenvs
    - id: cache-pipenv
      uses: actions/cache@v3
      with:
        path: ~/.local/share/virtualenvs
        key: venv
    - name: Check out repository code
      uses: actions/checkout@v3
    - run: |
        poetry install --without develop,doc,lint,test
        poetry build
    - name: Archive builds
      uses: actions/upload-artifact@v3
      with:
        name: builds
        path: dist/
