from datetime import timedelta import faker import freezegun import pytest from dirty_equals import IsList from fansifter_common.utils import timezone from app.models import ( AudienceFan, FanPersonalDataDbt, MessageSendQueue, ) from app.repositories import AudienceFanRepository, MessageSendQueueRepository from app.types import AudienceFanData from tests.unit.types import CreateModel class TestMessageSendQueueRepository: @pytest.mark.db @freezegun.freeze_time("2022-01-01 00:00:00") def test_find_ready( self, repository: MessageSendQueueRepository, create_model: CreateModel ) -> None: queue1 = create_model( MessageSendQueue, total=100, offset=0, send_at=timezone.now(), ) queue2 = create_model( MessageSendQueue, total=1000, offset=999, send_at=timezone.now(), ) # Scheduled email campaign create_model( MessageSendQueue, total=1000, offset=0, send_at=timezone.now() + timedelta(days=1), ) result = repository.find_ready() assert result == IsList(queue1, queue2, check_order=False) class TestAudienceFanRepository: @pytest.mark.db def test_find_by_snapshot_id( self, repository: AudienceFanRepository, create_model: CreateModel, faker: faker.Faker, ) -> None: snapshot_id = faker.pystr() audience_fans = [ create_model(AudienceFan, snapshot_id=snapshot_id) for _ in range(3) ] _ = [ create_model(FanPersonalDataDbt, fan_id=fan.fan_id) for fan in audience_fans ] rows = repository.find_by_snapshot_id( snapshot_id=snapshot_id, limit=2, offset=0, ) assert len(rows) == 2 @pytest.mark.db def test_find_by_snapshot_id_order_by_last_engagement( self, repository: AudienceFanRepository, create_model: CreateModel, faker: faker.Faker, ) -> None: snapshot_id = faker.pystr() today = timezone.now() audience_fan_1 = create_model( AudienceFan, snapshot_id=snapshot_id, fan_id="1234", last_engagement_at=today - timedelta(days=3), ) audience_fan_2 = create_model( AudienceFan, snapshot_id=snapshot_id, fan_id="3456", last_engagement_at=None, ) audience_fan_3 = create_model( AudienceFan, snapshot_id=snapshot_id, fan_id="2345", last_engagement_at=today - timedelta(days=1), ) phone_number_1 = faker.phone_number() phone_number_2 = faker.phone_number() phone_number_3 = faker.phone_number() _ = create_model( FanPersonalDataDbt, fan_id=audience_fan_1.fan_id, fan_mobile_phone=phone_number_1, ) _ = create_model( FanPersonalDataDbt, fan_id=audience_fan_2.fan_id, fan_mobile_phone=phone_number_2, ) _ = create_model( FanPersonalDataDbt, fan_id=audience_fan_3.fan_id, fan_mobile_phone=phone_number_3, ) rows = repository.find_by_snapshot_id( snapshot_id=snapshot_id, limit=2, offset=0, ) assert rows == IsList( AudienceFanData( fan_id=audience_fan_3.fan_id, phone_number=phone_number_3, ), AudienceFanData( fan_id=audience_fan_1.fan_id, phone_number=phone_number_1, ), check_order=True, ) @pytest.mark.db def test_find_by_snapshot_id_missed_fan_personal_data( self, repository: AudienceFanRepository, create_model: CreateModel, faker: faker.Faker, ) -> None: snapshot_id = faker.pystr() phone_number_1 = faker.phone_number() phone_number_2 = faker.phone_number() audience_fan_1 = create_model( AudienceFan, snapshot_id=snapshot_id, fan_id="1234", ) audience_fan_2 = create_model( AudienceFan, snapshot_id=snapshot_id, fan_id="3456" ) _ = create_model( FanPersonalDataDbt, fan_id=audience_fan_1.fan_id, fan_mobile_phone=phone_number_1, ) _ = create_model( FanPersonalDataDbt, fan_id=audience_fan_2.fan_id, fan_mobile_phone=phone_number_2, ) rows = repository.find_by_snapshot_id( snapshot_id=snapshot_id, limit=2, offset=0, ) assert len(rows) == 2 assert rows == IsList( AudienceFanData( fan_id=audience_fan_1.fan_id, phone_number=phone_number_1, channel="SMS", ), AudienceFanData( fan_id=audience_fan_2.fan_id, phone_number=phone_number_2, channel="SMS", ), check_order=True, ) @pytest.mark.db def test_count_by_snapshot_id_has_no_fans( self, repository: AudienceFanRepository, create_model: CreateModel, faker: faker.Faker, ) -> None: snapshot_id = faker.pystr() audience_fan = create_model(AudienceFan, snapshot_id=snapshot_id) create_model( FanPersonalDataDbt, fan_id=audience_fan.fan_id, fan_mobile_phone=faker.phone_number(), ) fans_count = repository.count_by_snapshot_id( snapshot_id=snapshot_id, ) assert fans_count == 1