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

1"""Tests de la fonction raise_for_status.""" 

2from __future__ import annotations 

3 

4from unittest.mock import MagicMock 

5from typing import cast 

6 

7import json 

8import httpx 

9import pytest 

10 

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) 

20 

21 

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) 

32 

33 

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) 

50 

51 

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)