103 lines
2.7 KiB
Python
103 lines
2.7 KiB
Python
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()
|