11# pylint:disable=redefined-outer-name
22# pylint:disable=unused-argument
33
4- import asyncio
4+ from collections . abc import AsyncIterator
55from pathlib import Path
6- from typing import AsyncIterator , Iterator
6+ from typing import Any , Final
77from unittest .mock import AsyncMock
88
99import pytest
2424from tenacity .stop import stop_after_delay
2525from tenacity .wait import wait_fixed
2626
27- _TENACITY_RETRY_PARAMS = dict (
28- reraise = True ,
29- retry = retry_if_exception_type (AssertionError ),
30- stop = stop_after_delay (10 ),
31- wait = wait_fixed (0.01 ),
32- )
27+ _TENACITY_RETRY_PARAMS : Final [ dict [ str , Any ]] = {
28+ " reraise" : True ,
29+ " retry" : retry_if_exception_type (AssertionError ),
30+ " stop" : stop_after_delay (10 ),
31+ " wait" : wait_fixed (0.01 ),
32+ }
3333
3434# FIXTURES
3535
@@ -75,11 +75,11 @@ async def outputs_manager(
7575@pytest .fixture
7676def mocked_port_key_content_changed (
7777 mocker : MockerFixture , outputs_manager : OutputsManager
78- ) -> Iterator [ AsyncMock ] :
78+ ) -> AsyncMock :
7979 async def _mock_upload_outputs (* args , ** kwargs ) -> None :
8080 pass
8181
82- yield mocker .patch .object (
82+ return mocker .patch .object (
8383 outputs_manager , "port_key_content_changed" , side_effect = _mock_upload_outputs
8484 )
8585
@@ -101,8 +101,8 @@ def get_wait_interval(self, dir_size: NonNegativeInt) -> NonNegativeFloat:
101101
102102
103103@pytest .fixture
104- def mock_get_directory_total_size (mocker : MockerFixture ) -> Iterator [ AsyncMock ] :
105- yield mocker .patch (
104+ def mock_get_directory_total_size (mocker : MockerFixture ) -> AsyncMock :
105+ return mocker .patch (
106106 "simcore_service_dynamic_sidecar.modules.outputs._event_filter.get_directory_total_size" ,
107107 return_value = 1 ,
108108 )
@@ -120,17 +120,6 @@ async def event_filter(
120120 await event_filter .shutdown ()
121121
122122
123- # UTILS
124-
125-
126- async def _wait_for_event_to_trigger (event_filter : EventFilter ) -> None :
127- await asyncio .sleep (event_filter .delay_policy .get_min_interval () * 5 )
128-
129-
130- async def _wait_for_event_to_trigger_big_directory (event_filter : EventFilter ) -> None :
131- await asyncio .sleep (event_filter .delay_policy .get_wait_interval (1 ) * 2 )
132-
133-
134123# TESTS
135124
136125
@@ -141,13 +130,16 @@ async def test_event_triggers_once(
141130):
142131 # event triggers once
143132 await event_filter .enqueue (port_key_1 )
144- await _wait_for_event_to_trigger (event_filter )
145- assert mocked_port_key_content_changed .call_count == 1
133+
134+ async for attempt in AsyncRetrying (** _TENACITY_RETRY_PARAMS ):
135+ with attempt :
136+ assert mocked_port_key_content_changed .call_count == 1
146137
147138 # event triggers a second time
148139 await event_filter .enqueue (port_key_1 )
149- await _wait_for_event_to_trigger (event_filter )
150- assert mocked_port_key_content_changed .call_count == 2
140+ async for attempt in AsyncRetrying (** _TENACITY_RETRY_PARAMS ):
141+ with attempt :
142+ assert mocked_port_key_content_changed .call_count == 2
151143
152144
153145async def test_trigger_once_after_event_chain (
@@ -157,8 +149,9 @@ async def test_trigger_once_after_event_chain(
157149):
158150 for _ in range (100 ):
159151 await event_filter .enqueue (port_key_1 )
160- await _wait_for_event_to_trigger (event_filter )
161- assert mocked_port_key_content_changed .call_count == 1
152+ async for attempt in AsyncRetrying (** _TENACITY_RETRY_PARAMS ):
153+ with attempt :
154+ assert mocked_port_key_content_changed .call_count == 1
162155
163156
164157async def test_always_trigger_after_delay (
@@ -170,8 +163,9 @@ async def test_always_trigger_after_delay(
170163 # event trigger after correct interval delay correctly
171164 for expected_call_count in range (1 , 10 ):
172165 await event_filter .enqueue (port_key_1 )
173- await _wait_for_event_to_trigger_big_directory (event_filter )
174- assert mocked_port_key_content_changed .call_count == expected_call_count
166+ async for attempt in AsyncRetrying (** _TENACITY_RETRY_PARAMS ):
167+ with attempt :
168+ assert mocked_port_key_content_changed .call_count == expected_call_count
175169
176170
177171async def test_minimum_amount_of_get_directory_total_size_calls (
@@ -183,14 +177,12 @@ async def test_minimum_amount_of_get_directory_total_size_calls(
183177 await event_filter .enqueue (port_key_1 )
184178 # wait a bit for the vent to be picked up
185179 # by the workers and processed
186- await _wait_for_event_to_trigger (event_filter )
187180 async for attempt in AsyncRetrying (** _TENACITY_RETRY_PARAMS ):
188181 with attempt :
189182 assert mock_get_directory_total_size .call_count == 1
190183 assert mocked_port_key_content_changed .call_count == 0
191184
192185 # event finished processing and was dispatched
193- await _wait_for_event_to_trigger_big_directory (event_filter )
194186 async for attempt in AsyncRetrying (** _TENACITY_RETRY_PARAMS ):
195187 with attempt :
196188 assert mock_get_directory_total_size .call_count == 2
@@ -206,24 +198,27 @@ async def test_minimum_amount_of_get_directory_total_size_calls_with_continuous_
206198 await event_filter .enqueue (port_key_1 )
207199 # wait a bit for the vent to be picked up
208200 # by the workers and processed
209- await _wait_for_event_to_trigger (event_filter )
210- assert mock_get_directory_total_size .call_count == 1
211- assert mocked_port_key_content_changed .call_count == 0
201+ async for attempt in AsyncRetrying (** _TENACITY_RETRY_PARAMS ):
202+ with attempt :
203+ assert mock_get_directory_total_size .call_count == 1
204+ assert mocked_port_key_content_changed .call_count == 0
212205
213206 # while changes keep piling up, keep extending the duration
214207 # no event will trigger
215208 # size of directory will not be computed
216209 VERY_LONG_EVENT_CHAIN = 1000
217210 for _ in range (VERY_LONG_EVENT_CHAIN ):
218211 await event_filter .enqueue (port_key_1 )
219- await _wait_for_event_to_trigger (event_filter )
220- assert mock_get_directory_total_size .call_count == 1
221- assert mocked_port_key_content_changed .call_count == 0
212+ async for attempt in AsyncRetrying (** _TENACITY_RETRY_PARAMS ):
213+ with attempt :
214+ assert mock_get_directory_total_size .call_count == 1
215+ assert mocked_port_key_content_changed .call_count == 0
222216
223217 # event finished processing and was dispatched
224- await _wait_for_event_to_trigger_big_directory (event_filter )
225- assert mock_get_directory_total_size .call_count == 2
226- assert mocked_port_key_content_changed .call_count == 1
218+ async for attempt in AsyncRetrying (** _TENACITY_RETRY_PARAMS ):
219+ with attempt :
220+ assert mock_get_directory_total_size .call_count == 2
221+ assert mocked_port_key_content_changed .call_count == 1
227222
228223
229224def test_default_delay_policy ():
0 commit comments