---
name: Test

on: [push, pull_request]

jobs:
  build:
    name: build (Python ${{ matrix.python-version }}, Django ${{ matrix.django-version }})
    runs-on: ubuntu-18.04

    strategy:
      fail-fast: false
      matrix:
        python-version: ['3.7', '3.8', '3.9', '3.10']
        django-version: ['3.2', '4.0', 'main']

        exclude:
          - python-version: '3.7'
            django-version: '4.0'
          - python-version: '3.7'
            django-version: 'main'
          - python-version: '3.10'
            django-version: '3.1'

    services:

      postgres:
        image: postgres:latest
        env:
          POSTGRES_USER: postgres
          POSTGRES_PASSWORD: postgres
          POSTGRES_DB: github_actions
        ports:
          - 5432:5432
        # needed because the postgres container does not provide a healthcheck
        options: --health-cmd pg_isready --health-interval 10s --health-timeout 5s --health-retries 5

      mysql:
        image: mysql:latest
        env:
          MYSQL_DATABASE: mysql
          MYSQL_ROOT_PASSWORD: mysql
        ports:
          - 3306:3306
        options: --health-cmd="mysqladmin ping" --health-interval=10s --health-timeout=5s --health-retries=3

      mariadb:
        image: mariadb:latest
        env:
          MYSQL_DATABASE: mariadb
          MYSQL_ROOT_PASSWORD: mariadb
        ports:
          - 3307:3306
        options: --health-cmd="mysqladmin ping" --health-interval=10s --health-timeout=5s --health-retries=3

    steps:
      - uses: actions/checkout@v2

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

      - name: Get pip cache dir
        id: pip-cache
        run: |
          echo "::set-output name=dir::$(pip cache dir)"

      - name: Cache
        uses: actions/cache@v2
        with:
          path: ${{ steps.pip-cache.outputs.dir }}
          key:
            ${{ matrix.python-version }}-v1-${{ hashFiles('**/setup.py') }}-${{ hashFiles('**/tox.ini') }}
          restore-keys: |
            ${{ matrix.python-version }}-v1-

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

      - name: Tox tests
        run: |
          tox -v
        env:
          DJANGO: ${{ matrix.django-version }}

      - name: Upload coverage
        uses: codecov/codecov-action@v1
        with:
          name: Python ${{ matrix.python-version }}
