Files
kefu/wechat_rpa/test_wechat_database_flow.py
T
2026-09-21 10:34:06 +08:00

64 lines
3.2 KiB
Python

"""Exercise the actual GUI loader method without starting the full desktop app."""
import ast
import threading
import unittest
from pathlib import Path
from unittest import mock
import wxwork_message_browser as browser
class AutomaticDatabaseFlowTest(unittest.TestCase):
@classmethod
def setUpClass(cls):
module = ast.parse(Path(__file__).with_name("wechat_gui_qt.py").read_text(encoding="utf-8"))
window = next(node for node in module.body if isinstance(node, ast.ClassDef) and node.name == "MainWindow")
method = next(node for node in window.body if isinstance(node, ast.FunctionDef) and node.name == "_refresh_wechat_database")
namespace = {"threading": threading}
exec(compile(ast.Module(body=[method], type_ignores=[]), "wechat_gui_qt.py", "exec"), namespace)
cls.refresh = staticmethod(namespace[method.name])
def setUp(self):
self.host = mock.Mock()
self.host._wechat_db_state = {}
self.host._wechat_db_selected_account = ""
self.host._wechat_db_selected_conversation = ""
self.host._wechat_db_query = ""
self.host._wechat_db_load_serial = 0
self.host.wechatDatabaseLoaded.emit.side_effect = lambda state: setattr(self.host, "_wechat_db_state", state)
thread = mock.patch.object(threading, "Thread", side_effect=lambda **kw: mock.Mock(start=kw["target"]))
thread.start()
self.addCleanup(thread.stop)
def test_first_load_automates_and_tab_return_does_not_retry_failure(self):
result = {"error": "automatic failed", "manualSetupRequired": True, "accounts": [], "loading": False}
with mock.patch.object(browser, "load_browser_snapshot", return_value=result) as load:
self.refresh(self.host)
self.assertTrue(load.call_args.kwargs["auto_initialize"])
self.refresh(self.host)
self.assertEqual(load.call_count, 1)
self.refresh(self.host, query="search")
self.assertFalse(load.call_args.kwargs["auto_initialize"])
self.refresh(self.host, refresh_cache=True)
self.assertTrue(load.call_args.kwargs["auto_initialize"])
def test_busy_refresh_does_not_start_a_second_scan(self):
self.host._wechat_db_state = {"loading": True}
with mock.patch.object(browser, "load_browser_snapshot") as load:
self.refresh(self.host, refresh_cache=True)
load.assert_not_called()
def test_manual_acquire_does_not_trigger_a_second_automatic_scan(self):
with mock.patch("wxwork_local_setup.acquire_local_keys") as acquire, \
mock.patch.object(browser, "load_browser_snapshot", return_value={"loading": False}) as load:
self.refresh(self.host, refresh_cache=True, acquire_keys=True)
acquire.assert_called_once_with()
self.assertFalse(load.call_args.kwargs["auto_initialize"])
def test_worker_error_exposes_manual_fallback(self):
with mock.patch.object(browser, "load_browser_snapshot", side_effect=ValueError("probe failure")):
self.refresh(self.host)
self.assertFalse(self.host._wechat_db_state["loading"])
self.assertTrue(self.host._wechat_db_state["manualSetupRequired"])
self.assertTrue(self.host._wechat_db_state["initializationAttempted"])