using System.Collections.Generic; using FluentAssertions; using Moq; using NUnit.Framework; using NzbDrone.Core.ImportLists.Spotify; using NzbDrone.Core.Test.Framework; using SpotifyAPI.Web; using SpotifyAPI.Web.Models; namespace NzbDrone.Core.Test.ImportListTests { [TestFixture] public class SpotifyPlaylistFixture : CoreTest { // placeholder, we don't use real API private readonly SpotifyWebAPI _api = null; [Test] public void should_not_throw_if_playlist_tracks_is_null() { Mocker.GetMock(). Setup(x => x.GetPlaylistTracks(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())) .Returns(default(Paging)); var result = Subject.Fetch(_api, "playlistid"); result.Should().BeEmpty(); } [Test] public void should_not_throw_if_playlist_tracks_items_is_null() { var playlistTracks = new Paging { Items = null }; Mocker.GetMock(). Setup(x => x.GetPlaylistTracks(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())) .Returns(playlistTracks); var result = Subject.Fetch(_api, "playlistid"); result.Should().BeEmpty(); } [Test] public void should_not_throw_if_playlist_track_is_null() { var playlistTracks = new Paging { Items = new List { null } }; Mocker.GetMock(). Setup(x => x.GetPlaylistTracks(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())) .Returns(playlistTracks); var result = Subject.Fetch(_api, "playlistid"); result.Should().BeEmpty(); } [Test] public void should_use_album_artist_when_it_exists() { var playlistTracks = new Paging { Items = new List { new PlaylistTrack { Track = new FullTrack { Album = new SimpleAlbum { Name = "Album", Artists = new List { new SimpleArtist { Name = "AlbumArtist" } } }, Artists = new List { new SimpleArtist { Name = "TrackArtist" } } } } } }; Mocker.GetMock(). Setup(x => x.GetPlaylistTracks(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())) .Returns(playlistTracks); var result = Subject.Fetch(_api, "playlistid"); result.Should().HaveCount(1); result[0].Artist.Should().Be("AlbumArtist"); } [Test] public void should_fall_back_to_track_artist_if_album_artist_missing() { var playlistTracks = new Paging { Items = new List { new PlaylistTrack { Track = new FullTrack { Album = new SimpleAlbum { Name = "Album", Artists = new List { new SimpleArtist { Name = null } } }, Artists = new List { new SimpleArtist { Name = "TrackArtist" } } } } } }; Mocker.GetMock(). Setup(x => x.GetPlaylistTracks(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())) .Returns(playlistTracks); var result = Subject.Fetch(_api, "playlistid"); result.Should().HaveCount(1); result[0].Artist.Should().Be("TrackArtist"); } [TestCase(null, null, "Album")] [TestCase("AlbumArtist", null, null)] [TestCase(null, "TrackArtist", null)] public void should_skip_bad_artist_or_album_names(string albumArtistName, string trackArtistName, string albumName) { var playlistTracks = new Paging { Items = new List { new PlaylistTrack { Track = new FullTrack { Album = new SimpleAlbum { Name = albumName, Artists = new List { new SimpleArtist { Name = albumArtistName } } }, Artists = new List { new SimpleArtist { Name = trackArtistName } } } } } }; Mocker.GetMock(). Setup(x => x.GetPlaylistTracks(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())) .Returns(playlistTracks); var result = Subject.Fetch(_api, "playlistid"); result.Should().BeEmpty(); } [Test] public void should_not_throw_if_get_next_page_returns_null() { var playlistTracks = new Paging { Items = new List { new PlaylistTrack { Track = new FullTrack { Album = new SimpleAlbum { Name = "Album", Artists = new List { new SimpleArtist { Name = null } } }, Artists = new List { new SimpleArtist { Name = "TrackArtist" } } } } }, Next = "DummyToMakeHasNextTrue" }; Mocker.GetMock(). Setup(x => x.GetPlaylistTracks(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())) .Returns(playlistTracks); Mocker.GetMock() .Setup(x => x.GetNextPage(It.IsAny(), It.IsAny(), It.IsAny>())) .Returns(default(Paging)); var result = Subject.Fetch(_api, "playlistid"); result.Should().HaveCount(1); Mocker.GetMock() .Verify(x => x.GetNextPage(It.IsAny(), It.IsAny(), It.IsAny>()), Times.Once()); } } }