11from unittest .mock import patch
22
3- import pytest
4-
53from datacommons_client .endpoints .base import API
64from 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+ )
1120def 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+ )
3858def 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
0 commit comments