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

1"""Tests du sous-client document_lines (synchrone et asynchrone).""" 

2 

3from __future__ import annotations 

4 

5from typing import Any 

6from unittest.mock import AsyncMock, MagicMock 

7 

8import pytest 

9 

10from henrri_connect.connect import ( 

11 AsyncHenrriClient, SyncHenrriClient, # type: ignore[import] 

12) 

13from henrri_connect.models import DocumentLine 

14 

15from tests.conftest import DOCUMENT_LINE_JSON, make_response 

16 

17 

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]}) 

25 

26 result = sync_client.document_lines.list_document_lines(100) 

27 

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] 

32 

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] 

39 

40 result = sync_client.document_lines.add(100, line) 

41 

42 assert result.id == 20 

43 assert mock_http.request.call_args.args[0] == "POST" 

44 

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) 

50 

51 result = sync_client.document_lines.get(100, 10) 

52 

53 assert result.id == 10 

54 assert "/lines/10" in mock_http.request.call_args.args[1] 

55 

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) 

62 

63 result = sync_client.document_lines.modify( 

64 100, 10, DocumentLine(type_id=2) # type: ignore[call-arg] 

65 ) 

66 

67 assert result.quantity == pytest.approx(3.0) # type: ignore[misc] 

68 assert mock_http.request.call_args.args[0] == "PUT" 

69 

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({}) 

75 

76 sync_client.document_lines.delete(100, 10) 

77 

78 assert mock_http.request.call_args.args[0] == "DELETE" 

79 assert "/lines/10" in mock_http.request.call_args.args[1] 

80 

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({}) 

86 

87 sync_client.document_lines.move(100, 10, to=3) 

88 

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 

93 

94 

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]}) 

102 

103 result = await async_client.document_lines.list_document_lines(100) 

104 

105 assert result.elements is not None 

106 assert len(result.elements) == 1 

107 

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] 

114 

115 result = await async_client.document_lines.add(100, line) 

116 

117 assert result.id == 30 

118 

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({}) 

124 

125 await async_client.document_lines.delete(100, 10) 

126 

127 assert mock_async_http.request.call_args.args[0] == "DELETE"