Skip to content

Commit fb49b6e

Browse files
committed
Add more request tests
- Refactor the new ``GET`` methods to be more specific to json responses and add tests: ``(async_)json_make_get_request`` - Add test for async ``make_post_request`` since there was none
1 parent a1300d3 commit fb49b6e

File tree

4 files changed

+105
-31
lines changed

4 files changed

+105
-31
lines changed

tests/core/utilities/test_request.py

Lines changed: 97 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,14 @@
22
from concurrent.futures import (
33
ThreadPoolExecutor,
44
)
5+
import json
56
import pytest
67
import threading
78
import time
89

910
from aiohttp import (
1011
ClientSession,
12+
ClientTimeout,
1113
)
1214
from eth_typing import (
1315
URI,
@@ -46,6 +48,10 @@ def __init__(self, text="", status_code=200):
4648
self.reason = None
4749
self.content = "content"
4850

51+
@staticmethod
52+
def json():
53+
return json.dumps({"data": "content"})
54+
4955
def raise_for_status(self):
5056
pass
5157

@@ -73,9 +79,38 @@ def _simulate_call(uri):
7379
return _session
7480

7581

82+
@pytest.fixture(autouse=True)
83+
def setup_and_teardown():
84+
# clear session caches before and after each test
85+
request._session_cache.clear()
86+
request._async_session_cache.clear()
87+
yield
88+
request._session_cache.clear()
89+
request._async_session_cache.clear()
90+
91+
92+
def test_json_make_get_request(mocker):
93+
mocker.patch("requests.Session.get", return_value=MockedResponse())
94+
95+
# Submit a first request to create a session with default parameters
96+
assert len(request._session_cache) == 0
97+
response = request.json_make_get_request(TEST_URI)
98+
assert response == json.dumps({"data": "content"})
99+
assert len(request._session_cache) == 1
100+
cache_key = generate_cache_key(f"{threading.get_ident()}:{TEST_URI}")
101+
session = request._session_cache.get_cache_entry(cache_key)
102+
session.get.assert_called_once_with(TEST_URI, timeout=10)
103+
104+
# Ensure the adapter was created with default values
105+
check_adapters_mounted(session)
106+
adapter = session.get_adapter(TEST_URI)
107+
assert isinstance(adapter, HTTPAdapter)
108+
assert adapter._pool_connections == DEFAULT_POOLSIZE
109+
assert adapter._pool_maxsize == DEFAULT_POOLSIZE
110+
111+
76112
def test_make_post_request_no_args(mocker):
77113
mocker.patch("requests.Session.post", return_value=MockedResponse())
78-
request._session_cache.clear()
79114

80115
# Submit a first request to create a session with default parameters
81116
assert len(request._session_cache) == 0
@@ -93,9 +128,6 @@ def test_make_post_request_no_args(mocker):
93128
assert adapter._pool_connections == DEFAULT_POOLSIZE
94129
assert adapter._pool_maxsize == DEFAULT_POOLSIZE
95130

96-
# clear cache
97-
request._session_cache.clear()
98-
99131

100132
def test_precached_session(mocker):
101133
mocker.patch("requests.Session.post", return_value=MockedResponse())
@@ -124,9 +156,6 @@ def test_precached_session(mocker):
124156
assert adapter._pool_connections == 100
125157
assert adapter._pool_maxsize == 100
126158

127-
# clear cache
128-
request._session_cache.clear()
129-
130159

131160
def test_cache_session_class():
132161
cache = SimpleCache(2)
@@ -155,9 +184,6 @@ def test_cache_session_class():
155184
# been evicted.
156185
assert cache.get_cache_entry("1") is None
157186

158-
# clear cache
159-
request._session_cache.clear()
160-
161187

162188
def test_cache_does_not_close_session_before_a_call_when_multithreading():
163189
# save default values
@@ -187,9 +213,6 @@ def test_cache_does_not_close_session_before_a_call_when_multithreading():
187213
request._session_cache = session_cache_default
188214
request.DEFAULT_TIMEOUT = timeout_default
189215

190-
# clear cache
191-
request._session_cache.clear()
192-
193216

194217
def test_unique_cache_keys_created_per_thread_with_same_uri():
195218
# somewhat inspired by issue #2680
@@ -205,13 +228,71 @@ def test_unique_cache_keys_created_per_thread_with_same_uri():
205228
# appropriately close the test sessions
206229
[session.result().close() for session in test_sessions]
207230

208-
# clear cache
209-
request._session_cache.clear()
210-
211231

212232
# -- async -- #
213233

214234

235+
class AsyncMockedResponse:
236+
status_code = 200
237+
238+
def __await__(self):
239+
yield
240+
return self
241+
242+
@staticmethod
243+
async def read():
244+
return "content"
245+
246+
@staticmethod
247+
async def json():
248+
return json.dumps({"data": "content"})
249+
250+
@staticmethod
251+
def raise_for_status() -> None:
252+
pass
253+
254+
255+
@pytest.mark.asyncio
256+
async def test_async_json_make_get_request(mocker):
257+
mocker.patch("aiohttp.ClientSession.get", return_value=AsyncMockedResponse())
258+
259+
# Submit a first request to create a session with default parameters
260+
assert len(request._async_session_cache) == 0
261+
response = await request.async_json_make_get_request(TEST_URI)
262+
assert response == json.dumps({"data": "content"})
263+
assert len(request._async_session_cache) == 1
264+
cache_key = generate_cache_key(f"{threading.get_ident()}:{TEST_URI}")
265+
session = request._async_session_cache.get_cache_entry(cache_key)
266+
assert isinstance(session, ClientSession)
267+
session.get.assert_called_once_with(
268+
TEST_URI,
269+
timeout=ClientTimeout(
270+
total=10, connect=None, sock_read=None, sock_connect=None
271+
),
272+
)
273+
274+
275+
@pytest.mark.asyncio
276+
async def test_async_make_post_request(mocker):
277+
mocker.patch("aiohttp.ClientSession.post", return_value=AsyncMockedResponse())
278+
279+
# Submit a first request to create a session with default parameters
280+
assert len(request._async_session_cache) == 0
281+
response = await request.async_make_post_request(TEST_URI, data=b"request")
282+
assert response == "content"
283+
assert len(request._async_session_cache) == 1
284+
cache_key = generate_cache_key(f"{threading.get_ident()}:{TEST_URI}")
285+
session = request._async_session_cache.get_cache_entry(cache_key)
286+
assert isinstance(session, ClientSession)
287+
session.post.assert_called_once_with(
288+
TEST_URI,
289+
data=b"request",
290+
timeout=ClientTimeout(
291+
total=10, connect=None, sock_read=None, sock_connect=None
292+
),
293+
)
294+
295+
215296
@pytest.mark.asyncio
216297
async def test_async_precached_session():
217298
# Add a session
@@ -232,9 +313,6 @@ async def test_async_precached_session():
232313
# appropriately close the cached sessions
233314
[await session.close() for session in request._async_session_cache._data.values()]
234315

235-
# clear cache
236-
request._async_session_cache.clear()
237-
238316

239317
@pytest.mark.asyncio
240318
async def test_async_cache_does_not_close_session_before_a_call_when_multithreading():
@@ -281,9 +359,6 @@ async def cache_uri_and_return_session(uri):
281359
request._async_session_cache = session_cache_default
282360
request.DEFAULT_TIMEOUT = timeout_default
283361

284-
# clear cache
285-
request._async_session_cache.clear()
286-
287362

288363
@pytest.mark.asyncio
289364
async def test_async_unique_cache_keys_created_per_thread_with_same_uri():
@@ -321,6 +396,3 @@ def target_function(endpoint_uri):
321396

322397
# appropriately close the test sessions
323398
[await session.close() for session in test_sessions]
324-
325-
# clear cache
326-
request._async_session_cache.clear()

web3/_utils/request.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,9 @@ def get_response_from_get_request(
8787
return response
8888

8989

90-
def make_get_request(endpoint_uri: URI, *args: Any, **kwargs: Any) -> Dict[str, Any]:
90+
def json_make_get_request(
91+
endpoint_uri: URI, *args: Any, **kwargs: Any
92+
) -> Dict[str, Any]:
9193
response = get_response_from_get_request(endpoint_uri, *args, **kwargs)
9294
response.raise_for_status()
9395
return response.json()
@@ -176,7 +178,7 @@ async def async_get_response_from_get_request(
176178
return response
177179

178180

179-
async def async_make_get_request(
181+
async def async_json_make_get_request(
180182
endpoint_uri: URI, *args: Any, **kwargs: Any
181183
) -> Dict[str, Any]:
182184
response = await async_get_response_from_get_request(endpoint_uri, *args, **kwargs)

web3/beacon/async_beacon.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99

1010
from web3._utils.request import (
1111
async_get_response_from_get_request,
12-
async_make_get_request,
12+
async_json_make_get_request,
1313
)
1414
from web3.beacon.api_endpoints import (
1515
GET_ATTESTATIONS,
@@ -54,7 +54,7 @@ def __init__(
5454

5555
async def _async_make_get_request(self, endpoint_uri: str) -> Dict[str, Any]:
5656
uri = URI(self.base_url + endpoint_uri)
57-
return await async_make_get_request(uri)
57+
return await async_json_make_get_request(uri)
5858

5959
# [ BEACON endpoints ]
6060

web3/beacon/main.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99

1010
from web3._utils.request import (
1111
get_response_from_get_request,
12-
make_get_request,
12+
json_make_get_request,
1313
)
1414
from web3.beacon.api_endpoints import (
1515
GET_ATTESTATIONS,
@@ -52,7 +52,7 @@ def __init__(
5252

5353
def _make_get_request(self, endpoint_url: str) -> Dict[str, Any]:
5454
uri = URI(self.base_url + endpoint_url)
55-
return make_get_request(uri)
55+
return json_make_get_request(uri)
5656

5757
# [ BEACON endpoints ]
5858

0 commit comments

Comments
 (0)