"""进程内 actor 运行时(``kilostar.utils.actor``)单元测试。 覆盖:注册/寻址/注销;句柄对同步与异步方法都返回 awaitable;便捷 getter; 未注册抛 KeyError。 """ from __future__ import annotations import pytest from kilostar.utils import actor as actor_mod from kilostar.utils.actor import ( clear_actors, get_actor, get_gsm, get_gwm, get_postgres, register_actor, unregister_actor, ) @pytest.fixture(autouse=True) def _clean_registry(): clear_actors() yield clear_actors() class _Sample: def __init__(self) -> None: self.value = 7 def sync_method(self, x): return x + 1 async def async_method(self, x): return x * 2 @pytest.mark.asyncio async def test_sync_method_is_awaitable_through_handle(): register_actor("sample", _Sample()) handle = get_actor("sample") assert await handle.sync_method(41) == 42 @pytest.mark.asyncio async def test_async_method_forwards_through_handle(): register_actor("sample", _Sample()) handle = get_actor("sample") assert await handle.async_method(21) == 42 def test_non_callable_attribute_passthrough(): register_actor("sample", _Sample()) assert get_actor("sample").value == 7 def test_get_unregistered_raises_keyerror(): with pytest.raises(KeyError): get_actor("does_not_exist") def test_unregister_then_missing(): register_actor("sample", _Sample()) assert get_actor("sample") is not None unregister_actor("sample") with pytest.raises(KeyError): get_actor("sample") # 幂等:再次注销不报错 unregister_actor("sample") def test_convenience_getters_resolve_named_actors(): register_actor("postgres_database", _Sample()) register_actor("global_state_machine", _Sample()) register_actor("global_workflow_manager", _Sample()) assert get_postgres() is get_actor("postgres_database") assert get_gsm() is get_actor("global_state_machine") assert get_gwm() is get_actor("global_workflow_manager") @pytest.mark.asyncio async def test_reregister_overwrites_underlying_instance(): first = _Sample() first.value = 100 register_actor("sample", first) assert get_actor("sample").value == 100 second = _Sample() second.value = 200 register_actor("sample", second) assert get_actor("sample").value == 200