64 lines
3.2 KiB
Python
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"])
|