import contextlib import hashlib import importlib.util import io import json from pathlib import Path import struct import sys import tempfile import unittest import zipfile sys.path.insert(0, str(Path(__file__).resolve().parents[1])) from plugin_catalog import archive_name, tag_version import release spec = importlib.util.spec_from_file_location("package_windows", Path(__file__).resolve().parents[1] / "package-windows.py") packaging = importlib.util.module_from_spec(spec) spec.loader.exec_module(packaging) class FakeGitea: def __init__(self): self.release = None self.bytes = {} self.calls = [] self.tag_exists = True self.fail_upload = False def request(self, method, path, data=None, missing=False): self.calls.append((method, path, data)) if path.startswith("/tags/"): return {"name": path.split("/")[-1]} if self.tag_exists else None if method == "GET": return self.release if method == "POST" and path == "/releases": self.release = dict(data, id=7, assets=[]) return self.release if method == "PATCH": self.release.update(data) return self.release raise AssertionError((method, path)) def upload(self, release_id, path): if self.fail_upload and path.name.endswith(".sha256"): raise RuntimeError("simulated interruption") self.calls.append(("UPLOAD", path.name, None)) url = "https://gitea.invalid/download/" + path.name self.bytes[url] = path.read_bytes() asset = {"name": path.name, "browser_download_url": url} self.release["assets"].append(asset) return asset def download(self, url): return self.bytes[url] class ReleaseTests(unittest.TestCase): def setUp(self): self.temp = tempfile.TemporaryDirectory() self.addCleanup(self.temp.cleanup) self.root = Path(self.temp.name) self.folder = self.root / "dist/x86_64-pc-windows-gnu" self.folder.mkdir(parents=True) catalog = {} for plugin, name, version in [("rivet", "Rivet", "0.3.0"), ("patina", "Patina", "0.1.0")]: manifest = f"plugins/{plugin}/plugin/Cargo.toml" catalog[plugin] = {"name": name, "description": name + " processor", "manifest": manifest, "documentation": f"docs/{plugin}"} self.write(manifest, f'[package]\nname="{plugin}"\nversion="{version}"\n') self.write(f"docs/{plugin}/README.md", name + " guide") self.write(f"docs/{plugin}/CHANGELOG.md", f"# Changelog\n\n## {version}\n\nFirst {name} release.\n") self.write(f"dist/x86_64-pc-windows-gnu/docs/{plugin}/README.md", name + " guide") self.write(f"dist/x86_64-pc-windows-gnu/docs/{plugin}/CHANGELOG.md", f"# Changelog\n\n## {version}\n\nFirst {name} release.\n") binary = bytearray(160) binary[:2] = b"MZ" struct.pack_into("