Files
libretro/tests/test_site_write.py
Abdessamad Derraz f8fe1d1464 test: cover the site writer and its sweep
The generated tree is swept rather than deleted, which puts a delete on
the build's critical path with only an end-to-end comparison behind it.
Fourteen tests hold the three behaviours that matter: front matter is
recognised and stripped for the body comparison but not for the
decoration's own, a rebuild on unchanged inputs writes nothing and keeps
its front matter, and the sweep removes a page only when nothing
produced it. Reverting any of the three fails at least two of them.
2026-08-12 14:24:05 +02:00

161 lines
6.4 KiB
Python

#!/usr/bin/env python3
"""Writing the site: what gets rewritten, and what gets deleted.
The generated tree used to be deleted before each build. Every page was then
new, so the comparison that skips unchanged files had no earlier version to
compare against and the whole site was rewritten for the clock alone: two
consecutive builds on identical inputs differed on 1034 files. Sweeping
instead means a page is deleted only once nothing produces it, which puts a
delete on the critical path and is why these tests exist.
"""
from __future__ import annotations
import sys
import tempfile
import unittest
from pathlib import Path
REPO_ROOT = Path(__file__).resolve().parent.parent
sys.path.insert(0, str(REPO_ROOT / "scripts"))
import sitewrite # noqa: E402
BODY = "# Title\n\nSome prose.\n\n*Generated on 2026-01-01T00:00:00Z*\n"
FRONT = (
"---\n"
"generated_by: retrobios-site\n"
'title: "Title"\n'
"---\n\n"
'<script type="application/ld+json">\n{"@type":"TechArticle"}\n</script>\n\n'
)
class Undecorate(unittest.TestCase):
def test_it_removes_front_matter_and_structured_data(self):
self.assertEqual(sitewrite._undecorated(FRONT + BODY), BODY)
def test_a_plain_body_is_returned_unchanged(self):
self.assertEqual(sitewrite._undecorated(BODY), BODY)
def test_front_matter_this_build_did_not_write_is_left_alone(self):
"""A hand-maintained page with its own front matter is not ours."""
foreign = '---\ntitle: "Hand written"\n---\n\nBody.\n'
self.assertEqual(sitewrite._undecorated(foreign), foreign)
class TwoPassWriting(unittest.TestCase):
"""A page is written as a body, then rewritten wrapped in front matter."""
def setUp(self):
self._tmp = tempfile.TemporaryDirectory()
self.page = Path(self._tmp.name) / "page.md"
sitewrite._produced.clear()
def tearDown(self):
sitewrite._produced.clear()
self._tmp.cleanup()
def _build(self, body: str) -> tuple[bool, bool]:
wrote_body = sitewrite.write_if_changed(str(self.page), body)
wrote_page = sitewrite.write_decorated(self.page, FRONT + body)
return wrote_body, wrote_page
def test_the_first_build_writes_and_decorates(self):
self.assertEqual(self._build(BODY), (True, True))
self.assertTrue(self.page.read_text().startswith("---\n"))
self.assertIn("ld+json", self.page.read_text())
def test_an_identical_rebuild_writes_nothing(self):
self._build(BODY)
self.assertEqual(self._build(BODY), (False, False))
def test_a_rebuild_keeps_the_front_matter(self):
"""Normalizing on both sides made the decoration look like a no-op."""
self._build(BODY)
self._build(BODY)
self.assertIn("ld+json", self.page.read_text())
def test_only_the_timestamp_moving_writes_nothing(self):
self._build(BODY)
moved = BODY.replace("2026-01-01T00:00:00Z", "2027-06-30T12:00:00Z")
self.assertEqual(self._build(moved), (False, False))
self.assertIn("2026-01-01", self.page.read_text())
def test_a_changed_body_is_written(self):
self._build(BODY)
self.assertEqual(self._build(BODY + "\nNew section.\n")[0], True)
self.assertIn("New section.", self.page.read_text())
self.assertIn("ld+json", self.page.read_text())
class Sweep(unittest.TestCase):
def setUp(self):
self._tmp = tempfile.TemporaryDirectory()
self.docs = Path(self._tmp.name)
sitewrite._produced.clear()
for relative in ("emulators/kept.md", "emulators/nested/deep.md",
"emulators/stale.md", "platforms/kept.md",
"untouched/manual.md"):
path = self.docs / relative
path.parent.mkdir(parents=True, exist_ok=True)
path.write_text("x")
def tearDown(self):
sitewrite._produced.clear()
self._tmp.cleanup()
def _produce(self, *relatives: str) -> None:
for relative in relatives:
sitewrite._record(self.docs / relative)
def test_it_removes_only_what_nothing_produced(self):
self._produce("emulators/kept.md", "emulators/nested/deep.md",
"platforms/kept.md")
removed = sitewrite._sweep_generated(self.docs, ["emulators", "platforms"])
self.assertEqual(removed, 1)
self.assertFalse((self.docs / "emulators/stale.md").exists())
self.assertTrue((self.docs / "emulators/kept.md").exists())
self.assertTrue((self.docs / "emulators/nested/deep.md").exists())
def test_a_directory_outside_the_list_is_never_touched(self):
self._produce("emulators/kept.md", "emulators/nested/deep.md",
"emulators/stale.md")
sitewrite._sweep_generated(self.docs, ["emulators"])
self.assertTrue((self.docs / "untouched/manual.md").exists())
self.assertTrue((self.docs / "platforms/kept.md").exists())
def test_an_emptied_directory_is_pruned(self):
self._produce("emulators/kept.md", "emulators/stale.md")
sitewrite._sweep_generated(self.docs, ["emulators"])
self.assertFalse((self.docs / "emulators/nested").exists())
self.assertTrue((self.docs / "emulators").is_dir())
def test_a_missing_directory_is_not_an_error(self):
self.assertEqual(sitewrite._sweep_generated(self.docs, ["absent"]), 0)
def test_producing_nothing_empties_the_generated_tree(self):
"""The wipe this replaced, reached only when the build produced nothing."""
removed = sitewrite._sweep_generated(self.docs, ["emulators"])
self.assertEqual(removed, 3)
self.assertTrue((self.docs / "untouched/manual.md").exists())
def test_the_produced_set_survives_a_second_build_in_one_process(self):
"""It is never reset, so a second run can only sweep less, never more.
Deleting a page a previous run produced would be the dangerous
direction; sparing one is merely stale, and the next fresh process
removes it.
"""
self._produce("emulators/kept.md")
sitewrite._sweep_generated(self.docs, ["emulators"])
survivors = {p.name for p in (self.docs / "emulators").rglob("*")
if p.is_file()}
self.assertEqual(survivors, {"kept.md"})
(self.docs / "emulators" / "kept.md").write_text("y")
self.assertEqual(sitewrite._sweep_generated(self.docs, ["emulators"]), 0)
if __name__ == "__main__":
unittest.main()