From 600719652e8f3df00336b89698f40bd2f0581989 Mon Sep 17 00:00:00 2001 From: Dusk-92 Date: Fri, 4 Sep 2026 08:32:32 +0200 Subject: [PATCH] Test WowPresence legacy and local failure handling --- tests/test_wowpresence_recovery.py | 177 +++++++++++++++++++++++++++++ 1 file changed, 177 insertions(+) create mode 100644 tests/test_wowpresence_recovery.py diff --git a/tests/test_wowpresence_recovery.py b/tests/test_wowpresence_recovery.py new file mode 100644 index 0000000..039fc73 --- /dev/null +++ b/tests/test_wowpresence_recovery.py @@ -0,0 +1,177 @@ +import unittest +from unittest import mock + +import remote_packages +from setup_tool_dynamic import ModernWowSetupTool + + +class WowPresenceRecoveryTests(unittest.TestCase): + def _tool(self): + tool = ModernWowSetupTool.__new__(ModernWowSetupTool) + tool._report_download_progress = mock.Mock() + tool._warn_offline = mock.Mock() + tool._valid_x86_dll = mock.Mock(return_value=True) + return tool + + def test_legacy_managed_wowpresence_is_repaired_offline(self): + tool = self._tool() + error = remote_packages.RemotePackageError("GitHub request failed: offline") + + with ( + mock.patch.object( + remote_packages, + "wowpresence_install_trust_state", + return_value="managed_unverified", + ), + mock.patch.object( + remote_packages, + "install_cached_wowpresence", + ) as cached, + mock.patch.object( + remote_packages, + "install_bundled_wowpresence", + ) as bundled, + mock.patch.object( + remote_packages, + "ensure_wowpresence_config", + ) as ensure_config, + mock.patch.object( + remote_packages, + "cache_installed_wowpresence", + ) as seed_cache, + ): + tool._recover_wowpresence_offline("C:/WoW", error) + + cached.assert_called_once_with( + "C:/WoW", + progress=tool._report_download_progress, + ) + bundled.assert_not_called() + ensure_config.assert_not_called() + seed_cache.assert_not_called() + tool._warn_offline.assert_called_once() + + def test_legacy_managed_state_is_marked_for_online_refresh(self): + tool = self._tool() + + with ( + mock.patch.object( + remote_packages, + "wowpresence_install_trust_state", + return_value="managed_unverified", + ), + mock.patch.object( + remote_packages, + "_set_managed_manifest_values", + ) as update_manifest, + ): + state = tool._prepare_wowpresence_managed_state("C:/WoW") + + self.assertEqual(state, "managed_unverified") + update_manifest.assert_called_once_with( + "C:/WoW", + remote_packages.WOWPRESENCE_MANAGED_ID, + revision="__legacy_unverified__", + ) + + def test_unmanaged_wowpresence_is_not_marked_for_refresh(self): + tool = self._tool() + + with ( + mock.patch.object( + remote_packages, + "wowpresence_install_trust_state", + return_value="unmanaged", + ), + mock.patch.object( + remote_packages, + "_set_managed_manifest_values", + ) as update_manifest, + ): + state = tool._prepare_wowpresence_managed_state("C:/WoW") + + self.assertEqual(state, "unmanaged") + update_manifest.assert_not_called() + + def test_remote_wowpresence_failure_uses_offline_recovery(self): + tool = self._tool() + tool._prepare_wowpresence_managed_state = mock.Mock() + tool._recover_wowpresence_offline = mock.Mock() + error = remote_packages.RemotePackageError("GitHub request failed: offline") + + with mock.patch.object( + remote_packages, + "install_wowpresence", + side_effect=error, + ) as install: + result = tool._install_wowpresence_with_fallback("C:/WoW") + + self.assertIsNone(result) + tool._prepare_wowpresence_managed_state.assert_called_once_with("C:/WoW") + install.assert_called_once_with( + "C:/WoW", + progress=tool._report_download_progress, + ) + tool._recover_wowpresence_offline.assert_called_once_with("C:/WoW", error) + + def test_local_wowpresence_failure_is_not_hidden_by_fallback(self): + tool = self._tool() + tool._prepare_wowpresence_managed_state = mock.Mock() + tool._recover_wowpresence_offline = mock.Mock() + error = remote_packages.RemotePackageError( + "Could not prepare C:/WoW/WowPresence.dll for replacement. Close WoW and try again." + ) + + with mock.patch.object( + remote_packages, + "install_wowpresence", + side_effect=error, + ): + with self.assertRaisesRegex( + RuntimeError, + "WowPresence installation failed locally", + ): + tool._install_wowpresence_with_fallback("C:/WoW") + + tool._recover_wowpresence_offline.assert_not_called() + + def test_wowpresence_source_failure_classifier_rejects_local_io(self): + tool = self._tool() + + self.assertTrue( + tool._wowpresence_source_failure( + remote_packages.RemotePackageError("GitHub request failed: offline") + ) + ) + self.assertTrue( + tool._wowpresence_source_failure( + remote_packages.RemotePackageError( + "SHA-256 mismatch for downloaded file (expected a, got b)." + ) + ) + ) + self.assertTrue( + tool._wowpresence_source_failure( + remote_packages.RemotePackageError( + "WowPresence.dll is not a valid Windows PE binary (missing MZ header)." + ) + ) + ) + self.assertFalse( + tool._wowpresence_source_failure( + remote_packages.RemotePackageError( + "Could not prepare C:/WoW/WowPresence.dll for replacement." + ) + ) + ) + self.assertFalse( + tool._wowpresence_source_failure( + remote_packages.RemotePackageError( + "Could not validate WowPresence.dll: permission denied" + ) + ) + ) + + +if __name__ == "__main__": + unittest.main()