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"]