name: Tests unitaires

# Gate de qualité : lance les 3 suites unitaires (Java / Python / Angular) à
# chaque push sur main et sur chaque PR. Une suite rouge fait échouer la CI
# (et, via la branch protection Gitea, peut bloquer le merge).
# Le build/push des images (release.yml) dépend AUSSI de ces tests via `needs`.
on:
  push:
    branches: [main]
  pull_request:
    branches: [main]

jobs:
  core:
    name: Core (Java · mvn test + JaCoCo)
    runs-on: ubuntu-latest
    # Les tests Core utilisent une VRAIE base PostgreSQL (cf.
    # src/test/resources/application.properties, ddl-auto=create-drop).
    # On en fournit une en service container. Sur Gitea (job en conteneur),
    # le service est joignable par son NOM d'hôte `postgres`.
    services:
      postgres:
        image: postgres:16-alpine
        env:
          POSTGRES_DB: loremind_test
          POSTGRES_USER: loremind_test
          POSTGRES_PASSWORD: loremind_test
        options: >-
          --health-cmd "pg_isready -U loremind_test -d loremind_test"
          --health-interval 10s
          --health-timeout 5s
          --health-retries 10
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-java@v4
        with:
          distribution: temurin
          java-version: '17'
          cache: maven
      # Maven wrapper (./mvnw) : le runner Gitea n'a pas `mvn` préinstallé et
      # setup-java n'installe que le JDK → le wrapper bootstrappe Maven lui-même.
      # `mvn test` exécute aussi jacoco:report + jacoco:check (plancher 60%).
      - name: mvn test (via wrapper)
        working-directory: core
        env:
          SPRING_DATASOURCE_URL: jdbc:postgresql://postgres:5432/loremind_test
          SPRING_DATASOURCE_USERNAME: loremind_test
          SPRING_DATASOURCE_PASSWORD: loremind_test
        run: |
          chmod +x ./mvnw
          ./mvnw -B test

  brain:
    name: Brain (Python · pytest + couverture)
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-python@v5
        with:
          python-version: '3.12'
          cache: pip
          cache-dependency-path: brain/requirements-dev.txt
      - name: Install deps (test)
        working-directory: brain
        run: pip install -r requirements-dev.txt
      - name: pytest (+ plancher couverture 50%)
        working-directory: brain
        run: pytest --cov=app --cov-report=term-missing --cov-fail-under=50

  web:
    name: Web (Angular · vitest + couverture)
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with:
          node-version: '20'
          cache: npm
          cache-dependency-path: web/package-lock.json
      - name: npm ci
        working-directory: web
        run: npm ci --no-audit --no-fund
      # vitest run --coverage applique les seuils définis dans vitest.config.ts.
      - name: vitest (+ seuils couverture)
        working-directory: web
        run: npm run test:unit:coverage
