]> git.openstreetmap.org Git - nominatim.git/commitdiff
bdd: clean up and extend API tests for details
authorSarah Hoffmann <lonvia@denofr.de>
Sat, 16 Jan 2021 11:04:13 +0000 (12:04 +0100)
committerSarah Hoffmann <lonvia@denofr.de>
Sat, 16 Jan 2021 11:04:13 +0000 (12:04 +0100)
- remove duplicates created by replacing HTML tests
  with JSON tests
- add tests for newer functions for returning geometries
  and hierarchies

test/bdd/api/details/language.feature [new file with mode: 0644]
test/bdd/api/details/params.feature
test/bdd/api/details/simple.feature
test/bdd/steps/steps_api_queries.py

diff --git a/test/bdd/api/details/language.feature b/test/bdd/api/details/language.feature
new file mode 100644 (file)
index 0000000..6611c81
--- /dev/null
@@ -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 |
index 03b91d291d2b1ebc45a728e550342fc1161512f6..87c3356c8a34d01b43c2d7f25c24647721b84b72 100644 (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  |
 
 
index 906c4ce5e9f0e6e1b69be6c365205e57ea7f6a21..a9b6d6a70553d933e5c3acd0ee01e1a2145e3b10 100644 (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 |
-
-    Scenario: Details with keywords
-        When sending details query for W43327921
-            | keywords |
-            | 1 |
-        Then the result is valid json
+      | object |
+      | 1 |
+      | R1 |
+      | N300209696:highway |
 
-    # ticket #1343
-    Scenario: Details of a country with keywords
-        When sending details query for R1155955
-            | keywords |
-            | 1 |
-        Then the result is valid json
 
index fd263af72c5564581f1f46fe56dc462c16c19fa1..00941e79c137bed2ec5f439c9de3a3f830f36b44 100644 (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):