@@ -99,6 +99,27 @@ def test_check_with_all_middlewares(make_post_request_mock):
9999 assert make_post_request_mock .call_count == 5
100100
101101
102+ @patch ("web3.providers.rpc.make_post_request" , side_effect = ConnectionError )
103+ def test_exception_retry_middleware_with_allow_list_kwarg (
104+ make_post_request_mock , exception_retry_request_setup
105+ ):
106+ w3 = Mock ()
107+ provider = HTTPProvider ()
108+ errors = (ConnectionError , HTTPError , Timeout , TooManyRedirects )
109+ setup = exception_retry_middleware (
110+ provider .make_request , w3 , errors , 5 , allow_list = ["test_userProvidedMethod" ]
111+ )
112+ setup .w3 = w3
113+ with pytest .raises (ConnectionError ):
114+ setup ("test_userProvidedMethod" , [])
115+ assert make_post_request_mock .call_count == 5
116+
117+ make_post_request_mock .reset_mock ()
118+ with pytest .raises (ConnectionError ):
119+ setup ("eth_getBalance" , [])
120+ assert make_post_request_mock .call_count == 1
121+
122+
102123# -- async -- #
103124
104125
@@ -132,27 +153,56 @@ async def async_exception_retry_request_setup():
132153 aiohttp .ClientOSError ,
133154 ),
134155)
135- async def test_check_retry_middleware (error , async_exception_retry_request_setup ):
156+ async def test_async_check_retry_middleware (error , async_exception_retry_request_setup ):
136157 with patch (
137158 "web3.providers.async_rpc.async_make_post_request"
138- ) as make_post_request_mock :
139- make_post_request_mock .side_effect = error
159+ ) as async_make_post_request_mock :
160+ async_make_post_request_mock .side_effect = error
140161
141162 with pytest .raises (error ):
142163 await async_exception_retry_request_setup ("eth_getBalance" , [])
143- assert make_post_request_mock .call_count == ASYNC_TEST_RETRY_COUNT
164+ assert async_make_post_request_mock .call_count == ASYNC_TEST_RETRY_COUNT
144165
145166
146167@pytest .mark .asyncio
147- async def test_check_without_retry_middleware ():
168+ async def test_async_check_without_retry_middleware ():
148169 with patch (
149170 "web3.providers.async_rpc.async_make_post_request"
150- ) as make_post_request_mock :
151- make_post_request_mock .side_effect = TimeoutError
171+ ) as async_make_post_request_mock :
172+ async_make_post_request_mock .side_effect = TimeoutError
152173 provider = AsyncHTTPProvider ()
153174 w3 = AsyncWeb3 (provider )
154175 w3 .provider ._middlewares = ()
155176
156177 with pytest .raises (TimeoutError ):
157178 await w3 .eth .block_number
158- assert make_post_request_mock .call_count == 1
179+ assert async_make_post_request_mock .call_count == 1
180+
181+
182+ @pytest .mark .asyncio
183+ async def test_async_exception_retry_middleware_with_allow_list_kwarg ():
184+ w3 = Mock ()
185+ provider = AsyncHTTPProvider ()
186+ setup = await async_exception_retry_middleware (
187+ provider .make_request ,
188+ w3 ,
189+ (TimeoutError , aiohttp .ClientError ),
190+ retries = ASYNC_TEST_RETRY_COUNT ,
191+ backoff_factor = 0.1 ,
192+ allow_list = ["test_userProvidedMethod" ],
193+ )
194+ setup .w3 = w3
195+
196+ with patch (
197+ "web3.providers.async_rpc.async_make_post_request"
198+ ) as async_make_post_request_mock :
199+ async_make_post_request_mock .side_effect = TimeoutError
200+
201+ with pytest .raises (TimeoutError ):
202+ await setup ("test_userProvidedMethod" , [])
203+ assert async_make_post_request_mock .call_count == ASYNC_TEST_RETRY_COUNT
204+
205+ async_make_post_request_mock .reset_mock ()
206+ with pytest .raises (TimeoutError ):
207+ await setup ("eth_getBalance" , [])
208+ assert async_make_post_request_mock .call_count == 1
0 commit comments