Skip to content

Commit 52f7e3c

Browse files
Ihor BilousIhor Bilous
authored andcommitted
Fix issue #26: Add tests for http client
1 parent c75cb42 commit 52f7e3c

File tree

1 file changed

+104
-0
lines changed

1 file changed

+104
-0
lines changed

tests/unit/test_http.py

Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
import json
2+
from unittest.mock import Mock
3+
4+
import pytest
5+
6+
from mailtrap.exceptions import APIError
7+
from mailtrap.exceptions import AuthorizationError
8+
from mailtrap.http import HttpClient
9+
10+
11+
class TestHttpClient:
12+
13+
def test_extract_errors_with_singular_error_key(self) -> None:
14+
data = {"error": "Simple error message"}
15+
errors = HttpClient._extract_errors(data)
16+
assert errors == ["Simple error message"]
17+
18+
def test_extract_errors_with_string_value(self) -> None:
19+
data = {"errors": "Error message"}
20+
errors = HttpClient._extract_errors(data)
21+
assert errors == ["Error message"]
22+
23+
def test_extract_errors_with_string_list(self) -> None:
24+
data = {"errors": ["Error 1", "Error 2"]}
25+
errors = HttpClient._extract_errors(data)
26+
assert errors == ["Error 1", "Error 2"]
27+
28+
def test_extract_errors_with_nested_dict(self) -> None:
29+
data = {"errors": {"field1": ["Error in field1"], "field2": "Error in field2"}}
30+
errors = HttpClient._extract_errors(data)
31+
assert "field1: Error in field1" in errors
32+
assert "field2: Error in field2" in errors
33+
34+
def test_extract_errors_with_unknown_format(self) -> None:
35+
data = {"unknown_key": "Some error"}
36+
errors = HttpClient._extract_errors(data)
37+
assert errors == ["Unknown error"]
38+
39+
def test_handle_failed_response_401_raises_authorization_error(self) -> None:
40+
client = HttpClient("test.mailtrap.com")
41+
42+
mock_response = Mock()
43+
mock_response.status_code = 401
44+
mock_response.content = b'{"error": "Unauthorized"}'
45+
mock_response.json.return_value = {"error": "Unauthorized"}
46+
47+
with pytest.raises(AuthorizationError) as exc_info:
48+
client._handle_failed_response(mock_response)
49+
50+
assert "Unauthorized" in str(exc_info.value)
51+
52+
def test_handle_failed_response_404_with_empty_content(self) -> None:
53+
client = HttpClient("test.mailtrap.com")
54+
55+
mock_response = Mock()
56+
mock_response.status_code = 404
57+
mock_response.content = b""
58+
59+
with pytest.raises(APIError) as exc_info:
60+
client._handle_failed_response(mock_response)
61+
62+
assert exc_info.value.status == 404
63+
assert "Not Found" in exc_info.value.errors
64+
65+
def test_handle_failed_response_with_empty_content(self) -> None:
66+
client = HttpClient("test.mailtrap.com")
67+
68+
mock_response = Mock()
69+
mock_response.status_code = 500
70+
mock_response.content = b""
71+
72+
with pytest.raises(APIError) as exc_info:
73+
client._handle_failed_response(mock_response)
74+
75+
assert exc_info.value.status == 500
76+
assert "Empty response body" in exc_info.value.errors
77+
78+
def test_handle_failed_response_invalid_json(self) -> None:
79+
client = HttpClient("test.mailtrap.com")
80+
81+
mock_response = Mock()
82+
mock_response.status_code = 400
83+
mock_response.content = b"Invalid JSON content"
84+
mock_response.json.side_effect = json.JSONDecodeError("Invalid JSON", "", 0)
85+
86+
with pytest.raises(APIError) as exc_info:
87+
client._handle_failed_response(mock_response)
88+
89+
assert exc_info.value.status == 400
90+
assert "Invalid JSON" in exc_info.value.errors
91+
92+
def test_handle_failed_response_generic_error(self) -> None:
93+
client = HttpClient("test.mailtrap.com")
94+
95+
mock_response = Mock()
96+
mock_response.status_code = 500
97+
mock_response.content = b'{"error": "Internal server error"}'
98+
mock_response.json.return_value = {"error": "Internal server error"}
99+
100+
with pytest.raises(APIError) as exc_info:
101+
client._handle_failed_response(mock_response)
102+
103+
assert exc_info.value.status == 500
104+
assert "Internal server error" in exc_info.value.errors

0 commit comments

Comments
 (0)