import pytest from faker import Faker from email_campaigns.campaigns.handlers import GetCampaignSalesAnalyticsHandler from email_campaigns.campaigns.models import EmailCampaign from email_campaigns.emails.exceptions import EmailNotFoundError from email_campaigns.emails.handlers import GetEmailSalesAnalyticsRequest from email_campaigns.emails.models import ShopifyEmailOrdersDbt from tests.unit.types import CreateModel class TestGetCampaignSalesAnalyticsHandler: @pytest.mark.db def test_get_campaign_sales_analytics( self, handler: GetCampaignSalesAnalyticsHandler, create_model: CreateModel, identity_id: str, ) -> None: campaign = create_model(EmailCampaign, name="Test Campaign") create_model( ShopifyEmailOrdersDbt, email_id=campaign.id, shop_id="shop1", currency="USD", country_code="US", shop_name="Shop One", total_orders=5, items_sold=10, total_sales_usd=120.0, total_discounts_usd=10.0, total_taxes_usd=8.0, total_delivery_usd=5.0, total_net_sales_usd=100.0, total_refunds_usd=10.0, first_time_buyer_rate=0.4, ) create_model( ShopifyEmailOrdersDbt, email_id=campaign.id, shop_id="shop2", currency="USD", country_code="CA", shop_name="Shop Two", total_orders=5, items_sold=10, total_sales_usd=65.0, total_discounts_usd=5.0, total_taxes_usd=4.0, total_delivery_usd=3.0, total_net_sales_usd=50.0, total_refunds_usd=5.0, first_time_buyer_rate=0.2, ) response = handler.handle( GetEmailSalesAnalyticsRequest( email_id=campaign.id, identity_id=identity_id, ), ) assert response.data == { "orders_count": 10, "items_sold": 20, "net_sales_usd": 150.0, "gross_sales_usd": 185.0, "discounts_usd": 15.0, "taxes_usd": 12.0, "shipping_usd": 8.0, "refunds_usd": 15.0, "average_units_per_order": 2.0, "average_order_amount": 15.0, "first_time_buyer_rate": 0.3, } @pytest.mark.db def test_get_campaign_sales_analytics_no_data( self, handler: GetCampaignSalesAnalyticsHandler, create_model: CreateModel, identity_id: str, ) -> None: campaign = create_model(EmailCampaign, name="Test Campaign") response = handler.handle( GetEmailSalesAnalyticsRequest( email_id=campaign.id, identity_id=identity_id, ), ) assert response.data == { "orders_count": 0, "items_sold": 0, "net_sales_usd": 0.0, "gross_sales_usd": 0.0, "discounts_usd": 0.0, "taxes_usd": 0.0, "shipping_usd": 0.0, "refunds_usd": 0.0, "average_units_per_order": 0.0, "average_order_amount": 0.0, "first_time_buyer_rate": 0.0, } @pytest.mark.db def test_get_campaign_sales_analytics_wrong_campaign_id( self, handler: GetCampaignSalesAnalyticsHandler, identity_id: str, faker: Faker, ) -> None: campaign_id = faker.uuid4() with pytest.raises(EmailNotFoundError): handler.handle( GetEmailSalesAnalyticsRequest( email_id=campaign_id, identity_id=identity_id, ), )