This commit is contained in:
Your Name
2026-09-01 15:31:05 +08:00
parent 1f3addcf79
commit 2fc864cc00
20 changed files with 1381 additions and 45 deletions
@@ -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()