Test WowPresence legacy and local failure handling

This commit is contained in:
2026-09-04 08:32:32 +02:00
parent 8658700a76
commit 600719652e
+177
View File
@@ -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()