from __future__ import annotations import unittest from types import SimpleNamespace from unittest.mock import patch from govoplan_campaign.backend.routes.sharing import ( search_campaign_share_targets, ) from govoplan_core.core.references import ( CAPABILITY_ACCESS_REFERENCE_OPTIONS, ReferenceOption, ReferenceSearchPage, ) class _Provider: def __init__(self) -> None: self.requests = [] def search_reference_options(self, session, principal, *, request): del session, principal self.requests.append(request) return ReferenceSearchPage( options=( ReferenceOption( value="membership-1", label="Ada", kind="membership", source_module="access", ), ), next_cursor="offset:1", has_more=True, ) class _Registry: def __init__(self) -> None: self.provider = _Provider() def has_capability(self, name): return name == CAPABILITY_ACCESS_REFERENCE_OPTIONS def capability(self, name): return self.provider if self.has_capability(name) else None class CampaignShareTargetSearchTests(unittest.TestCase): def test_search_uses_membership_references_and_retains_stale_targets(self) -> None: registry = _Registry() principal = SimpleNamespace( tenant_id="tenant-1", account_id="account-1", membership_id="membership-1", group_ids=frozenset(), ) with ( patch( "govoplan_campaign.backend.routes.sharing._get_campaign_for_principal" ), patch( "govoplan_campaign.backend.routes.sharing.get_registry", return_value=registry, ), ): response = search_campaign_share_targets( "campaign-1", "user", q="Ada", selected=["removed-membership"], limit=25, cursor="offset:0", session=object(), # type: ignore[arg-type] principal=principal, # type: ignore[arg-type] ) request = registry.provider.requests[0] self.assertEqual("membership", request.kind) self.assertEqual("tenant-1", request.tenant_id) self.assertEqual("ada", request.query) self.assertTrue(request.context["administrative"]) self.assertEqual( ["membership-1", "removed-membership"], [option.value for option in response.options], ) self.assertEqual("unavailable", response.options[1].availability) self.assertTrue(response.has_more) self.assertEqual("offset:1", response.next_cursor) if __name__ == "__main__": unittest.main()