name: Tests

on:
  pull_request:
  push:
    branches:
    - master
    - 'REL_[0-9]+_[0-9]+'

env:
  CODACY_PROJECT_TOKEN: ${{ secrets.CODACY_PROJECT_TOKEN }}
  SECRETS_AVAILABLE: ${{ secrets.CODACY_PROJECT_TOKEN != '' }}

jobs:
  unit:
    runs-on: ${{ matrix.os }}-latest
    strategy:
      fail-fast: false
      matrix:
        os: [ubuntu, windows, macos]

    steps:
    - uses: actions/checkout@v3

    - name: Set up Python 3.7
      uses: actions/setup-python@v4
      with:
        python-version: 3.7
    - name: Install dependencies
      run: python .github/workflows/install_deps.py
    - name: Run tests and flake8
      run: python .github/workflows/run_tests.py

    - name: Set up Python 3.8
      uses: actions/setup-python@v4
      with:
        python-version: 3.8
    - name: Install dependencies
      run: python .github/workflows/install_deps.py
    - name: Run tests and flake8
      run: python .github/workflows/run_tests.py

    - name: Set up Python 3.9
      uses: actions/setup-python@v4
      with:
        python-version: 3.9
    - name: Install dependencies
      run: python .github/workflows/install_deps.py
    - name: Run tests and flake8
      run: python .github/workflows/run_tests.py

    - name: Set up Python 3.10
      uses: actions/setup-python@v4
      with:
        python-version: '3.10'
    - name: Install dependencies
      run: python .github/workflows/install_deps.py
    - name: Run tests and flake8
      run: python .github/workflows/run_tests.py

    - name: Set up Python 3.11
      uses: actions/setup-python@v4
      with:
        python-version: 3.11
    - name: Install dependencies
      run: python .github/workflows/install_deps.py
    - name: Run tests and flake8
      run: python .github/workflows/run_tests.py

    - name: Combine coverage
      run: python .github/workflows/run_tests.py combine

    - name: Install coveralls
      run: python -m pip install coveralls

    - name: Upload Coverage
      env:
        COVERALLS_FLAG_NAME: unit-${{ matrix.os }}
        COVERALLS_PARALLEL: 'true'
        GITHUB_TOKEN: ${{ secrets.github_token }}
      run: python -m coveralls --service=github

  behave:
    runs-on: ${{ matrix.os }}-latest
    env:
      DCS: ${{ matrix.dcs }}
      ETCDVERSION: 3.4.23
      PGVERSION: 15.1-1  # for windows and macos
    strategy:
      fail-fast: false
      matrix:
        os: [ubuntu]
        python-version: [3.7, '3.10']
        dcs: [etcd, etcd3, consul, exhibitor, kubernetes, raft]
        include:
        - os: macos
          python-version: 3.8
          dcs: raft
        - os: macos
          python-version: 3.9
          dcs: etcd
        - os: macos
          python-version: 3.11
          dcs: etcd3

    steps:
    - uses: actions/checkout@v3
    - name: Set up Python
      uses: actions/setup-python@v4
      with:
        python-version: ${{ matrix.python-version }}
    - uses: nolar/setup-k3d-k3s@v1
      if: matrix.dcs == 'kubernetes'
    - name: Add postgresql and citus apt repo
      run: |
        sudo apt-get update -y
        sudo apt-get install -y wget ca-certificates gnupg debian-archive-keyring apt-transport-https
        sudo sh -c 'echo "deb http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list'
        sudo sh -c 'wget -qO - https://www.postgresql.org/media/keys/ACCC4CF8.asc | gpg --dearmor > /etc/apt/trusted.gpg.d/apt.postgresql.org.gpg'
        sudo sh -c 'echo "deb [signed-by=/etc/apt/trusted.gpg.d/citusdata_community.gpg] https://packagecloud.io/citusdata/community/ubuntu/ $(lsb_release -cs) main" > /etc/apt/sources.list.d/citusdata_community.list'
        sudo sh -c 'wget -qO - https://packagecloud.io/citusdata/community/gpgkey | gpg --dearmor > /etc/apt/trusted.gpg.d/citusdata_community.gpg'
      if: matrix.os == 'ubuntu'
    - name: Install dependencies
      run: python .github/workflows/install_deps.py
    - name: Run behave tests
      run: python .github/workflows/run_tests.py
    - name: Upload logs if behave failed
      uses: actions/upload-artifact@v3
      if: failure()
      with:
        name: behave-${{ matrix.os }}-${{ matrix.dcs }}-${{ matrix.python-version }}-logs
        path: |
          features/output/*_failed/*postgres?.*
          features/output/*.log
        if-no-files-found: error
        retention-days: 5
    - name: Generate coverage xml report
      run: python -m coverage xml -o cobertura.xml
    - name: Upload coverage to Codacy
      run: bash <(curl -Ls https://coverage.codacy.com/get.sh) report -r cobertura.xml -l Python --partial
      if: ${{ env.SECRETS_AVAILABLE == 'true' }}

  coveralls-finish:
    name: Finalize coveralls.io
    needs: unit
    runs-on: ubuntu-latest
    steps:
    - uses: actions/setup-python@v4
    - run: python -m pip install coveralls
    - run: python -m coveralls --service=github --finish
      env:
        GITHUB_TOKEN: ${{ secrets.github_token }}

  codacy-final:
    name: Finalize Codacy
    needs: behave
    runs-on: ubuntu-latest
    steps:
    - run: bash <(curl -Ls https://coverage.codacy.com/get.sh) final
      if: ${{ env.SECRETS_AVAILABLE == 'true' }}

  pyright:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v3

    - name: Set up Python 3.11
      uses: actions/setup-python@v4
      with:
        python-version: 3.11

    - name: Install dependencies
      run: python -m pip install -r requirements.txt psycopg2-binary psycopg

    - uses: jakebailey/pyright-action@v1
      with:
        version: 1.1.326

  docs:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v3

    - name: Set up Python 3.11
      uses: actions/setup-python@v4
      with:
        python-version: 3.11
        cache: pip

    - name: Install dependencies
      run: pip install tox

    - name: Install package dependencies
      run: |
        sudo apt update \
        && sudo apt install -y \
            latexmk texlive-latex-extra tex-gyre \
            --no-install-recommends

    - name: Generate documentation
      run: tox -m docs
