from unittest import mock import pytest from faker import Faker from fansifter_common.adapters.twilio.enums import TwilioMessageNumberType from fansifter_common.adapters.twilio.models import ( MessageCountryPricing, Price, SmsPrice, ) from ows_text_campaigns.twilio.handlers import SyncTwilioPricingHandler from ows_text_campaigns.twilio.repositories import ( TwilioMessagePricingByCountryRepository, ) from tests.unit.types import BuildModel class TestSyncTwilioPricingHandler: @pytest.mark.db def test_sync_twilio_pricing_handler_mobile_same_price_only_mobile( self, handler: SyncTwilioPricingHandler, message_pricing_repository: TwilioMessagePricingByCountryRepository, twilio_client_mock: mock.MagicMock, build_model: BuildModel, faker: Faker, ) -> None: price_1 = build_model( Price, number_type=TwilioMessageNumberType.OTHER, current_price=faker.pyint() / 1000, ) price_2 = build_model( Price, number_type=TwilioMessageNumberType.MOBILE, current_price=faker.pyint() / 1000, ) message_pricing = build_model( MessageCountryPricing, outbound_sms_prices=[build_model(SmsPrice, prices=[price_1, price_2])], ) twilio_client_mock.get_message_country_pricing.return_value = message_pricing country = faker.pystr() handler.supported_countries = [country] handler.handle() stored_message_pricing = message_pricing_repository.all() assert len(stored_message_pricing) == 1 assert stored_message_pricing[0].country_iso2 == country assert stored_message_pricing[0].currency == message_pricing.price_unit assert stored_message_pricing[0].min_current_price == price_2.current_price assert stored_message_pricing[0].max_current_price == price_2.current_price @pytest.mark.db def test_sync_twilio_pricing_handler_mobile_different_price( self, handler: SyncTwilioPricingHandler, message_pricing_repository: TwilioMessagePricingByCountryRepository, twilio_client_mock: mock.MagicMock, build_model: BuildModel, faker: Faker, ) -> None: price_1 = build_model( Price, number_type=TwilioMessageNumberType.MOBILE, current_price=faker.pyint() / 1000, ) sms_price_1 = build_model(SmsPrice, prices=[price_1]) price_2 = build_model( Price, number_type=TwilioMessageNumberType.MOBILE, current_price=price_1.current_price + 1000, ) sms_price_2 = build_model(SmsPrice, prices=[price_2]) message_pricing = build_model( MessageCountryPricing, outbound_sms_prices=[sms_price_1, sms_price_2] ) twilio_client_mock.get_message_country_pricing.return_value = message_pricing country = faker.pystr() handler.supported_countries = [country] handler.handle() stored_message_pricing = message_pricing_repository.all() assert len(stored_message_pricing) == 1 assert stored_message_pricing[0].country_iso2 == country assert stored_message_pricing[0].currency == message_pricing.price_unit assert stored_message_pricing[0].min_current_price == price_1.current_price assert stored_message_pricing[0].max_current_price == price_2.current_price