diff --git a/tests/test_concurrency.py b/tests/test_concurrency.py new file mode 100644 index 0000000..4d029e5 --- /dev/null +++ b/tests/test_concurrency.py @@ -0,0 +1,56 @@ +import asyncio + +from current_status import CurrentStatusCoordinator + + +async def test_older_overlapping_check_cannot_replace_newer_check() -> None: + coordinator = CurrentStatusCoordinator() + await coordinator.register_target("t") + release_old = asyncio.Event() + + async def old(_target): + await release_old.wait() + return {"value": "old"} + + async def new(_target): + return {"value": "new"} + + old_task = asyncio.create_task(coordinator.run_check("t", {}, old)) + await asyncio.sleep(0) + assert await coordinator.run_check("t", {}, new) is True + release_old.set() + assert await old_task is False + exists, status = await coordinator.read("t") + assert exists and status is not None + assert status["payload"] == {"value": "new"} + assert await coordinator.retained_status_count() == 1 + + +async def test_delete_cleans_status_and_stale_check_cannot_resurrect_recreate() -> None: + coordinator = CurrentStatusCoordinator() + await coordinator.register_target("same-id") + + async def initial(_target): + return {"value": "initial"} + + assert await coordinator.run_check("same-id", {}, initial) + assert await coordinator.retained_status_count() == 1 + + release = asyncio.Event() + + async def stale(_target): + await release.wait() + return {"value": "stale"} + + stale_task = asyncio.create_task(coordinator.run_check("same-id", {}, stale)) + await asyncio.sleep(0) + assert await coordinator.delete_target("same-id") + assert await coordinator.retained_status_count() == 0 + await coordinator.register_target("same-id") + release.set() + + assert await stale_task is False + exists, status = await coordinator.read("same-id") + assert exists is True + assert status is None + assert await coordinator.retained_status_count() == 0