from __future__ import annotations import json import unittest from scripts.prepare_channel_metadata import prepare_channel_metadata from scripts.release_lib import ReleaseToolError def manifest(version: str, channel: str) -> bytes: value = { "application": "PristonTale-EU", "archive": { "name": f"PristonTale-EU-{version}.tar.gz", "sha256": "a" * 64, "size": 123, "url": f"https://gitea.example.test/releases/download/v{version}/PristonTale-EU-{version}.tar.gz", }, "archive_sha256": "a" * 64, "archive_size": 123, "archive_url": f"https://gitea.example.test/releases/download/v{version}/PristonTale-EU-{version}.tar.gz", "channel": channel, "compatibility": { "config_schema": 1, "manifest_schema": 1, "minimum_config_schema": 1, "minimum_updater_version": "0.5.0", }, "minimum_updater_version": "0.5.0", "notes_url": f"https://gitea.example.test/releases/tag/v{version}", "published_at": "2026-09-08T12:00:00Z", "schema": 1, "status": "active", "tag": f"v{version}", "version": version, } return (json.dumps(value, sort_keys=True) + "\n").encode() def record(version: str, channel: str, status: str) -> dict[str, object]: return { "channel": channel, "compatibility": { "config_schema": 1, "minimum_config_schema": 1, }, "manifest_url": f"https://gitea.example.test/releases/download/v{version}/manifest.json", "status": status, "tag": f"v{version}", "version": version, } class ChannelMetadataTests(unittest.TestCase): def test_selects_latest_active_release_instead_of_withdrawn_head(self) -> None: history = { "schema": 1, "releases": [ record("1.9.0", "stable", "withdrawn"), record("1.8.0", "stable", "active"), ], } selected, prepared = prepare_channel_metadata( history, "stable", manifest("1.8.0", "stable"), ) self.assertEqual(selected["version"], "1.8.0") self.assertEqual(prepared["status"], "active") def test_marks_channel_inactive_when_no_active_release_exists(self) -> None: history = { "schema": 1, "releases": [record("1.9.0-beta.1", "prerelease", "blocked")], } selected, prepared = prepare_channel_metadata( history, "prerelease", manifest("1.9.0-beta.1", "prerelease"), ) self.assertEqual(selected["version"], "1.9.0-beta.1") self.assertEqual(prepared["status"], "blocked") def test_rejects_a_manifest_that_does_not_match_selected_history(self) -> None: history = { "schema": 1, "releases": [record("1.8.0", "stable", "active")], } with self.assertRaisesRegex(ReleaseToolError, "does not match"): prepare_channel_metadata( history, "stable", manifest("1.7.4", "stable"), ) if __name__ == "__main__": unittest.main()