"""Unit tests for sound recording streams_all logic layer.""" import datetime from unittest.mock import patch import pytest from sound_recordings.api import app from sound_recordings.logic import streams as streams @pytest.fixture def mock_get_streams_all_model_payload(): """Mock payload for sound recording streams model.""" return [ { "date": datetime.date(2018, 6, 28), "streams": 500, "streams_with_skips": 0, "skips": None, "saves": None, }, { "date": datetime.date(2018, 6, 29), "streams": 2000, "streams_with_skips": 1000, "skips": 200, "saves": 400, }, ] @pytest.fixture def expected_streams_all_payload(): """Return expected payload from streams logic.""" return { "isrc": "isrc", "items": [ { "streams": 500, "saves": None, "skip_rate": None, "date": "2018-06-28T00:00:00Z", }, { "streams": 2000, "saves": 400, "skip_rate": 0.16666666666666666, "date": "2018-06-29T00:00:00Z", }, ], } @pytest.fixture def mock_get_streams_all_model_success(mock_get_streams_all_model_payload): """Mock successful get_streams_all model response.""" with patch("sound_recordings.models.streams.get_streams_all") as get_streams_all: get_streams_all.return_value = mock_get_streams_all_model_payload yield get_streams_all @pytest.fixture def mock_get_streams_all_model_failure(): """Mock failure get_streams_all model response.""" with patch("sound_recordings.models.streams.get_streams_all") as get_streams_all: get_streams_all.return_value = [] yield get_streams_all class TestGetStreamsAllWithLabel: """Test get_streams_all with label.""" isrc = "isrc" start_date = datetime.date(2018, 6, 28) end_date = datetime.date(2018, 6, 29) @pytest.fixture def response( self, mock_get_streams_all_model_success, request_context_for_label, mock_permissions_for_label, ): """Run get_streams_all.""" return streams.get_streams_all( request_context_for_label, self.isrc, ["theorchard"], [], [], self.start_date, self.end_date, ) def test_succeeds(self, response, expected_streams_all_payload): """Test successful response.""" assert response.status == 200 assert response.message == expected_streams_all_payload def test_get_streams_all_model_is_called( self, response, mock_get_streams_all_model_success, permissions_for_label ): """Test get_streams_all model is called.""" mock_get_streams_all_model_success.assert_called_once_with( permissions_for_label, self.isrc, ["theorchard"], [], [], self.start_date, self.end_date, ) def test_fails_when_streams_all_model_fails( self, mock_get_streams_all_model_failure, mock_permissions_for_label, request_context_for_label, ): """Test failure response when streams_all model fails.""" response = streams.get_streams_all( request_context_for_label, self.isrc, ["theorchard"], [], [], self.start_date, self.end_date, ) assert response.status == 200 assert response.message == {"isrc": self.isrc, "items": []} class TestGetStreamsAllWithSubaccount: """Test get_streams_all with subaccount.""" isrc = "isrc" start_date = datetime.date(2018, 6, 28) end_date = datetime.date(2018, 6, 29) @pytest.fixture def response( self, mock_get_streams_all_model_success, mock_permissions_for_subaccount, request_context_for_subaccount, ): """Run get_streams_all.""" with app.test_request_context(): return streams.get_streams_all( request_context_for_subaccount, self.isrc, ["theorchard"], [], [], self.start_date, self.end_date, ) def test_succeeds(self, response, expected_streams_all_payload): """Test successful response.""" assert response.status == 200 assert response.message == expected_streams_all_payload def test_get_streams_all_model_is_called( self, response, mock_get_streams_all_model_success, permissions_for_subaccount ): """Test get_streams_all model is called.""" mock_get_streams_all_model_success.assert_called_once_with( permissions_for_subaccount, self.isrc, ["theorchard"], [], [], self.start_date, self.end_date, ) def test_fails_when_streams_all_model_fails( self, mock_get_streams_all_model_failure, mock_permissions_for_subaccount, request_context_for_subaccount, ): """Test failure response when streams model fails.""" response = streams.get_streams_all( request_context_for_subaccount, self.isrc, ["theorchard"] ) assert response.status == 200 assert response.message == {"isrc": self.isrc, "items": []}