Spaces:
Sleeping
Sleeping
File size: 2,044 Bytes
7babbd8 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 | """Sprint S3.6 — ``mypy --strict`` doit passer sur ``picarones.domain``.
Avant S3.6 :
- ``[tool.mypy.overrides] module = "picarones.domain.*" strict = true``
était configuré.
- MAIS le plugin Pydantic n'était pas chargé → ``BaseModel`` traité
comme ``Any`` → 20 erreurs ``Class cannot subclass "BaseModel"``.
- La CI ne faisait pas tomber sur ces erreurs (faux sentiment de
sécurité).
Après S3.6 :
- ``[tool.mypy] plugins = ["pydantic.mypy"]`` activé.
- ``pydantic`` ajouté en dépendance core.
- Ce test échoue si mypy strict sur ``domain/`` réintroduit des
erreurs.
"""
from __future__ import annotations
import subprocess
import sys
from pathlib import Path
import pytest
REPO_ROOT = Path(__file__).resolve().parents[2]
def test_mypy_strict_on_domain_passes() -> None:
"""``mypy picarones/domain/`` doit retourner 0 erreur."""
result = subprocess.run(
[sys.executable, "-m", "mypy", "picarones/domain/"],
capture_output=True,
text=True,
cwd=REPO_ROOT,
timeout=120,
)
if result.returncode != 0:
pytest.fail(
f"mypy strict sur ``picarones/domain`` échoue.\n"
f"return code: {result.returncode}\n"
f"stdout:\n{result.stdout}\n"
f"stderr:\n{result.stderr[-500:]}"
)
def test_mypy_pydantic_plugin_loaded() -> None:
"""Le plugin ``pydantic.mypy`` doit être déclaré dans pyproject.toml.
Sans ce plugin, les ``class X(BaseModel)`` sont traitées comme
``class X(Any)`` et toute la couche ``domain`` est faussement
typée. C'est exactement le bug que l'audit a détecté et que ce
test verrouille."""
pyproject = (REPO_ROOT / "pyproject.toml").read_text(encoding="utf-8")
assert "pydantic.mypy" in pyproject, (
"Le plugin ``pydantic.mypy`` n'est plus déclaré dans "
"``[tool.mypy] plugins = [...]``. Sans ce plugin, "
"``mypy --strict`` sur ``domain/`` reporte de faux "
"positifs ``Class cannot subclass BaseModel``."
)
|