import marshmallow_dataclass from typing import List, Callable from unittest.mock import MagicMock from datetime import date from tests.test_utils import load_fixture from utils.snowflake.metrics.schema import ( MetricsQueryResult, MetricsDetailsQueryResult, MetricsFilters, TotalMetricsQueryResult, ) def metrics_result( entity_id: int = 0, spend: float = 20.5, video_views: int = 123, impressions: int = 11, conversions: int = 2, frequency: float = 3.5, clicks: int = 456, cost_per_conversion: float = 1.1, reach: int = 12344, ctr: int = 12, engagements: float = 0.45, cost_per_engagement: float = 0.2, cost_per_click: int = 12, video_25_watched: float = 34.7, video_50_watched: float = 34.6, video_75_watched: float = 2.5, video_100_watched: int = 12, cpm: float = 13.6, cpm_reach: float = 33.3, video_view_rate: float = 1.2, cost_per_video_view: float = 5.5, start_date: date = date(2020, 10, 11), end_date: date = date(2020, 11, 11), thruplays: float = 22.2, u_outbound_clicks: float = 0.45, u_outbound_clicks_ctr: float = 0.45, custom_conversions: float = 0.45, u_custom_conversions: float = 0.45, landing_page_views: float = 0.45, leads: float = 0.45, reactions: float = 0.45, u_conversions: float = 0.45, cost_per_thurplays: float = 0.2, cost_per_u_outbound_clicks: float = 0.3, cost_per_custom_conversions: float = 0.2, cost_per_u_custom_conversions: float = 0.5, cost_per_landing_page_views: float = 0.2, ) -> MetricsQueryResult: return MetricsQueryResult( entity_id=entity_id, spend=spend, video_views=video_views, impressions=impressions, conversions=conversions, frequency=frequency, clicks=clicks, cost_per_conversion=cost_per_conversion, reach=reach, ctr=ctr, engagements=engagements, cost_per_engagement=cost_per_engagement, cost_per_click=cost_per_click, video_25_watched=video_25_watched, video_50_watched=video_50_watched, video_75_watched=video_75_watched, video_100_watched=video_100_watched, cpm=cpm, cpm_reach=cpm_reach, video_view_rate=video_view_rate, cost_per_video_view=cost_per_video_view, start_date=start_date, end_date=end_date, thruplays=thruplays, u_outbound_clicks=u_outbound_clicks, u_outbound_clicks_ctr=u_outbound_clicks_ctr, custom_conversions=custom_conversions, u_custom_conversions=u_custom_conversions, landing_page_views=landing_page_views, leads=leads, reactions=reactions, u_conversions=u_conversions, cost_per_thurplays=cost_per_thurplays, cost_per_u_outbound_clicks=cost_per_u_outbound_clicks, cost_per_custom_conversions=cost_per_custom_conversions, cost_per_u_custom_conversions=cost_per_u_custom_conversions, cost_per_landing_page_views=cost_per_landing_page_views, ) def metrics_details_result( entity_id: int = 0, name: str = "name", spend: float = 20.5, video_views: int = 123, impressions: int = 11, conversions: int = 2, frequency: float = 3.5, clicks: int = 456, cost_per_conversion: float = 1.1, reach: int = 12344, ctr: int = 12, engagements: float = 0.45, cost_per_engagement: float = 0.2, cost_per_click: int = 12, video_25_watched: float = 34.7, video_50_watched: float = 34.6, video_75_watched: float = 2.5, video_100_watched: int = 12, cpm: float = 13.6, cpm_reach: float = 33.3, video_view_rate: float = 1.2, cost_per_video_view: float = 5.5, start_date: date = date(2020, 10, 11), end_date: date = date(2020, 11, 11), thruplays: float = 22.2, u_outbound_clicks: float = 0.45, u_outbound_clicks_ctr: float = 0.45, custom_conversions: float = 0.45, u_custom_conversions: float = 0.45, landing_page_views: float = 0.45, leads: float = 0.45, reactions: float = 0.45, u_conversions: float = 0.45, cost_per_thurplays: float = 0.2, cost_per_u_outbound_clicks: float = 0.3, cost_per_custom_conversions: float = 0.2, cost_per_u_custom_conversions: float = 0.5, cost_per_landing_page_views: float = 0.2, ) -> MetricsQueryResult: return MetricsDetailsQueryResult( entity_id=entity_id, name=name, spend=spend, video_views=video_views, impressions=impressions, conversions=conversions, frequency=frequency, clicks=clicks, cost_per_conversion=cost_per_conversion, reach=reach, ctr=ctr, engagements=engagements, cost_per_engagement=cost_per_engagement, cost_per_click=cost_per_click, video_25_watched=video_25_watched, video_50_watched=video_50_watched, video_75_watched=video_75_watched, video_100_watched=video_100_watched, cpm=cpm, cpm_reach=cpm_reach, video_view_rate=video_view_rate, cost_per_video_view=cost_per_video_view, start_date=start_date, end_date=end_date, thruplays=thruplays, u_outbound_clicks=u_outbound_clicks, u_outbound_clicks_ctr=u_outbound_clicks_ctr, custom_conversions=custom_conversions, u_custom_conversions=u_custom_conversions, landing_page_views=landing_page_views, leads=leads, reactions=reactions, u_conversions=u_conversions, cost_per_thurplays=cost_per_thurplays, cost_per_u_outbound_clicks=cost_per_u_outbound_clicks, cost_per_custom_conversions=cost_per_custom_conversions, cost_per_u_custom_conversions=cost_per_u_custom_conversions, cost_per_landing_page_views=cost_per_landing_page_views, ) def total_metrics_result( entities_count: int = 3, spend: float = 20.5, video_views: int = 123, impressions: int = 11, conversions: int = 2, frequency: float = 3.5, clicks: int = 456, cost_per_conversion: float = 1.1, reach: int = 12344, ctr: int = 12, engagements: float = 0.45, cost_per_engagement: float = 0.2, cost_per_click: int = 12, video_25_watched: float = 34.7, video_50_watched: float = 34.6, video_75_watched: float = 2.5, video_100_watched: int = 12, cpm: float = 13.6, cpm_reach: float = 33.3, video_view_rate: float = 1.2, cost_per_video_view: float = 5.5, start_date: date = date(2020, 10, 11), end_date: date = date(2020, 11, 11), thruplays: float = 22.2, u_outbound_clicks: float = 0.45, u_outbound_clicks_ctr: float = 0.45, custom_conversions: float = 0.45, u_custom_conversions: float = 0.45, landing_page_views: float = 0.45, leads: float = 0.45, reactions: float = 0.45, u_conversions: float = 0.45, cost_per_thurplays: float = 0.2, cost_per_u_outbound_clicks: float = 0.3, cost_per_custom_conversions: float = 0.2, cost_per_u_custom_conversions: float = 0.5, cost_per_landing_page_views: float = 0.2, ) -> TotalMetricsQueryResult: return TotalMetricsQueryResult( entities_count=entities_count, spend=spend, video_views=video_views, impressions=impressions, conversions=conversions, frequency=frequency, clicks=clicks, cost_per_conversion=cost_per_conversion, reach=reach, ctr=ctr, engagements=engagements, cost_per_engagement=cost_per_engagement, cost_per_click=cost_per_click, video_25_watched=video_25_watched, video_50_watched=video_50_watched, video_75_watched=video_75_watched, video_100_watched=video_100_watched, cpm=cpm, cpm_reach=cpm_reach, video_view_rate=video_view_rate, cost_per_video_view=cost_per_video_view, start_date=start_date, end_date=end_date, thruplays=thruplays, u_outbound_clicks=u_outbound_clicks, u_outbound_clicks_ctr=u_outbound_clicks_ctr, custom_conversions=custom_conversions, u_custom_conversions=u_custom_conversions, landing_page_views=landing_page_views, leads=leads, reactions=reactions, u_conversions=u_conversions, cost_per_thurplays=cost_per_thurplays, cost_per_u_outbound_clicks=cost_per_u_outbound_clicks, cost_per_custom_conversions=cost_per_custom_conversions, cost_per_u_custom_conversions=cost_per_u_custom_conversions, cost_per_landing_page_views=cost_per_landing_page_views, ) def stub_snowflake_response( mock, verify_params: Callable[[MetricsFilters], None], stub_result: List[MetricsQueryResult], stub_result_counter: TotalMetricsQueryResult, ): def snowflake_mock(param: MetricsFilters) -> (List[MetricsQueryResult], TotalMetricsQueryResult): verify_params(param) return stub_result, stub_result_counter fetcher_mock = MagicMock() fetcher_mock.fetch_artists_metrics_data.side_effect = snowflake_mock fetcher_mock.fetch_projects_metrics_data.side_effect = snowflake_mock fetcher_mock.fetch_campaign_metrics_data.side_effect = snowflake_mock fetcher_mock.fetch_phases_metrics_data.side_effect = snowflake_mock mock.return_value = fetcher_mock def mock_from_json(schema, file_path): schema = marshmallow_dataclass.class_schema(schema) return schema().load(load_fixture(file_path))