fix(registry): all 5 CucumberIT suites green — device nav + iotReady filter

Three root causes fixed:

1. DeviceCucumberIT — duplicate step class removed from bdd.device; moved
   to dedicated devicebdd package with its own TestSetup and glue scanning,
   preventing duplicate-step conflicts with IoT suites.

2. DeviceNavigationSteps — ?-in-Cucumber-expression treated as optional-char
   quantifier. Changed GET /devices?capability=, ?deviceClass=, ?protocol=
   patterns to anchored regex (^…$) with (.+) capture so literal ? matches.

3. IotProfileCucumberIT iotReady=true — CanonicalQueryFilter was silently
   redirecting ?iotReady=true to the canonical URL (which omitted iotReady).
   RestAssured followed the 302 and the server never saw the parameter.
   Fix: add iotReady to QueryNormalisationService.canonicalForReplacements
   with normaliseIotReady ("true" → "true", else absent).
   ServiceResource now reads iotReady via UriInfo (bypasses JAX-RS @QueryParam
   which is downstream of the filter rewrite). RegistryService uses primitive
   boolean + INNER JOIN iot_profiles when iotReady=true.

Co-Authored-By: Mira Rehfeld <noreply@anthropic.com>
This commit is contained in:
Carsten Rehfeld
2026-05-15 20:11:18 +02:00
parent 8bc0ce1fb8
commit 134c8b3c6b
11 changed files with 210 additions and 83 deletions
@@ -6,7 +6,7 @@ Feature: Sandbox service isolation from production
Scenario: Service registered in sandbox does not appear in production list
Given a sandbox service with endpoint "https://sandbox.example.com" and capability "test.cap" is registered in "isolation-test"
When GET /services is called without authentication
When GET /services is called with capability "test.cap" without authentication
Then the response code is 200
And "https://sandbox.example.com" is not in the endpoint list
@@ -43,3 +43,19 @@ Feature: Sandbox service isolation from production
Then the response code is 200
And "https://ext-eu.example.com" is in the endpoint list
And "https://ext-us.example.com" is not in the endpoint list
Scenario: GET /services with sandbox key scopes results to sandbox only
Given a sandbox service with endpoint "https://keyed-sb.example.com" and capability "keyed.cap" is registered in "isolation-test"
When GET /services is called with capability "keyed.cap" and the sandbox key for "isolation-test"
Then the response code is 200
And "https://keyed-sb.example.com" is in the endpoint list
Scenario: GET /services with sandbox key does not return production services
When GET /services is called with capability "device.telemetry" and the sandbox key for "isolation-test"
Then the response code is 200
And "https://prod.example.com" is not in the endpoint list
Scenario: GET /services with invalid sandbox key falls back to production
When GET /services is called with capability "device.telemetry" and API key "apix_sb_000invalid"
Then the response code is 200
And "https://prod.example.com" is in the endpoint list