Files
planeMapper/tests/provisioning/test_portal.py
T
Matt Edholm 6231e3157e Implement story 1.4: location resolution ICAO and address
Adds location.resolve() with ICAO CSV lookup and Nominatim geocoding,
POST /find-location portal route with inline confirmation/error display,
and full test coverage with mocked network calls.

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

72 lines
2.0 KiB
Python

from unittest.mock import patch
import pytest
from planemapper.provisioning.portal import app
@pytest.fixture
def client():
app.config["TESTING"] = True
with app.test_client() as c:
yield c
def test_index_returns_200(client) -> None:
resp = client.get("/")
assert resp.status_code == 200
def test_index_contains_form_fields(client) -> None:
resp = client.get("/")
data = resp.data.decode()
assert 'name="location"' in data
assert 'name="radius"' in data
assert 'name="wifi_ssid"' in data
assert 'name="wifi_password"' in data
assert "Find location" in data
assert "Set up device" in data
def test_generate_204_redirects_to_index(client) -> None:
resp = client.get("/generate_204")
assert resp.status_code in (301, 302)
assert resp.headers["Location"].endswith("/")
def test_hotspot_detect_redirects_to_index(client) -> None:
resp = client.get("/hotspot-detect.html")
assert resp.status_code in (301, 302)
def test_ncsi_redirects_to_index(client) -> None:
resp = client.get("/ncsi.txt")
assert resp.status_code in (301, 302)
def test_unknown_route_redirects_to_index(client) -> None:
resp = client.get("/some/random/path")
assert resp.status_code in (301, 302)
def test_find_location_success(client) -> None:
mock_resolve = patch(
"planemapper.provisioning.portal.location.resolve", return_value=(51.5, -0.1, "London")
)
with mock_resolve:
resp = client.post("/find-location", data={"location": "EGLL", "radius": "100"})
assert resp.status_code == 200
data = resp.data.decode()
assert "London" in data
assert "51.5" in data
def test_find_location_error(client) -> None:
with patch(
"planemapper.provisioning.portal.location.resolve",
side_effect=ValueError("ICAO code not found — try an address instead"),
):
resp = client.post("/find-location", data={"location": "ZZZZ", "radius": "100"})
assert resp.status_code == 200
assert "ICAO code not found" in resp.data.decode()