import pytest
from fansifter_common.auth.account import Account
from ows_text_campaigns.campaigns.handlers import (
GetCampaignAnalyticsHandler,
GetCampaignAnalyticsRequest,
)
from ows_text_campaigns.campaigns.models import (
Campaign,
CampaignSendsCountryAggregated,
TextAnalyticsBenchmarkByAccountArtist,
TextCampaignUnsubscribe,
UrlShortenerClicksGenderAgeAggregated,
)
from tests.unit.types import CreateModel
class TestGetCampaignAnalyticsHandler:
@pytest.mark.db
def test_get_campaign_analytics_no_data(
self,
handler: GetCampaignAnalyticsHandler,
create_model: CreateModel,
identity_id: str,
account: Account,
) -> None:
url = "https://example.com/test-path"
campaign = create_model(
Campaign,
vendor_id=account.vendor_id,
subaccount_id=account.subaccount_id,
content=f"""
short_link
""",
)
result = handler.handle(
GetCampaignAnalyticsRequest(
identity_id=identity_id,
campaign_id=campaign.id,
vendor_id=account.vendor_id,
subaccount_id=account.subaccount_id,
)
)
assert result is not None
assert result.campaign_id == campaign.id
assert result.sends == 0
assert result.clicks == 0
assert result.click_through_rate == 0
assert result.unsubscribe_rate == 0
assert result.unsubscribe_rate_change is None
assert result.delivery_rate == 0
assert result.delivery_rate_change is None
assert result.delivery_failed_rate == 0
assert result.delivery_failed_rate_change is None
assert result.locations is None
@pytest.mark.db
def test_get_campaign_analytics_no_short_links(
self,
handler: GetCampaignAnalyticsHandler,
create_model: CreateModel,
identity_id: str,
account: Account,
) -> None:
url = "https://example.com/test-path"
campaign = create_model(
Campaign,
vendor_id=account.vendor_id,
subaccount_id=account.subaccount_id,
content=f'long_link',
)
result = handler.handle(
GetCampaignAnalyticsRequest(
identity_id=identity_id,
campaign_id=campaign.id,
vendor_id=account.vendor_id,
subaccount_id=account.subaccount_id,
)
)
assert result is not None
assert result.campaign_id == campaign.id
assert result.sends == 0
assert result.clicks is None
assert result.click_through_rate is None
assert result.unsubscribe_rate == 0
assert result.unsubscribe_rate_change is None
assert result.delivery_rate == 0
assert result.delivery_rate_change is None
assert result.delivery_failed_rate == 0
assert result.delivery_failed_rate_change is None
assert result.locations is None
@pytest.mark.db
def test_get_campaign_analytics(
self,
handler: GetCampaignAnalyticsHandler,
create_model: CreateModel,
identity_id: str,
account: Account,
) -> None:
url = "https://example.com/test-path"
campaign = create_model(
Campaign,
vendor_id=account.vendor_id,
subaccount_id=account.subaccount_id,
content=f"""
short_link
""",
)
sends = create_model(
CampaignSendsCountryAggregated,
campaign_id=campaign.id,
sends=10,
delivered=5,
failed=5,
)
create_model(
TextCampaignUnsubscribe,
campaign_id=campaign.id,
unsubscribes=2,
)
create_model(
UrlShortenerClicksGenderAgeAggregated,
campaign_id=campaign.id,
clicks=5,
redirect_url=url,
)
result = handler.handle(
GetCampaignAnalyticsRequest(
identity_id=identity_id,
campaign_id=campaign.id,
vendor_id=account.vendor_id,
subaccount_id=account.subaccount_id,
)
)
assert result is not None
assert result.campaign_id == campaign.id
assert result.sends == 10
assert result.clicks == 5
assert result.click_through_rate == 0.5
assert result.delivery_rate == 0.5
assert result.delivery_failed_rate == 0.5
assert result.delivery_rate_change is None
assert result.delivery_failed_rate_change is None
assert result.unsubscribe_rate == 0.2
# TODO
assert result.unsubscribe_rate_change is None
assert result.locations is not None
assert result.locations[0].sends == sends.sends
assert result.locations[0].country_code == sends.country_code
assert result.locations[0].clicks is None
@pytest.mark.db
def test_get_campaign_analytics_rates_change(
self,
handler: GetCampaignAnalyticsHandler,
create_model: CreateModel,
identity_id: str,
account: Account,
) -> None:
url = "https://example.com/test-path"
campaign = create_model(
Campaign,
vendor_id=account.vendor_id,
subaccount_id=account.subaccount_id,
content=f"""
short_link
""",
)
create_model(
CampaignSendsCountryAggregated,
campaign_id=campaign.id,
sends=10,
delivered=5,
failed=5,
)
create_model(
UrlShortenerClicksGenderAgeAggregated,
campaign_id=campaign.id,
clicks=5,
redirect_url=url,
)
create_model(
TextAnalyticsBenchmarkByAccountArtist,
vendor_id=account.vendor_id,
subaccount_id=account.subaccount_id,
global_participant_id=campaign.global_participant_id,
avg_delivery_rate=1,
avg_delivery_failed_rate=1,
)
result = handler.handle(
GetCampaignAnalyticsRequest(
identity_id=identity_id,
campaign_id=campaign.id,
vendor_id=account.vendor_id,
subaccount_id=account.subaccount_id,
)
)
assert result is not None
assert result.campaign_id == campaign.id
assert result.sends == 10
assert result.clicks == 5
assert result.click_through_rate == 0.5
assert result.delivery_rate == 0.5
assert result.delivery_failed_rate == 0.5
assert result.delivery_rate_change == -0.5
assert result.delivery_failed_rate_change == -0.5
assert result.unsubscribe_rate == 0
# TODO
assert result.unsubscribe_rate_change is None