79 lines
3.5 KiB
Python
79 lines
3.5 KiB
Python
from __future__ import annotations
|
|
|
|
import json
|
|
from pathlib import Path
|
|
import runpy
|
|
import tempfile
|
|
import unittest
|
|
|
|
|
|
META_ROOT = Path(__file__).resolve().parents[1]
|
|
CHECK = runpy.run_path(str(META_ROOT / "tools/checks/check-webui-package-facades.py"))
|
|
|
|
|
|
class WebuiPackageFacadeTests(unittest.TestCase):
|
|
def setUp(self) -> None:
|
|
self.temporary = tempfile.TemporaryDirectory()
|
|
self.addCleanup(self.temporary.cleanup)
|
|
self.repository = Path(self.temporary.name) / "govoplan-example"
|
|
source = self.repository / "webui/src"
|
|
source.mkdir(parents=True)
|
|
(source / "index.ts").write_text("export {};\n", encoding="utf-8")
|
|
(source / "styles.css").write_text(":root {}\n", encoding="utf-8")
|
|
self.webui = {
|
|
"name": "@govoplan/example-webui", "version": "0.1.2", "type": "module",
|
|
"main": "src/index.ts",
|
|
"exports": {".": {"import": "./src/index.ts"}, "./styles.css": "./src/styles.css"},
|
|
"peerDependencies": {"@govoplan/core-webui": "^0.1.45"},
|
|
"peerDependenciesMeta": {"@govoplan/core-webui": {"optional": True}},
|
|
}
|
|
self.root = {**self.webui, **{
|
|
field: CHECK["prefixed_entries"](self.webui[field])
|
|
for field in CHECK["ENTRY_FIELDS"] if field in self.webui
|
|
}}
|
|
self.write_manifests()
|
|
|
|
def write_manifests(self) -> None:
|
|
(self.repository / "webui/package.json").write_text(json.dumps(self.webui), encoding="utf-8")
|
|
(self.repository / "package.json").write_text(json.dumps(self.root), encoding="utf-8")
|
|
|
|
def issues(self) -> list[str]:
|
|
return CHECK["facade_issues"](self.repository, package_name="@govoplan/example-webui")
|
|
|
|
def test_matching_conditional_and_css_entries_are_accepted(self) -> None:
|
|
self.assertEqual([], self.issues())
|
|
|
|
def test_missing_root_or_generic_package_is_rejected(self) -> None:
|
|
(self.repository / "package.json").unlink()
|
|
self.assertIn("cannot read", " ".join(self.issues()))
|
|
self.root = {"name": "@govoplan/example", "version": "0.1.2"}
|
|
self.write_manifests()
|
|
self.assertIn("root name differs", " ".join(self.issues()))
|
|
self.assertIn("no WebUI entry point", " ".join(self.issues()))
|
|
|
|
def test_peer_drift_or_missing_entry_is_rejected(self) -> None:
|
|
self.root["peerDependencies"] = {"@govoplan/core-webui": "^9.0.0"}
|
|
self.write_manifests()
|
|
self.assertIn("peerDependencies differs", " ".join(self.issues()))
|
|
(self.repository / "webui/src/styles.css").unlink()
|
|
self.assertIn("missing exports entry", " ".join(self.issues()))
|
|
|
|
def test_entry_cannot_escape_webui_even_if_it_exists(self) -> None:
|
|
(self.repository / "outside.ts").write_text("export {};\n", encoding="utf-8")
|
|
self.root["main"] = "webui/../outside.ts"
|
|
self.write_manifests()
|
|
self.assertIn("escapes webui/", " ".join(self.issues()))
|
|
|
|
def test_release_composition_checks_only_declared_module_sources(self) -> None:
|
|
core = self.repository.parent / "govoplan-core/webui"
|
|
core.mkdir(parents=True)
|
|
(core / "package.release.json").write_text(json.dumps({"dependencies": {
|
|
"react": "19.2.7",
|
|
"@govoplan/example-webui": "git+ssh://git@git.add-ideas.de/GovOPlaN/govoplan-example.git#v0.1.2",
|
|
}}), encoding="utf-8")
|
|
self.assertEqual((1, []), CHECK["check_composition"](self.repository.parent))
|
|
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main()
|