]> git.openstreetmap.org Git - nominatim.git/blob - test/python/api/test_api_details.py
move sanitized names into PlaceInfo
[nominatim.git] / test / python / api / test_api_details.py
1 # SPDX-License-Identifier: GPL-3.0-or-later
2 #
3 # This file is part of Nominatim. (https://nominatim.org)
4 #
5 # Copyright (C) 2025 by the Nominatim developer community.
6 # For a full list of authors see the git log.
7 """
8 Tests for details API call.
9 """
10 import datetime as dt
11
12 import pytest
13
14 import nominatim_api as napi
15
16
17 @pytest.mark.parametrize('idobj', (napi.PlaceID(332), napi.OsmID('W', 4),
18                                    napi.OsmID('W', 4, 'highway')))
19 def test_lookup_in_placex(apiobj, frontend, idobj):
20     import_date = dt.datetime(2022, 12, 7, 14, 14, 46, 0)
21     apiobj.add_placex(place_id=332, osm_type='W', osm_id=4,
22                       class_='highway', type='residential',
23                       name={'name': 'Road'}, address={'city': 'Barrow'},
24                       extratags={'surface': 'paved'},
25                       parent_place_id=34, linked_place_id=55,
26                       admin_level=15, country_code='gb',
27                       housenumber='4',
28                       postcode='34425', wikipedia='en:Faa',
29                       rank_search=27, rank_address=26,
30                       importance=0.01,
31                       centroid=(23, 34),
32                       indexed_date=import_date,
33                       geometry='LINESTRING(23 34, 23.1 34, 23.1 34.1, 23 34)')
34
35     api = frontend(apiobj, options={'details'})
36     result = api.details(idobj)
37     napi.Locales().localize_results([result])
38
39     assert result is not None
40
41     assert result.source_table.name == 'PLACEX'
42     assert result.category == ('highway', 'residential')
43     assert result.centroid == (pytest.approx(23.0), pytest.approx(34.0))
44
45     assert result.place_id == 332
46     assert result.parent_place_id == 34
47     assert result.linked_place_id == 55
48     assert result.osm_object == ('W', 4)
49     assert result.admin_level == 15
50
51     assert result.names == {'name': 'Road'}
52     assert result.address == {'city': 'Barrow'}
53     assert result.extratags == {'surface': 'paved'}
54
55     assert result.housenumber == '4'
56     assert result.postcode == '34425'
57     assert result.wikipedia == 'en:Faa'
58
59     assert result.rank_search == 27
60     assert result.rank_address == 26
61     assert result.importance == pytest.approx(0.01)
62
63     assert result.country_code == 'gb'
64     assert result.indexed_date == import_date.replace(tzinfo=dt.timezone.utc)
65
66     assert result.address_rows is None
67     assert result.linked_rows is None
68     assert result.parented_rows is None
69     assert result.name_keywords is None
70     assert result.address_keywords is None
71
72     assert result.geometry == {'type': 'ST_LineString'}
73
74
75 def test_lookup_in_placex_minimal_info(apiobj, frontend):
76     import_date = dt.datetime(2022, 12, 7, 14, 14, 46, 0)
77     apiobj.add_placex(place_id=332, osm_type='W', osm_id=4,
78                       class_='highway', type='residential',
79                       admin_level=15,
80                       rank_search=27, rank_address=26,
81                       centroid=(23, 34),
82                       indexed_date=import_date,
83                       importance=0.8,
84                       geometry='LINESTRING(23 34, 23.1 34, 23.1 34.1, 23 34)')
85
86     api = frontend(apiobj, options={'details'})
87     result = api.details(napi.PlaceID(332))
88     napi.Locales().localize_results([result])
89
90     assert result is not None
91
92     assert result.source_table.name == 'PLACEX'
93     assert result.category == ('highway', 'residential')
94     assert result.centroid == (pytest.approx(23.0), pytest.approx(34.0))
95
96     assert result.place_id == 332
97     assert result.parent_place_id is None
98     assert result.linked_place_id is None
99     assert result.osm_object == ('W', 4)
100     assert result.admin_level == 15
101
102     assert result.names is None
103     assert result.address is None
104     assert result.extratags is None
105
106     assert result.housenumber is None
107     assert result.postcode is None
108     assert result.wikipedia is None
109
110     assert result.rank_search == 27
111     assert result.rank_address == 26
112     assert result.importance == pytest.approx(0.8)
113
114     assert result.country_code is None
115     assert result.indexed_date == import_date.replace(tzinfo=dt.timezone.utc)
116
117     assert result.address_rows is None
118     assert result.linked_rows is None
119     assert result.parented_rows is None
120     assert result.name_keywords is None
121     assert result.address_keywords is None
122
123     assert result.geometry == {'type': 'ST_LineString'}
124
125
126 def test_lookup_in_placex_with_geometry(apiobj, frontend):
127     apiobj.add_placex(place_id=332,
128                       geometry='LINESTRING(23 34, 23.1 34)')
129
130     api = frontend(apiobj, options={'details'})
131     result = api.details(napi.PlaceID(332), geometry_output=napi.GeometryFormat.GEOJSON)
132
133     assert result.geometry == {'geojson': '{"type":"LineString","coordinates":[[23,34],[23.1,34]]}'}
134
135
136 def test_lookup_placex_with_address_details(apiobj, frontend):
137     apiobj.add_placex(place_id=332, osm_type='W', osm_id=4,
138                       class_='highway', type='residential',  name='Street',
139                       country_code='pl',
140                       rank_search=27, rank_address=26)
141     apiobj.add_address_placex(332, fromarea=False, isaddress=False,
142                               distance=0.0034,
143                               place_id=1000, osm_type='N', osm_id=3333,
144                               class_='place', type='suburb', name='Smallplace',
145                               country_code='pl', admin_level=13,
146                               rank_search=24, rank_address=23)
147     apiobj.add_address_placex(332, fromarea=True, isaddress=True,
148                               place_id=1001, osm_type='N', osm_id=3334,
149                               class_='place', type='city', name='Bigplace',
150                               country_code='pl',
151                               rank_search=17, rank_address=16)
152
153     api = frontend(apiobj, options={'details'})
154     result = api.details(napi.PlaceID(332), address_details=True)
155     napi.Locales().localize_results([result])
156
157     assert result.address_rows == [
158                napi.AddressLine(place_id=332, osm_object=('W', 4),
159                                 category=('highway', 'residential'),
160                                 names={'name': 'Street'}, extratags={},
161                                 admin_level=15, fromarea=True, isaddress=True,
162                                 rank_address=26, distance=0.0,
163                                 local_name='Street'),
164                napi.AddressLine(place_id=1000, osm_object=('N', 3333),
165                                 category=('place', 'suburb'),
166                                 names={'name': 'Smallplace'}, extratags={},
167                                 admin_level=13, fromarea=False, isaddress=True,
168                                 rank_address=23, distance=0.0034,
169                                 local_name='Smallplace'),
170                napi.AddressLine(place_id=1001, osm_object=('N', 3334),
171                                 category=('place', 'city'),
172                                 names={'name': 'Bigplace'}, extratags={},
173                                 admin_level=15, fromarea=True, isaddress=True,
174                                 rank_address=16, distance=0.0,
175                                 local_name='Bigplace'),
176                napi.AddressLine(place_id=None, osm_object=None,
177                                 category=('place', 'country_code'),
178                                 names={'ref': 'pl'}, extratags={},
179                                 admin_level=None, fromarea=True, isaddress=False,
180                                 rank_address=4, distance=0.0)
181            ]
182
183
184 def test_lookup_place_with_linked_places_none_existing(apiobj, frontend):
185     apiobj.add_placex(place_id=332, osm_type='W', osm_id=4,
186                       class_='highway', type='residential',  name='Street',
187                       country_code='pl', linked_place_id=45,
188                       rank_search=27, rank_address=26)
189
190     api = frontend(apiobj, options={'details'})
191     result = api.details(napi.PlaceID(332), linked_places=True)
192
193     assert result.linked_rows == []
194
195
196 def test_lookup_place_with_linked_places_existing(apiobj, frontend):
197     apiobj.add_placex(place_id=332, osm_type='W', osm_id=4,
198                       class_='highway', type='residential',  name='Street',
199                       country_code='pl', linked_place_id=45,
200                       rank_search=27, rank_address=26)
201     apiobj.add_placex(place_id=1001, osm_type='W', osm_id=5,
202                       class_='highway', type='residential',  name='Street',
203                       country_code='pl', linked_place_id=332,
204                       rank_search=27, rank_address=26)
205     apiobj.add_placex(place_id=1002, osm_type='W', osm_id=6,
206                       class_='highway', type='residential',  name='Street',
207                       country_code='pl', linked_place_id=332,
208                       rank_search=27, rank_address=26)
209
210     api = frontend(apiobj, options={'details'})
211     result = api.details(napi.PlaceID(332), linked_places=True)
212
213     assert result.linked_rows == [
214                napi.AddressLine(place_id=1001, osm_object=('W', 5),
215                                 category=('highway', 'residential'),
216                                 names={'name': 'Street'}, extratags={},
217                                 admin_level=15, fromarea=False, isaddress=True,
218                                 rank_address=26, distance=0.0),
219                napi.AddressLine(place_id=1002, osm_object=('W', 6),
220                                 category=('highway', 'residential'),
221                                 names={'name': 'Street'}, extratags={},
222                                 admin_level=15, fromarea=False, isaddress=True,
223                                 rank_address=26, distance=0.0),
224     ]
225
226
227 def test_lookup_place_with_parented_places_not_existing(apiobj, frontend):
228     apiobj.add_placex(place_id=332, osm_type='W', osm_id=4,
229                       class_='highway', type='residential',  name='Street',
230                       country_code='pl', parent_place_id=45,
231                       rank_search=27, rank_address=26)
232
233     api = frontend(apiobj, options={'details'})
234     result = api.details(napi.PlaceID(332), parented_places=True)
235
236     assert result.parented_rows == []
237
238
239 def test_lookup_place_with_parented_places_existing(apiobj, frontend):
240     apiobj.add_placex(place_id=332, osm_type='W', osm_id=4,
241                       class_='highway', type='residential',  name='Street',
242                       country_code='pl', parent_place_id=45,
243                       rank_search=27, rank_address=26)
244     apiobj.add_placex(place_id=1001, osm_type='N', osm_id=5,
245                       class_='place', type='house', housenumber='23',
246                       country_code='pl', parent_place_id=332,
247                       rank_search=30, rank_address=30)
248     apiobj.add_placex(place_id=1002, osm_type='W', osm_id=6,
249                       class_='highway', type='residential',  name='Street',
250                       country_code='pl', parent_place_id=332,
251                       rank_search=27, rank_address=26)
252
253     api = frontend(apiobj, options={'details'})
254     result = api.details(napi.PlaceID(332), parented_places=True)
255
256     assert result.parented_rows == [
257                napi.AddressLine(place_id=1001, osm_object=('N', 5),
258                                 category=('place', 'house'),
259                                 names={'housenumber': '23'}, extratags={},
260                                 admin_level=15, fromarea=False, isaddress=True,
261                                 rank_address=30, distance=0.0),
262     ]
263
264
265 @pytest.mark.parametrize('idobj', (napi.PlaceID(4924), napi.OsmID('W', 9928)))
266 def test_lookup_in_osmline(apiobj, frontend, idobj):
267     import_date = dt.datetime(2022, 12, 7, 14, 14, 46, 0)
268     apiobj.add_osmline(place_id=4924, osm_id=9928,
269                        parent_place_id=12,
270                        startnumber=1, endnumber=4, step=1,
271                        country_code='gb', postcode='34425',
272                        address={'city': 'Big'},
273                        indexed_date=import_date,
274                        geometry='LINESTRING(23 34, 23 35)')
275
276     api = frontend(apiobj, options={'details'})
277     result = api.details(idobj)
278
279     assert result is not None
280
281     assert result.source_table.name == 'OSMLINE'
282     assert result.category == ('place', 'houses')
283     assert result.centroid == (pytest.approx(23.0), pytest.approx(34.5))
284
285     assert result.place_id == 4924
286     assert result.parent_place_id == 12
287     assert result.linked_place_id is None
288     assert result.osm_object == ('W', 9928)
289     assert result.admin_level == 15
290
291     assert result.names is None
292     assert result.address == {'city': 'Big'}
293     assert result.extratags == {'startnumber': '1', 'endnumber': '4', 'step': '1'}
294
295     assert result.housenumber is None
296     assert result.postcode == '34425'
297     assert result.wikipedia is None
298
299     assert result.rank_search == 30
300     assert result.rank_address == 30
301     assert result.importance is None
302
303     assert result.country_code == 'gb'
304     assert result.indexed_date == import_date.replace(tzinfo=dt.timezone.utc)
305
306     assert result.address_rows is None
307     assert result.linked_rows is None
308     assert result.parented_rows is None
309     assert result.name_keywords is None
310     assert result.address_keywords is None
311
312     assert result.geometry == {'type': 'ST_LineString'}
313
314
315 def test_lookup_in_osmline_split_interpolation(apiobj, frontend):
316     apiobj.add_osmline(place_id=1000, osm_id=9,
317                        startnumber=2, endnumber=4, step=1)
318     apiobj.add_osmline(place_id=1001, osm_id=9,
319                        startnumber=6, endnumber=9, step=1)
320     apiobj.add_osmline(place_id=1002, osm_id=9,
321                        startnumber=11, endnumber=20, step=1)
322
323     api = frontend(apiobj, options={'details'})
324     for i in range(1, 6):
325         result = api.details(napi.OsmID('W', 9, str(i)))
326         assert result.place_id == 1000
327     for i in range(7, 11):
328         result = api.details(napi.OsmID('W', 9, str(i)))
329         assert result.place_id == 1001
330     for i in range(12, 22):
331         result = api.details(napi.OsmID('W', 9, str(i)))
332         assert result.place_id == 1002
333
334
335 def test_lookup_osmline_with_address_details(apiobj, frontend):
336     apiobj.add_osmline(place_id=9000, osm_id=9,
337                        startnumber=2, endnumber=4, step=1,
338                        parent_place_id=332)
339     apiobj.add_placex(place_id=332, osm_type='W', osm_id=4,
340                       class_='highway', type='residential',  name='Street',
341                       country_code='pl',
342                       rank_search=27, rank_address=26)
343     apiobj.add_address_placex(332, fromarea=False, isaddress=False,
344                               distance=0.0034,
345                               place_id=1000, osm_type='N', osm_id=3333,
346                               class_='place', type='suburb', name='Smallplace',
347                               country_code='pl', admin_level=13,
348                               rank_search=24, rank_address=23)
349     apiobj.add_address_placex(332, fromarea=True, isaddress=True,
350                               place_id=1001, osm_type='N', osm_id=3334,
351                               class_='place', type='city', name='Bigplace',
352                               country_code='pl',
353                               rank_search=17, rank_address=16)
354
355     api = frontend(apiobj, options={'details'})
356     result = api.details(napi.PlaceID(9000), address_details=True)
357     napi.Locales().localize_results([result])
358
359     assert result.address_rows == [
360                napi.AddressLine(place_id=332, osm_object=('W', 4),
361                                 category=('highway', 'residential'),
362                                 names={'name': 'Street'}, extratags={},
363                                 admin_level=15, fromarea=True, isaddress=True,
364                                 rank_address=26, distance=0.0,
365                                 local_name='Street'),
366                napi.AddressLine(place_id=1000, osm_object=('N', 3333),
367                                 category=('place', 'suburb'),
368                                 names={'name': 'Smallplace'}, extratags={},
369                                 admin_level=13, fromarea=False, isaddress=True,
370                                 rank_address=23, distance=0.0034,
371                                 local_name='Smallplace'),
372                napi.AddressLine(place_id=1001, osm_object=('N', 3334),
373                                 category=('place', 'city'),
374                                 names={'name': 'Bigplace'}, extratags={},
375                                 admin_level=15, fromarea=True, isaddress=True,
376                                 rank_address=16, distance=0.0,
377                                 local_name='Bigplace'),
378                napi.AddressLine(place_id=None, osm_object=None,
379                                 category=('place', 'country_code'),
380                                 names={'ref': 'pl'}, extratags={},
381                                 admin_level=None, fromarea=True, isaddress=False,
382                                 rank_address=4, distance=0.0)
383            ]
384
385
386 def test_lookup_in_tiger(apiobj, frontend):
387     apiobj.add_tiger(place_id=4924,
388                      parent_place_id=12,
389                      startnumber=1, endnumber=4, step=1,
390                      postcode='34425',
391                      geometry='LINESTRING(23 34, 23 35)')
392     apiobj.add_placex(place_id=12,
393                       category=('highway', 'residential'),
394                       osm_type='W', osm_id=6601223,
395                       geometry='LINESTRING(23 34, 23 35)')
396
397     api = frontend(apiobj, options={'details'})
398     result = api.details(napi.PlaceID(4924))
399
400     assert result is not None
401
402     assert result.source_table.name == 'TIGER'
403     assert result.category == ('place', 'houses')
404     assert result.centroid == (pytest.approx(23.0), pytest.approx(34.5))
405
406     assert result.place_id == 4924
407     assert result.parent_place_id == 12
408     assert result.linked_place_id is None
409     assert result.osm_object == ('W', 6601223)
410     assert result.admin_level == 15
411
412     assert result.names is None
413     assert result.address is None
414     assert result.extratags == {'startnumber': '1', 'endnumber': '4', 'step': '1'}
415
416     assert result.housenumber is None
417     assert result.postcode == '34425'
418     assert result.wikipedia is None
419
420     assert result.rank_search == 30
421     assert result.rank_address == 30
422     assert result.importance is None
423
424     assert result.country_code == 'us'
425     assert result.indexed_date is None
426
427     assert result.address_rows is None
428     assert result.linked_rows is None
429     assert result.parented_rows is None
430     assert result.name_keywords is None
431     assert result.address_keywords is None
432
433     assert result.geometry == {'type': 'ST_LineString'}
434
435
436 def test_lookup_tiger_with_address_details(apiobj, frontend):
437     apiobj.add_tiger(place_id=9000,
438                      startnumber=2, endnumber=4, step=1,
439                      parent_place_id=332)
440     apiobj.add_placex(place_id=332, osm_type='W', osm_id=4,
441                       class_='highway', type='residential',  name='Street',
442                       country_code='us',
443                       rank_search=27, rank_address=26)
444     apiobj.add_address_placex(332, fromarea=False, isaddress=False,
445                               distance=0.0034,
446                               place_id=1000, osm_type='N', osm_id=3333,
447                               class_='place', type='suburb', name='Smallplace',
448                               country_code='us', admin_level=13,
449                               rank_search=24, rank_address=23)
450     apiobj.add_address_placex(332, fromarea=True, isaddress=True,
451                               place_id=1001, osm_type='N', osm_id=3334,
452                               class_='place', type='city', name='Bigplace',
453                               country_code='us',
454                               rank_search=17, rank_address=16)
455
456     api = frontend(apiobj, options={'details'})
457     result = api.details(napi.PlaceID(9000), address_details=True)
458     napi.Locales().localize_results([result])
459
460     assert result.address_rows == [
461                napi.AddressLine(place_id=332, osm_object=('W', 4),
462                                 category=('highway', 'residential'),
463                                 names={'name': 'Street'}, extratags={},
464                                 admin_level=15, fromarea=True, isaddress=True,
465                                 rank_address=26, distance=0.0,
466                                 local_name='Street'),
467                napi.AddressLine(place_id=1000, osm_object=('N', 3333),
468                                 category=('place', 'suburb'),
469                                 names={'name': 'Smallplace'}, extratags={},
470                                 admin_level=13, fromarea=False, isaddress=True,
471                                 rank_address=23, distance=0.0034,
472                                 local_name='Smallplace'),
473                napi.AddressLine(place_id=1001, osm_object=('N', 3334),
474                                 category=('place', 'city'),
475                                 names={'name': 'Bigplace'}, extratags={},
476                                 admin_level=15, fromarea=True, isaddress=True,
477                                 rank_address=16, distance=0.0,
478                                 local_name='Bigplace'),
479                napi.AddressLine(place_id=None, osm_object=None,
480                                 category=('place', 'country_code'),
481                                 names={'ref': 'us'}, extratags={},
482                                 admin_level=None, fromarea=True, isaddress=False,
483                                 rank_address=4, distance=0.0)
484            ]
485
486
487 def test_lookup_in_postcode(apiobj, frontend):
488     import_date = dt.datetime(2022, 12, 7, 14, 14, 46, 0)
489     apiobj.add_postcode(place_id=554,
490                         parent_place_id=152,
491                         postcode='34 425',
492                         country_code='gb',
493                         rank_search=20,
494                         indexed_date=import_date,
495                         centroid='POINT(-9.45 5.6)',
496                         geometry='POLYGON((-9.5 5.5, -9.5 5.7, -9.4 5.6, -9.5 5.5))')
497
498     api = frontend(apiobj, options={'details'})
499     result = api.details(napi.PlaceID(554))
500
501     assert result is not None
502
503     assert result.source_table.name == 'POSTCODE'
504     assert result.category == ('place', 'postcode')
505     assert result.centroid == (pytest.approx(-9.45), pytest.approx(5.6))
506
507     assert result.place_id == 554
508     assert result.parent_place_id == 152
509     assert result.linked_place_id is None
510     assert result.osm_object is None
511     assert result.admin_level == 15
512
513     assert result.names == {'ref': '34 425'}
514     assert result.address is None
515     assert result.extratags is None
516
517     assert result.housenumber is None
518     assert result.postcode is None
519     assert result.wikipedia is None
520
521     assert result.rank_search == 20
522     assert result.rank_address == 5
523     assert result.importance is None
524
525     assert result.country_code == 'gb'
526     assert result.indexed_date == import_date.replace(tzinfo=dt.timezone.utc)
527
528     assert result.address_rows is None
529     assert result.linked_rows is None
530     assert result.parented_rows is None
531     assert result.name_keywords is None
532     assert result.address_keywords is None
533
534     assert result.geometry == {'type': 'ST_Polygon'}
535
536
537 def test_lookup_in_postcode_by_stable_ref(apiobj, frontend):
538     import_date = dt.datetime(2022, 12, 7, 14, 14, 46, 0)
539     apiobj.add_postcode(place_id=554,
540                         parent_place_id=152,
541                         postcode='94110',
542                         country_code='us',
543                         rank_search=20,
544                         indexed_date=import_date,
545                         centroid='POINT(-122.4170874 37.7536873)',
546                         geometry='POLYGON((-122.47 37.70, -122.47 37.80, '
547                                  '-122.36 37.75, -122.47 37.70))')
548
549     api = frontend(apiobj, options={'details'})
550     result = api.details(napi.PostcodeRef('us', '94110'))
551
552     assert result is not None
553     assert result.source_table.name == 'POSTCODE'
554     assert result.place_id == 554
555     assert result.osm_object is None
556     assert result.names == {'ref': '94110'}
557     assert result.country_code == 'us'
558
559
560 @pytest.mark.parametrize('lookup', [napi.PlaceID(9000),
561                                     napi.OsmID('R', 12)])
562 def test_lookup_postcode_with_address_details(apiobj, frontend, lookup):
563     apiobj.add_postcode(place_id=9000, osm_id=12,
564                         parent_place_id=332,
565                         postcode='34 425',
566                         country_code='gb',
567                         rank_search=25)
568     apiobj.add_placex(place_id=332, osm_type='N', osm_id=3333,
569                       class_='place', type='suburb',  name='Smallplace',
570                       country_code='gb', admin_level=13,
571                       rank_search=24, rank_address=23)
572     apiobj.add_address_placex(332, fromarea=True, isaddress=True,
573                               place_id=1001, osm_type='N', osm_id=3334,
574                               class_='place', type='city', name='Bigplace',
575                               country_code='gb',
576                               rank_search=17, rank_address=16)
577
578     api = frontend(apiobj, options={'details'})
579     result = api.details(lookup, address_details=True)
580     napi.Locales().localize_results([result])
581
582     assert result.address_rows == [
583                napi.AddressLine(place_id=9000, osm_object=('R', 12),
584                                 category=('boundary', 'postal_code'),
585                                 names={'ref': '34 425'}, extratags={},
586                                 admin_level=15, fromarea=True, isaddress=True,
587                                 rank_address=5, distance=0.0,
588                                 local_name='34 425'),
589                napi.AddressLine(place_id=332, osm_object=('N', 3333),
590                                 category=('place', 'suburb'),
591                                 names={'name': 'Smallplace'}, extratags={},
592                                 admin_level=13, fromarea=True, isaddress=True,
593                                 rank_address=23, distance=0.0,
594                                 local_name='Smallplace'),
595                napi.AddressLine(place_id=1001, osm_object=('N', 3334),
596                                 category=('place', 'city'),
597                                 names={'name': 'Bigplace'}, extratags={},
598                                 admin_level=15, fromarea=True, isaddress=True,
599                                 rank_address=16, distance=0.0,
600                                 local_name='Bigplace'),
601                napi.AddressLine(place_id=None, osm_object=None,
602                                 category=('place', 'country_code'),
603                                 names={'ref': 'gb'}, extratags={},
604                                 admin_level=None, fromarea=True, isaddress=False,
605                                 rank_address=4, distance=0.0)
606            ]
607
608
609 @pytest.mark.parametrize('objid', [napi.PlaceID(1736),
610                                    napi.OsmID('W', 55),
611                                    napi.OsmID('N', 55, 'amenity')])
612 def test_lookup_missing_object(apiobj, frontend, objid):
613     apiobj.add_placex(place_id=1, osm_type='N', osm_id=55,
614                       class_='place', type='suburb')
615
616     api = frontend(apiobj, options={'details'})
617     assert api.details(objid) is None
618
619
620 @pytest.mark.parametrize('gtype', (napi.GeometryFormat.KML,
621                                    napi.GeometryFormat.SVG,
622                                    napi.GeometryFormat.TEXT))
623 def test_lookup_unsupported_geometry(apiobj, frontend, gtype):
624     apiobj.add_placex(place_id=332)
625
626     api = frontend(apiobj, options={'details'})
627     with pytest.raises(ValueError):
628         api.details(napi.PlaceID(332), geometry_output=gtype)