From b7422004421ff5f9ecf9c9f6d8fb5d23d9d0f2ec Mon Sep 17 00:00:00 2001 From: Sarah Hoffmann Date: Fri, 3 Feb 2023 21:59:16 +0100 Subject: [PATCH] expand details BDD tests There are now minor differences in the output between PHP and Python versions, so introduce specific tests. --- test/bdd/api/details/params.feature | 17 +++++--- test/bdd/api/details/simple.feature | 62 ++++++++++++++++++++++++++--- test/bdd/environment.py | 6 +++ test/bdd/steps/http_responses.py | 24 ++++++++++- 4 files changed, 97 insertions(+), 12 deletions(-) diff --git a/test/bdd/api/details/params.feature b/test/bdd/api/details/params.feature index 87c3356c..3bb5bf7c 100644 --- a/test/bdd/api/details/params.feature +++ b/test/bdd/api/details/params.feature @@ -7,6 +7,9 @@ Feature: Object details Then the result is valid json And result has attributes geometry And result has not attributes keywords,address,linked_places,parentof + And results contain + | geometry+type | + | Point | Scenario: JSON Details with pretty printing When sending json details query for W297699560 @@ -64,6 +67,7 @@ Feature: Object details | keywords | | 1 | Then the result is valid json + And result has attributes keywords Scenario Outline: JSON details with full geometry When sending json details query for @@ -71,12 +75,15 @@ Feature: Object details | 1 | Then the result is valid json And result has attributes geometry + And results contain + | geometry+type | + | | Examples: - | osmid | - | W297699560 | - | W243055645 | - | W243055716 | - | W43327921 | + | osmid | geometry | + | W297699560 | LineString | + | W243055645 | Polygon | + | W243055716 | Polygon | + | W43327921 | LineString | diff --git a/test/bdd/api/details/simple.feature b/test/bdd/api/details/simple.feature index c38018bc..58e5e59e 100644 --- a/test/bdd/api/details/simple.feature +++ b/test/bdd/api/details/simple.feature @@ -9,6 +9,7 @@ Feature: Object details | place_id | | 107077 | + Scenario Outline: Details via OSM id When sending details query for Then the result is valid json @@ -22,12 +23,6 @@ Feature: Object details | W | 43327921 | | 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 When sending details query for N300209696: @@ -42,6 +37,7 @@ Feature: Object details | natural | | mountain_pass | + Scenario Outline: Details via unknown OSM id When sending details query for Then a HTTP 404 is returned @@ -53,3 +49,57 @@ Feature: Object details | 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 diff --git a/test/bdd/environment.py b/test/bdd/environment.py index 305c88e9..afaa5151 100644 --- a/test/bdd/environment.py +++ b/test/bdd/environment.py @@ -62,3 +62,9 @@ def before_tag(context, tag): if tag == 'fail-legacy': if context.config.userdata['TOKENIZER'] == 'legacy': 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.") diff --git a/test/bdd/steps/http_responses.py b/test/bdd/steps/http_responses.py index 3b9f59eb..b493f013 100644 --- a/test/bdd/steps/http_responses.py +++ b/test/bdd/steps/http_responses.py @@ -2,7 +2,7 @@ # # 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. """ Classes wrapping HTTP responses from the Nominatim API. @@ -109,6 +109,26 @@ class GenericResponse: assert str(self.result[idx][field]) == str(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): """ Check that result rows`idx` has a field `field` with value `value` 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") self.assert_field(i, 'lat', float(lat)) self.assert_field(i, 'lon', float(lon)) + elif '+' in name: + self.assert_subfield(i, name.split('+'), value) else: self.assert_field(i, name, value)