更新
This commit is contained in:
@@ -1,6 +1,7 @@
|
||||
from __future__ import annotations
|
||||
|
||||
import asyncio
|
||||
import json
|
||||
import os
|
||||
import sys
|
||||
import unittest
|
||||
@@ -262,6 +263,95 @@ class BatchStartApiTests(unittest.IsolatedAsyncioTestCase):
|
||||
# return the connection: one before validation, one before the wait.
|
||||
self.assertEqual(events, ["release", "assess", "release", "start-worker"])
|
||||
|
||||
async def test_changed_egress_preserves_valid_credentials(self):
|
||||
ready_assessment = {
|
||||
"login_mode": "im_direct",
|
||||
"should_reset": False,
|
||||
"can_skip_browser": True,
|
||||
"message": "ready",
|
||||
"cookie_valid": True,
|
||||
"im_ready": True,
|
||||
}
|
||||
scenarios = (
|
||||
({"cookies": []}, "47.96.154.74"),
|
||||
({"cookies": [], "credential_egress_public_ip": "116.62.23.103"}, "47.96.154.74"),
|
||||
({"cookies": [], "credential_egress_public_ip": "47.96.154.74"}, ""),
|
||||
)
|
||||
modes = (("im_direct", False), (None, False), (None, True))
|
||||
for storage, selected_ip in scenarios:
|
||||
for requested_mode, wait_for_ready in modes:
|
||||
with self.subTest(storage=storage, mode=requested_mode, batch=wait_for_ready):
|
||||
cookie_data = json.dumps(storage)
|
||||
account = SimpleNamespace(
|
||||
id=506,
|
||||
status="offline",
|
||||
qr_code_base64=None,
|
||||
error_message="old channel warning",
|
||||
cookie_data=cookie_data,
|
||||
im_session_data="saved-session",
|
||||
egress_public_ip=selected_ip,
|
||||
)
|
||||
db = SimpleNamespace(commit=AsyncMock())
|
||||
with (
|
||||
patch.object(main.manager, "is_running", return_value=False),
|
||||
patch.object(main.manager, "start_worker", AsyncMock(return_value=True)) as start,
|
||||
patch.object(main, "_get_account_cookie_data", return_value=cookie_data),
|
||||
patch.object(main, "_reset_account_credentials", AsyncMock()) as reset,
|
||||
patch.object(main, "assess_account_credential", AsyncMock(return_value=ready_assessment)) as assess,
|
||||
):
|
||||
result = await main._start_account_rpa_impl(
|
||||
account, db, requested_mode, wait_for_ready=wait_for_ready
|
||||
)
|
||||
|
||||
reset.assert_not_awaited()
|
||||
assess.assert_awaited_once_with(
|
||||
cookie_data, "saved-session",
|
||||
startup_priority=True, egress_public_ip=selected_ip,
|
||||
)
|
||||
start.assert_awaited_once_with(
|
||||
506, login_mode="im_direct",
|
||||
wait_until_ready=wait_for_ready, credential_prevalidated=True,
|
||||
)
|
||||
self.assertEqual(account.cookie_data, cookie_data)
|
||||
self.assertEqual(account.im_session_data, "saved-session")
|
||||
self.assertIsNone(account.error_message)
|
||||
self.assertTrue(result["skip_qr"])
|
||||
self.assertTrue(result["skip_browser"])
|
||||
|
||||
async def test_changed_egress_still_rejects_invalid_im_credentials(self):
|
||||
account = SimpleNamespace(
|
||||
id=506,
|
||||
status="offline",
|
||||
qr_code_base64=None,
|
||||
error_message=None,
|
||||
im_session_data="saved-session",
|
||||
egress_public_ip="47.96.154.74",
|
||||
)
|
||||
db = SimpleNamespace(commit=AsyncMock())
|
||||
invalid_assessment = {
|
||||
"login_mode": "browser",
|
||||
"should_reset": False,
|
||||
"can_skip_browser": False,
|
||||
"message": "缺少 IM 签名密钥(web_protect/keys),请用浏览器登录补全",
|
||||
"cookie_valid": True,
|
||||
"im_ready": False,
|
||||
}
|
||||
|
||||
with (
|
||||
patch.object(main.manager, "is_running", return_value=False),
|
||||
patch.object(main.manager, "start_worker", AsyncMock()) as start,
|
||||
patch.object(main, "_get_account_cookie_data", return_value='{"cookies": []}'),
|
||||
patch.object(main, "_reset_account_credentials", AsyncMock()) as reset,
|
||||
patch.object(main, "assess_account_credential", AsyncMock(return_value=invalid_assessment)),
|
||||
):
|
||||
with self.assertRaises(main.HTTPException) as error:
|
||||
await main._start_account_rpa_impl(account, db, "im_direct")
|
||||
|
||||
self.assertEqual(error.exception.status_code, 400)
|
||||
self.assertEqual(error.exception.detail, invalid_assessment["message"])
|
||||
reset.assert_not_awaited()
|
||||
start.assert_not_awaited()
|
||||
|
||||
async def test_batch_start_does_not_launch_interactive_browser_login(self):
|
||||
account = SimpleNamespace(
|
||||
id=504,
|
||||
|
||||
Reference in New Issue
Block a user