"""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"])