mirror of
https://github.com/osm-search/Nominatim.git
synced 2026-03-12 05:44:06 +00:00
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:
62
test/bdd/api/details/language.feature
Normal file
62
test/bdd/api/details/language.feature
Normal 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 |
|
||||||
@@ -8,14 +8,15 @@ Feature: Object details
|
|||||||
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
|
||||||
|
|
||||||
Scenario: JSON Details with keywords
|
Scenario: JSON Details with pretty printing
|
||||||
When sending json details query for W297699560
|
When sending json details query for W297699560
|
||||||
| keywords |
|
| pretty |
|
||||||
| 1 |
|
| 1 |
|
||||||
Then the result is valid json
|
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
|
When sending json details query for W297699560
|
||||||
| addressdetails |
|
| addressdetails |
|
||||||
| 1 |
|
| 1 |
|
||||||
@@ -36,22 +37,46 @@ Feature: Object details
|
|||||||
Then the result is valid json
|
Then the result is valid json
|
||||||
And result has attributes hierarchy
|
And result has attributes hierarchy
|
||||||
|
|
||||||
Scenario: JSON Details with linkedplaces
|
Scenario: JSON Details with grouped hierarchy
|
||||||
When sending json details query for R123924
|
When sending json details query for W297699560
|
||||||
| linkedplaces |
|
| hierarchy | group_hierarchy |
|
||||||
| 1 |
|
| 1 | 1 |
|
||||||
Then the result is valid json
|
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>
|
When sending json details query for <osmid>
|
||||||
| keywords |
|
| keywords |
|
||||||
| 1 |
|
| 1 |
|
||||||
Then the result is valid json
|
Then the result is valid json
|
||||||
|
And result has attributes keywords
|
||||||
|
|
||||||
Examples:
|
Examples:
|
||||||
| osmid |
|
| osmid |
|
||||||
| W297699560 |
|
| W297699560 |
|
||||||
| W243055645 |
|
| W243055645 |
|
||||||
| W243055716 |
|
| 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 |
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -2,36 +2,54 @@
|
|||||||
Feature: Object details
|
Feature: Object details
|
||||||
Check details page for correctness
|
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
|
Scenario Outline: Details via OSM id
|
||||||
When sending <format> details query for <object>
|
When sending details query for <type><id>
|
||||||
Then the result is valid <format>
|
Then the result is valid json
|
||||||
|
And results contain
|
||||||
|
| osm_type | osm_id |
|
||||||
|
| <type> | <id> |
|
||||||
|
|
||||||
Examples:
|
Examples:
|
||||||
| format | object |
|
| type | id |
|
||||||
| json | 107077 |
|
| N | 5484325405 |
|
||||||
| json | N5484325405 |
|
| W | 43327921 |
|
||||||
| json | W43327921 |
|
| R | 123924 |
|
||||||
| json | R123924 |
|
|
||||||
|
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
|
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
|
Then a HTTP 400 is returned
|
||||||
|
|
||||||
Examples:
|
Examples:
|
||||||
| format | object |
|
| object |
|
||||||
| json | 1 |
|
| 1 |
|
||||||
| json | R1 |
|
| 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
|
|
||||||
|
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ from urllib.parse import urlencode
|
|||||||
from utils import run_script
|
from utils import run_script
|
||||||
from http_responses import GenericResponse, SearchResponse, ReverseResponse, StatusResponse
|
from http_responses import GenericResponse, SearchResponse, ReverseResponse, StatusResponse
|
||||||
from check_functions import Bbox
|
from check_functions import Bbox
|
||||||
|
from table_compare import NominatimID
|
||||||
|
|
||||||
LOG = logging.getLogger(__name__)
|
LOG = logging.getLogger(__name__)
|
||||||
|
|
||||||
@@ -168,8 +169,11 @@ def website_reverse_request(context, fmt, lat, lon):
|
|||||||
def website_details_request(context, fmt, query):
|
def website_details_request(context, fmt, query):
|
||||||
params = {}
|
params = {}
|
||||||
if query[0] in 'NWR':
|
if query[0] in 'NWR':
|
||||||
params['osmtype'] = query[0]
|
nid = NominatimID(query)
|
||||||
params['osmid'] = query[1:]
|
params['osmtype'] = nid.typ
|
||||||
|
params['osmid'] = nid.oid
|
||||||
|
if nid.cls:
|
||||||
|
params['class'] = nid.cls
|
||||||
else:
|
else:
|
||||||
params['place_id'] = query
|
params['place_id'] = query
|
||||||
outp, status = send_api_query('details', params, fmt, context)
|
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):
|
def check_header_no_attr(context, neg, attrs):
|
||||||
for attr in attrs.split(','):
|
for attr in attrs.split(','):
|
||||||
if neg:
|
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:
|
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')
|
@then(u'results contain')
|
||||||
def step_impl(context):
|
def step_impl(context):
|
||||||
@@ -255,9 +263,13 @@ def validate_attributes(context, lid, neg, attrs):
|
|||||||
for i in idx:
|
for i in idx:
|
||||||
for attr in attrs.split(','):
|
for attr in attrs.split(','):
|
||||||
if neg:
|
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:
|
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')
|
@then(u'result addresses contain')
|
||||||
def step_impl(context):
|
def step_impl(context):
|
||||||
|
|||||||
Reference in New Issue
Block a user