Coverage for tests/test_document_lines.py: 100%
59 statements
« prev ^ index » next coverage.py v7.14.1, created at 2026-06-09 19:37 +0200
« prev ^ index » next coverage.py v7.14.1, created at 2026-06-09 19:37 +0200
1"""Tests du sous-client document_lines (synchrone et asynchrone)."""
3from __future__ import annotations
5from typing import Any
6from unittest.mock import AsyncMock, MagicMock
8import pytest
10from henrri_connect.connect import (
11 AsyncHenrriClient, SyncHenrriClient, # type: ignore[import]
12)
13from henrri_connect.models import DocumentLine
15from tests.conftest import DOCUMENT_LINE_JSON, make_response
18class TestSyncDocumentLines:
19 """Tests du sous-client document_lines (synchrone)."""
20 def test_list_retourne_lignes(
21 self, sync_client: SyncHenrriClient, mock_http: MagicMock
22 ) -> None:
23 """Test de la méthode list_document_lines()."""
24 mock_http.request.return_value = make_response({"elements": [DOCUMENT_LINE_JSON]})
26 result = sync_client.document_lines.list_document_lines(100)
28 assert result.elements is not None
29 assert len(result.elements) == 1
30 assert result.elements[0].id == 10
31 assert "/v1/documents/100/lines" in mock_http.request.call_args.args[1]
33 def test_add_ligne(
34 self, sync_client: SyncHenrriClient, mock_http: MagicMock
35 ) -> None:
36 """Test de la méthode add_document_line()."""
37 mock_http.request.return_value = make_response({**DOCUMENT_LINE_JSON, "id": 20})
38 line = DocumentLine(type_id=2) # type: ignore[call-arg]
40 result = sync_client.document_lines.add(100, line)
42 assert result.id == 20
43 assert mock_http.request.call_args.args[0] == "POST"
45 def test_get_ligne(
46 self, sync_client: SyncHenrriClient, mock_http: MagicMock
47 ) -> None:
48 """Test de la méthode get_document_line()."""
49 mock_http.request.return_value = make_response(DOCUMENT_LINE_JSON)
51 result = sync_client.document_lines.get(100, 10)
53 assert result.id == 10
54 assert "/lines/10" in mock_http.request.call_args.args[1]
56 def test_modify_ligne(
57 self, sync_client: SyncHenrriClient, mock_http: MagicMock
58 ) -> None:
59 """Test de la méthode modify_document_line()."""
60 updated: dict[str, Any] = {**DOCUMENT_LINE_JSON, "quantity": 3.0}
61 mock_http.request.return_value = make_response(updated)
63 result = sync_client.document_lines.modify(
64 100, 10, DocumentLine(type_id=2) # type: ignore[call-arg]
65 )
67 assert result.quantity == pytest.approx(3.0) # type: ignore[misc]
68 assert mock_http.request.call_args.args[0] == "PUT"
70 def test_delete_ligne(
71 self, sync_client: SyncHenrriClient, mock_http: MagicMock
72 ) -> None:
73 """Test de la méthode delete_document_line()."""
74 mock_http.request.return_value = make_response({})
76 sync_client.document_lines.delete(100, 10)
78 assert mock_http.request.call_args.args[0] == "DELETE"
79 assert "/lines/10" in mock_http.request.call_args.args[1]
81 def test_move_ligne(
82 self, sync_client: SyncHenrriClient, mock_http: MagicMock
83 ) -> None:
84 """Test de la méthode move_document_line()."""
85 mock_http.request.return_value = make_response({})
87 sync_client.document_lines.move(100, 10, to=3)
89 args = mock_http.request.call_args
90 assert args.args[0] == "POST"
91 assert "/lines/10/move" in args.args[1]
92 assert args.kwargs["json"]["to"] == 3
95class TestAsyncDocumentLines:
96 """Tests du sous-client document_lines (asynchrone)."""
97 async def test_list_retourne_lignes(
98 self, async_client: AsyncHenrriClient, mock_async_http: AsyncMock
99 ) -> None:
100 """Test de la méthode list_document_lines()."""
101 mock_async_http.request.return_value = make_response({"elements": [DOCUMENT_LINE_JSON]})
103 result = await async_client.document_lines.list_document_lines(100)
105 assert result.elements is not None
106 assert len(result.elements) == 1
108 async def test_add_ligne(
109 self, async_client: AsyncHenrriClient, mock_async_http: AsyncMock
110 ) -> None:
111 """Test de la méthode add_document_line()."""
112 mock_async_http.request.return_value = make_response({**DOCUMENT_LINE_JSON, "id": 30})
113 line = DocumentLine(type_id=2) # type: ignore[call-arg]
115 result = await async_client.document_lines.add(100, line)
117 assert result.id == 30
119 async def test_delete_ligne(
120 self, async_client: AsyncHenrriClient, mock_async_http: AsyncMock
121 ) -> None:
122 """Test de la méthode delete_document_line()."""
123 mock_async_http.request.return_value = make_response({})
125 await async_client.document_lines.delete(100, 10)
127 assert mock_async_http.request.call_args.args[0] == "DELETE"