Example #1
0
        public List <ChartEntry> CreateEntriesForLastFmCharts(
            LastFmChart <LastFmChartTrack> trackChart,
            LastFmChart <LastFmChartAlbum> albumChart,
            LastFmChart <LastFmChartArtist> artistChart,
            ChartWeek targetWeek)
        {
            var entries = new List <ChartEntry>();

            foreach (var entry in trackChart.Entries)
            {
                if (entry.Rank > 100)
                {
                    continue;
                }
                entries.Add(new ChartEntry
                {
                    Week   = targetWeek,
                    Type   = ChartEntryType.Track,
                    Rank   = entry.Rank,
                    Title  = entry.Title,
                    Artist = entry.Artist,
                });
            }

            foreach (var entry in albumChart.Entries)
            {
                if (entry.Rank > 100)
                {
                    continue;
                }
                entries.Add(new ChartEntry
                {
                    Week   = targetWeek,
                    Type   = ChartEntryType.Album,
                    Rank   = entry.Rank,
                    Title  = entry.Title,
                    Artist = entry.Artist,
                });
            }

            foreach (var entry in artistChart.Entries)
            {
                if (entry.Rank > 100)
                {
                    continue;
                }
                entries.Add(new ChartEntry
                {
                    Week   = targetWeek,
                    Type   = ChartEntryType.Artist,
                    Rank   = entry.Rank,
                    Artist = entry.Name,
                });
            }

            return(entries);
        }
        public async Task GetStatsForChart_WithMultipleTrackEntries_ReturnsCorrectStats()
        {
            // Arrange
            var lastFmFake = new FakeLastFmService();
            var lastFmStub = lastFmFake.Object;

            // Represents the tracks that will be returned over time
            var tracksList = new List <List <LastFmChartTrack> >
            {
                new List <LastFmChartTrack>
                {
                    new LastFmChartTrack {
                        Title = "Cool", Artist = "Dua Lipa", Rank = 1
                    },
                    new LastFmChartTrack {
                        Title = "Pretty Please", Artist = "Dua Lipa", Rank = 2
                    },
                    new LastFmChartTrack {
                        Title = "Hallucinate", Artist = "Dua Lipa", Rank = 3
                    },
                    new LastFmChartTrack {
                        Title = "WANNABE", Artist = "ITZY", Rank = 4
                    },
                },
                new List <LastFmChartTrack>
                {
                    new LastFmChartTrack {
                        Title = "WANNABE", Artist = "ITZY", Rank = 1
                    },
                    new LastFmChartTrack {
                        Title = "Pretty Please", Artist = "Dua Lipa", Rank = 2
                    },
                    new LastFmChartTrack {
                        Title = "Cool", Artist = "Dua Lipa", Rank = 3
                    },
                },
                new List <LastFmChartTrack>
                {
                    new LastFmChartTrack {
                        Title = "WANNABE", Artist = "ITZY", Rank = 1
                    },
                    new LastFmChartTrack {
                        Title = "Pretty Please", Artist = "Dua Lipa", Rank = 2
                    },
                    new LastFmChartTrack {
                        Title = "Hallucinate", Artist = "Dua Lipa", Rank = 3
                    },
                    new LastFmChartTrack {
                        Title = "Cool", Artist = "Dua Lipa", Rank = 4
                    },
                }
            };

            var context          = FakeThreeChartsContext.BuildInMemoryContext();
            var chartDateService = new ChartDateService(context);
            var repo             = new ChartRepository(context);
            var chartService     = new ChartService(repo, chartDateService, lastFmStub);

            // Act
            var weeks = new List <ChartWeek>();

            for (var i = 0; i < 3; i++)
            {
                var week = new ChartWeek
                {
                    Owner = new User {
                        UserName = "******"
                    }, WeekNumber = i + 1
                };

                // Set LastFm fake to return correct tracks according to index
                lastFmFake.Tracks = tracksList[i];
                lastFmFake.SetupFake(); // Updates fake returns

                var trackChart = await lastFmStub.GetWeeklyTrackChart("", 0, 0);

                var albumChart = await lastFmStub.GetWeeklyAlbumChart("", 0, 0);

                var artistChart = await lastFmStub.GetWeeklyArtistChart("", 0, 0);

                week.ChartEntries = chartService.CreateEntriesForLastFmCharts(
                    trackChart.Value,
                    albumChart.Value,
                    artistChart.Value,
                    week
                    );

                weeks.Add(week);
            }

            var results = weeks
                          .Select(w => w.ChartEntries)
                          .Select(entries =>
                                  entries
                                  .Select(entry => chartService.GetStatsForChartEntry(entry, weeks))
                                  .ToList())
                          .ToList();

            // Assert
            // All stats on the first week should be .New
            results[0].ForEach(r => r.stat.Should().Be(ChartEntryStat.New));

            results[1].Should().BeEquivalentTo(
                new List <(ChartEntryStat stat, string statText)>()
            {
                (ChartEntryStat.Increase, "+3"),
                (ChartEntryStat.NoDiff, "="),
                (ChartEntryStat.Decrease, "-2"),
            }
                );

            results[2].Should().BeEquivalentTo(
                new List <(ChartEntryStat stat, string statText)>()
            {
                (ChartEntryStat.NoDiff, "="),
                (ChartEntryStat.NoDiff, "="),
                (ChartEntryStat.Reentry, null),
                (ChartEntryStat.Decrease, "-1"),
            }
                );
        }