#!/usr/bin/env python3 """Release identity changes must keep the packaged version honest.""" import importlib.util from pathlib import Path import os import subprocess import sys import tempfile import unittest from unittest.mock import patch import xml.etree.ElementTree as ET sys.dont_write_bytecode = True spec = importlib.util.spec_from_file_location( "prepare_metainfo", Path(__file__).with_name("prepare-metainfo.py") ) metainfo = importlib.util.module_from_spec(spec) spec.loader.exec_module(metainfo) class ReleaseMetainfoTests(unittest.TestCase): def fixture(self, app_id=metainfo.LEGACY_ID, version="0.8.0"): return f""" {app_id}Fastpotify {app_id}.desktop

Existing release description.

""" def test_renames_old_identity_without_changing_release_details(self): result = ET.fromstring(metainfo.rename_metainfo(self.fixture(), "0.8.0")) self.assertEqual(result.findtext("id"), metainfo.APP_ID) self.assertEqual(result.findtext("launchable"), metainfo.APP_ID + ".desktop") self.assertEqual(result.findtext("name"), "Spotifast") self.assertEqual(result.findtext("description/p"), "Existing release description.") self.assertEqual(result.find("releases/release").attrib, {"version": "0.8.0", "date": "2026-09-14"}) def test_current_identity_is_idempotent(self): first = metainfo.rename_metainfo(self.fixture(metainfo.APP_ID), "0.8.0") self.assertEqual(metainfo.rename_metainfo(first, "0.8.0"), first) def test_rejects_another_version_or_application(self): for contents in [self.fixture(version="0.8.1"), self.fixture("org.example.App"), self.fixture().replace(metainfo.LEGACY_ID + ".desktop", "wrong.desktop")]: with self.subTest(contents=contents), self.assertRaises(ValueError): metainfo.rename_metainfo(contents, "0.8.0") def test_reads_the_tag_when_the_checkout_owner_differs(self): with tempfile.TemporaryDirectory() as directory: root = Path(directory) original = root / "packaging/flatpak" / (metainfo.LEGACY_ID + ".metainfo.xml") original.parent.mkdir(parents=True) original.write_text(self.fixture()) def git(*args): return subprocess.check_output(["git", *args], cwd=root, stderr=subprocess.DEVNULL) git("init") git("add", ".") git("-c", "user.name=Metadata Test", "-c", "user.email=test@example.invalid", "-c", "commit.gpgsign=false", "commit", "-m", "Release fixture") git("tag", "v0.8.0") # The working copy differs; preparation must still read the tag. original.write_text(self.fixture(version="0.8.1")) with patch.dict(os.environ, {"GIT_TEST_ASSUME_DIFFERENT_OWNER": "1"}): result = metainfo.release_metainfo(root, "v0.8.0") component = ET.fromstring(result) self.assertEqual(component.findtext("id"), metainfo.APP_ID) self.assertEqual(component.find("releases/release").get("version"), "0.8.0") if __name__ == "__main__": unittest.main()