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