"""Unit tests for sound recording aggregate_streams logic layer.""" from unittest.mock import patch import pytest from sound_recordings.api import app from sound_recordings.logic import streams @pytest.fixture def mock_get_aggregate_streams_model_payload(): """Mock payload for sound recording aggregate_streams model.""" return [ {"isrc": "ISRC1", "streams_all_time": 40000, "streams_7_day_growth": 0.35}, {"isrc": "ISRC2", "streams_all_time": 100, "streams_7_day_growth": 0.2}, ] @pytest.fixture def expected_payload(): """Return expected payload from aggregate_streams logic.""" return { "ISRC1": {"growth_percentage_7_days": 0.35, "streams_all_time": 40000}, "ISRC2": {"growth_percentage_7_days": 0.2, "streams_all_time": 100}, } @pytest.fixture def mock_get_aggregate_streams_model_success(mock_get_aggregate_streams_model_payload): """Mock successful get_aggregate_streams model response.""" with patch( "sound_recordings.models.streams.get_aggregate_streams" ) as get_aggregate_streams: get_aggregate_streams.return_value = mock_get_aggregate_streams_model_payload yield get_aggregate_streams @pytest.fixture def mock_get_aggregate_streams_model_failure(): """Mock failure get_aggregate_streams model response.""" with patch( "sound_recordings.models.streams.get_aggregate_streams" ) as get_aggregate_streams: get_aggregate_streams.return_value = [] yield get_aggregate_streams class TestGetAggregateStreamsWithLabel: """Test get_aggregate_streams with label.""" isrcs = ["ISRC1", "ISRC2"] @pytest.fixture def response( self, mock_get_aggregate_streams_model_success, request_context_for_label, mock_permissions_for_label, ): """Run get_aggregate_streams.""" return streams.get_aggregate_streams( request_context_for_label, self.isrcs, ["theorchard"], [], [] ) def test_succeeds(self, response, expected_payload): """Test successful response.""" assert response.status == 200 print(response.message, "<<<<<<<<<") assert response.message == expected_payload def test_get_aggregate_streamsmodel_is_called( self, response, mock_get_aggregate_streams_model_success, permissions_for_label ): """Test get_aggregate_streams model is called.""" mock_get_aggregate_streams_model_success.assert_called_once_with( permissions_for_label, self.isrcs, ["theorchard"], [], [] ) def test_fails_when_aggregate_streams_model_fails( self, mock_get_aggregate_streams_model_failure, mock_permissions_for_label, request_context_for_label, ): """Test failure response when get_aggregate_streams model fails.""" response = streams.get_aggregate_streams( request_context_for_label, self.isrcs, ["theorchard"] ) assert response.status == 200 assert response.message == { "ISRC1": {"growth_percentage_7_days": None, "streams_all_time": 0}, "ISRC2": {"growth_percentage_7_days": None, "streams_all_time": 0}, } class TestGetAggregateStreamsWithSubaccount: """Test get_aggregate_streams with subaccount.""" isrcs = ["ISRC1", "ISRC2"] @pytest.fixture def response( self, mock_get_aggregate_streams_model_success, mock_permissions_for_subaccount, request_context_for_subaccount, ): """Run get_aggregate_streams.""" with app.test_request_context(): return streams.get_aggregate_streams( request_context_for_subaccount, self.isrcs, ["theorchard"], [], [] ) def test_succeeds(self, response, expected_payload): """Test successful response.""" assert response.status == 200 assert response.message == expected_payload def test_get_aggregate_streams_model_is_called( self, response, mock_get_aggregate_streams_model_success, permissions_for_subaccount, ): """Test get_aggregate_streams model is called.""" mock_get_aggregate_streams_model_success.assert_called_once_with( permissions_for_subaccount, self.isrcs, ["theorchard"], [], [] ) def test_fails_when_aggregate_streams_model_fails( self, mock_get_aggregate_streams_model_failure, mock_permissions_for_subaccount, request_context_for_subaccount, ): """Test failure response when get_aggregate_streams model fails.""" response = streams.get_aggregate_streams( request_context_for_subaccount, self.isrcs, ["theorchard"] ) assert response.status == 200 assert response.message == { "ISRC1": {"growth_percentage_7_days": None, "streams_all_time": 0}, "ISRC2": {"growth_percentage_7_days": None, "streams_all_time": 0}, }