name: Run Tests

on:
  push:
    branches: [ main, master, develop, claude/** ]
  pull_request:
    branches: [ main, master, develop ]

# Cancel in-progress runs when a new commit is pushed
concurrency:
  group: ${{ github.workflow }}-${{ github.ref }}
  cancel-in-progress: true

jobs:
  test:
    runs-on: ubuntu-latest

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

    - name: Set up Python 3.13
      uses: actions/setup-python@v5
      with:
        python-version: '3.13'
        cache: 'pip'

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

    - name: Run unit tests
      run: |
        pytest tests/unit/ -v --tb=short --cov=. --cov-report=term-missing
      env:
        SQLALCHEMY_DATABASE_URI: "sqlite:///:memory:"
        TESTING: "1"
        MODEL_ENDPOINT_0: "https://hermes.ai.unturf.com/v1"
        MODEL_API_KEY_0: "dummy"

    - name: Run functional tests
      run: |
        pytest tests/functional/ -v --tb=short
      env:
        SQLALCHEMY_DATABASE_URI: "sqlite:///:memory:"
        TESTING: "1"

    - name: Run integration tests
      run: |
        pytest tests/integration/ -v --tb=short
      env:
        SQLALCHEMY_DATABASE_URI: "sqlite:///:memory:"
        TESTING: "1"
        MODEL_ENDPOINT_0: "https://hermes.ai.unturf.com/v1"
        MODEL_API_KEY_0: "dummy"

    - name: Validate activity YAML files
      run: |
        python activity_yaml_validator.py research/SPEC.yaml
        python activity_yaml_validator.py research/activity*.yaml

  lint:
    runs-on: ubuntu-latest

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

    - name: Set up Python 3.13
      uses: actions/setup-python@v5
      with:
        python-version: '3.13'
        cache: 'pip'

    - name: Install linting dependencies
      run: |
        python -m pip install --upgrade pip
        pip install black flake8

    - name: Check code formatting with black
      run: |
        black --check --diff .
      continue-on-error: true

    - name: Lint with flake8 (syntax errors)
      run: |
        # Stop the build if there are Python syntax errors or undefined names
        flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics

    - name: Lint with flake8 (style warnings)
      run: |
        # Exit-zero treats all errors as warnings
        flake8 . --count --exit-zero --max-complexity=10 --max-line-length=127 --statistics
      continue-on-error: true
