add api tests for language, details and lookup

This commit is contained in:
Sarah Hoffmann 2016-12-28 22:57:52 +01:00
parent 3a787df934
commit b2c1d086b5
6 changed files with 185 additions and 3 deletions

View File

@ -0,0 +1,14 @@
@APIDB
Feature: Object details
Check details page for correctness
Scenario Outline: Details via OSM id
When sending details query for <object>
Then the result is valid html
Examples:
| object |
| 492887 |
| N4267356889 |
| W230804120 |
| R123924 |

View File

@ -0,0 +1,17 @@
@APIDB
Feature: Places by osm_type and osm_id Tests
Simple tests for internal server errors and response format.
Scenario Outline: address lookup for existing node, way, relation
When sending <format> lookup query for N3284625766,W6065798,,R123924,X99,N0
Then the result is valid <format>
And exactly 3 results are returned
Examples:
| format |
| xml |
| json |
Scenario: address lookup for non-existing or invalid node, way, relation
When sending xml lookup query for X99,,N0,nN158845944,ABC,,W9
Then exactly 0 results are returned

View File

@ -0,0 +1,36 @@
@APIDB
Feature: Localization of reverse search results
Scenario: default language
When sending json reverse coordinates 18.1147,-15.95
Then result addresses contain
| ID | country |
| 0 | Mauritanie موريتانيا |
Scenario: accept-language parameter
When sending json reverse coordinates 18.1147,-15.95
| accept-language |
| en,fr |
Then result addresses contain
| ID | country |
| 0 | Mauritania |
Scenario: HTTP accept language header
Given the HTTP header
| accept-language |
| fr-ca,fr;q=0.8,en-ca;q=0.5,en;q=0.3 |
When sending json reverse coordinates 18.1147,-15.95
Then result addresses contain
| ID | country |
| 0 | Mauritanie |
Scenario: accept-language parameter and HTTP header
Given the HTTP header
| accept-language |
| fr-ca,fr;q=0.8,en-ca;q=0.5,en;q=0.3 |
When sending json reverse coordinates 18.1147,-15.95
| accept-language |
| en |
Then result addresses contain
| ID | country |
| 0 | Mauritania |

View File

@ -0,0 +1,62 @@
@APIDB
Feature: Localization of search results
Scenario: default language
When sending json search query "Vietnam"
Then results contain
| ID | display_name |
| 0 | Vit Nam |
Scenario: accept-language first
When sending json search query "Mauretanien"
| accept-language |
| en,de |
Then results contain
| ID | display_name |
| 0 | Mauritania |
Scenario: accept-language missing
When sending json search query "Mauretanien"
| accept-language |
| xx,fr,en,de |
Then results contain
| ID | display_name |
| 0 | Mauritanie |
Scenario: http accept language header first
Given the HTTP header
| accept-language |
| fr-ca,fr;q=0.8,en-ca;q=0.5,en;q=0.3 |
When sending json search query "Mauretanien"
Then results contain
| ID | display_name |
| 0 | Mauritanie |
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 json search query "Mauretanien"
| accept-language |
| de,en |
Then results contain
| ID | display_name |
| 0 | Mauretanien |
Scenario: http accept language header fallback
Given the HTTP header
| accept-language |
| fr-ca,en-ca;q=0.5 |
When sending json search query "Mauretanien"
Then results contain
| ID | display_name |
| 0 | Mauritanie |
Scenario: http accept language header fallback (upper case)
Given the HTTP header
| accept-language |
| fr-FR;q=0.8,en-ca;q=0.5 |
When sending json search query "Mauretanie"
Then results contain
| ID | display_name |
| 0 | Mauritanie |

View File

@ -30,6 +30,8 @@ Feature: Search queries
Scenario: XML search with addressdetails Scenario: XML search with addressdetails
When sending xml search query "Aleg" with address When sending xml search query "Aleg" with address
| accept-language |
| en |
Then address of result 0 is Then address of result 0 is
| type | value | | type | value |
| city | Aleg | | city | Aleg |
@ -39,6 +41,8 @@ Feature: Search queries
Scenario: coordinate search with addressdetails Scenario: coordinate search with addressdetails
When sending json search query "14.271104294939,107.69828796387" When sending json search query "14.271104294939,107.69828796387"
| accept-language |
| en |
Then results contain Then results contain
| display_name | | display_name |
| Plei Ya Rê, Kon Tum province, Vietnam | | Plei Ya Rê, Kon Tum province, Vietnam |

View File

@ -19,7 +19,6 @@ BASE_SERVER_ENV = {
'HTTP_HOST' : 'localhost', 'HTTP_HOST' : 'localhost',
'HTTP_USER_AGENT' : 'Mozilla/5.0 (X11; Linux x86_64; rv:51.0) Gecko/20100101 Firefox/51.0', 'HTTP_USER_AGENT' : 'Mozilla/5.0 (X11; Linux x86_64; rv:51.0) Gecko/20100101 Firefox/51.0',
'HTTP_ACCEPT' : 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 'HTTP_ACCEPT' : 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'HTTP_ACCEPT_LANGUAGE' : 'en,de;q=0.5',
'HTTP_ACCEPT_ENCODING' : 'gzip, deflate', 'HTTP_ACCEPT_ENCODING' : 'gzip, deflate',
'HTTP_CONNECTION' : 'keep-alive', 'HTTP_CONNECTION' : 'keep-alive',
'SERVER_SIGNATURE' : '<address>Nominatim BDD Tests</address>', 'SERVER_SIGNATURE' : '<address>Nominatim BDD Tests</address>',
@ -149,7 +148,6 @@ class SearchResponse(GenericResponse):
self.result[-1]['address'] = address self.result[-1]['address'] = address
class ReverseResponse(GenericResponse): class ReverseResponse(GenericResponse):
def __init__(self, page, fmt='json', errorcode=200): def __init__(self, page, fmt='json', errorcode=200):
@ -214,6 +212,23 @@ class ReverseResponse(GenericResponse):
"Unknown XML tag %s on page: %s" % (child.tag, self.page) "Unknown XML tag %s on page: %s" % (child.tag, self.page)
class DetailsResponse(GenericResponse):
def __init__(self, page, fmt='json', errorcode=200):
self.page = page
self.format = fmt
self.errorcode = errorcode
self.result = []
self.header = dict()
if errorcode == 200:
getattr(self, 'parse_' + fmt)()
def parse_html(self):
content, errors = tidy_document(self.page,
options={'char-encoding' : 'utf8'})
self.result = {}
@when(u'searching for "(?P<query>.*)"(?P<dups> with dups)?') @when(u'searching for "(?P<query>.*)"(?P<dups> with dups)?')
def query_cmd(context, query, dups): def query_cmd(context, query, dups):
""" Query directly via PHP script. """ Query directly via PHP script.
@ -259,6 +274,9 @@ def send_api_query(endpoint, params, fmt, context):
'%s.php' % endpoint) '%s.php' % endpoint)
env['NOMINATIM_SETTINGS'] = context.nominatim.local_settings_file env['NOMINATIM_SETTINGS'] = context.nominatim.local_settings_file
if hasattr(context, 'http_headers'):
env.update(context.http_headers)
cmd = ['/usr/bin/php-cgi', env['SCRIPT_FILENAME']] cmd = ['/usr/bin/php-cgi', env['SCRIPT_FILENAME']]
for k,v in params.items(): for k,v in params.items():
cmd.append("%s=%s" % (k, v)) cmd.append("%s=%s" % (k, v))
@ -284,10 +302,18 @@ def send_api_query(endpoint, params, fmt, context):
return outp[content_start + 4:], status return outp[content_start + 4:], status
@given(u'the HTTP header')
def add_http_header(context):
if not hasattr(context, 'http_headers'):
context.http_headers = {}
for h in context.table.headings:
envvar = 'HTTP_' + h.upper().replace('-', '_')
context.http_headers[envvar] = context.table[0][h]
@when(u'sending (?P<fmt>\S+ )?search query "(?P<query>.*)"(?P<addr> with address)?') @when(u'sending (?P<fmt>\S+ )?search query "(?P<query>.*)"(?P<addr> with address)?')
def website_search_request(context, fmt, query, addr): def website_search_request(context, fmt, query, addr):
params = {} params = {}
if query: if query:
params['q'] = query params['q'] = query
@ -324,6 +350,29 @@ def website_reverse_request(context, fmt, lat, lon):
context.response = ReverseResponse(outp, outfmt, status) context.response = ReverseResponse(outp, outfmt, status)
@when(u'sending (?P<fmt>\S+ )?details query for (?P<query>.*)')
def website_details_request(context, fmt, query):
params = {}
if query[0] in 'NWR':
params['osmtype'] = query[0]
params['osmid'] = query[1:]
else:
params['place_id'] = query
outp, status = send_api_query('details', params, fmt, context)
context.response = DetailsResponse(outp, 'html', status)
@when(u'sending (?P<fmt>\S+ )?lookup query for (?P<query>.*)')
def website_lookup_request(context, fmt, query):
params = { 'osm_ids' : query }
outp, status = send_api_query('lookup', params, fmt, context)
if fmt == 'json ':
outfmt = 'json'
else:
outfmt = 'xml'
context.response = SearchResponse(outp, outfmt, status)
@step(u'(?P<operator>less than|more than|exactly|at least|at most) (?P<number>\d+) results? (?:is|are) returned') @step(u'(?P<operator>less than|more than|exactly|at least|at most) (?P<number>\d+) results? (?:is|are) returned')