--- /dev/null
+@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
--- /dev/null
+@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 |
--- /dev/null
+@APIDB
+Feature: Localization of search results
+
+ Scenario: default language
+ When sending json search query "Vietnam"
+ Then results contain
+ | ID | display_name |
+ | 0 | Việt 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 |
'HTTP_HOST' : 'localhost',
'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_LANGUAGE' : 'en,de;q=0.5',
'HTTP_ACCEPT_ENCODING' : 'gzip, deflate',
'HTTP_CONNECTION' : 'keep-alive',
'SERVER_SIGNATURE' : '<address>Nominatim BDD Tests</address>',
self.result[-1]['address'] = address
-
class ReverseResponse(GenericResponse):
def __init__(self, page, fmt='json', errorcode=200):
"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)?')
def query_cmd(context, query, dups):
""" Query directly via PHP script.
'%s.php' % endpoint)
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']]
for k,v in params.items():
cmd.append("%s=%s" % (k, v))
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)?')
def website_search_request(context, fmt, query, addr):
-
params = {}
if query:
params['q'] = query
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')