[fix] race condition
This commit is contained in:
parent
fb974fff1e
commit
f5d13feaf9
7 changed files with 185 additions and 63 deletions
|
|
@ -32,6 +32,23 @@ class FakeLogger:
|
|||
self.messages.append(('error', message, attrs))
|
||||
|
||||
|
||||
class FakeLockContext:
|
||||
def __enter__(self) -> None:
|
||||
return None
|
||||
|
||||
def __exit__(self, exc_type, exc, traceback) -> None:
|
||||
return None
|
||||
|
||||
|
||||
class FakeLocker:
|
||||
def __init__(self) -> None:
|
||||
self.chat_ids: list[str] = []
|
||||
|
||||
def lock(self, chat_id: str) -> FakeLockContext:
|
||||
self.chat_ids.append(chat_id)
|
||||
return FakeLockContext()
|
||||
|
||||
|
||||
class FakeRuntime:
|
||||
def __init__(self) -> None:
|
||||
self.create_calls: list[dict[str, object]] = []
|
||||
|
|
@ -80,8 +97,10 @@ def test_create_sandbox_reuses_active_session_when_not_expired() -> None:
|
|||
repository.save(session)
|
||||
runtime = FakeRuntime()
|
||||
logger = FakeLogger()
|
||||
locker = FakeLocker()
|
||||
usecase = CreateSandbox(
|
||||
repository=repository,
|
||||
locker=locker,
|
||||
runtime=runtime,
|
||||
clock=FakeClock(now),
|
||||
logger=logger,
|
||||
|
|
@ -94,6 +113,7 @@ def test_create_sandbox_reuses_active_session_when_not_expired() -> None:
|
|||
assert runtime.create_calls == []
|
||||
assert runtime.stop_calls == []
|
||||
assert repository.get_active_by_chat_id('chat-1') == session
|
||||
assert locker.chat_ids == ['chat-1']
|
||||
assert logger.messages == [
|
||||
(
|
||||
'info',
|
||||
|
|
@ -123,8 +143,10 @@ def test_create_sandbox_replaces_expired_session_and_creates_new_one(
|
|||
repository.save(expired_session)
|
||||
runtime = FakeRuntime()
|
||||
logger = FakeLogger()
|
||||
locker = FakeLocker()
|
||||
usecase = CreateSandbox(
|
||||
repository=repository,
|
||||
locker=locker,
|
||||
runtime=runtime,
|
||||
clock=FakeClock(now),
|
||||
logger=logger,
|
||||
|
|
@ -152,6 +174,7 @@ def test_create_sandbox_replaces_expired_session_and_creates_new_one(
|
|||
expires_at=now + timedelta(minutes=5),
|
||||
)
|
||||
assert repository.get_active_by_chat_id('chat-1') == result
|
||||
assert locker.chat_ids == ['chat-1']
|
||||
assert logger.messages == [
|
||||
(
|
||||
'info',
|
||||
|
|
@ -179,8 +202,10 @@ def test_create_sandbox_creates_new_session_when_none_exists() -> None:
|
|||
repository = InMemorySandboxSessionRepository()
|
||||
runtime = FakeRuntime()
|
||||
logger = FakeLogger()
|
||||
locker = FakeLocker()
|
||||
usecase = CreateSandbox(
|
||||
repository=repository,
|
||||
locker=locker,
|
||||
runtime=runtime,
|
||||
clock=FakeClock(now),
|
||||
logger=logger,
|
||||
|
|
@ -203,6 +228,7 @@ def test_create_sandbox_creates_new_session_when_none_exists() -> None:
|
|||
}
|
||||
assert runtime.stop_calls == []
|
||||
assert repository.get_active_by_chat_id('chat-1') == result
|
||||
assert locker.chat_ids == ['chat-1']
|
||||
assert logger.messages == [
|
||||
(
|
||||
'info',
|
||||
|
|
@ -248,8 +274,10 @@ def test_cleanup_expired_sandboxes_stops_and_deletes_only_expired_sessions() ->
|
|||
repository.save(active_session)
|
||||
runtime = FakeRuntime()
|
||||
logger = FakeLogger()
|
||||
locker = FakeLocker()
|
||||
usecase = CleanupExpiredSandboxes(
|
||||
repository=repository,
|
||||
locker=locker,
|
||||
runtime=runtime,
|
||||
clock=FakeClock(now),
|
||||
logger=logger,
|
||||
|
|
@ -262,6 +290,7 @@ def test_cleanup_expired_sandboxes_stops_and_deletes_only_expired_sessions() ->
|
|||
assert repository.get_active_by_chat_id('chat-expired') is None
|
||||
assert repository.get_active_by_chat_id('chat-boundary') is None
|
||||
assert repository.get_active_by_chat_id('chat-active') == active_session
|
||||
assert locker.chat_ids == ['chat-expired', 'chat-boundary']
|
||||
assert logger.messages == [
|
||||
(
|
||||
'info',
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue