File size: 3,694 Bytes
45b1179
 
 
 
8595143
 
 
45b1179
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
baaa888
8595143
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
baaa888
8595143
baaa888
 
 
8595143
 
 
 
 
baaa888
27d6159
 
 
 
 
 
 
baaa888
 
 
 
27d6159
 
8595143
 
 
 
 
 
 
 
 
 
45b1179
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
from app.modules.places.infrastructure.main_api_place_source import (
    MainApiPlacesClient,
    place_to_source_record,
)
from app.modules.places.infrastructure.place_semantic_document import (
    place_tag_catalog,
)


def test_place_to_source_record_maps_api_place() -> None:
    record = place_to_source_record(
        {
            "id": "place_123",
            "name": "Cafe Centro",
            "category": "cafe",
            "city": "Tuxtla Gutierrez",
            "state": "Chiapas",
            "source": "osm",
            "tags": ["cafe", "tranquilo"],
            "description": "Un lugar para platicar.",
        }
    )

    assert record is not None
    assert record.id == "place_123"
    assert "Cafe Centro" in record.document
    assert record.metadata["name"] == "Cafe Centro"
    assert record.metadata["category"] == "cafe"
    assert record.metadata["source"] == "osm"
    assert record.is_active is True
    assert len(record.content_hash) == 64


def test_place_to_source_record_resolves_tags_without_token_repetition() -> None:
    record = place_to_source_record(
        {
            "id": "place_weighted",
            "name": "Nombre Ambiguo",
            "category": "shopping",
            "source": "osm",
            "address": "Direccion que no debe influir",
            "tags": [29, 187, 9999],
            "description": "Venta de prendas y accesorios.",
        }
    )

    assert record is not None
    assert record.metadata["tags"] == "Compras,Ropa barata"
    assert record.metadata["tag_ids"] == [29, 187, 9999]
    assert record.metadata["unknown_tag_ids"] == [9999]
    assert record.metadata["semantic_document_version"] == "structured-place-v3"
    assert record.document.count("Nombre Ambiguo") == 1
    assert record.document.count("Venta de prendas y accesorios") == 1
    assert record.document.count("Compras Ropa barata") == 1
    assert "Tipo registrado: shopping." in record.document
    assert "osm" not in record.document
    assert "Direccion que no debe influir" not in record.document
    assert "9999" not in record.document


def test_semantic_documents_keep_source_category_without_manual_expansion() -> None:
    park = place_to_source_record(
        {"id": "park", "name": "Area Uno", "category": "park"}
    )
    shopping = place_to_source_record(
        {"id": "shopping", "name": "Area Dos", "category": "shopping"}
    )

    assert park is not None and "Tipo registrado: park." in park.document
    assert shopping is not None and "Tipo registrado: shopping." in shopping.document
    assert "park parque naturaleza" not in park.document
    assert "shopping compras tiendas" not in shopping.document


def test_place_tag_catalog_contains_complete_supplied_mapping() -> None:
    catalog = place_tag_catalog()

    assert len(catalog) == 310
    assert catalog[12].name == "Tranquilo"
    assert catalog[33].name == "Café"
    assert catalog[187].name == "Ropa barata"
    assert catalog[250].name == "museum"


def test_extract_places_supports_common_response_shapes() -> None:
    payload = {
        "data": {
            "items": [
                {"id": "place_1", "name": "Cafe"},
                {"id": "place_2", "name": "Parque"},
            ]
        }
    }

    places = MainApiPlacesClient._extract_places(payload)

    assert [place["id"] for place in places] == ["place_1", "place_2"]


def test_place_source_extracts_cursor_metadata() -> None:
    payload = {
        "data": [],
        "next_cursor": "cursor_abc",
        "has_more": True,
    }

    assert MainApiPlacesClient._extract_next_cursor(payload) == "cursor_abc"
    assert MainApiPlacesClient._extract_has_more(payload) is True