예제 #1
0
        public override async Task <PageResponse <LastArtist> > HandleResponse(HttpResponseMessage response)
        {
            var json = await response.Content.ReadAsStringAsync();

            var jtoken       = JsonConvert.DeserializeObject <JToken>(json);
            var resultsToken = jtoken.SelectToken("topartists");

            LastResponseStatus status;

            if (LastFm.IsResponseValid(json, out status) && response.IsSuccessStatusCode)
            {
                if (string.IsNullOrEmpty(resultsToken.SelectToken("@attr.tag").Value <string>()))
                {
                    return(PageResponse <LastArtist> .CreateErrorResponse(LastResponseStatus.MissingParameters));
                }

                var itemsToken = resultsToken.SelectToken("artist");

                return(PageResponse <LastArtist> .CreateSuccessResponse(itemsToken, resultsToken, LastArtist.ParseJToken, LastPageResultsType.Attr));
            }
            else
            {
                // The tag api always returns a "valid" response, so
                return(PageResponse <LastArtist> .CreateErrorResponse(status));
            }
        }
예제 #2
0
        public async override Task <PageResponse <LastStation> > HandleResponse(HttpResponseMessage response)
        {
            string json = await response.Content.ReadAsStringAsync();

            LastResponseStatus status;

            if (LastFm.IsResponseValid(json, out status) && response.IsSuccessStatusCode)
            {
                JToken jtoken = JsonConvert.DeserializeObject <JToken>(json).SelectToken("recentstations");

                var stationsToken = jtoken.SelectToken("station");

                var stations = stationsToken.Children().Select(LastStation.ParseJToken).ToList();

                var pageresponse = PageResponse <LastStation> .CreateSuccessResponse(stations);

                var attrToken = jtoken.SelectToken("@attr");
                pageresponse.AddPageInfoFromJToken(attrToken);

                return(pageresponse);
            }
            else
            {
                return(LastResponse.CreateErrorResponse <PageResponse <LastStation> >(status));
            }
        }
        public async override Task <PageResponse <LastTrack> > HandleResponse(HttpResponseMessage response)
        {
            var json = await response.Content.ReadAsStringAsync();

            LastFmApiError error;

            if (LastFm.IsResponseValid(json, out error) && response.IsSuccessStatusCode)
            {
                JToken jtoken = JsonConvert.DeserializeObject <JToken>(json).SelectToken("recenttracks");

                var tracksToken = jtoken.SelectToken("track");

                var tracks = new List <LastTrack>();
                foreach (var track in tracksToken.Children())
                {
                    var t = LastTrack.ParseJToken(track);

                    tracks.Add(t);
                }

                var pageresponse = PageResponse <LastTrack> .CreateSuccessResponse(tracks);

                var attrToken = jtoken.SelectToken("@attr");
                pageresponse.AddPageInfoFromJToken(attrToken);

                return(pageresponse);
            }
            else
            {
                return(LastResponse.CreateErrorResponse <PageResponse <LastTrack> >(error));
            }
        }
예제 #4
0
        public async Task CreateTasteTextTest()
        {
            // given: user api mock
            string            username = "******";
            LastStatsTimeSpan timeSpan = LastStatsTimeSpan.Overall;

            // create test data
            int amount = 3;
            IEnumerable <LastArtist> responseArtists = TestHelper.CreateGenericArtists(amount);

            Mock <IUserApi> userApiMock = new Mock <IUserApi>(MockBehavior.Strict);

            userApiMock.Setup(u => u.GetTopArtists(username, timeSpan, It.IsAny <int>(), amount))
            .Returns(Task.Run(() => PageResponse <LastArtist> .CreateSuccessResponse(responseArtists)));

            PasteYourTasteViewModel vm = new PasteYourTasteViewModel(userApiMock.Object)
            {
                Username = username,
                Amount   = amount
            };

            // when: getting the taste text
            await vm.GetTopArtists();

            // then: taste text contains artists
            foreach (var artist in responseArtists)
            {
                Assert.That(vm.TasteText.Contains(artist.Name), Is.True);
            }
        }
 public Task <PageResponse <LastArtist> > GetRecommendedArtistsAsync(int page = 1, int limit = 30)
 {
     return(Task.FromResult(PageResponse <LastArtist> .CreateSuccessResponse(new List <LastArtist>
     {
         CreateArtist("Iggy Azalea",
                      "http://musicimage.xboxlive.com/content/music.1F154700-0200-11DB-89CA-0019B92A3933/image?locale=en-US")
     })));
 }
        public void LoginTest()
        {
            // given: mocks
            var    lastAuthMock = new Mock <ILastAuth>(MockBehavior.Strict);
            bool   isSubscriber = true;
            string username     = "******";
            string token        = "TestToken";

            lastAuthMock.Setup(l => l.UserSession).Returns(new LastUserSession()
            {
                IsSubscriber = isSubscriber, Token = token, Username = username
            });
            lastAuthMock.Setup(l => l.LoadSession(It.IsAny <LastUserSession>())).Returns(true);
            lastAuthMock.Setup(l => l.Authenticated).Returns(true);

            var userApiMock = new Mock <IUserApi>(MockBehavior.Strict);

            userApiMock.Setup(u => u.GetRecentScrobbles(It.IsAny <string>(), It.IsAny <DateTimeOffset?>(), It.IsAny <DateTimeOffset?>(),
                                                        It.IsAny <bool>(), 1, It.IsAny <int>()))
            .Returns(() => Task.Run(() => PageResponse <LastTrack> .CreateSuccessResponse()));
            userApiMock.Setup(u => u.GetRecentScrobbles(It.IsAny <string>(), It.IsAny <DateTimeOffset?>(), It.IsAny <DateTimeOffset?>(),
                                                        It.IsAny <bool>(), 2, It.IsAny <int>()))
            .Returns(() => Task.Run(() => PageResponse <LastTrack> .CreateSuccessResponse()));
            userApiMock.Setup(u => u.GetRecentScrobbles(It.IsAny <string>(), It.IsAny <DateTimeOffset?>(), It.IsAny <DateTimeOffset?>(),
                                                        It.IsAny <bool>(), 3, It.IsAny <int>()))
            .Returns(() => Task.Run(() => PageResponse <LastTrack> .CreateSuccessResponse()));

            var messageBoxServiceMock = new Mock <IMessageBoxService>(MockBehavior.Strict);

            messageBoxServiceMock.Setup(m => m.ShowDialog(It.IsAny <string>())).Returns(IMessageBoxServiceResult.OK);

            var windowManagerMock = new Mock <IExtendedWindowManager>(MockBehavior.Strict);

            windowManagerMock.Setup(w => w.ShowDialog(It.IsAny <LoginViewModel>(), It.IsAny <object>(), It.IsAny <IDictionary <string, object> >())).Returns(true);
            windowManagerMock.SetupGet(w => w.MessageBoxService).Returns(messageBoxServiceMock.Object);

            var fileOperatorMock = new Mock <IFileOperator>(MockBehavior.Strict);

            var directoryOperatorMock = new Mock <IDirectoryOperator>(MockBehavior.Strict);

            directoryOperatorMock.Setup(d => d.Exists(It.IsAny <string>())).Returns(true);
            directoryOperatorMock.Setup(d => d.GetFiles(It.IsAny <string>())).Returns(Array.Empty <string>());

            var userSerializerMock = new Mock <ISerializer>(MockBehavior.Strict);

            userSerializerMock.Setup(u => u.Serialize(It.IsAny <User>(), It.IsAny <string>(), It.IsAny <IEnumerable <Type> >()));

            UserViewModel vm = new UserViewModel(windowManagerMock.Object, lastAuthMock.Object, userApiMock.Object, fileOperatorMock.Object, directoryOperatorMock.Object, userSerializerMock.Object);

            vm.AddUser();
            vm.SelectedUser = vm.AvailableUsers.First();

            // when: logging the user in
            vm.LoginUser();

            // then: active user changed
            Assert.That(vm.ActiveUser, Is.SameAs(vm.SelectedUser));
        }
예제 #7
0
        public async override Task <PageResponse <LastTag> > HandleResponse(HttpResponseMessage response)
        {
            var json = await response.Content.ReadAsStringAsync().ConfigureAwait(false);

            LastResponseStatus status;

            if (LastFm.IsResponseValid(json, out status) && response.IsSuccessStatusCode)
            {
                var jtoken     = JsonConvert.DeserializeObject <JToken>(json);
                var itemsToken = jtoken.SelectToken("toptags.tag");

                return(PageResponse <LastTag> .CreateSuccessResponse(itemsToken, LastTag.ParseJToken));
            }

            return(PageResponse <LastTag> .CreateErrorResponse(status));
        }
예제 #8
0
        public override async Task <PageResponse <LastWeeklyChartList> > HandleResponse(HttpResponseMessage response)
        {
            var json = await response.Content.ReadAsStringAsync();

            LastResponseStatus status;

            if (LastFm.IsResponseValid(json, out status) && response.IsSuccessStatusCode)
            {
                var jtoken         = JsonConvert.DeserializeObject <JToken>(json);
                var chartListToken = jtoken.SelectToken("weeklychartlist");
                var itemsToken     = chartListToken.SelectToken("chart");
                var pageInfoToken  = chartListToken.SelectToken("@attr");

                return(PageResponse <LastWeeklyChartList> .CreateSuccessResponse(itemsToken, pageInfoToken, LastWeeklyChartList.ParseJToken, LastPageResultsType.Attr));
            }

            return(LastResponse.CreateErrorResponse <PageResponse <LastWeeklyChartList> >(status));
        }
예제 #9
0
        public async override Task <PageResponse <LastTrack> > HandleResponse(HttpResponseMessage response)
        {
            var json = await response.Content.ReadAsStringAsync();

            LastFmApiError error;

            if (LastFm.IsResponseValid(json, out error) && response.IsSuccessStatusCode)
            {
                var jtoken     = JsonConvert.DeserializeObject <JToken>(json);
                var itemsToken = jtoken.SelectToken("similartracks").SelectToken("track");

                return(PageResponse <LastTrack> .CreateSuccessResponse(itemsToken, null, LastTrack.ParseJToken));
            }
            else
            {
                return(LastResponse.CreateErrorResponse <PageResponse <LastTrack> >(error));
            }
        }
예제 #10
0
        public async override Task <PageResponse <LastArtist> > HandleResponse(HttpResponseMessage response)
        {
            var json = await response.Content.ReadAsStringAsync();

            LastResponseStatus status;

            if (LastFm.IsResponseValid(json, out status) && response.IsSuccessStatusCode)
            {
                var jtoken     = JsonConvert.DeserializeObject <JToken>(json);
                var itemsToken = jtoken.SelectToken("similarartists").SelectToken("artist");

                return(PageResponse <LastArtist> .CreateSuccessResponse(itemsToken, LastArtist.ParseJToken));
            }
            else
            {
                return(LastResponse.CreateErrorResponse <PageResponse <LastArtist> >(status));
            }
        }
예제 #11
0
        public async override Task <PageResponse <LastTag> > HandleResponse(HttpResponseMessage response)
        {
            var json = await response.Content.ReadAsStringAsync();

            LastResponseStatus status;

            if (LastFm.IsResponseValid(json, out status) && response.IsSuccessStatusCode)
            {
                var jtoken     = JsonConvert.DeserializeObject <JToken>(json).SelectToken("similartags");
                var itemsToken = jtoken.SelectToken("tag");
                var attrToken  = jtoken.SelectToken("@attr");
                var relatedTag = attrToken.SelectToken("tag").Value <string>();

                return(PageResponse <LastTag> .CreateSuccessResponse(itemsToken, jt => LastTag.ParseJToken(jt, relatedTag)));
            }

            return(LastResponse.CreateErrorResponse <PageResponse <LastTag> >(status));
        }
예제 #12
0
        public async override Task <PageResponse <LastTrack> > HandleResponse(HttpResponseMessage response)
        {
            var json = await response.Content.ReadAsStringAsync();

            LastResponseStatus status;

            if (LastFm.IsResponseValid(json, out status) && response.IsSuccessStatusCode)
            {
                var jtoken        = JsonConvert.DeserializeObject <JToken>(json).SelectToken("tracks");
                var tracksToken   = jtoken.SelectToken("track");
                var pageInfoToken = jtoken.SelectToken("@attr");

                return(PageResponse <LastTrack> .CreateSuccessResponse(tracksToken, pageInfoToken, LastTrack.ParseJToken, LastPageResultsType.Attr));
            }
            else
            {
                return(LastResponse.CreateErrorResponse <PageResponse <LastTrack> >(status));
            }
        }
예제 #13
0
        public override async Task <PageResponse <LastAlbum> > HandleResponse(HttpResponseMessage response)
        {
            var json = await response.Content.ReadAsStringAsync();

            LastResponseStatus status;

            if (LastFm.IsResponseValid(json, out status) && response.IsSuccessStatusCode)
            {
                var jtoken        = JToken.Parse(json);
                var itemsToken    = jtoken.SelectToken("topalbums").SelectToken("album");
                var pageInfoToken = jtoken.SelectToken("@attr");

                return(PageResponse <LastAlbum> .CreateSuccessResponse(itemsToken, pageInfoToken, LastAlbum.ParseJToken, LastPageResultsType.Attr));
            }
            else
            {
                return(LastResponse.CreateErrorResponse <PageResponse <LastAlbum> >(status));
            }
        }
예제 #14
0
        public async override Task <PageResponse <LastTag> > HandleResponse(HttpResponseMessage response)
        {
            var json = await response.Content.ReadAsStringAsync();

            LastFmApiError error;

            if (LastFm.IsResponseValid(json, out error) && response.IsSuccessStatusCode)
            {
                var jtoken       = JsonConvert.DeserializeObject <JToken>(json);
                var resultsToken = jtoken.SelectToken("toptags");
                var itemsToken   = resultsToken.SelectToken("tag");

                return(PageResponse <LastTag> .CreateSuccessResponse(itemsToken, resultsToken, LastTag.ParseJToken, LastPageResultsType.Attr));
            }
            else
            {
                return(LastResponse.CreateErrorResponse <PageResponse <LastTag> >(error));
            }
        }
예제 #15
0
        public override async Task <PageResponse <LastTrack> > HandleResponse(HttpResponseMessage response)
        {
            var json = await response.Content.ReadAsStringAsync();

            LastResponseStatus status;

            if (LastFm.IsResponseValid(json, out status) && response.IsSuccessStatusCode)
            {
                var jtoken       = JsonConvert.DeserializeObject <JToken>(json);
                var resultsToken = jtoken.SelectToken("results");
                var itemsToken   = resultsToken.SelectToken("trackmatches").SelectToken("track");

                return(PageResponse <LastTrack> .CreateSuccessResponse(itemsToken, resultsToken, LastTrack.ParseJToken, LastPageResultsType.OpenQuery));
            }
            else
            {
                return(LastResponse.CreateErrorResponse <PageResponse <LastTrack> >(status));
            }
        }
예제 #16
0
        public override async Task <PageResponse <LastTag> > HandleResponse(HttpResponseMessage response)
        {
            var json = await response.Content.ReadAsStringAsync();

            LastResponseStatus status;

            if (LastFm.IsResponseValid(json, out status) && response.IsSuccessStatusCode)
            {
                var jo            = JObject.Parse(json);
                var tagsToken     = jo.SelectToken("tags.tag");
                var pageInfoToken = jo.SelectToken("@attr");

                return(PageResponse <LastTag> .CreateSuccessResponse(tagsToken, pageInfoToken, LastTag.ParseJToken, LastPageResultsType.Attr));
            }
            else
            {
                return(PageResponse <LastTag> .CreateErrorResponse(status));
            }
        }
예제 #17
0
        public override async Task <PageResponse <LastShout> > HandleResponse(HttpResponseMessage response)
        {
            var json = await response.Content.ReadAsStringAsync();

            LastFmApiError error;

            if (LastFm.IsResponseValid(json, out error) && response.IsSuccessStatusCode)
            {
                var jtoken        = JsonConvert.DeserializeObject <JToken>(json);
                var shoutsToken   = jtoken.SelectToken("shouts");
                var itemsToken    = shoutsToken.SelectToken("shout");
                var pageInfoToken = shoutsToken.SelectToken("@attr");

                return(PageResponse <LastShout> .CreateSuccessResponse(itemsToken, pageInfoToken, LastShout.ParseJToken));
            }
            else
            {
                return(LastResponse.CreateErrorResponse <PageResponse <LastShout> >(error));
            }
        }
예제 #18
0
        /// <summary>
        /// Creates a user that has hit the daily scrobble limit.
        /// </summary>
        /// <returns>User with reached limit.</returns>
        public static Login.User CreateCappedUser()
        {
            var tracks1 = CreateGenericScrobbles(1000).ToLastTracks();
            var tracks2 = CreateGenericScrobbles(1000).ToLastTracks();
            var tracks3 = CreateGenericScrobbles(1000).ToLastTracks();

            var userApiMock = new Mock <IUserApi>(MockBehavior.Strict);

            // setup so first page returs the scrobbles
            userApiMock.Setup(u => u.GetRecentScrobbles(It.IsAny <string>(), It.IsAny <DateTimeOffset?>(), It.IsAny <DateTimeOffset?>(),
                                                        It.IsAny <bool>(), 1, It.IsAny <int>()))
            .Returns(() => Task.Run(() => PageResponse <LastTrack> .CreateSuccessResponse(tracks1)));
            userApiMock.Setup(u => u.GetRecentScrobbles(It.IsAny <string>(), It.IsAny <DateTimeOffset?>(), It.IsAny <DateTimeOffset?>(),
                                                        It.IsAny <bool>(), 2, It.IsAny <int>()))
            .Returns(() => Task.Run(() => PageResponse <LastTrack> .CreateSuccessResponse(tracks2)));
            userApiMock.Setup(u => u.GetRecentScrobbles(It.IsAny <string>(), It.IsAny <DateTimeOffset?>(), It.IsAny <DateTimeOffset?>(),
                                                        It.IsAny <bool>(), 3, It.IsAny <int>()))
            .Returns(() => Task.Run(() => PageResponse <LastTrack> .CreateSuccessResponse(tracks3)));

            return(new Login.User("TestUser", "TestToken", true, userApiMock.Object));
        }
예제 #19
0
        public static Login.User CreateUserWithRecentTracks(string username, string token, bool isSubscriber, IEnumerable <LastTrack> tracks)
        {
            if (tracks == null || tracks.Count() > 1000)
            {
                throw new ArgumentException(nameof(tracks), "tracks is null or has more than 1000 tracks");
            }

            var userApiMock = new Mock <IUserApi>(MockBehavior.Strict);

            // setup so first page returs the scrobbles
            userApiMock.Setup(u => u.GetRecentScrobbles(username, It.IsAny <DateTimeOffset?>(), It.IsAny <DateTimeOffset?>(),
                                                        It.IsAny <bool>(), 1, It.IsAny <int>()))
            .Returns(() => Task.Run(() => PageResponse <LastTrack> .CreateSuccessResponse(tracks)));
            userApiMock.Setup(u => u.GetRecentScrobbles(username, It.IsAny <DateTimeOffset?>(), It.IsAny <DateTimeOffset?>(),
                                                        It.IsAny <bool>(), 2, It.IsAny <int>()))
            .Returns(() => Task.Run(() => PageResponse <LastTrack> .CreateSuccessResponse()));
            userApiMock.Setup(u => u.GetRecentScrobbles(username, It.IsAny <DateTimeOffset?>(), It.IsAny <DateTimeOffset?>(),
                                                        It.IsAny <bool>(), 3, It.IsAny <int>()))
            .Returns(() => Task.Run(() => PageResponse <LastTrack> .CreateSuccessResponse()));

            return(new Login.User(username, token, isSubscriber, userApiMock.Object));
        }
예제 #20
0
        public void CreateTasteTextTest()
        {
            // given: user api mock
            string            username = "******";
            int               amount   = 3;
            LastStatsTimeSpan timeSpan = LastStatsTimeSpan.Overall;

            // create test data
            List <LastArtist> responseArtists = new List <LastArtist>();

            for (int i = 0; i < amount; i++)
            {
                responseArtists.Add(new LastArtist()
                {
                    Name = "TestArtist" + i
                });
            }

            Mock <IUserApi> userApiMock = new Mock <IUserApi>(MockBehavior.Strict);

            userApiMock.Setup(u => u.GetTopArtists(username, timeSpan, It.IsAny <int>(), amount))
            .Returns(Task.Run(() => PageResponse <LastArtist> .CreateSuccessResponse(responseArtists)));

            PasteYourTasteViewModel vm = new PasteYourTasteViewModel(userApiMock.Object)
            {
                Username = username,
                Amount   = amount
            };

            // when: getting the taste text
            vm.GetTopArtists();

            // then: taste text contains artists
            foreach (var artist in responseArtists)
            {
                Assert.That(vm.TasteText.Contains(artist.Name), Is.True);
            }
        }
        public async Task ScrobbleTest()
        {
            //given: FriendScrobbleViewModel with mocked userapi
            List <Scrobble> expected = new List <Scrobble>
            {
                new Scrobble("TestArtist", "TestAlbum", "TestTrack", DateTime.Now)
                {
                    Duration = TimeSpan.FromSeconds(30)
                },
                new Scrobble("TestArtist2", "TestAlbum2", "TestTrack2", DateTime.Now.AddSeconds(1))
                {
                    Duration = TimeSpan.FromSeconds(30)
                },
                new Scrobble("TestArtist3", "TestAlbum3", "TestTrack3", DateTime.Now.AddSeconds(2))
                {
                    Duration = TimeSpan.FromSeconds(30)
                }
            };

            Mock <IAuthScrobbler>  scrobblerMock = new Mock <IAuthScrobbler>();
            IEnumerable <Scrobble> actual        = null;

            scrobblerMock.Setup(i => i.ScrobbleAsync(It.IsAny <IEnumerable <Scrobble> >())).Callback <IEnumerable <Scrobble> >(s => actual = s)
            .Returns(Task.Run(() => new ScrobbleResponse()));


            Mock <IUserApi> userApiMock = new Mock <IUserApi>();

            userApiMock.Setup(i => i.GetRecentScrobbles(It.IsAny <string>(), It.IsAny <DateTimeOffset?>(), It.IsAny <int>(), It.IsAny <int>())).Returns(()
                                                                                                                                                        => Task.Run(() => PageResponse <LastTrack> .CreateSuccessResponse(expected.ToLastTracks())));

            FriendScrobbleViewModel vm = new FriendScrobbleViewModel(null, userApiMock.Object)
            {
                Scrobbler = scrobblerMock.Object,
                Username  = "******"
            };

            await vm.FetchScrobbles();

            vm.SelectAll();

            // when: scrobbling the fetched tracks.
            await vm.Scrobble();

            // we add 1 second to each TimePlayed of the expected because the vm does this too so you can scrobble from yourself...
            for (int i = 0; i < expected.Count; i++)
            {
                expected[i] = expected[i].CloneWithAddedSecond();
            }

            // then: scrobbled tracks should be equal to the given tracks.
            Assert.That(actual.IsEqualScrobble(expected), Is.True);
        }
예제 #22
0
        public Task <PageResponse <LastAlbum> > GetArtistTopAlbums(string name)
        {
            var pageResp = PageResponse <LastAlbum> .CreateSuccessResponse(CreateDesignAlbums());

            return(Task.FromResult(pageResp));
        }
예제 #23
0
        public Task <PageResponse <LastArtist> > SearchArtistAsync(string query, int page = 1, int limit = 30)
        {
            var pageResp = PageResponse <LastArtist> .CreateSuccessResponse(CreateDesignArtists());

            return(Task.FromResult(pageResp));
        }
예제 #24
0
        public Task <PageResponse <LastTrack> > GetTopTracksAsync(int page = 1, int limit = 30)
        {
            var pageResp = PageResponse <LastTrack> .CreateSuccessResponse(CreateDesignTracks());

            return(Task.FromResult(pageResp));
        }
예제 #25
0
        public async Task ScrobbleTest()
        {
            // given: mocks
            string artistSearchText = "TestArtist";

            Mock <IExtendedWindowManager> windowManagerMock = new Mock <IExtendedWindowManager>(MockBehavior.Strict);

            IEnumerable <LastArtist> artists = TestHelper.CreateGenericArtists(3);
            IEnumerable <LastAlbum>  albums  = TestHelper.CreateGenericAlbums(3);

            Mock <IArtistApi> artistAPIMock = new Mock <IArtistApi>(MockBehavior.Strict);

            artistAPIMock.Setup(a => a.SearchAsync(artistSearchText, It.IsAny <int>(), It.IsAny <int>()))
            .Returns(Task.Run(() => PageResponse <LastArtist> .CreateSuccessResponse(artists)));
            artistAPIMock.Setup(a => a.GetTopAlbumsAsync(artists.First().Name, It.IsAny <bool>(), It.IsAny <int>(), It.IsAny <int>()))
            .Returns(Task.Run(() => PageResponse <LastAlbum> .CreateSuccessResponse(albums)));

            DateTime        scrobbleTime      = DateTime.Now;
            List <Scrobble> expectedScrobbles = new List <Scrobble>();

            for (int i = 0; i < 3; i++)
            {
                // -3 minutes because that is the default if the song has no duration
                expectedScrobbles.Add(new Scrobble("TestArtist", "TestAlbum", "TestTrack", scrobbleTime.Subtract(TimeSpan.FromMinutes(i * 3))));
            }

            LastAlbum albumToScrobble = albums.First();

            albumToScrobble.Tracks = expectedScrobbles.ToLastTracks();

            Mock <IAlbumApi> albumAPIMock = new Mock <IAlbumApi>(MockBehavior.Strict);

            albumAPIMock.Setup(a => a.GetInfoAsync(albums.First().ArtistName, albums.First().Name, It.IsAny <bool>(), It.IsAny <string>()))
            .Returns(Task.Run(() => LastResponse <LastAlbum> .CreateSuccessResponse(albumToScrobble)));

            IEnumerable <Scrobble> actual        = null;
            Mock <IUserScrobbler>  scrobblerMock = new Mock <IUserScrobbler>(MockBehavior.Strict);

            scrobblerMock.Setup(u => u.ScrobbleAsync(It.IsAny <IEnumerable <Scrobble> >(), false)).Callback <IEnumerable <Scrobble>, bool>((s, c) => actual = s)
            .Returns(Task.Run(() => new ScrobbleResponse()));
            scrobblerMock.Setup(u => u.IsAuthenticated).Returns(true);

            var discocsClientMock = new Mock <IDiscogsDataBaseClient>(MockBehavior.Strict);

            var vm = new DatabaseScrobbleViewModel(windowManagerMock.Object, artistAPIMock.Object, albumAPIMock.Object, discocsClientMock.Object)
            {
                DatabaseToSearch = Database.LastFm,
                Scrobbler        = scrobblerMock.Object,
                SearchType       = SearchType.Artist,
                SearchText       = artistSearchText,
            };

            vm.ScrobbleTimeVM.UseCurrentTime = false;
            vm.ScrobbleTimeVM.Time           = scrobbleTime;

            // when searching and scrobbling
            await vm.Search();

            // now we should have artists
            // we "click" the first one, this should trigger the album search
            (vm.ActiveItem as ArtistResultViewModel).Items.First().Clicked();

            // now we should have albums
            // we "click" the first one, this should trigger the tracklist fetching
            (vm.ActiveItem as ReleaseResultViewModel).Items.First().Clicked();

            vm.CheckAll();
            await vm.Scrobble();

            // then: correct items where scrobbles
            Assert.That(actual.IsEqualScrobble(expectedScrobbles), Is.True);
        }
예제 #26
0
        public async Task ScrobbleTest()
        {
            //given: FriendScrobbleViewModel with mocked userapi
            var expected = TestHelper.CreateGenericScrobbles(3);

            IEnumerable <Scrobble> actual        = null;
            Mock <IUserScrobbler>  scrobblerMock = new Mock <IUserScrobbler>(MockBehavior.Strict);

            scrobblerMock.Setup(u => u.ScrobbleAsync(It.IsAny <IEnumerable <Scrobble> >(), false)).Callback <IEnumerable <Scrobble>, bool>((s, c) => actual = s)
            .Returns(Task.Run(() => new ScrobbleResponse()));
            scrobblerMock.Setup(u => u.IsAuthenticated).Returns(true);


            Mock <IUserApi> userApiMock = new Mock <IUserApi>();

            userApiMock.Setup(i => i.GetRecentScrobbles(It.IsAny <string>(), It.IsAny <DateTimeOffset?>(), It.IsAny <int>(), It.IsAny <int>())).Returns(()
                                                                                                                                                        => Task.Run(() => PageResponse <LastTrack> .CreateSuccessResponse(expected.ToLastTracks())));

            Mock <IExtendedWindowManager> windowManagerMock = new Mock <IExtendedWindowManager>(MockBehavior.Strict);

            FriendScrobbleViewModel vm = new FriendScrobbleViewModel(windowManagerMock.Object, userApiMock.Object)
            {
                Scrobbler = scrobblerMock.Object,
                Username  = "******"
            };

            await vm.FetchScrobbles();

            vm.CheckAll();

            // when: scrobbling the fetched tracks.
            await vm.Scrobble();

            // we add 1 second to each TimePlayed of the expected because the vm does this too so you can scrobble from yourself...
            for (int i = 0; i < expected.Length; i++)
            {
                expected[i] = expected[i].CloneWithAddedTime(TimeSpan.FromSeconds(1));
            }

            // then: scrobbled tracks should be equal to the given tracks.
            Assert.That(actual.IsEqualScrobble(expected), Is.True);
        }
예제 #27
0
        public Task <PageResponse <LastArtist> > GetTopArtistsAsync(int page = 1, int limit = 30)
        {
            var pageResp = PageResponse <LastArtist> .CreateSuccessResponse(CreateDesignArtists());

            return(Task.FromResult(pageResp));
        }