Skip to content

Commit 91bfe23

Browse files
authored
Improve and fix tests (#210)
Fixes a few failing tests, which were not working properly after other refactoring. Also improves code formatting.
1 parent 57ea77c commit 91bfe23

File tree

5 files changed

+141
-68
lines changed

5 files changed

+141
-68
lines changed
Lines changed: 115 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -1,47 +1,64 @@
11
from unittest.mock import patch
22

3-
import pytest
4-
53
from datacommons_client.endpoints.base import API
64
from datacommons_client.endpoints.base import Endpoint
5+
import pytest
76

87

9-
@patch("datacommons_client.endpoints.base.build_headers")
10-
@patch("datacommons_client.endpoints.base.resolve_instance_url")
8+
@patch(
9+
"datacommons_client.endpoints.base.build_headers",
10+
return_value={"Content-Type": "application/json"},
11+
)
12+
@patch(
13+
"datacommons_client.endpoints.base.resolve_instance_url",
14+
return_value="https://api.datacommons.org/v2",
15+
)
16+
@patch(
17+
"datacommons_client.endpoints.base.check_instance_is_valid",
18+
return_value="https://api.datacommons.org/v2",
19+
)
1120
def test_api_initialization_default(
12-
mock_resolve_instance_url, mock_build_headers
21+
mock_check_instance, mock_resolve_instance, mock_build_headers
1322
):
1423
"""Tests default API initialization with `datacommons.org` instance."""
15-
mock_resolve_instance_url.return_value = "https://api.datacommons.org/v2"
16-
mock_build_headers.return_value = {"Content-Type": "application/json"}
17-
1824
api = API()
1925

2026
assert api.base_url == "https://api.datacommons.org/v2"
2127
assert api.headers == {"Content-Type": "application/json"}
22-
mock_resolve_instance_url.assert_called_once_with("datacommons.org")
28+
mock_resolve_instance.assert_called_once_with("datacommons.org")
2329
mock_build_headers.assert_called_once_with(None)
2430

2531

26-
@patch("datacommons_client.endpoints.base.build_headers")
27-
def test_api_initialization_with_url(mock_build_headers):
32+
@patch(
33+
"datacommons_client.endpoints.base.build_headers",
34+
return_value={"Content-Type": "application/json"},
35+
)
36+
@patch(
37+
"datacommons_client.endpoints.base.check_instance_is_valid",
38+
return_value="https://custom_instance.api/v2",
39+
)
40+
def test_api_initialization_with_url(mock_check_instance, mock_build_headers):
2841
"""Tests API initialization with a fully qualified URL."""
29-
mock_build_headers.return_value = {"Content-Type": "application/json"}
30-
3142
api = API(url="https://custom_instance.api/v2")
3243
assert api.base_url == "https://custom_instance.api/v2"
3344
assert api.headers == {"Content-Type": "application/json"}
45+
mock_check_instance.assert_called_once_with(
46+
"https://custom_instance.api/v2"
47+
)
3448

3549

36-
@patch("datacommons_client.endpoints.base.build_headers")
37-
@patch("datacommons_client.endpoints.base.resolve_instance_url")
50+
@patch(
51+
"datacommons_client.endpoints.base.resolve_instance_url",
52+
return_value="https://custom-instance/api/v2",
53+
)
54+
@patch(
55+
"datacommons_client.endpoints.base.build_headers",
56+
return_value={"Content-Type": "application/json"},
57+
)
3858
def test_api_initialization_with_dc_instance(
39-
mock_resolve_instance_url, mock_build_headers
59+
mock_build_headers, mock_resolve_instance_url
4060
):
4161
"""Tests API initialization with a custom Data Commons instance."""
42-
mock_resolve_instance_url.return_value = "https://custom-instance/api/v2"
43-
mock_build_headers.return_value = {"Content-Type": "application/json"}
44-
4562
api = API(dc_instance="custom-instance")
4663

4764
assert api.base_url == "https://custom-instance/api/v2"
@@ -55,22 +72,16 @@ def test_api_initialization_invalid_args():
5572
API(dc_instance="custom-instance", url="https://custom.api/v2")
5673

5774

58-
def test_api_repr():
59-
"""Tests the string representation of the API object."""
60-
api = API(url="https://custom_instance.api/v2", api_key="test-key")
61-
assert (
62-
repr(api) == "<API at https://custom_instance.api/v2 (Authenticated)>"
63-
)
64-
65-
api = API(url="https://custom_instance.api/v2")
66-
assert repr(api) == "<API at https://custom_instance.api/v2>"
67-
68-
69-
@patch("datacommons_client.endpoints.base.post_request")
70-
def test_api_post_request(mock_post_request):
75+
@patch(
76+
"datacommons_client.endpoints.base.post_request",
77+
return_value={"success": True},
78+
)
79+
@patch(
80+
"datacommons_client.endpoints.base.check_instance_is_valid",
81+
return_value="https://custom_instance.api/v2",
82+
)
83+
def test_api_post_request(mock_check_instance, mock_post_request):
7184
"""Tests making a POST request using the API object."""
72-
mock_post_request.return_value = {"success": True}
73-
7485
api = API(url="https://custom_instance.api/v2")
7586
payload = {"key": "value"}
7687

@@ -83,15 +94,23 @@ def test_api_post_request(mock_post_request):
8394
)
8495

8596

86-
def test_api_post_request_invalid_payload():
97+
@patch(
98+
"datacommons_client.endpoints.base.check_instance_is_valid",
99+
return_value="https://custom_instance.api/v2",
100+
)
101+
def test_api_post_request_invalid_payload(mock_check_instance):
87102
"""Tests that an invalid payload raises a ValueError."""
88103
api = API(url="https://custom_instance.api/v2")
89104

90105
with pytest.raises(ValueError):
91106
api.post(payload=["invalid", "payload"], endpoint="test-endpoint")
92107

93108

94-
def test_endpoint_initialization():
109+
@patch(
110+
"datacommons_client.endpoints.base.check_instance_is_valid",
111+
return_value="https://custom_instance.api/v2",
112+
)
113+
def test_endpoint_initialization(mock_check_instance):
95114
"""Tests initializing an Endpoint with a valid API instance."""
96115
api = API(url="https://custom_instance.api/v2")
97116
endpoint = Endpoint(endpoint="node", api=api)
@@ -100,7 +119,11 @@ def test_endpoint_initialization():
100119
assert endpoint.api is api
101120

102121

103-
def test_endpoint_repr():
122+
@patch(
123+
"datacommons_client.endpoints.base.check_instance_is_valid",
124+
return_value="https://custom.api/v2",
125+
)
126+
def test_endpoint_repr(mock_check_instance):
104127
"""Tests the string representation of the Endpoint object."""
105128
api = API(url="https://custom.api/v2")
106129
endpoint = Endpoint(endpoint="node", api=api)
@@ -110,11 +133,16 @@ def test_endpoint_repr():
110133
)
111134

112135

113-
@patch("datacommons_client.endpoints.base.post_request")
114-
def test_endpoint_post_request(mock_post_request):
136+
@patch(
137+
"datacommons_client.endpoints.base.post_request",
138+
return_value={"success": True},
139+
)
140+
@patch(
141+
"datacommons_client.endpoints.base.check_instance_is_valid",
142+
return_value="https://custom.api/v2",
143+
)
144+
def test_endpoint_post_request(mock_check_instance, mock_post_request):
115145
"""Tests making a POST request using the Endpoint object."""
116-
mock_post_request.return_value = {"success": True}
117-
118146
api = API(url="https://custom.api/v2")
119147
endpoint = Endpoint(endpoint="node", api=api)
120148
payload = {"key": "value"}
@@ -128,10 +156,55 @@ def test_endpoint_post_request(mock_post_request):
128156
)
129157

130158

131-
def test_endpoint_post_request_invalid_payload():
159+
@patch(
160+
"datacommons_client.endpoints.base.check_instance_is_valid",
161+
return_value="https://custom.api/v2",
162+
)
163+
def test_endpoint_post_request_invalid_payload(mock_check_instance):
132164
"""Tests that an invalid payload raises a ValueError in the Endpoint post method."""
133165
api = API(url="https://custom.api/v2")
134166
endpoint = Endpoint(endpoint="node", api=api)
135167

136168
with pytest.raises(ValueError):
137169
endpoint.post(payload=["invalid", "payload"])
170+
171+
172+
@patch(
173+
"datacommons_client.endpoints.base.build_headers",
174+
side_effect=lambda api_key: {"X-API-Key": api_key} if api_key else {},
175+
)
176+
@patch(
177+
"datacommons_client.endpoints.base.check_instance_is_valid",
178+
side_effect=lambda url: url.rstrip("/"),
179+
)
180+
def test_api_repr(mock_check_instance, mock_build_headers):
181+
"""Tests the __repr__ method of the API class."""
182+
# Without API key
183+
api = API(url="https://custom.api/v2")
184+
assert repr(api) == "<API at https://custom.api/v2>"
185+
186+
# With API key
187+
api_with_key = API(url="https://custom.api/v2", api_key="test_key")
188+
assert (
189+
repr(api_with_key) == "<API at https://custom.api/v2 (Authenticated)>"
190+
)
191+
192+
mock_build_headers.assert_any_call(None)
193+
mock_build_headers.assert_any_call("test_key")
194+
195+
196+
@patch(
197+
"datacommons_client.endpoints.base.build_headers",
198+
return_value={"Content-Type": "application/json"},
199+
)
200+
@patch(
201+
"datacommons_client.endpoints.base.check_instance_is_valid",
202+
return_value="https://custom.api/v2",
203+
)
204+
def test_endpoint_repr(mock_check_instance, mock_build_headers):
205+
"""Tests the __repr__ method of the Endpoint class."""
206+
api = API(url="https://custom.api/v2")
207+
endpoint = Endpoint(endpoint="node", api=api)
208+
209+
expected_repr = "<Node Endpoint using <API at https://custom.api/v2>>"
210+
assert repr(endpoint) == expected_repr

datacommons_client/tests/endpoints/test_error_handling.py

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,12 @@
1+
from datacommons_client.utils.error_handling import APIError
2+
from datacommons_client.utils.error_handling import DataCommonsError
3+
from datacommons_client.utils.error_handling import DCAuthenticationError
4+
from datacommons_client.utils.error_handling import DCConnectionError
5+
from datacommons_client.utils.error_handling import DCStatusError
6+
from datacommons_client.utils.error_handling import InvalidDCInstanceError
17
from requests import Request
28
from requests import Response
39

4-
from datacommons_client.utils.error_hanlding import APIError
5-
from datacommons_client.utils.error_hanlding import DataCommonsError
6-
from datacommons_client.utils.error_hanlding import DCAuthenticationError
7-
from datacommons_client.utils.error_hanlding import DCConnectionError
8-
from datacommons_client.utils.error_hanlding import DCStatusError
9-
from datacommons_client.utils.error_hanlding import InvalidDCInstanceError
10-
1110

1211
def test_data_commons_error_default_message():
1312
"""Tests that DataCommonsError uses the default message."""

datacommons_client/tests/endpoints/test_payloads.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,9 @@ def test_node_payload_normalize():
1414
payload = NodeRequestPayload(node_dcids="node1", expression="prop1")
1515
assert payload.node_dcids == ["node1"]
1616

17-
payload = NodeRequestPayload(node_dcids=["node1", "node2"], expression="prop1")
17+
payload = NodeRequestPayload(
18+
node_dcids=["node1", "node2"], expression="prop1"
19+
)
1820
assert payload.node_dcids == ["node1", "node2"]
1921

2022

datacommons_client/tests/endpoints/test_request_handling.py

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,21 @@
11
from unittest.mock import MagicMock
22
from unittest.mock import patch
33

4-
import pytest
5-
import requests
6-
7-
from datacommons_client.utils.error_hanlding import APIError
8-
from datacommons_client.utils.error_hanlding import DCAuthenticationError
9-
from datacommons_client.utils.error_hanlding import DCConnectionError
10-
from datacommons_client.utils.error_hanlding import DCStatusError
11-
from datacommons_client.utils.error_hanlding import InvalidDCInstanceError
12-
from datacommons_client.utils.request_handling import check_instance_is_valid
4+
from datacommons_client.utils.error_handling import APIError
5+
from datacommons_client.utils.error_handling import DCAuthenticationError
6+
from datacommons_client.utils.error_handling import DCConnectionError
7+
from datacommons_client.utils.error_handling import DCStatusError
8+
from datacommons_client.utils.error_handling import InvalidDCInstanceError
139
from datacommons_client.utils.request_handling import _fetch_with_pagination
1410
from datacommons_client.utils.request_handling import _merge_values
1511
from datacommons_client.utils.request_handling import _recursively_merge_dicts
1612
from datacommons_client.utils.request_handling import _send_post_request
1713
from datacommons_client.utils.request_handling import build_headers
14+
from datacommons_client.utils.request_handling import check_instance_is_valid
1815
from datacommons_client.utils.request_handling import post_request
1916
from datacommons_client.utils.request_handling import resolve_instance_url
17+
import pytest
18+
import requests
2019

2120

2221
def test_resolve_instance_url_default():
@@ -47,7 +46,7 @@ def test_send_post_request_connection_error(mock_post):
4746
_send_post_request("https://api.test.com", {}, {})
4847

4948

50-
@patch("datacommons_client.utils.request_handling._check_instance_is_valid")
49+
@patch("datacommons_client.utils.request_handling.check_instance_is_valid")
5150
def test_resolve_instance_url_custom(mock_check_instance_is_valid):
5251
"""Tests resolving a custom Data Commons instance."""
5352
mock_check_instance_is_valid.return_value = (

datacommons_client/tests/endpoints/test_response.py

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
1+
from datacommons_client.endpoints.response import _unpack_arcs
2+
from datacommons_client.endpoints.response import DCResponse
3+
from datacommons_client.endpoints.response import extract_observations
4+
from datacommons_client.endpoints.response import flatten_properties
5+
from datacommons_client.endpoints.response import NodeResponse
6+
from datacommons_client.endpoints.response import ObservationResponse
7+
from datacommons_client.endpoints.response import ResolveResponse
8+
from datacommons_client.endpoints.response import SparqlResponse
19
from datacommons_client.models.observation import Facet
210
from datacommons_client.models.observation import Observation
311
from datacommons_client.models.observation import OrderedFacets
412
from datacommons_client.models.observation import Variable
5-
from datacommons_client.utils.response import _unpack_arcs
6-
from datacommons_client.utils.response import DCResponse
7-
from datacommons_client.utils.response import extract_observations
8-
from datacommons_client.utils.response import flatten_properties
9-
from datacommons_client.utils.response import NodeResponse
10-
from datacommons_client.utils.response import ObservationResponse
11-
from datacommons_client.utils.response import ResolveResponse
12-
from datacommons_client.utils.response import SparqlResponse
1313

1414
### ----- Test DCResponse ----- ###
1515

0 commit comments

Comments
 (0)