name: CI

on:
  push:
  pull_request:

concurrency:
  group: ${{ github.head_ref || github.run_id }}
  cancel-in-progress: true

jobs:
  lint:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - uses: actions/setup-python@v4
        with:
          python-version: "3.9"
          cache: pip
      - name: Run pre-commit
        uses: pre-commit/action@v3.0.0

  tests:
    strategy:
      fail-fast: false
      matrix:
        os:
          - ubuntu-latest
          - windows-latest
          - macOS-latest

    name: "Run tests"
    runs-on: ${{ matrix.os }}
    steps:
      - uses: actions/checkout@v3
      - uses: actions/setup-python@v4
        with:
          python-version: "3.9"
          cache: pip
      - name: Install dependencies
        run: pip install -r requirements.txt
      - name: Run tests
        run: pytest tests

  docker:
    strategy:
      fail-fast: false
      matrix:
        script:
          - name: Basic
            args: ""
          - name: Extended
            args: "use_celery=y use_drf=y frontend_pipeline=Gulp"

    name: "${{ matrix.script.name }} Docker"
    runs-on: ubuntu-latest
    env:
      DOCKER_BUILDKIT: 1
      COMPOSE_DOCKER_CLI_BUILD: 1

    steps:
      - uses: actions/checkout@v3
      - uses: actions/setup-python@v4
        with:
          python-version: "3.9"
          cache: pip
      - name: Install dependencies
        run: pip install -r requirements.txt
      - name: Docker ${{ matrix.script.name }}
        run: sh tests/test_docker.sh ${{ matrix.script.args }}

  bare:
    strategy:
      fail-fast: false
      matrix:
        script:
          - name: With Celery
            args: "use_celery=y frontend_pipeline='Django Compressor'"
          - name: With Gulp
            args: "frontend_pipeline='Gulp'"

    name: "${{ matrix.script.name }} Bare metal"
    runs-on: ubuntu-latest
    services:
      redis:
        image: redis:5.0
        ports:
          - 6379:6379
      postgres:
        image: postgres:12
        ports:
          - 5432:5432
        env:
          POSTGRES_PASSWORD: postgres

    env:
      CELERY_BROKER_URL: "redis://localhost:6379/0"
      # postgres://user:password@host:port/database
      DATABASE_URL: "postgres://postgres:postgres@localhost:5432/postgres"

    steps:
      - uses: actions/checkout@v3
      - uses: actions/setup-python@v4
        with:
          python-version: "3.9"
          cache: pip
          cache-dependency-path: |
            requirements.txt
            {{cookiecutter.project_slug}}/requirements/base.txt
            {{cookiecutter.project_slug}}/requirements/local.txt
      - name: Install dependencies
        run: pip install -r requirements.txt
      - uses: actions/setup-node@v3
        with:
          node-version: "16"
      - name: Bare Metal ${{ matrix.script.name }}
        run: sh tests/test_bare.sh ${{ matrix.script.args }}
