22from concurrent .futures import (
33 ThreadPoolExecutor ,
44)
5+ import json
56import pytest
67import threading
78import time
89
910from aiohttp import (
1011 ClientSession ,
12+ ClientTimeout ,
1113)
1214from 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+
76112def 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
100132def 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
131160def 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
162188def 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
194217def 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
216297async 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
240318async 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
289364async 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 ()
0 commit comments