Spaces:
Running
Running
File size: 3,045 Bytes
008947a dbea2d0 008947a d79b6e6 008947a | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 | from __future__ import annotations
from pathlib import Path
from fastapi.testclient import TestClient
from backend.main import app, service
from maptoposter.models import MapDataRef
client = TestClient(app)
def poster_payload() -> dict[str, object]:
return {
"location": {"display_name": "Beijing", "latitude": 39.9042, "longitude": 116.4074, "country": "China"},
"bbox": {"west": 116.3, "south": 39.8, "east": 116.5, "north": 40.0},
"style_id": "japanese_ink",
"typography": {"title": "BEIJING"},
"layout": "classic",
"layers": {},
"size": {"preset": "3:4"},
}
def test_catalog_endpoints() -> None:
assert client.get("/api/v1/health").json()["status"] == "ok"
assert len(client.get("/api/v1/styles").json()) >= 5
assert len(client.get("/api/v1/layouts").json()) == 5
assert {item["id"] for item in client.get("/api/v1/sizes").json()} >= {
"3:4",
"4:3",
"16:9",
"1:1",
"A4",
"A4-landscape",
}
def test_prepare_preview_and_export_contract(monkeypatch, tmp_path) -> None:
key = "a" * 64
monkeypatch.setattr(service, "prepare_map", lambda config: MapDataRef(key, Path(tmp_path), True))
monkeypatch.setattr(service, "render_preview", lambda reference, config: b"\x89PNG\r\n")
monkeypatch.setattr(service, "export_poster", lambda reference, config, export: b"%PDF-test")
prepared = client.post("/api/v1/map-data/prepare", json=poster_payload())
assert prepared.status_code == 200 and prepared.json()["cache_hit"] is True
preview = client.post("/api/v1/posters/preview", json={"map_data_id": key, "poster": poster_payload()})
assert preview.status_code == 200 and preview.headers["content-type"] == "image/png"
exported = client.post(
"/api/v1/posters/export",
json={"map_data_id": key, "poster": poster_payload(), "format": "pdf", "dpi": 300},
)
assert exported.status_code == 200
assert "beijing-japanese-ink" in exported.headers["content-disposition"]
def test_prepare_keeps_selected_bbox_for_portrait_ratio(monkeypatch, tmp_path) -> None:
key = "b" * 64
captured = {}
def prepare(config):
captured["bbox"] = config.map.viewport.bbox
return MapDataRef(key, Path(tmp_path), True)
monkeypatch.setattr(service, "prepare_map", prepare)
payload = poster_payload()
payload["bbox"] = {"west": 116.3, "south": 39.8, "east": 116.5, "north": 40.0}
payload["size"] = {"preset": "3:4"}
response = client.post("/api/v1/map-data/prepare", json=payload)
assert response.status_code == 200
assert captured["bbox"].as_tuple() == (116.3, 39.8, 116.5, 40.0)
def test_invalid_coordinate_returns_clear_error(monkeypatch) -> None:
response = client.post(
"/api/v1/map-data/prepare",
json={**poster_payload(), "location": {"display_name": "Invalid", "latitude": 95, "longitude": 0}},
)
assert response.status_code == 400
assert "Latitude" in response.json()["detail"]
|