From: Sarah Hoffmann Date: Sat, 16 Jan 2021 11:04:13 +0000 (+0100) Subject: bdd: clean up and extend API tests for details X-Git-Tag: v3.7.0~53^2~3 X-Git-Url: https://git.openstreetmap.org./nominatim.git/commitdiff_plain/c6c907d4518976a20e8d3ce843e968287ead8004 bdd: clean up and extend API tests for details - remove duplicates created by replacing HTML tests with JSON tests - add tests for newer functions for returning geometries and hierarchies --- diff --git a/test/bdd/api/details/language.feature b/test/bdd/api/details/language.feature new file mode 100644 index 00000000..6611c81b --- /dev/null +++ b/test/bdd/api/details/language.feature @@ -0,0 +1,62 @@ +@APIDB +Feature: Localization of search results + + Scenario: default language + When sending details query for R1155955 + Then results contain + | ID | localname | + | 0 | Liechtenstein | + + Scenario: accept-language first + When sending details query for R1155955 + | accept-language | + | zh,de | + Then results contain + | ID | localname | + | 0 | 列支敦士登 | + + Scenario: accept-language missing + When sending details query for R1155955 + | accept-language | + | xx,fr,en,de | + Then results contain + | ID | localname | + | 0 | Liechtenstein | + + Scenario: http accept language header first + Given the HTTP header + | accept-language | + | fo;q=0.8,en-ca;q=0.5,en;q=0.3 | + When sending details query for R1155955 + Then results contain + | ID | localname | + | 0 | Liktinstein | + + Scenario: http accept language header and accept-language + Given the HTTP header + | accept-language | + | fr-ca,fr;q=0.8,en-ca;q=0.5,en;q=0.3 | + When sending details query for R1155955 + | accept-language | + | fo,en | + Then results contain + | ID | localname | + | 0 | Liktinstein | + + Scenario: http accept language header fallback + Given the HTTP header + | accept-language | + | fo-ca,en-ca;q=0.5 | + When sending details query for R1155955 + Then results contain + | ID | localname | + | 0 | Liktinstein | + + Scenario: http accept language header fallback (upper case) + Given the HTTP header + | accept-language | + | fo-FR;q=0.8,en-ca;q=0.5 | + When sending details query for R1155955 + Then results contain + | ID | localname | + | 0 | Liktinstein | diff --git a/test/bdd/api/details/params.feature b/test/bdd/api/details/params.feature index 03b91d29..87c3356c 100644 --- a/test/bdd/api/details/params.feature +++ b/test/bdd/api/details/params.feature @@ -8,14 +8,15 @@ Feature: Object details And result has attributes geometry And result has not attributes keywords,address,linked_places,parentof - Scenario: JSON Details with keywords + Scenario: JSON Details with pretty printing When sending json details query for W297699560 - | keywords | - | 1 | + | pretty | + | 1 | Then the result is valid json - And result has attributes keywords + And result has attributes geometry + And result has not attributes keywords,address,linked_places,parentof - Scenario: JSON Details with addressdetails + Scenario: JSON Details with addressdetails When sending json details query for W297699560 | addressdetails | | 1 | @@ -36,22 +37,46 @@ Feature: Object details Then the result is valid json And result has attributes hierarchy - Scenario: JSON Details with linkedplaces - When sending json details query for R123924 - | linkedplaces | - | 1 | + Scenario: JSON Details with grouped hierarchy + When sending json details query for W297699560 + | hierarchy | group_hierarchy | + | 1 | 1 | Then the result is valid json + And result has attributes hierarchy - Scenario Outline: HTML Details with keywords + Scenario Outline: JSON Details with keywords When sending json details query for | keywords | | 1 | Then the result is valid json + And result has attributes keywords + + Examples: + | osmid | + | W297699560 | + | W243055645 | + | W243055716 | + | W43327921 | + + # ticket #1343 + Scenario: Details of a country with keywords + When sending details query for R1155955 + | keywords | + | 1 | + Then the result is valid json + + Scenario Outline: JSON details with full geometry + When sending json details query for + | polygon_geojson | + | 1 | + Then the result is valid json + And result has attributes geometry Examples: | osmid | | W297699560 | | W243055645 | | W243055716 | + | W43327921 | diff --git a/test/bdd/api/details/simple.feature b/test/bdd/api/details/simple.feature index 906c4ce5..a9b6d6a7 100644 --- a/test/bdd/api/details/simple.feature +++ b/test/bdd/api/details/simple.feature @@ -2,36 +2,54 @@ Feature: Object details Check details page for correctness + Scenario: Details by place ID + When sending details query for 107077 + Then the result is valid json + And results contain + | place_id | + | 107077 | + Scenario Outline: Details via OSM id - When sending details query for - Then the result is valid + When sending details query for + Then the result is valid json + And results contain + | osm_type | osm_id | + | | | Examples: - | format | object | - | json | 107077 | - | json | N5484325405 | - | json | W43327921 | - | json | R123924 | + | type | id | + | N | 5484325405 | + | 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: + Then the result is valid json + And results contain + | osm_type | osm_id | category | + | N | 300209696 | | + + Examples: + | class | + | tourism | + | natural | + | mountain_pass | Scenario Outline: Details via unknown OSM id - When sending details query for + When sending details query for Then a HTTP 400 is returned Examples: - | format | object | - | json | 1 | - | json | R1 | - - Scenario: Details with keywords - When sending details query for W43327921 - | keywords | - | 1 | - Then the result is valid json + | object | + | 1 | + | R1 | + | N300209696:highway | - # ticket #1343 - Scenario: Details of a country with keywords - When sending details query for R1155955 - | keywords | - | 1 | - Then the result is valid json diff --git a/test/bdd/steps/steps_api_queries.py b/test/bdd/steps/steps_api_queries.py index fd263af7..00941e79 100644 --- a/test/bdd/steps/steps_api_queries.py +++ b/test/bdd/steps/steps_api_queries.py @@ -12,6 +12,7 @@ from urllib.parse import urlencode from utils import run_script from http_responses import GenericResponse, SearchResponse, ReverseResponse, StatusResponse from check_functions import Bbox +from table_compare import NominatimID LOG = logging.getLogger(__name__) @@ -168,8 +169,11 @@ def website_reverse_request(context, fmt, lat, lon): def website_details_request(context, fmt, query): params = {} if query[0] in 'NWR': - params['osmtype'] = query[0] - params['osmid'] = query[1:] + nid = NominatimID(query) + params['osmtype'] = nid.typ + params['osmid'] = nid.oid + if nid.cls: + params['class'] = nid.cls else: params['place_id'] = query outp, status = send_api_query('details', params, fmt, context) @@ -232,9 +236,13 @@ def check_header_attr(context): def check_header_no_attr(context, neg, attrs): for attr in attrs.split(','): if neg: - assert attr not in context.response.header + assert attr not in context.response.header, \ + "Unexpected attribute {}. Full response:\n{}".format( + attr, json.dumps(context.response.header, sort_keys=True, indent=2)) else: - assert attr in context.response.header + assert attr in context.response.header, \ + "No attribute {}. Full response:\n{}".format( + attr, json.dumps(context.response.header, sort_keys=True, indent=2)) @then(u'results contain') def step_impl(context): @@ -255,9 +263,13 @@ def validate_attributes(context, lid, neg, attrs): for i in idx: for attr in attrs.split(','): if neg: - assert attr not in context.response.result[i] + assert attr not in context.response.result[i],\ + "Unexpected attribute {}. Full response:\n{}".format( + attr, json.dumps(context.response.result[i], sort_keys=True, indent=2)) else: - assert attr in context.response.result[i] + assert attr in context.response.result[i], \ + "No attribute {}. Full response:\n{}".format( + attr, json.dumps(context.response.result[i], sort_keys=True, indent=2)) @then(u'result addresses contain') def step_impl(context):