Files
college-infos/tests/conftest.py
Antoine Van Elstraete 19cbf8f13f fix(M9): corrections d'audit FIXME_M9 — secrets, messages, validation, tests
Cinq corrections de l'audit FIXME_M9 :
- redact_secrets() étendue avec extra_secrets pour masquer les clés brutes ;
  providers stockent SecretStr jusqu'à l'appel SDK.
- _build_prompt() inclut le contenu des messages (tronqué à 500 car.) ;
  prompt système renforcé contre l'injection.
- _validate_output() supprime les emojis et rejette titre/liste/HTML → None.
- Tests litellm utilisent importorskip + LITELLM_LOCAL_MODEL_COST_MAP=true.
- .env.example désactive l'IA par défaut (AI_ENABLED=false).
- Documentation §9.2-§9.5 alignée avec l'implémentation (SDK openai, SecretStr,
  factory réelle, validation sortie, politique hors réseau).

Co-authored-by: opencode/coder <coder@agents.invalid>
Co-authored-by: opencode/test-engineer <test-engineer@agents.invalid>
Co-authored-by: opencode/tech-writer <tech-writer@agents.invalid>
2026-09-07 19:01:25 +02:00

104 lines
2.8 KiB
Python

"""Fixtures partagées pour les tests de pronote-sync."""
from __future__ import annotations
import os
os.environ.setdefault("LITELLM_LOCAL_MODEL_COST_MAP", "true")
from datetime import date, datetime
import pytest
from pydantic import SecretStr
from pronote_sync.config.settings import CalDAVSettings
from pronote_sync.models.agenda import Lesson, LessonStatus, SchoolEvent, SchoolEventKind
from pronote_sync.models.homework import Homework
from pronote_sync.models.pronote import PronoteData
@pytest.fixture
def sample_lesson() -> Lesson:
"""Cours normal pour les tests."""
return Lesson(
id="L-1234-Normal",
start=datetime(2026, 1, 15, 8, 0),
end=datetime(2026, 1, 15, 9, 0),
subject="Mathématiques",
teachers=("Prof Dupont",),
rooms=("Salle 101",),
status=LessonStatus.NORMAL,
group=None,
content=None,
)
@pytest.fixture
def sample_cancelled_lesson() -> Lesson:
"""Cours annulé pour les tests."""
return Lesson(
id="L-5678-Cancelled",
start=datetime(2026, 1, 16, 10, 0),
end=datetime(2026, 1, 16, 11, 0),
subject="Français",
teachers=("Prof Martin",),
rooms=("Salle 202",),
status=LessonStatus.CANCELLED,
group=None,
content=None,
)
@pytest.fixture
def sample_homework() -> Homework:
"""Devoir pour les tests."""
return Homework(
id="hw-001",
subject="Histoire",
teachers=("Prof Bernard",),
assigned_on=date(2026, 1, 15),
due_on=date(2026, 1, 20),
text="Lire le chapitre 5",
html="<p>Lire le chapitre 5</p>",
)
@pytest.fixture
def sample_school_event() -> SchoolEvent:
"""Événement scolaire pour les tests."""
return SchoolEvent(
kind=SchoolEventKind.HOLIDAY,
label="Vacances de Noël",
from_date=date(2026, 12, 20),
to_date=date(2027, 1, 5),
)
@pytest.fixture
def caldav_settings() -> CalDAVSettings:
"""Configuration CalDAV de test avec une URL HTTPS."""
return CalDAVSettings(
url=SecretStr("https://caldav.example.com/remote.php/dav/"),
username="test-user",
password=SecretStr("test-secret-password-12345"),
calendar_path="/pronote-sync/",
)
@pytest.fixture
def pronote_data(
sample_lesson: Lesson,
sample_cancelled_lesson: Lesson,
sample_homework: Homework,
sample_school_event: SchoolEvent,
) -> PronoteData:
"""Données Pronote de test avec des cours, devoirs et événements."""
return PronoteData(
lessons=[sample_lesson, sample_cancelled_lesson],
homeworks=[sample_homework],
school_events=[sample_school_event],
messages=[],
target_date=date(2026, 1, 15),
generated_at=datetime(2026, 1, 15, 0, 0),
)