Test WowPresence legacy and local failure handling
This commit is contained in:
@@ -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()
|
||||||
Reference in New Issue
Block a user