from unittest import mock from unittest.mock import MagicMock import pytest from anydi import Container from faker import Faker from fansifter_common.adapters.graphql_router import GlobalParticipant from ows_text_campaigns.adapters.scanner import ContentRecommendations, ContentScanner from ows_text_campaigns.artist.exceptions import ArtistSettingsNotFoundError from ows_text_campaigns.artist.handlers import ( UpdateArtistSettingsHandler, UpdateArtistSettingsRequest, ) from ows_text_campaigns.artist.models import ArtistSettings from ows_text_campaigns.assets.exceptions import InvalidAssetIdError from ows_text_campaigns.assets.models import Asset from ows_text_campaigns.rosters.models import ArtistRosterMainRep from tests.unit.types import BuildModel, CreateModel class TestUpdateArtistSettingsHandler: @pytest.mark.db def test_update_artist_settings_not_found( self, handler: UpdateArtistSettingsHandler, faker: Faker, identity_id: str, create_model: CreateModel, ) -> None: global_participant_id = faker.uuid4() create_model( ArtistRosterMainRep, global_participant_id=global_participant_id, vendor_id=1, subaccount_id=0, ) with pytest.raises(ArtistSettingsNotFoundError): handler.handle( UpdateArtistSettingsRequest( identity_id=identity_id, global_participant_id=global_participant_id, ) ) @pytest.mark.db def test_update_artist_settings_welcome_message( self, container: Container, handler: UpdateArtistSettingsHandler, build_model: BuildModel, create_model: CreateModel, graphql_router_client_mock: mock.MagicMock, faker: Faker, identity_id: str, ) -> None: global_participant = build_model(GlobalParticipant, imageUrl=None) artist_settings = create_model( ArtistSettings, opt_in_message_scan_result=ContentRecommendations( includedArtistName=True, sensitiveWords=[] ), welcome_message_scan_result=ContentRecommendations( includedArtistName=True, sensitiveWords=[] ), ) create_model( ArtistRosterMainRep, global_participant_id=artist_settings.global_participant_id, vendor_id=1, subaccount_id=0, ) new_welcome_message = faker.text(max_nb_chars=100) graphql_router_client_mock.get_global_participant_by_gp_id.return_value = ( global_participant ) expected_scan_result = ContentRecommendations( includedArtistName=False, sensitiveWords=["bad word"] ) content_scanner_mock = MagicMock(spec=ContentScanner) content_scanner_mock.scan.return_value = expected_scan_result with ( container.override(ContentScanner, content_scanner_mock), ): updated_artist_settings = handler.handle( UpdateArtistSettingsRequest( identity_id=identity_id, global_participant_id=artist_settings.global_participant_id, welcome_message=new_welcome_message, ) ) content_scanner_mock.scan.assert_called_once_with( new_welcome_message, artist_settings.artist_name ) assert updated_artist_settings.welcome_message == new_welcome_message assert ( updated_artist_settings.welcome_message_scan_result == expected_scan_result ) @pytest.mark.db def test_update_artist_settings_image( self, handler: UpdateArtistSettingsHandler, create_model: CreateModel, identity_id: str, ) -> None: artist_settings = create_model(ArtistSettings, asset_id=None) create_model( ArtistRosterMainRep, global_participant_id=artist_settings.global_participant_id, vendor_id=1, subaccount_id=0, ) asset = create_model( Asset, object_type="artist", object_id=artist_settings.global_participant_id, ) updated_artist_settings = handler.handle( UpdateArtistSettingsRequest( identity_id=identity_id, global_participant_id=artist_settings.global_participant_id, asset_id=asset.id, ) ) assert updated_artist_settings.asset_id == asset.id @pytest.mark.db def test_update_artist_settings_image_invalid_asset( self, handler: UpdateArtistSettingsHandler, create_model: CreateModel, identity_id: str, ) -> None: artist_settings = create_model(ArtistSettings, asset_id=None) create_model( ArtistRosterMainRep, global_participant_id=artist_settings.global_participant_id, vendor_id=1, subaccount_id=0, ) asset = create_model(Asset) with pytest.raises(InvalidAssetIdError): handler.handle( UpdateArtistSettingsRequest( identity_id=identity_id, global_participant_id=artist_settings.global_participant_id, asset_id=asset.id, ) ) @pytest.mark.db def test_update_artist_settings_opt_in_message( self, container: Container, handler: UpdateArtistSettingsHandler, build_model: BuildModel, create_model: CreateModel, graphql_router_client_mock: mock.MagicMock, faker: Faker, identity_id: str, ) -> None: global_participant = build_model(GlobalParticipant, imageUrl=None) artist_settings = create_model( ArtistSettings, opt_in_message_scan_result=ContentRecommendations( includedArtistName=True, sensitiveWords=[] ), welcome_message_scan_result=ContentRecommendations( includedArtistName=True, sensitiveWords=[] ), ) create_model( ArtistRosterMainRep, global_participant_id=artist_settings.global_participant_id, vendor_id=1, subaccount_id=0, ) new_opt_in_message = faker.text(max_nb_chars=100) graphql_router_client_mock.get_global_participant_by_gp_id.return_value = ( global_participant ) expected_scan_result = ContentRecommendations( includedArtistName=False, sensitiveWords=["bad word"] ) content_scanner_mock = MagicMock(spec=ContentScanner) content_scanner_mock.scan.return_value = expected_scan_result with ( container.override(ContentScanner, content_scanner_mock), ): updated_artist_settings = handler.handle( UpdateArtistSettingsRequest( identity_id=identity_id, global_participant_id=artist_settings.global_participant_id, opt_in_message=new_opt_in_message, ) ) content_scanner_mock.scan.assert_called_once_with( new_opt_in_message, artist_settings.artist_name ) assert updated_artist_settings.opt_in_message == new_opt_in_message assert ( updated_artist_settings.opt_in_message_scan_result == expected_scan_result )