chore(release): document hardening and verify complete source package composition
This commit is contained in:
@@ -0,0 +1,78 @@
|
||||
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()
|
||||
Reference in New Issue
Block a user