Files
flow2api/tests/test_browser_captcha_personal.py

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()