mirror of
https://github.com/TheSmallHanCat/flow2api.git
synced 2026-05-07 06:19:24 +08:00
79 lines
2.8 KiB
Python
79 lines
2.8 KiB
Python
import types
|
|
import unittest
|
|
from unittest.mock import AsyncMock
|
|
|
|
from src.services.browser_captcha_personal import BrowserCaptchaService, ResidentTabInfo
|
|
|
|
|
|
class _FakeTab:
|
|
def __init__(self, result):
|
|
self._result = result
|
|
|
|
async def evaluate(self, expression, await_promise=False, return_by_value=False):
|
|
return self._result
|
|
|
|
|
|
class BrowserCaptchaPersonalTests(unittest.IsolatedAsyncioTestCase):
|
|
def setUp(self):
|
|
self.service = BrowserCaptchaService()
|
|
|
|
@staticmethod
|
|
def _make_remote_object_result(token: str):
|
|
return types.SimpleNamespace(
|
|
type_="object",
|
|
value=None,
|
|
deep_serialized_value=types.SimpleNamespace(
|
|
type_="object",
|
|
value=[
|
|
["ok", {"type": "boolean", "value": True}],
|
|
["token", {"type": "string", "value": token}],
|
|
],
|
|
),
|
|
)
|
|
|
|
async def test_tab_evaluate_normalizes_deep_serialized_remote_object(self):
|
|
tab = _FakeTab(self._make_remote_object_result("token-123"))
|
|
|
|
result = await self.service._tab_evaluate(
|
|
tab,
|
|
"ignored",
|
|
label="unit_test_tab_evaluate",
|
|
await_promise=True,
|
|
return_by_value=True,
|
|
)
|
|
|
|
self.assertEqual(result, {"ok": True, "token": "token-123"})
|
|
|
|
async def test_execute_recaptcha_on_tab_accepts_remote_object_success_result(self):
|
|
tab = _FakeTab(self._make_remote_object_result("token-xyz"))
|
|
|
|
token = await self.service._execute_recaptcha_on_tab(tab, action="IMAGE_GENERATION")
|
|
|
|
self.assertEqual(token, "token-xyz")
|
|
|
|
async def test_create_resident_tab_returns_none_when_browser_missing(self):
|
|
self.service.browser = None
|
|
|
|
resident_info = await self.service._create_resident_tab("slot-1", project_id="project-1")
|
|
|
|
self.assertIsNone(resident_info)
|
|
|
|
async def test_restart_browser_for_project_reuses_recent_healthy_runtime(self):
|
|
resident_info = ResidentTabInfo(tab=object(), slot_id="slot-1", project_id="project-1")
|
|
self.service.browser = types.SimpleNamespace(stopped=False)
|
|
self.service._initialized = True
|
|
self.service._mark_runtime_restart()
|
|
self.service._probe_browser_runtime = AsyncMock(return_value=True)
|
|
self.service._ensure_resident_tab = AsyncMock(return_value=("slot-1", resident_info))
|
|
self.service._restart_browser_for_project_unlocked = AsyncMock(return_value=True)
|
|
|
|
result = await self.service._restart_browser_for_project("project-1")
|
|
|
|
self.assertTrue(result)
|
|
self.service._restart_browser_for_project_unlocked.assert_not_awaited()
|
|
self.service._ensure_resident_tab.assert_awaited_once()
|
|
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main()
|