name: Python tests

permissions:
  contents: read

on:
  push:
    branches: [ master ]
  pull_request:
    branches: [ master ]

jobs:
  lint-docs-build:
    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v5
    - name: Set up Python
      uses: actions/setup-python@v6
      with:
        python-version: "3.13"
    - name: Install Python dependencies
      run: |
        python -m pip install --upgrade pip
        pip install .[build]
    - name: Check code style
      run: |
        ruff check .
    - name: Test building documentation
      run: |
        cd docs
        make html
    - name: Test building packages
      run: |
        hatch build

  test:
    needs: lint-docs-build
    runs-on: ubuntu-latest

    services:
      elasticsearch:
        image: elasticsearch:8.19.7
        env:
          discovery.type: single-node
          cluster.name: parsedmarc-cluster
          discovery.seed_hosts: elasticsearch
          bootstrap.memory_lock: true
          xpack.security.enabled: false
          xpack.license.self_generated.type: basic
        ports:
          - 9200:9200
          - 9300:9300

    strategy:
      fail-fast: false
      matrix:
        python-version: ["3.10", "3.11", "3.12", "3.13", "3.14"]

    steps:
    - uses: actions/checkout@v5
    - name: Set up Python ${{ matrix.python-version }}
      uses: actions/setup-python@v6
      with:
        python-version: ${{ matrix.python-version }}
    - name: Install system dependencies
      run: |
        sudo apt-get -q update
        sudo apt-get -qy install libemail-outlook-message-perl
    - name: Install Python dependencies
      run: |
        python -m pip install --upgrade pip
        pip install .[build]
    - name: Run unit tests
      run: |
        pytest --cov --cov-report=xml tests.py
    - name: Test sample DMARC reports
      run: |
        pip install -e .
        parsedmarc --debug -c ci.ini samples/aggregate/*
        parsedmarc --debug -c ci.ini samples/forensic/*
    - name: Upload coverage to Codecov
      uses: codecov/codecov-action@v5
      with:
          token: ${{ secrets.CODECOV_TOKEN }}
