"""Unit tests for the /product-metrics logic layer.""" from unittest.mock import MagicMock, patch import pytest from analytics.api import app from analytics.logic import product_metrics @pytest.fixture(autouse=True) def mock_redis_cache(): """Bypass `cache_in_redis` decorators by forcing cache miss on every call.""" with patch("analytics.utils.cache.redis.client", new=MagicMock(get=lambda _: None)): yield @pytest.fixture def base_permissions(): return { "permission_label_ids": [7123], "permission_subaccount_ids": [], "permission_artist_ids": [], "permission_label_participant_ids": [], "permission_feed_ids": [1, 2, 38], } def _row(product_id, total=2): return { "product_id": product_id, "upc": "u", "streams_1_day": 1, "growth_percentage_1_day": 0, "streams_7_days": 7, "growth_percentage_7_days": 0, "streams_28_days": 28, "growth_percentage_28_days": 0, "streams_all_time": 100, "release_date": None, "sale_start_date": None, "total_records": total, } def test_picks_non_participant_class_when_no_gp_ids(base_permissions): query_params = { "distributors": ["theorchard"], "global_participant_ids": [], "country_ids": [], "label_ids": [], "subaccount_ids": [], "fin_label_ids": [], "upper_profit_center_ids": [], "parent_companies": [], "company_brands": [], "service_tier": None, "multi_product": False, "order_by": "streams_7_days", "order_dir": "DESC", "limit": 25, "offset": 0, } with ( app.test_request_context(), patch("analytics.logic.product_metrics.ProductMetrics") as cls_a, patch("analytics.logic.product_metrics.ProductMetricsByParticipant") as cls_b, patch( "analytics.logic.product_metrics.store_availability.is_apple_spotify_data_in_sync", return_value=True, ), ): cls_a.return_value.execute.return_value = [_row(1, total=2), _row(2, total=2)] response = product_metrics.get_product_metrics(query_params, base_permissions) assert response.status == 200 assert response.message["total_products"] == 2 assert len(response.message["metrics"]) == 2 cls_b.assert_not_called() def test_picks_participant_class_when_gp_ids(base_permissions): query_params = { "distributors": ["theorchard"], "global_participant_ids": ["abc"], "country_ids": [], "label_ids": [], "subaccount_ids": [], "fin_label_ids": [], "upper_profit_center_ids": [], "parent_companies": [], "company_brands": [], "service_tier": None, "multi_product": True, "order_by": "streams_7_days", "order_dir": "DESC", "limit": 25, "offset": 0, } with ( app.test_request_context(), patch("analytics.logic.product_metrics.ProductMetrics") as cls_a, patch("analytics.logic.product_metrics.ProductMetricsByParticipant") as cls_b, patch( "analytics.logic.product_metrics.store_availability.is_apple_spotify_data_in_sync", return_value=False, ), ): cls_b.return_value.execute.return_value = [] response = product_metrics.get_product_metrics(query_params, base_permissions) assert response.status == 200 assert response.message["total_products"] == 0 assert response.message["metrics"] == [] cls_a.assert_not_called()