From fc0c132043bc4b4aa0b6060ff4ce4199aeb000fd Mon Sep 17 00:00:00 2001 From: Itz-Agasta Date: Sat, 15 Aug 2026 21:04:45 +0530 Subject: [PATCH] Add BDD tests for repeated include/exclude parameters A parameter listed more than once in the step table is now sent as a repeated request parameter. --- test/bdd/features/api/search/params.feature | 24 +++++++++++++++++++++ test/bdd/utils/api_runner.py | 12 ++++++++--- 2 files changed, 33 insertions(+), 3 deletions(-) diff --git a/test/bdd/features/api/search/params.feature b/test/bdd/features/api/search/params.feature index 98f1f312..66e0341e 100644 --- a/test/bdd/features/api/search/params.feature +++ b/test/bdd/features/api/search/params.feature @@ -446,6 +446,30 @@ Feature: Search queries | osm.building.yes | Then exactly 0 results are returned + Scenario: Repeated include parameters must all match + When geocoding "Boccia Club" + | param | value | + | include | osm.leisure.sports_centre | + | include | osm.building.yes | + Then more than 0 results are returned + When geocoding "Boccia Club" + | param | value | + | include | osm.leisure.sports_centre | + | include | osm.amenity.cafe | + Then exactly 0 results are returned + + Scenario: Repeated exclude parameters drop results matching any of them + When geocoding "Boccia Club" + | param | value | + | exclude | osm.amenity.cafe | + | exclude | osm.building.yes | + Then exactly 0 results are returned + When geocoding "Boccia Club" + | param | value | + | exclude | osm.amenity.cafe | + | exclude | osm.tourism.hotel | + Then more than 0 results are returned + Scenario Outline: Invalid categories are rejected When sending v1/search | q | | diff --git a/test/bdd/utils/api_runner.py b/test/bdd/utils/api_runner.py index 2301dc1a..155deb48 100644 --- a/test/bdd/utils/api_runner.py +++ b/test/bdd/utils/api_runner.py @@ -29,9 +29,15 @@ class APIRunner: if datatable: if datatable[0] == ['param', 'value']: - base_params.update(datatable[1:]) + rows = datatable[1:] else: - base_params.update(zip(datatable[0], datatable[1])) + rows = list(zip(datatable[0], datatable[1])) + + # A parameter listed more than once is sent as a repeated parameter. + params = {} + for name, value in rows: + params.setdefault(name, []).append(value) + base_params.update(params) return self.run(endpoint, base_params, http_headers) @@ -44,7 +50,7 @@ class APIRunner: async with falcon.testing.ASGIConductor(app) as conductor: response = await conductor.get("/" + endpoint, params=params, - headers=http_headers) + params_csv=False, headers=http_headers) return APIResponse(endpoint, response.status_code, response.text, response.headers) -- 2.47.3