Coverage for tests/test_utils_raise_for_status.py: 100%
26 statements
« prev ^ index » next coverage.py v7.14.1, created at 2026-06-05 11:17 +0200
« prev ^ index » next coverage.py v7.14.1, created at 2026-06-05 11:17 +0200
1"""Tests de la fonction raise_for_status."""
2from __future__ import annotations
4from unittest.mock import MagicMock
5from typing import cast
7import json
8import httpx
9import pytest
11from henrri_connect.utils import raise_for_status
12from henrri_connect.exc import (
13 HenrriValidationError,
14 HenrriAuthError,
15 HenrriForbiddenError,
16 HenrriNotFoundError,
17 HenrriServerError,
18 HenrriHTTPError,
19)
22def _make_resp(status: int, data: dict | None = None, text: str = "") -> httpx.Response:
23 m = MagicMock(spec=httpx.Response)
24 m.status_code = status
25 m.is_success = status < 400
26 if data is None:
27 m.json.side_effect = json.JSONDecodeError("msg", "doc", 0)
28 else:
29 m.json.return_value = data
30 m.text = text
31 return cast(httpx.Response, m)
34@pytest.mark.parametrize(
35 "status,exc",
36 [
37 (400, HenrriValidationError),
38 (401, HenrriAuthError),
39 (403, HenrriForbiddenError),
40 (404, HenrriNotFoundError),
41 (500, HenrriServerError),
42 (418, HenrriHTTPError),
43 ],
44)
45def test_raise_for_status_raises_correct_exception(status, exc):
46 """Leve une exception appropriée selon le code HTTP de la réponse."""
47 resp = _make_resp(status, {"detail": "boom"}, text="boom")
48 with pytest.raises(exc):
49 raise_for_status(resp)
52def test_raise_for_status_handles_invalid_json():
53 """Si le corps de la réponse n'est pas du JSON valide, le texte brut est utilisé."""
54 resp = _make_resp(500, None, text="plain error")
55 with pytest.raises(HenrriServerError):
56 raise_for_status(resp)