Loading src/open_exposure_gateway/api/gsma/federation_manager/v1_4_0/router.py +3 −12 Changes for src/open_exposure_gateway/api/gsma/federation_manager/v1_4_0/router.py: 3 added lines, 12 removed lines. Original line number Diff line number Diff line Loading @@ -33,6 +33,7 @@ from pydantic import BaseModel, ValidationError from open_exposure_gateway.adapters.http.fm_client import FmClient, FmUnavailableError from open_exposure_gateway.api.camara.common import XCorrelatorHeader from open_exposure_gateway.api.error_handlers import x_correlator_header from open_exposure_gateway.api.gsma.federation_manager.v1_4_0.schemas import ( FederationContextId, FederationContextIdResponse, Loading Loading @@ -162,7 +163,6 @@ async def _relay( method: str, path: str, request: Request, x_correlator: str | None, request_schema: type[BaseModel] | None = None, ) -> Response: """Forward one federation-lifecycle operation to FM and relay its answer unaltered. Loading Loading @@ -198,7 +198,7 @@ async def _relay( path, content=body or None, content_type=request.headers.get("content-type"), x_correlator=x_correlator, x_correlator=x_correlator_header(request), params=tuple(request.query_params.multi_items()), ) except FmUnavailableError: Loading Loading @@ -234,7 +234,6 @@ async def create_federation( "POST", f"/partners/{partnerOpId}/federations", request, x_correlator, request_schema=FederationRequestData, ) Loading @@ -253,9 +252,7 @@ async def get_federation_context_id( fm_client: FmClientDep, x_correlator: XCorrelatorHeader = None, ) -> Response: return await _relay( fm_client, "GET", f"/partners/{partnerOpId}/federations", request, x_correlator ) return await _relay(fm_client, "GET", f"/partners/{partnerOpId}/federations", request) @router.get( Loading @@ -278,7 +275,6 @@ async def get_federation_details( "GET", f"/partners/{partnerOpId}/federations/{federationContextId}", request, x_correlator, ) Loading @@ -302,7 +298,6 @@ async def delete_federation_details( "DELETE", f"/partners/{partnerOpId}/federations/{federationContextId}", request, x_correlator, ) Loading @@ -327,7 +322,6 @@ async def get_zone_data( "GET", f"/partners/{partnerOpId}/federations/{federationContextId}/zones", request, x_correlator, ) Loading @@ -351,7 +345,6 @@ async def zone_subscribe( "POST", f"/partners/{partnerOpId}/federations/{federationContextId}/zones", request, x_correlator, request_schema=ZoneRegistrationRequestData, ) Loading Loading @@ -380,7 +373,6 @@ async def get_zone_details( "GET", f"/partners/{partnerOpId}/federations/{federationContextId}/zones/{zoneId}", request, x_correlator, ) Loading Loading @@ -408,5 +400,4 @@ async def zone_unsubscribe( "DELETE", f"/partners/{partnerOpId}/federations/{federationContextId}/zones/{zoneId}", request, x_correlator, ) tests/unit/test_federation_manager_endpoints.py +14 −0 Changes for tests/unit/test_federation_manager_endpoints.py: 14 added lines, 0 removed lines. Original line number Diff line number Diff line Loading @@ -156,6 +156,20 @@ def test_get_zone_data_forwards_zone_id_query_string( assert ("zoneId", _ZONE) in fake_fm_client.calls[0]["params"] @pytest.mark.parametrize("headers", [{}, {"x-correlator": ""}]) def test_generated_x_correlator_is_the_same_for_fm_and_the_caller( client: TestClient, fake_fm_client: _FakeFmClient, headers: dict[str, str] ) -> None: """No usable ``X-Correlator`` from the caller: the id OEG makes up must reach FM too, or OEG's and FM's logs for this request can't be matched.""" response = client.get(f"{BASE_PATH}{_FEDERATIONS}/{_CTX}", headers=headers) assert response.status_code == 200 generated = response.headers["x-correlator"] assert generated assert fake_fm_client.calls[0]["x_correlator"] == generated def test_fm_error_response_is_relayed_unaltered( client: TestClient, fake_fm_client: _FakeFmClient ) -> None: Loading Loading
src/open_exposure_gateway/api/gsma/federation_manager/v1_4_0/router.py +3 −12 Changes for src/open_exposure_gateway/api/gsma/federation_manager/v1_4_0/router.py: 3 added lines, 12 removed lines. Original line number Diff line number Diff line Loading @@ -33,6 +33,7 @@ from pydantic import BaseModel, ValidationError from open_exposure_gateway.adapters.http.fm_client import FmClient, FmUnavailableError from open_exposure_gateway.api.camara.common import XCorrelatorHeader from open_exposure_gateway.api.error_handlers import x_correlator_header from open_exposure_gateway.api.gsma.federation_manager.v1_4_0.schemas import ( FederationContextId, FederationContextIdResponse, Loading Loading @@ -162,7 +163,6 @@ async def _relay( method: str, path: str, request: Request, x_correlator: str | None, request_schema: type[BaseModel] | None = None, ) -> Response: """Forward one federation-lifecycle operation to FM and relay its answer unaltered. Loading Loading @@ -198,7 +198,7 @@ async def _relay( path, content=body or None, content_type=request.headers.get("content-type"), x_correlator=x_correlator, x_correlator=x_correlator_header(request), params=tuple(request.query_params.multi_items()), ) except FmUnavailableError: Loading Loading @@ -234,7 +234,6 @@ async def create_federation( "POST", f"/partners/{partnerOpId}/federations", request, x_correlator, request_schema=FederationRequestData, ) Loading @@ -253,9 +252,7 @@ async def get_federation_context_id( fm_client: FmClientDep, x_correlator: XCorrelatorHeader = None, ) -> Response: return await _relay( fm_client, "GET", f"/partners/{partnerOpId}/federations", request, x_correlator ) return await _relay(fm_client, "GET", f"/partners/{partnerOpId}/federations", request) @router.get( Loading @@ -278,7 +275,6 @@ async def get_federation_details( "GET", f"/partners/{partnerOpId}/federations/{federationContextId}", request, x_correlator, ) Loading @@ -302,7 +298,6 @@ async def delete_federation_details( "DELETE", f"/partners/{partnerOpId}/federations/{federationContextId}", request, x_correlator, ) Loading @@ -327,7 +322,6 @@ async def get_zone_data( "GET", f"/partners/{partnerOpId}/federations/{federationContextId}/zones", request, x_correlator, ) Loading @@ -351,7 +345,6 @@ async def zone_subscribe( "POST", f"/partners/{partnerOpId}/federations/{federationContextId}/zones", request, x_correlator, request_schema=ZoneRegistrationRequestData, ) Loading Loading @@ -380,7 +373,6 @@ async def get_zone_details( "GET", f"/partners/{partnerOpId}/federations/{federationContextId}/zones/{zoneId}", request, x_correlator, ) Loading Loading @@ -408,5 +400,4 @@ async def zone_unsubscribe( "DELETE", f"/partners/{partnerOpId}/federations/{federationContextId}/zones/{zoneId}", request, x_correlator, )
tests/unit/test_federation_manager_endpoints.py +14 −0 Changes for tests/unit/test_federation_manager_endpoints.py: 14 added lines, 0 removed lines. Original line number Diff line number Diff line Loading @@ -156,6 +156,20 @@ def test_get_zone_data_forwards_zone_id_query_string( assert ("zoneId", _ZONE) in fake_fm_client.calls[0]["params"] @pytest.mark.parametrize("headers", [{}, {"x-correlator": ""}]) def test_generated_x_correlator_is_the_same_for_fm_and_the_caller( client: TestClient, fake_fm_client: _FakeFmClient, headers: dict[str, str] ) -> None: """No usable ``X-Correlator`` from the caller: the id OEG makes up must reach FM too, or OEG's and FM's logs for this request can't be matched.""" response = client.get(f"{BASE_PATH}{_FEDERATIONS}/{_CTX}", headers=headers) assert response.status_code == 200 generated = response.headers["x-correlator"] assert generated assert fake_fm_client.calls[0]["x_correlator"] == generated def test_fm_error_response_is_relayed_unaltered( client: TestClient, fake_fm_client: _FakeFmClient ) -> None: Loading