Files
Solo_bot/tests/test_notify_and_actor_middleware.py
2026-04-14 07:19:14 +00:00

73 lines
2.9 KiB
Python

import sys
import unittest
from importlib.util import module_from_spec, spec_from_file_location
from pathlib import Path
from types import SimpleNamespace
from unittest.mock import AsyncMock, patch
from database.access.resolution import notify_telegram_chat_id
_ACTOR_SPEC = spec_from_file_location(
"actor_module_for_tests",
str(Path(__file__).resolve().parents[1] / "middlewares" / "actor.py"),
)
_ACTOR_MODULE = module_from_spec(_ACTOR_SPEC)
assert _ACTOR_SPEC is not None and _ACTOR_SPEC.loader is not None
sys.modules["actor_module_for_tests"] = _ACTOR_MODULE
_ACTOR_SPEC.loader.exec_module(_ACTOR_MODULE)
ActorMiddleware = _ACTOR_MODULE.ActorMiddleware
class NotifyTelegramChatIdTests(unittest.IsolatedAsyncioTestCase):
async def test_returns_user_tg_when_user_has_telegram(self):
session = object()
user = SimpleNamespace(tg_id=555)
with patch("database.access.resolution.resolve_user_optional", new=AsyncMock(return_value=user)):
value = await notify_telegram_chat_id(session, 100)
self.assertEqual(value, 555)
async def test_returns_legacy_ref_when_user_missing(self):
session = object()
with patch("database.access.resolution.resolve_user_optional", new=AsyncMock(return_value=None)):
value = await notify_telegram_chat_id(session, 777)
self.assertEqual(value, 777)
async def test_returns_none_when_user_exists_without_tg(self):
session = object()
user = SimpleNamespace(tg_id=None)
with patch("database.access.resolution.resolve_user_optional", new=AsyncMock(return_value=user)):
value = await notify_telegram_chat_id(session, 11)
self.assertIsNone(value)
class ActorMiddlewareTests(unittest.IsolatedAsyncioTestCase):
async def test_sets_actor_for_non_bot_user(self):
middleware = ActorMiddleware()
from_user = SimpleNamespace(id=123, is_bot=False)
data = {"event_from_user": from_user, "session": SimpleNamespace(execute=object())}
async def handler(event, payload):
return payload.get("actor")
resolved_actor = SimpleNamespace(surface="telegram", billing_user_id=10, telegram_chat_id=123, identity_id=None)
with patch("actor_module_for_tests.resolve_actor_from_legacy_ref", new=AsyncMock(return_value=resolved_actor)):
result = await middleware(handler, object(), data)
self.assertEqual(result, resolved_actor)
self.assertEqual(data.get("actor"), resolved_actor)
async def test_skips_actor_when_event_user_missing(self):
middleware = ActorMiddleware()
data = {"session": object()}
async def handler(event, payload):
return payload.get("actor")
with patch("actor_module_for_tests.resolve_actor_from_legacy_ref", new=AsyncMock()) as resolver_mock:
result = await middleware(handler, object(), data)
self.assertIsNone(result)
resolver_mock.assert_not_called()