]> git.openstreetmap.org Git - nominatim.git/commitdiff
return an error when q is used together with structured parameters
authorSarah Hoffmann <lonvia@denofr.de>
Tue, 8 Aug 2023 13:54:55 +0000 (15:54 +0200)
committerSarah Hoffmann <lonvia@denofr.de>
Tue, 8 Aug 2023 13:54:55 +0000 (15:54 +0200)
nominatim/api/v1/server_glue.py
test/python/api/test_server_glue_v1.py

index d1bcc1dab0d3050bd5ec2a0cad40f1fbad9f0b58..80bf38a4517b9ea8eee53604a71a088d1ef42ed4 100644 (file)
@@ -453,17 +453,24 @@ async def search_endpoint(api: napi.NominatimAPIAsync, params: ASGIAdaptor) -> A
     if params.get('featureType', None) is not None:
         details['layers'] = napi.DataLayer.ADDRESS
 
+    # unstructured query parameters
     query = params.get('q', None)
+    # structured query parameters
     queryparts = {}
+    for key in ('amenity', 'street', 'city', 'county', 'state', 'postalcode', 'country'):
+        details[key] = params.get(key, None)
+        if details[key]:
+            queryparts[key] = details[key]
+
     try:
         if query is not None:
+            if queryparts:
+                params.raise_error("Structured query parameters"
+                                   "(amenity, street, city, county, state, postalcode, country)"
+                                   " cannot be used together with 'q' parameter.")
             queryparts['q'] = query
             results = await _unstructured_search(query, api, details)
         else:
-            for key in ('amenity', 'street', 'city', 'county', 'state', 'postalcode', 'country'):
-                details[key] = params.get(key, None)
-                if details[key]:
-                    queryparts[key] = details[key]
             query = ', '.join(queryparts.values())
 
             results = await api.search_address(**details)
index 26e6517e53b4fe3dc8e5031d67c6d1c1b148835c..fe406c42e9a778838263bd120108f00e95a7bb44 100644 (file)
@@ -508,9 +508,8 @@ class TestSearchEndPointSearch:
         a.params['q'] = 'something'
         a.params['city'] = 'ignored'
 
-        res = await glue.search_endpoint(napi.NominatimAPIAsync(Path('/invalid')), a)
-
-        assert len(json.loads(res.output)) == 1
+        with pytest.raises(FakeError, match='^400 -- .*cannot be used together'):
+            res = await glue.search_endpoint(napi.NominatimAPIAsync(Path('/invalid')), a)
 
 
     @pytest.mark.asyncio