"""Test for episode links logic tier.""" from unittest.mock import MagicMock from unittest.mock import patch import pytest from podcast.logic import episode_links as episode_links_logic from podcast.models import episode_links as episode_links_model from podcast.models import podcast as podcast_model from podcast.utils.exc import OwsError @patch('podcast.utils.feature_flag_utils.get_feature_flag', return_value=False) def test_get_episode_links_success(mock_get_feature_flag, mock_current_admin_user, monkeypatch): """Test get episode links success.""" monkeypatch.setattr(episode_links_model, 'get_episode_links_by_episode_id', MagicMock()) episode_links_logic.get_episode_links(2, 3) episode_links_model.get_episode_links_by_episode_id.assert_called_once_with(3) @patch('podcast.utils.feature_flag_utils.get_feature_flag', return_value=False) def test_get_episode_links_no_access(mock_get_feature_flag, mock_current_user): """Test get episode links no access.""" with pytest.raises(OwsError) as err: episode_links_logic.get_episode_links(2, 3) assert err.value.status == 403 @patch('podcast.logic.episode_links.update_episode') @patch('podcast.utils.feature_flag_utils.get_feature_flag', return_value=False) def test_create_episode_link_success( mock_get_feature_flag, mock_update_episode, mock_current_admin_user, podcast_fixture, monkeypatch): """Test create episode link for other stores success.""" request_data = { 'podcast_id': 1, 'episode_id': 2, 'store_id': 2, 'link': 'https://test-link' } monkeypatch.setattr(podcast_model, 'get_podcast_by_id', MagicMock(return_value=podcast_fixture)) monkeypatch.setattr(episode_links_model, 'create_or_update_episode_link', MagicMock()) episode_links_logic.create_episode_link(request_data) assert not podcast_model.get_podcast_by_id.called assert not mock_update_episode.called episode_links_model.create_or_update_episode_link.assert_called_once_with(request_data) @patch('podcast.logic.episode_links.update_episode') @patch('podcast.utils.feature_flag_utils.get_feature_flag', return_value=False) def test_create_episode_link_success_for_private_feed( mock_get_feature_flag, mock_update_episode, mock_current_admin_user, podcast_fixture_3, monkeypatch): """Test create apple episode link success for private-rss feed.""" request_data = { 'podcast_id': 3, 'episode_id': 2, 'store_id': 1, 'link': 'https://test-link' } monkeypatch.setattr(podcast_model, 'get_podcast_by_id', MagicMock(return_value=podcast_fixture_3)) monkeypatch.setattr(episode_links_model, 'create_or_update_episode_link', MagicMock()) episode_links_logic.create_episode_link(request_data) podcast_model.get_podcast_by_id.assert_called_once_with(3) assert not mock_update_episode.called episode_links_model.create_or_update_episode_link.assert_called_once_with(request_data) @patch('podcast.logic.episode_links.update_episode') @patch('podcast.utils.feature_flag_utils.get_feature_flag', return_value=False) def test_create_apple_episode_link_success_for_public_feed( mock_get_feature_flag, mock_update_episode, mock_current_admin_user, podcast_fixture, monkeypatch): """Test create apple episode link success for public-rss feed.""" request_data = { 'podcast_id': 1, 'episode_id': 2, 'store_id': 1, 'link': 'https://podcasts.apple.com/us/podcast/ep-1-test/id1557542960?i=1000636700652' } monkeypatch.setattr(podcast_model, 'get_podcast_by_id', MagicMock(return_value=podcast_fixture)) monkeypatch.setattr(episode_links_model, 'create_or_update_episode_link', MagicMock()) episode_links_logic.create_episode_link(request_data) podcast_model.get_podcast_by_id.assert_called_once_with(1) mock_update_episode.assert_called_once_with(2, {'apple_id': '1000636700652'}) episode_links_model.create_or_update_episode_link.assert_called_once_with(request_data) @patch('podcast.logic.episode_links.update_episode') @patch('podcast.utils.feature_flag_utils.get_feature_flag', return_value=False) def test_create_apple_episode_link_success_for_apple_feed( mock_get_feature_flag, mock_update_episode, mock_current_admin_user, podcast_fixture_4, monkeypatch): """Test create apple episode link success for apple-subscription feed.""" request_data = { 'podcast_id': 4, 'episode_id': 2, 'store_id': 1, 'link': 'https://podcasts.apple.com/us/podcast/ep-1-test/id1557542960?i=1000636700652' } monkeypatch.setattr(podcast_model, 'get_podcast_by_id', MagicMock(return_value=podcast_fixture_4)) monkeypatch.setattr(episode_links_model, 'create_or_update_episode_link', MagicMock()) episode_links_logic.create_episode_link(request_data) podcast_model.get_podcast_by_id.assert_called_once_with(4) mock_update_episode.assert_called_once_with(2, {'apple_id': '1000636700652'}) episode_links_model.create_or_update_episode_link.assert_called_once_with(request_data) @patch('podcast.utils.feature_flag_utils.get_feature_flag', return_value=False) def test_create_episode_link_no_access(mock_get_feature_flag, mock_current_user): """Test create episode link no access unless admin.""" with pytest.raises(OwsError) as err: episode_links_logic.create_episode_link({}) assert err.value.status == 403 @patch('podcast.utils.feature_flag_utils.get_feature_flag', return_value=False) def test_delete_episode_link_no_access(mock_get_feature_flag, mock_current_user): """Test delete episode link no access unless admin.""" with pytest.raises(OwsError) as err: episode_links_logic.delete_episode_link(1, 1) assert err.value.status == 403 @patch('podcast.utils.feature_flag_utils.get_feature_flag', return_value=True) def test_get_episode_links_success_with_show_family( mock_get_feature_flag, mock_current_podcast_level_user, monkeypatch): """Test get episode links success with show family access.""" monkeypatch.setattr(episode_links_model, 'get_episode_links_by_episode_id', MagicMock()) episode_links_logic.get_episode_links(1, 2) episode_links_model.get_episode_links_by_episode_id.assert_called_once_with(2) @patch('podcast.utils.feature_flag_utils.get_feature_flag', return_value=True) def test_get_episode_links_no_access_show_family(mock_get_feature_flag, mock_current_user): """Test get episode links no show family access.""" with pytest.raises(OwsError) as err: episode_links_logic.get_episode_links(2, 3) assert err.value.status == 403