mirror of
https://github.com/Felitendo/spotifast.git
synced 2026-11-01 17:33:26 +01:00
74 lines
3.4 KiB
Python
74 lines
3.4 KiB
Python
#!/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"""<component type="desktop-application">
|
|
<id>{app_id}</id><name>Fastpotify</name>
|
|
<launchable type="desktop-id">{app_id}.desktop</launchable>
|
|
<description><p>Existing release description.</p></description>
|
|
<releases><release version="{version}" date="2026-09-14" /></releases>
|
|
</component>"""
|
|
|
|
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()
|