"""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'}
]