Loading src/srm/application/command_handlers/network_capability_activate.py +29 −2 Original line number Diff line number Diff line Loading @@ -169,8 +169,8 @@ class NetworkCapabilityActivateCommandCoordinator: schema_version="1.0", operation_id=envelope.operation_id, service_order_id=None, service_instance_id=None, capability="network_capability", service_instance_id=self._service_instance_id_from_envelope(envelope), capability=self._capability_from_envelope(envelope), state=OperationStatusState.FAILED_BEFORE_START, correlation_id=envelope.correlation_id, emitted_at=now, Loading Loading @@ -198,6 +198,33 @@ class NetworkCapabilityActivateCommandCoordinator: completed_event.model_dump(mode="json"), ) def _capability_from_envelope(self, envelope: ValidatedEnvelopeV1) -> str | None: if envelope.model_extra is None: return None network_capability = envelope.model_extra.get("network_capability") if not isinstance(network_capability, dict): return None capability_type = network_capability.get("capability_type") if isinstance(capability_type, str) and capability_type: return capability_type return None def _service_instance_id_from_envelope(self, envelope: ValidatedEnvelopeV1) -> UUID | None: if envelope.model_extra is None: return None service_instance_id = envelope.model_extra.get("service_instance_id") if isinstance(service_instance_id, UUID): return service_instance_id if isinstance(service_instance_id, str): try: return UUID(service_instance_id) except ValueError: return None return None def _failed_after_accept_event( self, command: NetworkCapabilityActivateCommand, Loading tests/application/test_network_capability_activate_command_coordinator.py +70 −5 Original line number Diff line number Diff line Loading @@ -42,6 +42,9 @@ class FakeSessionMaker: def _valid_envelope( *, service_instance_id: str | None = "1f0c8e5a-4b77-4c31-9d2e-7a5c1b0e9b21", network_capability: dict[str, object] | None = None, zone_id: str | None = None, domain_id: str | None = None, ) -> ValidatedEnvelopeV1: payload: dict[str, object] = { "schema_version": "1.0", Loading @@ -51,15 +54,21 @@ def _valid_envelope( "app_provider_id": "VideoAppsCo", "source": "nbi_camara", "service_specification_id": "7608e902-b927-559f-b448-e7e9061dfa5c", "network_capability": { } if service_instance_id is not None: payload["service_instance_id"] = service_instance_id if zone_id is not None: payload["zone_id"] = zone_id if domain_id is not None: payload["domain_id"] = domain_id if network_capability is None: network_capability = { "capability_type": "qod_session", "target": {}, "profile_ref": "voice", "parameters": {"duration_seconds": 3600}, }, } if service_instance_id is not None: payload["service_instance_id"] = service_instance_id payload["network_capability"] = network_capability return ValidatedEnvelopeV1.model_validate(payload) Loading @@ -81,12 +90,68 @@ async def test_handle_publishes_failed_before_start_for_stage2_schema_failure() subject, payload = publisher.publish.await_args_list[0].args assert subject == "event.srm.operation.status" assert payload["state"] == "failed_before_start" assert payload["service_instance_id"] is None assert payload["capability"] == "qod_session" subject, payload = publisher.publish.await_args_list[1].args assert subject == "event.srm.operation.completed" assert payload["status"] == "failed" assert payload["error"]["detail"] == "Network capability activate command payload is invalid." async def test_handle_uses_null_capability_when_stage2_payload_has_no_capability_type() -> None: session_maker = FakeSessionMaker() use_case_factory = MagicMock() publisher = AsyncMock() coordinator = NetworkCapabilityActivateCommandCoordinator( session_maker=session_maker, # type: ignore[arg-type] use_case_factory=use_case_factory, publisher=publisher, ) await coordinator.handle( _valid_envelope( network_capability={ "target": {}, "profile_ref": "voice", "parameters": {"duration_seconds": 3600}, } ) ) assert session_maker.contexts == [] use_case_factory.assert_not_called() subject, payload = publisher.publish.await_args_list[0].args assert subject == "event.srm.operation.status" assert payload["state"] == "failed_before_start" assert payload["capability"] is None async def test_handle_preserves_readable_service_instance_id_for_stage2_schema_failure() -> None: session_maker = FakeSessionMaker() use_case_factory = MagicMock() publisher = AsyncMock() coordinator = NetworkCapabilityActivateCommandCoordinator( session_maker=session_maker, # type: ignore[arg-type] use_case_factory=use_case_factory, publisher=publisher, ) await coordinator.handle( _valid_envelope( service_instance_id="99999999-0000-4000-8000-000000000002", domain_id="642f6105-7015-4af1-a4d1-e1ecb8437abc", ) ) assert session_maker.contexts == [] use_case_factory.assert_not_called() subject, payload = publisher.publish.await_args_list[0].args assert subject == "event.srm.operation.status" assert payload["state"] == "failed_before_start" assert payload["service_instance_id"] == "99999999-0000-4000-8000-000000000002" assert payload["capability"] == "qod_session" async def test_handle_commits_accept_before_publishing_accepted() -> None: session_maker = FakeSessionMaker() accepted_order_id = UUID("aaaaaaaa-0000-4000-8000-000000000001") Loading tests/integration/test_databus_command_flow.py 0 → 100644 +835 −0 File added.Preview size limit exceeded, changes collapsed. Show changes Loading
src/srm/application/command_handlers/network_capability_activate.py +29 −2 Original line number Diff line number Diff line Loading @@ -169,8 +169,8 @@ class NetworkCapabilityActivateCommandCoordinator: schema_version="1.0", operation_id=envelope.operation_id, service_order_id=None, service_instance_id=None, capability="network_capability", service_instance_id=self._service_instance_id_from_envelope(envelope), capability=self._capability_from_envelope(envelope), state=OperationStatusState.FAILED_BEFORE_START, correlation_id=envelope.correlation_id, emitted_at=now, Loading Loading @@ -198,6 +198,33 @@ class NetworkCapabilityActivateCommandCoordinator: completed_event.model_dump(mode="json"), ) def _capability_from_envelope(self, envelope: ValidatedEnvelopeV1) -> str | None: if envelope.model_extra is None: return None network_capability = envelope.model_extra.get("network_capability") if not isinstance(network_capability, dict): return None capability_type = network_capability.get("capability_type") if isinstance(capability_type, str) and capability_type: return capability_type return None def _service_instance_id_from_envelope(self, envelope: ValidatedEnvelopeV1) -> UUID | None: if envelope.model_extra is None: return None service_instance_id = envelope.model_extra.get("service_instance_id") if isinstance(service_instance_id, UUID): return service_instance_id if isinstance(service_instance_id, str): try: return UUID(service_instance_id) except ValueError: return None return None def _failed_after_accept_event( self, command: NetworkCapabilityActivateCommand, Loading
tests/application/test_network_capability_activate_command_coordinator.py +70 −5 Original line number Diff line number Diff line Loading @@ -42,6 +42,9 @@ class FakeSessionMaker: def _valid_envelope( *, service_instance_id: str | None = "1f0c8e5a-4b77-4c31-9d2e-7a5c1b0e9b21", network_capability: dict[str, object] | None = None, zone_id: str | None = None, domain_id: str | None = None, ) -> ValidatedEnvelopeV1: payload: dict[str, object] = { "schema_version": "1.0", Loading @@ -51,15 +54,21 @@ def _valid_envelope( "app_provider_id": "VideoAppsCo", "source": "nbi_camara", "service_specification_id": "7608e902-b927-559f-b448-e7e9061dfa5c", "network_capability": { } if service_instance_id is not None: payload["service_instance_id"] = service_instance_id if zone_id is not None: payload["zone_id"] = zone_id if domain_id is not None: payload["domain_id"] = domain_id if network_capability is None: network_capability = { "capability_type": "qod_session", "target": {}, "profile_ref": "voice", "parameters": {"duration_seconds": 3600}, }, } if service_instance_id is not None: payload["service_instance_id"] = service_instance_id payload["network_capability"] = network_capability return ValidatedEnvelopeV1.model_validate(payload) Loading @@ -81,12 +90,68 @@ async def test_handle_publishes_failed_before_start_for_stage2_schema_failure() subject, payload = publisher.publish.await_args_list[0].args assert subject == "event.srm.operation.status" assert payload["state"] == "failed_before_start" assert payload["service_instance_id"] is None assert payload["capability"] == "qod_session" subject, payload = publisher.publish.await_args_list[1].args assert subject == "event.srm.operation.completed" assert payload["status"] == "failed" assert payload["error"]["detail"] == "Network capability activate command payload is invalid." async def test_handle_uses_null_capability_when_stage2_payload_has_no_capability_type() -> None: session_maker = FakeSessionMaker() use_case_factory = MagicMock() publisher = AsyncMock() coordinator = NetworkCapabilityActivateCommandCoordinator( session_maker=session_maker, # type: ignore[arg-type] use_case_factory=use_case_factory, publisher=publisher, ) await coordinator.handle( _valid_envelope( network_capability={ "target": {}, "profile_ref": "voice", "parameters": {"duration_seconds": 3600}, } ) ) assert session_maker.contexts == [] use_case_factory.assert_not_called() subject, payload = publisher.publish.await_args_list[0].args assert subject == "event.srm.operation.status" assert payload["state"] == "failed_before_start" assert payload["capability"] is None async def test_handle_preserves_readable_service_instance_id_for_stage2_schema_failure() -> None: session_maker = FakeSessionMaker() use_case_factory = MagicMock() publisher = AsyncMock() coordinator = NetworkCapabilityActivateCommandCoordinator( session_maker=session_maker, # type: ignore[arg-type] use_case_factory=use_case_factory, publisher=publisher, ) await coordinator.handle( _valid_envelope( service_instance_id="99999999-0000-4000-8000-000000000002", domain_id="642f6105-7015-4af1-a4d1-e1ecb8437abc", ) ) assert session_maker.contexts == [] use_case_factory.assert_not_called() subject, payload = publisher.publish.await_args_list[0].args assert subject == "event.srm.operation.status" assert payload["state"] == "failed_before_start" assert payload["service_instance_id"] == "99999999-0000-4000-8000-000000000002" assert payload["capability"] == "qod_session" async def test_handle_commits_accept_before_publishing_accepted() -> None: session_maker = FakeSessionMaker() accepted_order_id = UUID("aaaaaaaa-0000-4000-8000-000000000001") Loading
tests/integration/test_databus_command_flow.py 0 → 100644 +835 −0 File added.Preview size limit exceeded, changes collapsed. Show changes