1414from aiohttp .test_utils import TestClient
1515from faker import Faker
1616from models_library .products import ProductName
17- from pytest_mock import MockerFixture
17+ from pytest_mock import MockerFixture , MockType
1818from pytest_simcore .helpers .assert_checks import assert_status
1919from pytest_simcore .helpers .monkeypatch_envs import setenvs_from_dict
2020from pytest_simcore .helpers .typing_env import EnvVarsDict
2121from pytest_simcore .helpers .webserver_login import NewUser , UserInfoDict
2222from servicelib .aiohttp import status
23- from servicelib .aiohttp .application_keys import APP_SETTINGS_KEY
2423from simcore_service_webserver .api_keys import _repository , _service , api_keys_service
2524from simcore_service_webserver .api_keys .models import ApiKey
26- from simcore_service_webserver .application_settings import GarbageCollectorSettings
25+ from simcore_service_webserver .application_settings import (
26+ ApplicationSettings ,
27+ get_application_settings ,
28+ )
2729from simcore_service_webserver .db .models import UserRole
2830from tenacity import (
2931 retry_if_exception_type ,
30- stop_after_attempt ,
32+ stop_after_delay ,
3133 wait_fixed ,
3234)
3335
@@ -38,8 +40,9 @@ async def fake_user_api_keys(
3840 logged_user : UserInfoDict ,
3941 osparc_product_name : ProductName ,
4042 faker : Faker ,
41- ) -> AsyncIterable [list [int ]]:
43+ ) -> AsyncIterable [list [ApiKey ]]:
4244 assert client .app
45+
4346 api_keys : list [ApiKey ] = [
4447 await _repository .create_api_key (
4548 client .app ,
@@ -85,7 +88,7 @@ async def test_list_api_keys(
8588 logged_user : UserInfoDict ,
8689 user_role : UserRole ,
8790 expected : HTTPStatus ,
88- disable_gc_manual_guest_users : None ,
91+ disabled_setup_garbage_collector : MockType ,
8992):
9093 resp = await client .get ("/v0/auth/api-keys" )
9194 data , errors = await assert_status (resp , expected )
@@ -103,7 +106,7 @@ async def test_create_api_key(
103106 logged_user : UserInfoDict ,
104107 user_role : UserRole ,
105108 expected : HTTPStatus ,
106- disable_gc_manual_guest_users : None ,
109+ disabled_setup_garbage_collector : MockType ,
107110):
108111 display_name = "foo"
109112 resp = await client .post ("/v0/auth/api-keys" , json = {"displayName" : display_name })
@@ -130,7 +133,7 @@ async def test_delete_api_keys(
130133 logged_user : UserInfoDict ,
131134 user_role : UserRole ,
132135 expected : HTTPStatus ,
133- disable_gc_manual_guest_users : None ,
136+ disabled_setup_garbage_collector : MockType ,
134137):
135138 resp = await client .delete ("/v0/auth/api-keys/0" )
136139 await assert_status (resp , expected )
@@ -140,6 +143,9 @@ async def test_delete_api_keys(
140143 await assert_status (resp , expected )
141144
142145
146+ EXPIRATION_WAIT_FACTOR = 1.2
147+
148+
143149@pytest .mark .parametrize (
144150 "user_role,expected" ,
145151 _get_user_access_parametrizations (status .HTTP_200_OK ),
@@ -149,7 +155,7 @@ async def test_create_api_key_with_expiration(
149155 logged_user : UserInfoDict ,
150156 user_role : UserRole ,
151157 expected : HTTPStatus ,
152- disable_gc_manual_guest_users : None ,
158+ disabled_setup_garbage_collector : MockType ,
153159):
154160 assert client .app
155161
@@ -172,7 +178,7 @@ async def test_create_api_key_with_expiration(
172178 assert [d ["displayName" ] for d in data ] == ["foo" ]
173179
174180 # wait for api-key for it to expire and force-run scheduled task
175- await asyncio .sleep (1.1 * expiration_interval .seconds )
181+ await asyncio .sleep (EXPIRATION_WAIT_FACTOR * expiration_interval .seconds )
176182
177183 deleted = await api_keys_service .prune_expired_api_keys (client .app )
178184 assert deleted == ["foo" ]
@@ -184,6 +190,7 @@ async def test_create_api_key_with_expiration(
184190
185191async def test_get_or_create_api_key (
186192 client : TestClient ,
193+ disabled_setup_garbage_collector : MockType ,
187194):
188195 async with NewUser (
189196 app = client .app ,
@@ -218,7 +225,7 @@ async def test_get_not_existing_api_key(
218225 logged_user : UserInfoDict ,
219226 user_role : UserRole ,
220227 expected : HTTPException ,
221- disable_gc_manual_guest_users : None ,
228+ disabled_setup_garbage_collector : MockType ,
222229):
223230 resp = await client .get ("/v0/auth/api-keys/42" )
224231 data , errors = await assert_status (resp , expected )
@@ -241,20 +248,31 @@ async def app_environment(
241248
242249
243250async def test_prune_expired_api_keys_task_is_triggered (
244- app_environment : EnvVarsDict , mocker : MockerFixture , client : TestClient
251+ app_environment : EnvVarsDict ,
252+ mocker : MockerFixture ,
253+ client : TestClient ,
245254):
246- mock = mocker .patch (
247- "simcore_service_webserver.api_keys._service._repository.prune_expired"
248- )
249- settings = client .server .app [ # type: ignore
250- APP_SETTINGS_KEY
251- ].WEBSERVER_GARBAGE_COLLECTOR
252- assert isinstance (settings , GarbageCollectorSettings )
255+ assert app_environment ["WEBSERVER_GARBAGE_COLLECTOR" ] is not None
256+
257+ delete_expired_spy = mocker .spy (_repository , "delete_expired_api_keys" )
258+
259+ assert client .app
260+
261+ settings : ApplicationSettings = get_application_settings (client .app )
262+ assert settings .WEBSERVER_GARBAGE_COLLECTOR
263+
264+ assert not delete_expired_spy .called
265+
253266 async for attempt in tenacity .AsyncRetrying (
254- stop = stop_after_attempt (5 ),
267+ stop = stop_after_delay (
268+ timedelta (
269+ seconds = EXPIRATION_WAIT_FACTOR
270+ * settings .WEBSERVER_GARBAGE_COLLECTOR .GARBAGE_COLLECTOR_EXPIRED_USERS_CHECK_INTERVAL_S
271+ )
272+ ),
255273 wait = wait_fixed (1 ),
256274 retry = retry_if_exception_type (AssertionError ),
257275 reraise = True ,
258276 ):
259277 with attempt :
260- mock .assert_called ()
278+ delete_expired_spy .assert_called ()
0 commit comments