name: Test Textual module

on:
  pull_request:
    paths:
      - ".github/workflows/pythonpackage.yml"
      - "**.py"
      - "**.pyi"
      - "**.css"
      - "**.ambr"
      - "**.lock"
      - "Makefile"

env:
  PYTEST_ADDOPTS: "--color=yes"

jobs:
  build:
    runs-on: ${{ matrix.os }}
    strategy:
      matrix:
        os: [ubuntu-latest, windows-latest, macos-latest]
        python-version: ["3.8", "3.9", "3.10", "3.11", "3.12"]

        # Python 3.9 is on macos-13 but not macos-latest (macos-14-arm64)
        # https://github.com/actions/setup-python/issues/696#issuecomment-1637587760
        exclude:
          - { python-version: "3.8", os: "macos-latest" }
          - { python-version: "3.9", os: "macos-latest" }
          - { python-version: "3.11", os: "macos-latest" }
        include:
          - { python-version: "3.8", os: "macos-13" }
          - { python-version: "3.9", os: "macos-13" }
          - { python-version: "3.11", os: "macos-13" }
    defaults:
      run:
        shell: bash
    steps:
      - uses: actions/checkout@v4.1.1
      - name: Install Poetry
        run: pipx install poetry==1.7.1
      - name: Set up Python ${{ matrix.python-version }}
        uses: actions/setup-python@v4.7.1
        with:
          python-version: ${{ matrix.python-version }}
          cache: "poetry"
      - name: Install dependencies
        run: poetry install --no-interaction --extras syntax
        if: ${{ matrix.python-version != '3.12' }}
      - name: Install dependencies for 3.12 # https://github.com/Textualize/textual/issues/3491#issuecomment-1854156476
        run: poetry install --no-interaction
        if: ${{ matrix.python-version == '3.12' }}
      - name: Test with pytest
        run: |
          poetry run pytest tests -v --cov=./src/textual --cov-report=xml:./coverage.xml --cov-report term-missing
        if: ${{ matrix.python-version != '3.12' }}
      - name: Test with pytest for 3.12 # https://github.com/Textualize/textual/issues/3491#issuecomment-1854156476
        run: |
          poetry run pytest tests -v --cov=./src/textual --cov-report=xml:./coverage.xml --cov-report term-missing -m 'not syntax'
        if: ${{ matrix.python-version == '3.12' }}
      - name: Upload snapshot report
        if: always()
        uses: actions/upload-artifact@v3
        with:
          name: snapshot-report-textual
          path: snapshot_report.html
