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
This commit is contained in:
Sarah Hoffmann
2021-01-16 12:04:13 +01:00
parent 19ab038724
commit c6c907d451
4 changed files with 156 additions and 39 deletions

View File

@@ -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 |

View File

@@ -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 <osmid>
| 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 <osmid>
| polygon_geojson |
| 1 |
Then the result is valid json
And result has attributes geometry
Examples:
| osmid |
| W297699560 |
| W243055645 |
| W243055716 |
| W43327921 |

View File

@@ -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 <format> details query for <object>
Then the result is valid <format>
When sending details query for <type><id>
Then the result is valid json
And results contain
| osm_type | osm_id |
| <type> | <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:<class>
Then the result is valid json
And results contain
| osm_type | osm_id | category |
| N | 300209696 | <class> |
Examples:
| class |
| tourism |
| natural |
| mountain_pass |
Scenario Outline: Details via unknown OSM id
When sending <format> details query for <object>
When sending details query for <object>
Then a HTTP 400 is returned
Examples:
| format | object |
| json | 1 |
| json | R1 |
| object |
| 1 |
| R1 |
| N300209696:highway |
Scenario: Details with keywords
When sending details query for W43327921
| keywords |
| 1 |
Then the result is valid json
# ticket #1343
Scenario: Details of a country with keywords
When sending details query for R1155955
| keywords |
| 1 |
Then the result is valid json

View File

@@ -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):