expand details BDD tests

There are now minor differences in the output between PHP and
Python versions, so introduce specific tests.
This commit is contained in:
Sarah Hoffmann 2023-02-03 21:59:16 +01:00
parent 3ac70f7cc2
commit b742200442
4 changed files with 97 additions and 12 deletions

View File

@ -7,6 +7,9 @@ Feature: Object details
Then the result is valid json Then the result is valid json
And result has attributes geometry And result has attributes geometry
And result has not attributes keywords,address,linked_places,parentof And result has not attributes keywords,address,linked_places,parentof
And results contain
| geometry+type |
| Point |
Scenario: JSON Details with pretty printing Scenario: JSON Details with pretty printing
When sending json details query for W297699560 When sending json details query for W297699560
@ -64,6 +67,7 @@ Feature: Object details
| keywords | | keywords |
| 1 | | 1 |
Then the result is valid json Then the result is valid json
And result has attributes keywords
Scenario Outline: JSON details with full geometry Scenario Outline: JSON details with full geometry
When sending json details query for <osmid> When sending json details query for <osmid>
@ -71,12 +75,15 @@ Feature: Object details
| 1 | | 1 |
Then the result is valid json Then the result is valid json
And result has attributes geometry And result has attributes geometry
And results contain
| geometry+type |
| <geometry> |
Examples: Examples:
| osmid | | osmid | geometry |
| W297699560 | | W297699560 | LineString |
| W243055645 | | W243055645 | Polygon |
| W243055716 | | W243055716 | Polygon |
| W43327921 | | W43327921 | LineString |

View File

@ -9,6 +9,7 @@ Feature: Object details
| place_id | | place_id |
| 107077 | | 107077 |
Scenario Outline: Details via OSM id Scenario Outline: Details via OSM id
When sending details query for <type><id> When sending details query for <type><id>
Then the result is valid json Then the result is valid json
@ -22,12 +23,6 @@ Feature: Object details
| W | 43327921 | | W | 43327921 |
| R | 123924 | | R | 123924 |
Scenario: Details for interpolation way just return the dependent street
When sending details query for W1
Then the result is valid json
And results contain
| category |
| highway |
Scenario Outline: Details for different class types for the same OSM id Scenario Outline: Details for different class types for the same OSM id
When sending details query for N300209696:<class> When sending details query for N300209696:<class>
@ -42,6 +37,7 @@ Feature: Object details
| natural | | natural |
| mountain_pass | | mountain_pass |
Scenario Outline: Details via unknown OSM id Scenario Outline: Details via unknown OSM id
When sending details query for <object> When sending details query for <object>
Then a HTTP 404 is returned Then a HTTP 404 is returned
@ -53,3 +49,57 @@ Feature: Object details
| N300209696:highway | | N300209696:highway |
@v1-api-php-only
Scenario: Details for interpolation way just return the dependent street
When sending details query for W1
Then the result is valid json
And results contain
| category |
| highway |
@v1-api-python-only
Scenario: Details for interpolation way return the interpolation
When sending details query for W1
Then the result is valid json
And results contain
| category | type | osm_type | osm_id | admin_level |
| place | houses | W | 1 | 15 |
@v1-api-php-only
Scenario: Details for Tiger way just return the dependent street
When sending details query for 112871
Then the result is valid json
And results contain
| category |
| highway |
@v1-api-python-only
Scenario: Details for interpolation way return the interpolation
When sending details query for 112871
Then the result is valid json
And results contain
| category | type | admin_level |
| place | houses | 15 |
And result has not attributes osm_type,osm_id
@v1-api-php-only
Scenario: Details for postcodes just return the dependent place
When sending details query for 112820
Then the result is valid json
And results contain
| category |
| boundary |
@v1-api-python-only
Scenario: Details for interpolation way return the interpolation
When sending details query for 112820
Then the result is valid json
And results contain
| category | type | admin_level |
| place | postcode | 15 |
And result has not attributes osm_type,osm_id

View File

@ -62,3 +62,9 @@ def before_tag(context, tag):
if tag == 'fail-legacy': if tag == 'fail-legacy':
if context.config.userdata['TOKENIZER'] == 'legacy': if context.config.userdata['TOKENIZER'] == 'legacy':
context.scenario.skip("Not implemented in legacy tokenizer") context.scenario.skip("Not implemented in legacy tokenizer")
if tag == 'v1-api-php-only':
if context.config.userdata['API_ENGINE'] != 'php':
context.scenario.skip("Only valid with PHP version of v1 API.")
if tag == 'v1-api-python-only':
if context.config.userdata['API_ENGINE'] == 'php':
context.scenario.skip("Only valid with Python version of v1 API.")

View File

@ -2,7 +2,7 @@
# #
# This file is part of Nominatim. (https://nominatim.org) # This file is part of Nominatim. (https://nominatim.org)
# #
# Copyright (C) 2022 by the Nominatim developer community. # Copyright (C) 2023 by the Nominatim developer community.
# For a full list of authors see the git log. # For a full list of authors see the git log.
""" """
Classes wrapping HTTP responses from the Nominatim API. Classes wrapping HTTP responses from the Nominatim API.
@ -109,6 +109,26 @@ class GenericResponse:
assert str(self.result[idx][field]) == str(value), \ assert str(self.result[idx][field]) == str(value), \
BadRowValueAssert(self, idx, field, value) BadRowValueAssert(self, idx, field, value)
def assert_subfield(self, idx, path, value):
assert path
field = self.result[idx]
for p in path:
assert isinstance(field, OrderedDict)
assert p in field
field = field[p]
if isinstance(value, float):
assert Almost(value) == float(field)
elif value.startswith("^"):
assert re.fullmatch(value, field)
elif isinstance(field, OrderedDict):
assert field, eval('{' + value + '}')
else:
assert str(field) == str(value)
def assert_address_field(self, idx, field, value): def assert_address_field(self, idx, field, value):
""" Check that result rows`idx` has a field `field` with value `value` """ Check that result rows`idx` has a field `field` with value `value`
in its address. If idx is None, then all results are checked. in its address. If idx is None, then all results are checked.
@ -163,6 +183,8 @@ class GenericResponse:
raise RuntimeError("Context needed when using grid coordinates") raise RuntimeError("Context needed when using grid coordinates")
self.assert_field(i, 'lat', float(lat)) self.assert_field(i, 'lat', float(lat))
self.assert_field(i, 'lon', float(lon)) self.assert_field(i, 'lon', float(lon))
elif '+' in name:
self.assert_subfield(i, name.split('+'), value)
else: else:
self.assert_field(i, name, value) self.assert_field(i, name, value)