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()