import unittest from types import SimpleNamespace from unittest import mock class _DummySignal: def __init__(self): self._callbacks = [] def connect(self, callback): if callback is not None: self._callbacks.append(callback) def emit(self, *args, **kwargs): for callback in list(self._callbacks): callback(*args, **kwargs) class _DummyThread: created = 0 def __init__(self, _parent=None): type(self).created += 1 self.started = _DummySignal() self.finished = _DummySignal() def start(self): self.started.emit() def quit(self): self.finished.emit() def deleteLater(self): return None class _DummyChecker: created = 0 def __init__(self, *_args, **_kwargs): type(self).created += 1 self.check_finished = _DummySignal() self.check_failed = _DummySignal() def moveToThread(self, _thread): return None def run(self): return None def deleteLater(self): return None class UpdateReentryRuntimeTests(unittest.TestCase): @classmethod def setUpClass(cls): try: import main # noqa: PLC0415 except Exception as exc: raise unittest.SkipTest(f"main import unavailable: {exc}") from exc cls.main = main def test_repeated_update_check_is_ignored_until_thread_finishes(self): _DummyChecker.created = 0 _DummyThread.created = 0 manager = self.main.VkChatManager.__new__(self.main.VkChatManager) manager._update_in_progress = False manager._update_check_silent = False manager.update_channel = "stable" manager.update_repository_url = "https://example.com/org/repo" manager.update_checker = None manager.update_thread = None manager.status_label = SimpleNamespace(setText=lambda *_args, **_kwargs: None) manager._log_event = lambda *_args, **_kwargs: None manager._set_update_action_state = lambda *_args, **_kwargs: None with mock.patch.object(self.main, "UpdateChecker", _DummyChecker), mock.patch.object(self.main, "QThread", _DummyThread): self.main.VkChatManager.check_for_updates(manager, silent_no_updates=True) self.assertTrue(manager._update_in_progress) self.assertEqual(_DummyChecker.created, 1) self.assertEqual(_DummyThread.created, 1) first_thread = manager.update_thread self.main.VkChatManager.check_for_updates(manager, silent_no_updates=True) self.assertEqual(_DummyChecker.created, 1) self.assertEqual(_DummyThread.created, 1) self.assertIs(manager.update_thread, first_thread) manager.update_checker.check_finished.emit({"has_update": False, "current_version": self.main.APP_VERSION}) self.assertFalse(manager._update_in_progress) self.assertIsNone(manager.update_checker) self.assertIsNone(manager.update_thread) if __name__ == "__main__": unittest.main()