from unittest import mock import faker import pytest from fansifter_common.adapters.twilio.models import ( SendMessageRequest, SendMessageResponse, ) from ows_text_campaigns.artist.models import ArtistPhoneNumber, ArtistSettings from ows_text_campaigns.assets.models import Asset from ows_text_campaigns.campaigns.handlers import ( SendCampaignTestMessageHandler, SendCampaignTestMessageRequest, ) from ows_text_campaigns.campaigns.models import Campaign from ows_text_campaigns.twilio.models import TwilioAccount from tests.unit.types import CreateModel, CreatePgModel class TestSendCampaignTestMessageHandler: @pytest.mark.db def test_send_campaign_test_message_for_us( self, handler: SendCampaignTestMessageHandler, create_model: CreateModel, create_pg_model: CreatePgModel, faker: faker.Faker, twilio_client_mock: mock.MagicMock, ) -> None: global_participant_id = faker.uuid4() twilio_account = create_pg_model(TwilioAccount) twilio_account_sid = twilio_account.account_sid twilio_messaging_service_sid = faker.pystr() create_model( ArtistSettings, global_participant_id=global_participant_id, phone_numbers=[ ArtistPhoneNumber( global_participant_id=global_participant_id, phone_number="+12345678900", ) ], twilio_account_sid=twilio_account_sid, twilio_messaging_service_sid=twilio_messaging_service_sid, ) asset = create_model(Asset, key="image.jpg") campaign = create_model( Campaign, global_participant_id=global_participant_id, content="Hello World!", assets=[asset], ) twilio_client_mock.send_message.return_value = SendMessageResponse( sid=faker.uuid4(), error_code=None, error_message=None, ) handler.handle( SendCampaignTestMessageRequest( identity_id=faker.uuid4(), campaign_id=campaign.id, phone_number="+12345678901", ) ) twilio_client_mock.send_message.assert_called_once_with( SendMessageRequest.model_construct( to="+12345678901", from_="+12345678900", body="Hello World!\nReply STOP to unsubscribe.", media_url="https://test-cdn.com/image.jpg", messaging_service_sid=twilio_messaging_service_sid, account_sid=twilio_account_sid, status_callback=mock.ANY, ), auth=( twilio_account.api_key_id, twilio_account.api_secret, ), ) @pytest.mark.db def test_send_campaign_test_message_for_non_us( self, handler: SendCampaignTestMessageHandler, create_model: CreateModel, create_pg_model: CreatePgModel, faker: faker.Faker, twilio_client_mock: mock.MagicMock, ) -> None: global_participant_id = faker.uuid4() twilio_account = create_pg_model(TwilioAccount) twilio_account_sid = twilio_account.account_sid twilio_messaging_service_sid = faker.pystr() create_model( ArtistSettings, global_participant_id=global_participant_id, phone_numbers=[ ArtistPhoneNumber( phone_number="+12345678900", global_participant_id=global_participant_id, ), ArtistPhoneNumber( phone_number="+37255000000", global_participant_id=global_participant_id, ), ], twilio_account_sid=twilio_account_sid, twilio_messaging_service_sid=twilio_messaging_service_sid, ) asset = create_model(Asset, key="image.jpg") campaign = create_model( Campaign, global_participant_id=global_participant_id, content="Hello World!", assets=[asset], ) twilio_client_mock.send_message.return_value = SendMessageResponse( sid=faker.uuid4(), error_code=None, error_message=None, ) handler.handle( SendCampaignTestMessageRequest( identity_id=faker.uuid4(), campaign_id=campaign.id, phone_number="+37255555555", ) ) twilio_client_mock.send_message.assert_called_once_with( SendMessageRequest.model_construct( to="+37255555555", from_="+37255000000", body="Hello World!\nReply STOP to unsubscribe.", media_url=None, messaging_service_sid=twilio_messaging_service_sid, account_sid=twilio_account_sid, status_callback=mock.ANY, ), auth=( twilio_account.api_key_id, twilio_account.api_secret, ), )