Add channel-aware release tooling and updater recovery
This commit is contained in:
96
release_tests/test_channel_discovery.py
Normal file
96
release_tests/test_channel_discovery.py
Normal file
@@ -0,0 +1,96 @@
|
||||
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()
|
||||
Reference in New Issue
Block a user