Files

77 lines
3.5 KiB
Python

#!/usr/bin/env python3
import importlib.util
import json
import tempfile
import unittest
from pathlib import Path
MODULE = Path(__file__).resolve().parents[1] / "scripts" / "build-tiles.py"
SPEC = importlib.util.spec_from_file_location("build_tiles", MODULE)
build_tiles = importlib.util.module_from_spec(SPEC)
assert SPEC.loader is not None
SPEC.loader.exec_module(build_tiles)
class BuildTilesTests(unittest.TestCase):
def test_rotation_changes_extent_and_keeps_area(self):
plain = {"north": 40.1, "south": 39.7, "east": 25.5, "west": 25.0, "rotation": 0.0}
rotated = {**plain, "rotation": 10.0}
plain_corners = build_tiles.rotated_corners(plain)
rotated_corners = build_tiles.rotated_corners(rotated)
self.assertNotEqual(plain_corners, rotated_corners)
self.assertAlmostEqual(build_tiles.polygon_area(plain_corners), build_tiles.polygon_area(rotated_corners), places=2)
def test_source_override_precedes_global(self):
config = {"global": {"minzoom": 7, "maxzoom": 12}, "sources": {"Altis.kmz": {"minzoom": 9, "maxzoom": 14}}}
self.assertEqual(build_tiles.effective_zooms(11, "Altis.kmz", config), (9, 14, True))
def test_callback_provider_accepts_safe_https_xyz_template(self):
provider = build_tiles.validate_callback_provider("https://tiles.example.org/maps/{z}/{x}/{y}.png")
self.assertEqual(provider.origin, "https://tiles.example.org")
def test_callback_provider_rejects_missing_or_unsafe_template(self):
with self.assertRaises(build_tiles.ProviderValidationError):
build_tiles.validate_callback_provider("http://tiles.example.org/{z}/{x}/{y}.png")
with self.assertRaises(build_tiles.ProviderValidationError):
build_tiles.validate_callback_provider("https://127.0.0.1/{z}/{x}/{y}.png")
with self.assertRaises(build_tiles.ProviderValidationError):
build_tiles.validate_callback_provider("https://tiles.example.org/{z}/{x}.png")
def test_config_normalizes_source_key(self):
with tempfile.TemporaryDirectory() as directory:
path = Path(directory) / "maps.json"
path.write_text(json.dumps({"global": {}, "sources": {"nested\\map.kmz": {"minzoom": 8}}}))
self.assertIn("nested/map.kmz", build_tiles.read_config(path)["sources"])
def test_publish_replaces_generated_output_directory(self):
with tempfile.TemporaryDirectory() as directory:
root = Path(directory)
stage = root / "stage"
output = root / "tiles"
stage.mkdir()
output.mkdir()
(stage / "metadata.json").write_text("new")
(stage / "8").mkdir()
(stage / "8" / "tile.png").write_text("tile")
(output / "stale.png").write_text("stale")
build_tiles.publish(stage, output)
self.assertFalse((output / "stale.png").exists())
self.assertEqual((output / "metadata.json").read_text(), "new")
self.assertTrue((output / "8" / "tile.png").is_file())
def test_empty_tile_is_opaque_white_png(self):
with tempfile.TemporaryDirectory() as directory:
target = Path(directory)
build_tiles.write_empty_tile(target)
with build_tiles.Image.open(target / "empty.png") as image:
self.assertEqual(image.mode, "RGBA")
self.assertEqual(image.size, (256, 256))
self.assertEqual(image.getpixel((0, 0)), (255, 255, 255, 255))
if __name__ == "__main__":
unittest.main()