Finalize M13 test and coverage milestone: tests/fixtures/pronote-6e.ics (new): - Anonymized iCal fixture for Classe de 6e (3 VEVENTs: SVT lesson with homework block, Histoire-Géo modified lesson, all-day school outing) - Same structure as pronote-4e.ics, no secrets or real data tests/conftest.py: - Added sample_message fixture (Message with MessageType.INFORMATION) - Integrated sample_message into pronote_data fixture (messages=[sample_message]) - Sphinx/reST docstring with :return: and :rtype: .gitignore: - Fixed typo: .worktress/ -> .worktrees/ (line 56) pyproject.toml: - Added ".worktrees" to ruff extend-exclude to prevent ruff format --check . from scanning worktree files TODO.md: - Checked M13 items: tests/fixtures/ and tests/conftest.py Validation: 627 tests pass, coverage 95.67% (threshold 90%), ruff/mypy/ bandit/pre-commit all green. Co-authored-by: opencode/coder <coder@agents.invalid>
124 lines
3.3 KiB
Python
124 lines
3.3 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.message import Message, MessageType
|
|
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 sample_message() -> Message:
|
|
"""Message Pronote pour les tests.
|
|
|
|
:return: Message Pronote de test.
|
|
:rtype: Message
|
|
"""
|
|
return Message(
|
|
id="msg-001",
|
|
type=MessageType.INFORMATION,
|
|
title="Information de rentrée",
|
|
content="La rentrée est prévue le 1er septembre.",
|
|
author="Administration",
|
|
date=datetime(2026, 1, 15, 9, 0),
|
|
read=False,
|
|
)
|
|
|
|
|
|
@pytest.fixture
|
|
def pronote_data(
|
|
sample_lesson: Lesson,
|
|
sample_cancelled_lesson: Lesson,
|
|
sample_homework: Homework,
|
|
sample_school_event: SchoolEvent,
|
|
sample_message: Message,
|
|
) -> PronoteData:
|
|
"""Données Pronote de test avec des cours, devoirs, événements et messages."""
|
|
return PronoteData(
|
|
lessons=[sample_lesson, sample_cancelled_lesson],
|
|
homeworks=[sample_homework],
|
|
school_events=[sample_school_event],
|
|
messages=[sample_message],
|
|
target_date=date(2026, 1, 15),
|
|
generated_at=datetime(2026, 1, 15, 0, 0),
|
|
)
|