"""Unit tests for show links importer.""" from unittest.mock import MagicMock, patch from scripts import show_links_importer from podcast.constants.api import REQUESTS_USER_AGENT from podcast.models import podcast_links from tests.utils import db_operations @patch('scripts.show_links_importer._search_spotify_api') def test_get_spotify_links(mock_search): """Test successful get spotify store url.""" mock_return_value = [ { 'name': 'random podcast title', 'publisher': 'random publisher', 'external_urls': { 'spotify': 'url 1' } }, { 'name': 'title', 'publisher': 'Tom', 'external_urls': { 'spotify': 'url 2' } } ] mock_search.return_value = {'shows': {'items': mock_return_value}} link = show_links_importer.get_spotify_links( db_operations.podcast_data[0], db_operations.podcast_data[0]['title'] ) assert link == 'url 2' @patch('scripts.show_links_importer._search_spotify_api') def test_get_spotify_links_none_found(mock_search): """Test successful get spotify store url.""" mock_return_value = [ { 'name': 'random podcast title', 'publisher': 'random publisher', 'external_urls': { 'spotify': 'url 1' } } ] mock_search.return_value = {'shows': {'items': mock_return_value}} link = show_links_importer.get_spotify_links( db_operations.podcast_data[0], db_operations.podcast_data[0]['title'] ) assert link is None @patch('scripts.show_links_importer.podcast_model') @patch('requests.get') def test_get_apple_link(mock_get, mock_podcast_model): """Test successful get apple store url.""" mock_return_value = [ { 'feedUrl': 'https://feeds.megaphone.fm/efg', 'trackViewUrl': 'efg' }, { 'feedUrl': 'https://feeds.megaphone.fm/SLUG-123', 'trackViewUrl': 'abc', 'trackId': 1234567890 } ] mock_get.return_value.json.return_value = {'results': mock_return_value} link = show_links_importer.get_apple_link( db_operations.podcast_data[0], db_operations.podcast_data[0]['title'] ) request_url = 'https://itunes.apple.com/search' + \ '?media=podcast&entity=podcast&attribute=titleTerm&term=title&limit=200' mock_get.assert_called_with(request_url) assert link == 'abc' @patch('requests.get') def test_get_apple_link_none_found(mock_get): """Test unsuccessful get apple store url.""" mock_return_value = [ { 'feedUrl': 'https://feeds.megaphone.fm/efg', 'trackViewUrl': 'efg' } ] mock_get.return_value.json.return_value = {'results': mock_return_value} link = show_links_importer.get_apple_link( db_operations.podcast_data[0], db_operations.podcast_data[0]['title'] ) request_url = 'https://itunes.apple.com/search' + \ '?media=podcast&entity=podcast&attribute=titleTerm&term=title&limit=200' mock_get.assert_called_with(request_url) assert link is None @patch('requests.get') def test_get_show_link_by_apple_id(mock_get, store_url_fixture): """Test get show link by apple id.""" apple_id = db_operations.podcast_data[1]['apple_id'] mock_get.return_value.status_code = 200 request_url = '{}/{}'.format(store_url_fixture, apple_id) mock_get.return_value.url = request_url link = show_links_importer.get_show_link_by_apple_id( apple_id, store_url_fixture ) mock_get.assert_called_with(request_url) assert link == 'https://test.com/1234567890' @patch('requests.get') def test_get_show_link_by_apple_id_not_found(mock_get, invalid_podcast_slug_fixture, store_url_fixture): """Test get show link by apple for invalid apple id.""" mock_get.return_value.status_code = 404 request_url = '{}/{}'.format(store_url_fixture, invalid_podcast_slug_fixture) mock_get.return_value.url = request_url link = show_links_importer.get_show_link_by_apple_id( invalid_podcast_slug_fixture, store_url_fixture ) mock_get.assert_called_with(request_url) assert link is None @patch('requests.get') def test_get_radio_public_show_link(mock_get, podcast_slug_fixture, podcast_title_fixture, store_url_fixture): """Test get radio public show link.""" resp = MagicMock() resp.content = '

test podcast title

' mock_get.return_value = resp mock_get.return_value.status_code = 200 mock_get.return_value.url = '{}/{}'.format(store_url_fixture, podcast_slug_fixture) link = show_links_importer.get_radio_public_show_link( podcast_slug_fixture, podcast_title_fixture, store_url_fixture ) request_url = '{}/https%3A%2F%2Ffeeds.megaphone.fm%2Ftest-podcast'.format(store_url_fixture) mock_get.assert_called_with(request_url, headers={'User-Agent': REQUESTS_USER_AGENT}) assert link == 'https://test.com/test-podcast' @patch('requests.get') def test_get_radio_public_show_link_not_found( mock_get, invalid_podcast_slug_fixture, podcast_title_fixture, store_url_fixture): """Test get radio public show link not found.""" mock_get.return_value.status_code = 404 mock_get.return_value.url = '{}/{}'.format(store_url_fixture, invalid_podcast_slug_fixture) link = show_links_importer.get_radio_public_show_link( invalid_podcast_slug_fixture, podcast_title_fixture, store_url_fixture ) request_url = '{}/https%3A%2F%2Ffeeds.megaphone.fm%2F{}'.format(store_url_fixture, invalid_podcast_slug_fixture) mock_get.assert_called_with(request_url, headers={'User-Agent': REQUESTS_USER_AGENT}) assert link is None @patch('requests.get') def test_get_player_fm_link_not_found(mock_get, encoded_rss_fixture, invalid_podcast_slug_fixture, store_url_fixture): """Test get player fm show link by rss feed for invalid rss feed.""" request_url = '{}/{}{}'.format(store_url_fixture, encoded_rss_fixture, invalid_podcast_slug_fixture) mock_get.return_value.status_code = 404 mock_get.return_value.url = '{}/{}'.format(store_url_fixture, invalid_podcast_slug_fixture) link = show_links_importer.get_player_fm_link( invalid_podcast_slug_fixture, store_url_fixture ) mock_get.assert_called_with(request_url) assert link is None @patch('requests.get') def test_get_stitcher_link(mock_get, stitcher_shows_fixture_1): """Test successful get apple store url.""" mock_get.return_value.json.return_value = stitcher_shows_fixture_1 link = show_links_importer.get_stitcher_link( db_operations.podcast_data[1], db_operations.podcast_data[1]['title'] ) request_url = 'https://api.prod.stitcher.com/search/shows?query=alpha title 1&count=10' mock_get.assert_called_with(request_url) assert link == 'https://www.stitcher.com/show/test-slug' @patch('requests.get') def test_get_stitcher_link_not_found(mock_get, stitcher_shows_fixture_2): """Test unsuccessful get stitcher store url.""" mock_get.return_value.json.return_value = stitcher_shows_fixture_2 link = show_links_importer.get_stitcher_link( db_operations.podcast_data[0], db_operations.podcast_data[0]['title'] ) request_url = 'https://api.prod.stitcher.com/search/shows?query=title&count=10' mock_get.assert_called_with(request_url) assert link is None @patch('requests.get') def test_get_deezer_link(mock_get): """Test successful get deezer store url.""" mock_return_value = [ { 'title': 'title', 'description': 'some description', 'link': 'abc' }, { 'title': 'title', 'description': 'description', 'link': 'efg' } ] mock_get.return_value.json.return_value = {'data': mock_return_value} link = show_links_importer.get_deezer_link( db_operations.podcast_data[0], db_operations.podcast_data[0]['title'] ) request_url = 'https://api.deezer.com/search/podcast?strict=on&q=title' mock_get.assert_called_with(request_url) assert link == 'efg' @patch('requests.get') def test_get_deezer_link_none_found(mock_get): """Test unsuccessful get deezer store url.""" mock_return_value = [ { 'title': 'title', 'description': 'some description', 'link': 'abc' } ] mock_get.return_value.json.return_value = {'data': mock_return_value} link = show_links_importer.get_deezer_link( db_operations.podcast_data[0], db_operations.podcast_data[0]['title'] ) request_url = 'https://api.deezer.com/search/podcast?strict=on&q=title' mock_get.assert_called_with(request_url) assert link is None @patch('scripts.show_links_importer._scrape_amazon_links') def test_get_amazon_link(mock_scrape_amazon_links): """Test get amazon store url.""" mock_return_value = [ { 'title': 'some title', 'link': 'https://music.amazon.com/podcasts/ddd' }, { 'title': 'title', 'link': '/music/ddd' }, { 'title': 'title', 'link': '/podcasts/aaa' } ] mock_scrape_amazon_links.return_value = mock_return_value link = show_links_importer.get_amazon_link( db_operations.podcast_data[0]['title'], 'scripts' ) mock_scrape_amazon_links.assert_called_with( db_operations.podcast_data[0]['title']) assert link == 'https://music.amazon.com/podcasts/aaa' @patch('scripts.show_links_importer._scrape_amazon_links') def test_get_amazon_link_none_found(mock_scrape_amazon_links): """Test unsuccessful get amazon store url.""" mock_return_value = [ { 'title': 'some title', 'link': 'https://music.amazon.com/podcasts/ddd' }, { 'title': 'title', 'link': 'https://music.amazon.com/music/ddd' } ] mock_scrape_amazon_links.return_value = mock_return_value link = show_links_importer.get_amazon_link( db_operations.podcast_data[0]['title'], 'scripts' ) mock_scrape_amazon_links.assert_called_with( db_operations.podcast_data[0]['title']) assert link is None @patch('requests.post') def test_get_pandora_link(mock_post, pandora_data_fixture): """Test successful get pandora store url.""" mock_post.return_value.status_code = 200 mock_post.return_value.json.return_value = pandora_data_fixture link = show_links_importer.get_pandora_link('test-podcast') request_url = 'https://www.pandora.com/api/v3/sod/search' mock_post.assert_called_with( request_url, json={ 'query': 'test-podcast', 'types': ['PC', 'PE'], 'listener': None, 'start': 0, 'count': 100, 'annotate': True, 'searchTime': 0, 'annotationRecipe': 'CLASS_OF_2019' } ) assert link == 'https://www.pandora.com/podcast/test-podcast/PE:9673056' @patch('requests.post') def test_get_pandora_link_none_found(mock_post, pandora_data_fixture): """Test failure for get pandora store url.""" mock_post.return_value.status_code = 200 mock_post.return_value.json.return_value = pandora_data_fixture link = show_links_importer.get_pandora_link('test-podcast-fail') assert link is None @patch('scripts.show_links_importer.get_link') def test_populate_podcast_links(mock_get_link): """Test successful fetching and population of store links for a podcast.""" results = podcast_links.get_podcast_links(db_operations.podcast_data[1]['id']) assert results['items'] == [{'id': 3, 'link': 'https://www.spotify.com/xyz', 'podcast_id': 2, 'store_id': 2}] mock_get_link.return_value = 'url' show_links_importer.populate_podcast_links( db_operations.podcast_data[1], db_operations.stores, 'test') results = podcast_links.get_podcast_links(db_operations.podcast_data[1]['id']) assert results['items'][1] == {'id': 4, 'store_id': 1, 'podcast_id': 2, 'link': 'url'} @patch('scripts.show_links_importer.get_link') def test_populate_podcast_links_none_found(mock_get_link): """Test unsuccessful fetching and population of store links for a podcast.""" results = podcast_links.get_podcast_links(db_operations.podcast_data[0]['id']) assert results['items'] == [ {'id': 1, 'store_id': 1, 'podcast_id': 1, 'link': 'https://www.link.com'}, {'id': 2, 'store_id': 2, 'podcast_id': 1, 'link': 'https://www.spotify.com/abc'} ] mock_get_link.return_value = None show_links_importer.populate_podcast_links( db_operations.podcast_data[0], db_operations.stores, 'scripts') results = podcast_links.get_podcast_links(db_operations.podcast_data[0]['id']) assert results['items'] == [ {'id': 1, 'store_id': 1, 'podcast_id': 1, 'link': 'https://www.link.com'}, {'id': 2, 'store_id': 2, 'podcast_id': 1, 'link': 'https://www.spotify.com/abc'} ]