aboutsummaryrefslogtreecommitdiffziptar.gz
path: root/tests/test_deploy.py
diff options
context:
space:
mode:
authorgodosa <godosa@godosa.eu>2026-10-07 00:14:38 +0200
committergodosa <godosa@godosa.eu>2026-10-07 00:14:38 +0200
commit3443c1c65e9f1753e1e656b35d08416c1fa298f2 (patch)
tree4e43236f460145a4d75d1b4616dcb7aa6ef08f51 /tests/test_deploy.py
downloadworldmap-viewer-3443c1c65e9f1753e1e656b35d08416c1fa298f2.tar.gz
worldmap-viewer-3443c1c65e9f1753e1e656b35d08416c1fa298f2.zip
worldmap-viewer: initial public history
Diffstat (limited to 'tests/test_deploy.py')
-rw-r--r--tests/test_deploy.py102
1 files changed, 102 insertions, 0 deletions
diff --git a/tests/test_deploy.py b/tests/test_deploy.py
new file mode 100644
index 0000000..679e621
--- /dev/null
+++ b/tests/test_deploy.py
@@ -0,0 +1,102 @@
+import contextlib
+import io
+import shutil
+import tempfile
+import unittest
+from pathlib import Path
+
+from mapgen import config as C
+from mapgen.testing import built_world
+
+import deploy
+import refine
+import servecache
+import tiles
+
+
+class BundleTest(unittest.TestCase):
+ @classmethod
+ def setUpClass(cls):
+ cls.tmp = Path(tempfile.mkdtemp())
+ cls.root = cls.tmp / "world"
+ shutil.copytree(built_world(), cls.root) # copy2: keeps mtimes (ns)
+ out = cls.root / "out" / "r2"
+ seed = int(C.load(cls.root)[0]["build"]["seed"])
+ cls.fp = tiles.fingerprint(out, seed)
+ tag = f"v{tiles.VERSION}.{tiles.DRAW}-{cls.fp}"
+ for rel, text in {
+ f"out/r2/regions/{cls.fp}-m{refine.MODEL}/a1/cells.npz": "current area",
+ "out/r2/regions/0000000000-m7/a1/cells.npz": "an earlier build's area",
+ "out/r2/regions/areas/k1/cells.npz": "shared area results",
+ f"out/r2/tiles/{tag}/relief/5/0/0.jpg": "current tile",
+ f"out/r2/tiles/{tag}+abc/relief/5/0/0.jpg": "current tile, refined set",
+ "out/r2/tiles/v1.1-0000000000/relief/5/0/0.jpg": "old tile",
+ f"out/r2/tiles/{tag}/relief/5/0/1.jpg.part": "half written",
+ "places/pins.json": "{\"pins\": []}",
+ "places/regions.json": "{\"regions\": []}",
+ "places/views.md": "notes",
+ "exports/x.zip": "export",
+ "lore/true-gods.md": "secret",
+ "sketch/a.png": "input",
+ }.items():
+ f = cls.root / rel
+ f.parent.mkdir(parents=True, exist_ok=True)
+ f.write_text(text)
+ cls.dest = cls.tmp / "dest"
+ with contextlib.redirect_stdout(io.StringIO()):
+ cls.rc = deploy.bundle(cls.root, str(cls.dest), 2)
+
+ @classmethod
+ def tearDownClass(cls):
+ shutil.rmtree(cls.tmp)
+
+ def test_copies_what_the_public_server_reads(self):
+ self.assertEqual(self.rc, 0)
+ tag = f"v{tiles.VERSION}.{tiles.DRAW}-{self.fp}"
+ for rel in ("config/world.toml", "places/regions.json", "out/r2/cells.npz", "out/r2/fields.json",
+ f"out/r2/regions/{self.fp}-m{refine.MODEL}/a1/cells.npz", "out/r2/regions/areas/k1/cells.npz",
+ f"out/r2/tiles/{tag}/relief/5/0/0.jpg", f"out/r2/tiles/{tag}+abc/relief/5/0/0.jpg"):
+ self.assertTrue((self.dest / rel).is_file(), rel)
+
+ def test_leaves_private_stale_and_input_files_behind(self):
+ for rel in ("places/pins.json", "places/views.md", "exports", "lore", "sketch",
+ "out/r2/regions/0000000000-m7", "out/r2/tiles/v1.1-0000000000"):
+ self.assertFalse((self.dest / rel).exists(), rel)
+ self.assertFalse(list(self.dest.rglob("*.part")))
+
+ def test_the_copy_keeps_the_build_fingerprint(self):
+ seed = int(C.load(self.dest)[0]["build"]["seed"])
+ self.assertEqual(tiles.fingerprint(self.dest / "out" / "r2", seed), self.fp)
+
+ def test_a_second_bundle_keeps_the_servers_own_tiles(self):
+ mine = self.dest / "out/r2/tiles/v9.9-ffffffffff/relief/9/1/1.jpg"
+ mine.parent.mkdir(parents=True, exist_ok=True)
+ mine.write_text("rendered on the server")
+ with contextlib.redirect_stdout(io.StringIO()):
+ self.assertEqual(deploy.bundle(self.root, str(self.dest), 2), 0)
+ self.assertTrue(mine.exists())
+
+
+class DedupeWorldTest(unittest.TestCase):
+ def test_pairs_each_era_cache_with_earlier_peers(self):
+ tmp = Path(tempfile.mkdtemp())
+ try:
+ out = tmp / "out" / "r2"
+ dirs = [out / "regions" / k / f"{servecache.PREFIX}abc-v1" for k in ("aaa-m7", "bbb-m7", "ccc-m7")]
+ for d in dirs:
+ d.mkdir(parents=True)
+ (d / servecache.DONE).write_text("ok")
+ calls = []
+ orig = deploy.dedupe.dedupe_dirs
+ deploy.dedupe.dedupe_dirs = lambda new, peers: calls.append((new, sorted(peers))) or 7
+ try:
+ self.assertEqual(deploy.dedupe_world(tmp, 2), 21)
+ finally:
+ deploy.dedupe.dedupe_dirs = orig
+ self.assertEqual(calls, [(dirs[0], []), (dirs[1], [dirs[0]]), (dirs[2], [dirs[0], dirs[1]])])
+ finally:
+ shutil.rmtree(tmp)
+
+
+if __name__ == "__main__":
+ unittest.main()