Commit 726cfc23 authored by Paris Stentoumis's avatar Paris Stentoumis
Browse files

feat: tests and changes to match implementation of events to architecture

parent 6988c209
Loading
Loading
Loading
Loading
+29 −2
Original line number Diff line number Diff line
@@ -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,
@@ -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,
+70 −5
Original line number Diff line number Diff line
@@ -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",
@@ -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)


@@ -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")
+835 −0

File added.

Preview size limit exceeded, changes collapsed.