from unittest import mock import pytest from fansifter_common.auth.account import Account, AccountAccess from fansifter_common.auth.types import Permission from fansifter_common.utils.uuid import uuid_string from ows_text_campaigns.artist.validators import ArtistSettingsValidator from ows_text_campaigns.rosters.exceptions import ArtistNotInRosterError from ows_text_campaigns.rosters.models import ArtistRoster, ArtistRosterMainRep from tests.unit.types import CreateModel class TestArtistSettingsValidator: @pytest.mark.db def test_validate_roster_access_main_rep( self, validator: ArtistSettingsValidator, create_model: CreateModel ) -> None: global_participant_id = uuid_string() identity_id = uuid_string() vendor_id = 123 subaccount_id = 0 create_model( ArtistRosterMainRep, global_participant_id=global_participant_id, vendor_id=vendor_id, subaccount_id=subaccount_id, ) validator.auth_service.authorize_for_permission = mock.Mock( return_value=AccountAccess( accounts=[Account(vendor_id=vendor_id, subaccount_id=subaccount_id)] ) ) result = validator.validate_roster_access( identity_id=identity_id, global_participant_id=global_participant_id, permission=Permission("text_campaign", "create"), ) assert isinstance(result, AccountAccess) assert result.vendor_ids == [vendor_id] @pytest.mark.db def test_validate_roster_access_artist_roster( self, validator: ArtistSettingsValidator, create_model: CreateModel ) -> None: global_participant_id = uuid_string() identity_id = uuid_string() vendor_id = 456 subaccount_id = 789 create_model( ArtistRoster, global_participant_id=global_participant_id, vendor_id=vendor_id, subaccount_id=subaccount_id, ) validator.auth_service.authorize_for_permission = mock.Mock( return_value=AccountAccess( accounts=[Account(vendor_id=vendor_id, subaccount_id=subaccount_id)] ) ) result = validator.validate_roster_access( identity_id=identity_id, global_participant_id=global_participant_id, permission=Permission("text_campaign", "create"), ) assert isinstance(result, AccountAccess) @pytest.mark.db def test_validate_roster_access_multiple_vendors( self, validator: ArtistSettingsValidator, create_model: CreateModel ) -> None: global_participant_id = uuid_string() identity_id = uuid_string() vendor_id_1 = 111 vendor_id_2 = 222 create_model( ArtistRosterMainRep, global_participant_id=global_participant_id, vendor_id=vendor_id_2, subaccount_id=0, ) validator.auth_service.authorize_for_permission = mock.Mock( return_value=AccountAccess( accounts=[ Account(vendor_id=vendor_id_1, subaccount_id=0), Account(vendor_id=vendor_id_2, subaccount_id=0), ] ) ) result = validator.validate_roster_access( identity_id=identity_id, global_participant_id=global_participant_id, permission=Permission("text_campaign", "create"), ) assert isinstance(result, AccountAccess) @pytest.mark.db def test_validate_roster_access_not_found( self, validator: ArtistSettingsValidator ) -> None: global_participant_id = uuid_string() identity_id = uuid_string() validator.auth_service.authorize_for_permission = mock.Mock( return_value=AccountAccess( accounts=[ Account(vendor_id=999, subaccount_id=0), Account(vendor_id=0, subaccount_id=888), ] ) ) with pytest.raises(ArtistNotInRosterError) as exc_info: validator.validate_roster_access( identity_id=identity_id, global_participant_id=global_participant_id, permission=Permission("text_campaign", "create"), ) assert exc_info.value.global_participant_id == global_participant_id @pytest.mark.db def test_validate_roster_access_wrong_vendor( self, validator: ArtistSettingsValidator, create_model: CreateModel ) -> None: global_participant_id = uuid_string() identity_id = uuid_string() create_model( ArtistRosterMainRep, global_participant_id=global_participant_id, vendor_id=100, subaccount_id=0, ) validator.auth_service.authorize_for_permission = mock.Mock( return_value=AccountAccess( accounts=[Account(vendor_id=200, subaccount_id=0)] ) ) with pytest.raises(ArtistNotInRosterError): validator.validate_roster_access( identity_id=identity_id, global_participant_id=global_participant_id, permission=Permission("text_campaign", "create"), ) @pytest.mark.db def test_validate_roster_access_empty_account_access( self, validator: ArtistSettingsValidator, create_model: CreateModel ) -> None: global_participant_id = uuid_string() identity_id = uuid_string() create_model( ArtistRosterMainRep, global_participant_id=global_participant_id, vendor_id=100, subaccount_id=0, ) validator.auth_service.authorize_for_permission = mock.Mock( return_value=AccountAccess(accounts=[]) ) with pytest.raises(ArtistNotInRosterError): validator.validate_roster_access( identity_id=identity_id, global_participant_id=global_participant_id, permission=Permission("text_campaign", "create"), )