97 lines
2.8 KiB
Python
97 lines
2.8 KiB
Python
from __future__ import annotations
|
|
|
|
from unittest.mock import patch
|
|
import unittest
|
|
|
|
from ptlinux.self_update import (
|
|
DEFAULT_PRERELEASE_UPDATE_MANIFEST_URL,
|
|
DEFAULT_STABLE_UPDATE_MANIFEST_URL,
|
|
UpdateManifest,
|
|
check_for_launcher_update,
|
|
configured_manifest_urls,
|
|
)
|
|
|
|
|
|
def manifest(version: str, channel: str, *, status: str = "active") -> UpdateManifest:
|
|
return UpdateManifest(
|
|
schema=1,
|
|
channel=channel,
|
|
version=version,
|
|
minimum_updater_version="0.5.0",
|
|
archive_url=f"https://example.test/PristonTale-EU-{version}.tar.gz",
|
|
archive_sha256="a" * 64,
|
|
archive_size=123,
|
|
published_at="2026-09-08T00:00:00Z",
|
|
notes_url=f"https://example.test/releases/v{version}",
|
|
tag=f"v{version}",
|
|
status=status,
|
|
)
|
|
|
|
|
|
class ChannelDiscoveryTests(unittest.TestCase):
|
|
def test_stable_fetches_only_stable_metadata(self) -> None:
|
|
self.assertEqual(
|
|
configured_manifest_urls(channel="stable", environment={}),
|
|
(("stable", DEFAULT_STABLE_UPDATE_MANIFEST_URL, False),),
|
|
)
|
|
|
|
def test_prerelease_fetches_stable_and_optional_prerelease_metadata(self) -> None:
|
|
self.assertEqual(
|
|
configured_manifest_urls(channel="prerelease", environment={}),
|
|
(
|
|
("stable", DEFAULT_STABLE_UPDATE_MANIFEST_URL, False),
|
|
("prerelease", DEFAULT_PRERELEASE_UPDATE_MANIFEST_URL, True),
|
|
),
|
|
)
|
|
|
|
def test_stable_client_ignores_a_newer_prerelease(self) -> None:
|
|
with patch(
|
|
"ptlinux.self_update._fetch_authenticated_manifest",
|
|
return_value=manifest("1.8.0", "stable"),
|
|
) as fetch:
|
|
check = check_for_launcher_update(
|
|
current_version="1.7.4",
|
|
channel="stable",
|
|
)
|
|
|
|
self.assertEqual(fetch.call_count, 1)
|
|
self.assertEqual(check.latest_version, "1.8.0")
|
|
self.assertEqual(check.manifest.channel, "stable")
|
|
self.assertTrue(check.available)
|
|
|
|
def test_prerelease_client_chooses_the_highest_eligible_release(self) -> None:
|
|
def fetch(url: str, *_args: object, **_kwargs: object) -> UpdateManifest:
|
|
if url == DEFAULT_STABLE_UPDATE_MANIFEST_URL:
|
|
return manifest("1.8.0", "stable")
|
|
return manifest("1.9.0-beta.2", "prerelease")
|
|
|
|
with patch(
|
|
"ptlinux.self_update._fetch_authenticated_manifest",
|
|
side_effect=fetch,
|
|
):
|
|
check = check_for_launcher_update(
|
|
current_version="1.9.0-beta.1",
|
|
channel="prerelease",
|
|
)
|
|
|
|
self.assertEqual(check.latest_version, "1.9.0-beta.2")
|
|
self.assertEqual(check.manifest.channel, "prerelease")
|
|
self.assertTrue(check.available)
|
|
|
|
def test_returning_to_stable_never_offers_an_older_stable_release(self) -> None:
|
|
with patch(
|
|
"ptlinux.self_update._fetch_authenticated_manifest",
|
|
return_value=manifest("1.8.0", "stable"),
|
|
):
|
|
check = check_for_launcher_update(
|
|
current_version="1.9.0-beta.2",
|
|
channel="stable",
|
|
)
|
|
|
|
self.assertFalse(check.available)
|
|
self.assertIn("will not downgrade", check.reason)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main()
|