from unittest import mock import pytest from audience_common.auth.account import Account from campaigns.auth.dtos import User, UserId from campaigns.connectors.db import Database from campaigns.connectors.facebook import models as fb_models from campaigns.meta.handlers import ( GetFacebookUserPagesForLabelHandler, GetFacebookUserPagesForLabelRequest, ) from campaigns.meta.models import FacebookPageLabel from campaigns.meta.repositories import FacebookPageRepository from campaigns.meta.services import FacebookPageTokenService from tests.unit.types import CreateModel @pytest.fixture def handler( db: Database, facebook_page_repository: FacebookPageRepository, facebook_page_token_service: FacebookPageTokenService, ) -> GetFacebookUserPagesForLabelHandler: return GetFacebookUserPagesForLabelHandler( db=db, facebook_page_repository=facebook_page_repository, facebook_page_token_service=facebook_page_token_service, ) async def test_get_facebook_user_pages_for_label_by_vendor( handler: GetFacebookUserPagesForLabelHandler, facebook_client_mock: mock.MagicMock, create_model: CreateModel, user_id: UserId, ) -> None: page_label = await create_model(FacebookPageLabel) page = page_label.page account_access = mock.MagicMock() account_access.has_direct_access_to_vendor.return_value = True account_access.has_direct_access_to_subaccount.return_value = False user = User(id=user_id, account_access=account_access) facebook_client_mock.debug_tokens.return_value = { page.token: fb_models.DebugToken(is_valid=True, scopes=[]) } pages = await handler.handle( GetFacebookUserPagesForLabelRequest( user=user, account=Account(vendor_id=page_label.vendor_id, subaccount_id=0), ), ) assert pages == [page] async def test_get_facebook_user_pages_for_label_by_subaccount( handler: GetFacebookUserPagesForLabelHandler, facebook_client_mock: mock.MagicMock, create_model: CreateModel, user_id: UserId, ) -> None: page_label = await create_model(FacebookPageLabel) page = page_label.page account_access = mock.MagicMock() account_access.has_direct_access_to_vendor.return_value = False account_access.has_direct_access_to_subaccount.return_value = True user = User(id=user_id, account_access=account_access) facebook_client_mock.debug_tokens.return_value = { page.token: fb_models.DebugToken(is_valid=True, scopes=[]) } pages = await handler.handle( request=GetFacebookUserPagesForLabelRequest( user=user, account=page_label.account, ), ) assert pages == [page] async def test_get_facebook_user_pages_for_label_return_none_when_no_direct_access( handler: GetFacebookUserPagesForLabelHandler, create_model: CreateModel, user_id: UserId, ) -> None: page_label = await create_model(FacebookPageLabel) account_access = mock.MagicMock() account_access.has_access_to_vendor.return_value = False account_access.has_access_to_subaccount.return_value = False user = User(id=user_id, account_access=account_access) pages = await handler.handle( request=GetFacebookUserPagesForLabelRequest( user=user, account=page_label.account, ), ) assert pages == []