]> git.openstreetmap.org Git - nominatim.git/blobdiff - tests/steps/api_result.py
add mention of required Tiger files for test database
[nominatim.git] / tests / steps / api_result.py
index d83aa83deb4081928673ff101cbce410675ebf8d..2644d4a20c7489589ab5045d01c4c44fc06a67eb 100644 (file)
@@ -27,17 +27,35 @@ def _parse_xml():
     world.results = []
 
     # results
-    if page.nodeName == 'searchresults':
+    if page.nodeName == 'searchresults' or page.nodeName == 'lookupresults':
         for node in page.childNodes:
             if node.nodeName != "#text":
                 assert_equals(node.nodeName, 'place', msg="Unexpected element '%s'" % node.nodeName)
                 newresult = OrderedDict(node.attributes.items())
                 assert_not_in('address', newresult)
                 assert_not_in('geokml', newresult)
+                assert_not_in('extratags', newresult)
+                assert_not_in('namedetails', newresult)
                 address = OrderedDict()
                 for sub in node.childNodes:
                     if sub.nodeName == 'geokml':
                         newresult['geokml'] = sub.childNodes[0].toxml()
+                    elif sub.nodeName == 'extratags':
+                        newresult['extratags'] = {}
+                        for tag in sub.childNodes:
+                            assert_equals(tag.nodeName, 'tag')
+                            attrs = dict(tag.attributes.items())
+                            assert_in('key', attrs)
+                            assert_in('value', attrs)
+                            newresult['extratags'][attrs['key']] = attrs['value']
+                    elif sub.nodeName == 'namedetails':
+                        newresult['namedetails'] = {}
+                        for tag in sub.childNodes:
+                            assert_equals(tag.nodeName, 'name')
+                            attrs = dict(tag.attributes.items())
+                            assert_in('desc', attrs)
+                            newresult['namedetails'][attrs['desc']] = tag.firstChild.nodeValue.strip()
+
                     elif sub.nodeName == '#text':
                         pass
                     else:
@@ -65,6 +83,23 @@ def _parse_xml():
                 for sub in node.childNodes:
                     address[sub.nodeName] = sub.firstChild.nodeValue.strip()
                 world.results[0]['address'] = address
+            elif node.nodeName == 'extratags':
+                world.results[0]['extratags'] = {}
+                for tag in node.childNodes:
+                    assert_equals(tag.nodeName, 'tag')
+                    attrs = dict(tag.attributes.items())
+                    assert_in('key', attrs)
+                    assert_in('value', attrs)
+                    world.results[0]['extratags'][attrs['key']] = attrs['value']
+            elif node.nodeName == 'namedetails':
+                world.results[0]['namedetails'] = {}
+                for tag in node.childNodes:
+                    assert_equals(tag.nodeName, 'name')
+                    attrs = dict(tag.attributes.items())
+                    assert_in('desc', attrs)
+                    world.results[0]['namedetails'][attrs['desc']] = tag.firstChild.nodeValue.strip()
+            elif node.nodeName == "geokml":
+                world.results[0]['geokml'] = node
             elif node.nodeName == "#text":
                 pass
             else:
@@ -86,12 +121,14 @@ def api_result_is_valid(step, fmt):
     if world.response_format == 'html':
         document, errors = tidy_document(world.page, 
                              options={'char-encoding' : 'utf8'})
-        assert(len(errors) == 0), "Errors found in HTML document:\n%s" % errors
+        assert(len(errors) == 0), "Errors found in HTML document:\n%s" % errors
         world.results = document
     elif world.response_format == 'xml':
         _parse_xml()
     elif world.response_format == 'json':
         world.results = json.JSONDecoder(object_pairs_hook=OrderedDict).decode(world.page)
+        if world.request_type == 'reverse':
+            world.results = (world.results,)
     else:
         assert False, "Unknown page format: %s" % (world.response_format)
 
@@ -143,6 +180,11 @@ def api_result_header_contains(step):
         assert_in(line['attr'], world.result_header)
         m = re.match("%s$" % (line['value'],), world.result_header[line['attr']])
 
+@step(u'result header has no attribute (.*)')
+def api_result_header_contains_not(step, attr):
+    step.given('the result is valid')
+    assert_not_in(attr, world.result_header)
+
 @step(u'results contain$')
 def api_result_contains(step):
     step.given('at least 1 result is returned')
@@ -169,6 +211,15 @@ def api_result_contains(step):
                         m = re.match("%s$" % (v,), curres[k])
                         assert_is_not_none(m, msg="field %s does not match: %s$ != %s." % (k, v, curres[k]))
 
+@step(u'results contain valid boundingboxes$')
+def api_result_address_contains(step):
+    step.given('the result is valid')
+    for curres in world.results:
+        bb = curres['boundingbox']
+        if world.response_format == 'json':
+            bb = ','.join(bb)
+        m = re.match('^(-?\d+\.\d+),(-?\d+\.\d+),(-?\d+\.\d+),(-?\d+\.\d+)$', bb)
+        assert_is_not_none(m, msg="invalid boundingbox: %s." % (curres['boundingbox']))
 
 @step(u'result addresses contain$')
 def api_result_address_contains(step):
@@ -194,7 +245,10 @@ def api_result_address_exact(step, resid):
     addr = world.results[resid]['address']
     for line in step.hashes:
         assert_in(line['type'], addr)
-        assert_equals(line['value'], addr[line['type']])
+        m = re.match("%s$" % line['value'], addr[line['type']])
+        assert_is_not_none(m, msg="field %s does not match: %s$ != %s." % (
+                                  line['type'], line['value'], addr[line['type']]))
+        #assert_equals(line['value'], addr[line['type']])
 
 @step(u'address of result (\d+) does not contain (.*)')
 def api_result_address_details_missing(step, resid, types):