更新
This commit is contained in:
@@ -18,6 +18,8 @@ if str(BACKEND_DIR) not in sys.path:
|
||||
|
||||
from auth.system_settings import SystemSettingsData, set_cached_settings
|
||||
from rpa_engine.douyin_im.service import DouyinImService
|
||||
from rpa_engine.douyin_im.session import DouyinImSession
|
||||
from rpa_engine.douyin_im import service as service_module
|
||||
from rpa_engine.playwright_worker import DouyinWorker
|
||||
|
||||
|
||||
@@ -114,6 +116,74 @@ def _build_service(delay_seconds: int = 60):
|
||||
|
||||
|
||||
class ReplyQueueIntegrationTests(unittest.IsolatedAsyncioTestCase):
|
||||
async def test_kick_does_not_replay_through_browser_fallback(self):
|
||||
callback = AsyncMock()
|
||||
fallback = AsyncMock(return_value=(True, "must not run"))
|
||||
session = DouyinImSession(cookies={"sessionid": "test"}, my_uid=999)
|
||||
service = DouyinImService(
|
||||
session=session,
|
||||
match_reply=AsyncMock(),
|
||||
log_fn=AsyncMock(),
|
||||
account_id=1,
|
||||
send_fallback=fallback,
|
||||
on_session_invalid=callback,
|
||||
)
|
||||
service._running = True
|
||||
kicked_http = SimpleNamespace(
|
||||
send_text_message=AsyncMock(return_value=False),
|
||||
last_error="decision=KICK",
|
||||
last_send_needs_refresh=False,
|
||||
)
|
||||
context = AsyncMock()
|
||||
context.__aenter__.return_value = kicked_http
|
||||
context.__aexit__.return_value = None
|
||||
|
||||
with (
|
||||
unittest.mock.patch.object(
|
||||
service_module, "DouyinImHttpClient", return_value=context
|
||||
),
|
||||
unittest.mock.patch(
|
||||
"rpa_engine.douyin_im.service.system_logger.record", Mock()
|
||||
),
|
||||
):
|
||||
sent, _ = await service._send_text("0:1:999:123", "hello")
|
||||
|
||||
self.assertFalse(sent)
|
||||
fallback.assert_not_awaited()
|
||||
callback.assert_awaited_once()
|
||||
|
||||
async def test_fresh_session_replaces_send_and_ws_state_atomically(self):
|
||||
current = DouyinImSession(
|
||||
cookies={"sessionid": "old"},
|
||||
my_uid=999,
|
||||
conv_meta={"old": {"ticket": "one"}},
|
||||
)
|
||||
current.egress_public_ip = "203.0.113.10"
|
||||
current.egress_source_ip = "10.0.0.10"
|
||||
current.egress_auto_attempts = 2
|
||||
service = DouyinImService(
|
||||
session=current,
|
||||
match_reply=AsyncMock(),
|
||||
log_fn=AsyncMock(),
|
||||
account_id=1,
|
||||
)
|
||||
service._ws_client = SimpleNamespace(session=current)
|
||||
fresh = DouyinImSession(
|
||||
cookies={"sessionid": "fresh"},
|
||||
my_uid=999,
|
||||
conv_meta={"new": {"ticket": "two"}},
|
||||
)
|
||||
|
||||
await service.replace_session(fresh)
|
||||
|
||||
self.assertIs(service.session, fresh)
|
||||
self.assertIs(service._ws_client.session, fresh)
|
||||
self.assertEqual(service.session.cookies["sessionid"], "fresh")
|
||||
self.assertEqual(set(service.session.conv_meta), {"old", "new"})
|
||||
self.assertEqual(service.session.egress_public_ip, "203.0.113.10")
|
||||
self.assertEqual(service.session.egress_source_ip, "10.0.0.10")
|
||||
self.assertEqual(service.session.egress_auto_attempts, 2)
|
||||
|
||||
async def test_kick_response_takes_account_offline_immediately(self):
|
||||
callback = AsyncMock()
|
||||
service, _, _ = _build_service()
|
||||
|
||||
Reference in New Issue
Block a user