4aeeefb488
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>
72 lines
2.2 KiB
Python
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()
|