from __future__ import annotations import json from pathlib import Path import subprocess import sys import tempfile import unittest META_ROOT = Path(__file__).resolve().parents[1] SCRIPT = META_ROOT / "tools" / "release" / "synchronize-webui-package-metadata.py" class SynchronizeWebuiPackageMetadataTests(unittest.TestCase): def test_copies_peer_contract_without_changing_publish_paths(self) -> None: with tempfile.TemporaryDirectory() as directory: repo = Path(directory) (repo / "webui").mkdir() (repo / "package.json").write_text( json.dumps( { "name": "@govoplan/example-webui", "exports": {".": "./webui/src/index.ts"}, "peerDependencies": {"vite": "^6"}, } ) ) (repo / "webui" / "package.json").write_text( json.dumps( { "name": "@govoplan/example-webui", "peerDependencies": {"vite": "^7"}, "peerDependenciesMeta": {"vite": {"optional": True}}, } ) ) subprocess.run( [sys.executable, str(SCRIPT), "--repo", str(repo)], check=True, capture_output=True, text=True, ) package = json.loads((repo / "package.json").read_text()) self.assertEqual({"vite": "^7"}, package["peerDependencies"]) self.assertEqual({"vite": {"optional": True}}, package["peerDependenciesMeta"]) self.assertEqual({".": "./webui/src/index.ts"}, package["exports"]) def test_leaves_distinct_root_and_webui_packages_separate(self) -> None: with tempfile.TemporaryDirectory() as directory: repo = Path(directory) (repo / "webui").mkdir() (repo / "package.json").write_text(json.dumps({"name": "@govoplan/one"})) (repo / "webui" / "package.json").write_text(json.dumps({"name": "@govoplan/two"})) subprocess.run( [sys.executable, str(SCRIPT), "--repo", str(repo)], check=True, capture_output=True, text=True, ) root = json.loads((repo / "package.json").read_text()) self.assertEqual("@govoplan/one", root["name"]) self.assertNotIn("peerDependencies", root) if __name__ == "__main__": unittest.main()