name: Tests

on:
  push:
    branches:
      - dev-3.x
    paths:
      - ".github/workflows/tests.yml"
      - "aiogram/**"
      - "tests/**"
      - "codecov.yaml"
      - "pyproject.toml"
  pull_request:
    branches:
      - dev-3.x
    paths:
      - ".github/workflows/tests.yml"
      - "aiogram/**"
      - "tests/**"
      - "pyproject.toml"

jobs:
  tests:
    strategy:
      fail-fast: false
      matrix:
        os:
          - ubuntu-latest
          - macos-latest
          - windows-latest
        python-version:
          - '3.8'
          - '3.9'
          - '3.10'
          - '3.11'
          - '3.12'

    defaults:
      # Windows sucks. Force use bash instead of PowerShell
      run:
        shell: bash

    runs-on: ${{ matrix.os }}

    env:
      # Windows has some limitations:
      # – Redis and MongoDB is not supported on GitHub Windows runners;
      IS_WINDOWS: ${{ startswith(matrix.os, 'windows') }}
      # MongoDB has some limitations:
      # – MongoDB container action is only supported on Linux;
      IS_UBUNTU: ${{ startswith(matrix.os, 'ubuntu') }}

    steps:
      - name: Checkout code
        uses: actions/checkout@v4

      - name: Set up Python ${{ matrix.python-version }} on ${{ matrix.os }}
        uses: actions/setup-python@v5
        with:
          python-version: ${{ matrix.python-version }}
          cache: "pip"
          cache-dependency-path: pyproject.toml

      - name: Install project dependencies
        run: |
          pip install -e .[dev,test,redis,mongo,proxy,i18n,fast]

      - name: Lint code
        run: |
          ruff check --output-format=github aiogram examples
          mypy aiogram
          black --check --diff aiogram tests

      - name: Setup redis
        if: ${{ env.IS_WINDOWS == 'false' }}
        uses: shogo82148/actions-setup-redis@v1
        with:
          redis-version: 6

      - name: Setup mongodb
        if: ${{ env.IS_UBUNTU == 'true' }}
        uses: supercharge/mongodb-github-action@1.10.0
        with:
          mongodb-version: '7.0'
          mongodb-username: mongo
          mongodb-password: mongo
          mongodb-port: 27017

      - name: Run tests
        run: |
          flags="$flags --cov=aiogram --cov-config .coveragerc --cov-report=xml"
          [[ "$IS_WINDOWS" == "false" ]] && flags="$flags --redis redis://localhost:6379/0"
          [[ "$IS_UBUNTU" == "true" ]] && flags="$flags --mongo mongodb://mongo:mongo@localhost:27017"
          pytest $flags

      - name: Upload coverage data
        uses: codecov/codecov-action@v4
        with:
          token: ${{ secrets.CODECOV_TOKEN }}
          files: coverage.xml
          flags: unittests
          name: py-${{ matrix.python-version }}-${{ matrix.os }}
          fail_ci_if_error: true

  pypy-tests:
    strategy:
      fail-fast: false
      matrix:
        os:
          - ubuntu-latest
          - macos-latest
          # - windows-latest
        python-version:
          - 'pypy3.8'
          - 'pypy3.9'
          - 'pypy3.10'

    defaults:
      # Windows sucks. Force use bash instead of PowerShell
      run:
        shell: bash

    runs-on: ${{ matrix.os }}

    steps:
      - name: Checkout code
        uses: actions/checkout@v4

      - name: Set up Python ${{ matrix.python-version }} on ${{ matrix.os }}
        uses: actions/setup-python@v5
        with:
          python-version: ${{ matrix.python-version }}
          cache: "pip"
          cache-dependency-path: pyproject.toml

      - name: Install project dependencies
        run: |
          pip install -e .[dev,test,redis,mongo,proxy,i18n,fast]

      - name: Run tests
        run: |
          flags=""
          pytest $flags
