Skip to content

Commit 417f92b

Browse files
author
Andrei Neagu
committed
refactor tests
1 parent 12ee118 commit 417f92b

File tree

2 files changed

+45
-20
lines changed

2 files changed

+45
-20
lines changed

packages/service-library/src/servicelib/long_running_interfaces/_redis.py

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ def __init__(
2323
long_running_namespace: LongRunningNamespace,
2424
) -> None:
2525
self.long_running_namespace = long_running_namespace
26-
self._redis_sdk = RedisClientSDK(
26+
self.redis_sdk = RedisClientSDK(
2727
redis_settings.build_redis_dsn(
2828
RedisDatabase.DEFERRED_TASKS # TODO: requires separate DB for sure
2929
),
@@ -38,11 +38,11 @@ async def setup(self) -> None:
3838
_logger.debug("finished setup")
3939

4040
async def teardown(self) -> None:
41-
await self._redis_sdk.shutdown()
41+
await self.redis_sdk.shutdown()
4242

4343
async def get(self, unique_id: JobUniqueId) -> ScheduleModel | None:
4444
key = self._get_key(unique_id)
45-
raw_data = await self._redis_sdk.redis.get(key)
45+
raw_data = await self.redis_sdk.redis.get(key)
4646

4747
if raw_data is None:
4848
return None
@@ -53,18 +53,22 @@ async def set(
5353
unique_id: JobUniqueId,
5454
schedule_data: ScheduleModel,
5555
*,
56-
timeout: timedelta | None, # noqa: ASYNC109
56+
expire: timedelta | None,
5757
) -> None:
58+
"""
59+
timeout -- if None means to keep the existing ttl if one was set previously
60+
"""
61+
5862
key = self._get_key(unique_id)
5963

60-
if timeout is None:
64+
if expire is None:
6165
expire_seconds = None
6266
keep_ttl = True
6367
else:
64-
expire_seconds = int(timeout.total_seconds())
68+
expire_seconds = int(expire.total_seconds())
6569
keep_ttl = False
6670

67-
await self._redis_sdk.redis.set(
71+
await self.redis_sdk.redis.set(
6872
key,
6973
schedule_data.model_dump_json().encode(),
7074
ex=expire_seconds,
@@ -73,24 +77,24 @@ async def set(
7377

7478
async def remove(self, unique_id: JobUniqueId) -> None:
7579
key = self._get_key(unique_id)
76-
await self._redis_sdk.redis.delete(key)
80+
await self.redis_sdk.redis.delete(key)
7781

7882
async def get_existing(self, unique_id: JobUniqueId) -> ScheduleModel:
7983
data = await self.get(unique_id)
8084
if data is None:
8185
raise UnexpectedJobNotFoundError(unique_id=unique_id)
8286
return data
8387

84-
async def update_timeout(
85-
self, unique_id: JobUniqueId, *, timeout: timedelta # noqa: ASYNC109
88+
async def update_entry_expiry(
89+
self, unique_id: JobUniqueId, *, expire: timedelta
8690
) -> None:
8791
key = self._get_key(unique_id)
88-
await self._redis_sdk.redis.expire(key, time=int(timeout.total_seconds()))
92+
await self.redis_sdk.redis.expire(key, time=int(expire.total_seconds()))
8993

9094
@asynccontextmanager
9195
async def auto_save_get(
9296
self, unique_id: JobUniqueId
9397
) -> AsyncIterator[ScheduleModel]:
9498
data = await self.get_existing(unique_id)
9599
yield data
96-
await self.set(unique_id, data, timeout=None)
100+
await self.set(unique_id, data, expire=None)

packages/service-library/tests/long_running_interfaces/test__redis.py

Lines changed: 29 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@ async def client_store_interface(
2727
client = ClientStoreInterface(redis_service, long_running_namespace)
2828
await client.setup()
2929

30+
await client.redis_sdk.redis.flushdb()
31+
3032
yield client
3133

3234
await client.teardown()
@@ -45,7 +47,7 @@ async def test_get_set_delete(
4547
):
4648
assert await client_store_interface.get(unique_id) is None
4749

48-
await client_store_interface.set(unique_id, schedule_model, timeout=job_timeout)
50+
await client_store_interface.set(unique_id, schedule_model, expire=job_timeout)
4951
assert await client_store_interface.get(unique_id) == schedule_model
5052

5153
await client_store_interface.remove(unique_id)
@@ -62,7 +64,7 @@ async def test_auto_save_get(
6264
schedule_model: ScheduleModel,
6365
job_timeout: timedelta,
6466
):
65-
await client_store_interface.set(unique_id, schedule_model, timeout=job_timeout)
67+
await client_store_interface.set(unique_id, schedule_model, expire=job_timeout)
6668

6769
assert await client_store_interface.get(unique_id) == schedule_model
6870
async with client_store_interface.auto_save_get(unique_id) as auto_saved:
@@ -71,26 +73,45 @@ async def test_auto_save_get(
7173
assert await client_store_interface.get(unique_id) == auto_saved
7274

7375

74-
async def test_expired_key(
76+
async def test_key_does_not_expire(
7577
client_store_interface: ClientStoreInterface,
7678
unique_id: JobUniqueId,
7779
schedule_model: ScheduleModel,
7880
job_timeout: timedelta,
7981
):
80-
await client_store_interface.set(unique_id, schedule_model, timeout=job_timeout)
82+
# check key does not expire
83+
await client_store_interface.set(unique_id, schedule_model, expire=None)
84+
assert await client_store_interface.get(unique_id) is not None
85+
assert await client_store_interface.get_existing(unique_id)
86+
87+
# wait a bit and key shoult still be there
88+
await asyncio.sleep(job_timeout.total_seconds())
89+
90+
assert await client_store_interface.get(unique_id) is not None
91+
assert await client_store_interface.get_existing(unique_id)
8192

93+
94+
async def test_key_actually_expires(
95+
client_store_interface: ClientStoreInterface,
96+
unique_id: JobUniqueId,
97+
schedule_model: ScheduleModel,
98+
job_timeout: timedelta,
99+
):
100+
await client_store_interface.set(unique_id, schedule_model, expire=job_timeout)
82101
assert await client_store_interface.get(unique_id) is not None
83102
assert await client_store_interface.get_existing(unique_id)
84103

104+
# check that key actially expires
85105
await asyncio.sleep(job_timeout.total_seconds())
86106

87107
assert await client_store_interface.get(unique_id) is None
88108
with pytest.raises(UnexpectedJobNotFoundError):
89109
await client_store_interface.get_existing(unique_id)
90110

91111

92-
async def test_update_timeout_not_existing(
93-
client_store_interface: ClientStoreInterface,
94-
job_timeout: timedelta,
112+
async def test_update_entry_expiry_not_existing(
113+
client_store_interface: ClientStoreInterface, job_timeout: timedelta
95114
):
96-
await client_store_interface.update_timeout("missing", timeout=job_timeout)
115+
await client_store_interface.update_entry_expiry(
116+
"missing_asdads", expire=job_timeout
117+
)

0 commit comments

Comments
 (0)