Files
planeMapper/tests/provisioning/test_tiles.py
T
Matt Edholm 4aeeefb488 Implement story 1.5: provisioning execution tile download cache validation wifi kill
Add tiles.py, airspace.py, wifi.join_home_wifi, portal /submit route, and rewire
provision.py main loop; all tasks and quality gates pass (56 tests, ruff clean).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-22 22:54:34 -04:00

72 lines
2.2 KiB
Python

import io
from pathlib import Path
from unittest.mock import MagicMock, patch
import pytest
from PIL import Image
from planemapper.provisioning import ProvisioningError
from planemapper.provisioning.tiles import (
download_and_composite,
lat_lon_to_tile,
validate_cache,
)
def _make_png_bytes() -> bytes:
img = Image.new("RGB", (256, 256), (200, 200, 200))
buf = io.BytesIO()
img.save(buf, format="PNG")
return buf.getvalue()
def test_lat_lon_to_tile_london() -> None:
x, y = lat_lon_to_tile(51.5, -0.1, 10)
assert x == 511
assert y == 340
def test_download_and_composite(tmp_path: Path) -> None:
bg_path = tmp_path / "background.png"
mock_resp = MagicMock()
mock_resp.content = _make_png_bytes()
mock_resp.raise_for_status = MagicMock()
with (
patch("planemapper.provisioning.tiles.requests.get", return_value=mock_resp),
patch("planemapper.provisioning.tiles.BACKGROUND_PATH", bg_path),
):
download_and_composite(51.5, -0.1, 100)
assert bg_path.exists()
with Image.open(bg_path) as img:
assert img.size == (800, 480)
def test_validate_cache_passes(tmp_path: Path) -> None:
bg_path = tmp_path / "background.png"
Image.new("RGB", (800, 480), (255, 255, 255)).save(str(bg_path))
with patch("planemapper.provisioning.tiles.BACKGROUND_PATH", bg_path):
validate_cache()
def test_validate_cache_missing(tmp_path: Path) -> None:
bg_path = tmp_path / "nonexistent.png"
with patch("planemapper.provisioning.tiles.BACKGROUND_PATH", bg_path):
with pytest.raises(ProvisioningError, match="not found"):
validate_cache()
def test_validate_cache_empty(tmp_path: Path) -> None:
bg_path = tmp_path / "background.png"
bg_path.write_bytes(b"")
with patch("planemapper.provisioning.tiles.BACKGROUND_PATH", bg_path):
with pytest.raises(ProvisioningError, match="empty"):
validate_cache()
def test_validate_cache_corrupt(tmp_path: Path) -> None:
bg_path = tmp_path / "background.png"
bg_path.write_bytes(b"not a png at all")
with patch("planemapper.provisioning.tiles.BACKGROUND_PATH", bg_path):
with pytest.raises(ProvisioningError, match="not a valid PNG"):
validate_cache()