"""Unit tests for Track logic.""" from unittest.mock import MagicMock from owsrequest import request as requests from owsrequest import test_utils from promo_player.constants import service_name from promo_player.logic import track def test_get_tracks_no_product_id(monkeypatch): """Test retrieving tracks for a promo player with no product id.""" product_id = None promo_player_tracks = [] result = track.get_tracks(product_id, promo_player_tracks) assert result assert len(result.message['items']) == 0 def test_get_tracks_no_promo_player_tracks( monkeypatch, fixture_tracks_response): """Test retrieving tracks for a promo player with no tracks.""" monkeypatch.setattr( track, 'get_product_tracks', MagicMock(return_value=fixture_tracks_response)) product_id = 1 promo_player_tracks = [] result = track.get_tracks(product_id, promo_player_tracks) assert result assert len(result.message['items']) == len( fixture_tracks_response.message['items']) def test_get_tracks_no_product_tracks(monkeypatch, fixture_fatal): """Test retrieving tracks for a promo player with no tracks.""" monkeypatch.setattr( track, 'get_product_tracks', MagicMock(return_value=fixture_fatal)) product_id = 1 promo_player_tracks = [ {'track_id': 1}, {'track_id': 2}, ] result = track.get_tracks(product_id, promo_player_tracks) assert not result assert result.status == fixture_fatal.status def test_get_tracks(monkeypatch, fixture_tracks_response): """Test retrieving tracks for a promo player.""" monkeypatch.setattr( track, 'get_product_tracks', MagicMock(return_value=fixture_tracks_response)) product_id = 1 promo_player_tracks = [ {'track_id': 1}, {'track_id': 2}, ] result = track.get_tracks(product_id, promo_player_tracks) expected_tracks = [ {'tuid': 1}, {'tuid': 2} ] assert result assert result.message['items'] == expected_tracks def test_get_product_tracks(monkeypatch): """Test retrieving a list of track for a product from ows-track.""" product_id = 1 json_response_mock = { 'items': [ {'tuid': 1}, {'tuid': 2} ] } path = '/product/{product_id}/tracks'.format(product_id=product_id) call_specs = [{ 'service': service_name.OWS_TRACK, 'path': path, 'status': 200, 'json': json_response_mock }] monkeypatch.setattr( requests, 'get', test_utils.mock_ows_requests(call_specs)) result = track.get_product_tracks(product_id) assert len(result.message['items']) == 2 def test_get_product_tracks_error(monkeypatch): """Test that an error response is returned if the request fails.""" product_id = 1 path = '/product/{product_id}/tracks'.format(product_id=product_id) call_specs = [{ 'service': service_name.OWS_TRACK, 'path': path, 'status': 404 }] monkeypatch.setattr( requests, 'get', test_utils.mock_ows_requests(call_specs)) result = track.get_product_tracks(product_id) assert result.status == 404 def test_get_by_track_id(monkeypatch): """Test retrieving a track by track_id from ows-track.""" track_id = 1 json_response_mock = { 'track_id': 1 } path = '/track/{track_id}'.format(track_id=track_id) call_specs = [{ 'service': service_name.OWS_TRACK, 'path': path, 'status': 200, 'json': json_response_mock }] monkeypatch.setattr( requests, 'get', test_utils.mock_ows_requests(call_specs)) result = track.get_by_track_id(track_id) assert result.message['track_id'] == 1 def test_get_by_track_id_error(monkeypatch): """Test that an error response is returned if the request fails.""" track_id = 1 path = '/track/{track_id}'.format(track_id=track_id) call_specs = [{ 'service': service_name.OWS_TRACK, 'path': path, 'status': 404 }] monkeypatch.setattr( requests, 'get', test_utils.mock_ows_requests(call_specs)) result = track.get_by_track_id(track_id) assert result.status == 404 def test_map_tracks(): """Test that the tracks are mapped with their durations.""" tracks = [ { 'tuid': 1, 'track_number': 1, 'track_name': 'One', 'version': '', 'artists': [ {'name': 'PERFORMER 1', 'type': 'performer'} ] }, { 'tuid': 2, 'track_number': 2, 'track_name': 'Two', 'version': '', 'artists': [ {'name': 'PERFORMER 1', 'type': 'performer'}, {'name': 'PERFORMER 2', 'type': 'performer'}, ] }, { 'tuid': 3, 'track_number': 3, 'track_name': 'Three', 'version': '', 'artists': [ {'name': 'PERFORMER 1', 'type': 'performer'}, {'name': 'FEATURING 1', 'type': 'featuring'}, {'name': 'FEATURING 2', 'type': 'featuring'} ] }, { 'tuid': 4, 'track_number': 4, 'track_name': 'Four', 'version': 'Live', 'artists': [] } ] assets = [ {'asset_id': 1}, {'asset_id': 2, 'track_unique_id': 666}, {'asset_id': 3, 'track_unique_id': 1}, {'asset_id': 4, 'track_unique_id': 1, 'stream': ''}, {'asset_id': 5, 'track_unique_id': 1, 'stream': {}}, {'asset_id': 6, 'track_unique_id': 2, 'stream': {'duration': 60}}, {'asset_id': 7, 'track_unique_id': 3, 'stream': {'duration': 90}} ] expected_result = [ { 'tuid': 1, 'track_number': 1, 'track_name': 'One', 'track_duration': 0, 'artist_name': 'PERFORMER 1' }, { 'tuid': 2, 'track_number': 2, 'track_name': 'Two', 'track_duration': 60, 'artist_name': 'PERFORMER 1 & PERFORMER 2' }, { 'tuid': 3, 'track_number': 3, 'track_name': 'Three', 'track_duration': 90, 'artist_name': 'PERFORMER 1 ft. FEATURING 1 & FEATURING 2' }, { 'tuid': 4, 'track_number': 4, 'track_name': 'Four (Live)', 'track_duration': 0, 'artist_name': 'N/A' } ] result = track.map_tracks(tracks, assets) assert result == expected_result