public static void GetAlbumList2ByYearAsync_LibraryDoesNotExist_ThrowsDataNotFoundError()
            {
                var dbConnection = OpenSqliteDatabase();

                var dbContextOptionsBuilder = new DbContextOptionsBuilder <MediaInfoContext>()
                                              .DisableClientSideEvaluation()
                                              .UseSqlite(dbConnection);

                using (var dbContext = new MediaInfoContext(dbContextOptionsBuilder.Options))
                {
                    var random  = new RandomPopulator(dbContext);
                    var user    = random.AddUser();
                    var library = random.AddLibrary();
                    var artist  = random.AddArtist();
                    var album   = random.AddAlbum(artist);
                    album.Date = 2000_00_00;
                    var directory = random.AddDirectory(library);
                    var file      = random.AddFile(directory);
                    var track     = random.AddTrack(file, artist, album);
                    dbContext.SaveChanges();

                    var ex = Assert.Throws <RestApiErrorException>(() => RestApiQueries.GetAlbumList2ByYearAsync(dbContext, user.UserId, library.LibraryId + 1, 0, 10, 1999, 2001, CancellationToken.None).GetAwaiter().GetResult());

                    var expectedException = RestApiErrorException.DataNotFoundError();
                    Assert.Equal(expectedException.Message, ex.Message);
                    Assert.Equal(expectedException.Code, ex.Code);
                }
            }
            public static void GetAlbumList2ByYearAsync_LibraryIsSpecified_ReturnsExpectedAlbums(int fromYear, int toYear)
            {
                var dbConnection = OpenSqliteDatabase();

                var dbContextOptionsBuilder = new DbContextOptionsBuilder <MediaInfoContext>()
                                              .DisableClientSideEvaluation()
                                              .UseSqlite(dbConnection);

                using (var dbContext = new MediaInfoContext(dbContextOptionsBuilder.Options))
                {
                    var random       = new RandomPopulator(dbContext);
                    var user         = random.AddUser();
                    var library      = random.AddLibrary();
                    var otherLibrary = random.AddLibrary();
                    var artist       = random.AddArtist();
                    var album        = random.AddAlbum(artist);
                    album.Date = 2000_00_00;
                    var directory      = random.AddDirectory(library);
                    var file           = random.AddFile(directory);
                    var track          = random.AddTrack(file, artist, album);
                    var otherDirectory = random.AddDirectory(otherLibrary);
                    var otherFile      = random.AddFile(otherDirectory);
                    var otherTrack     = random.AddTrack(otherFile, artist, album);
                    dbContext.SaveChanges();

                    var result = RestApiQueries.GetAlbumList2ByYearAsync(dbContext, user.UserId, library.LibraryId, 0, 10, fromYear, toYear, CancellationToken.None).GetAwaiter().GetResult();

                    var resultAlbum = Assert.Single(result.album);
                    Assert.Equal("a" + album.AlbumId, resultAlbum.id);
                    Assert.Equal(1, resultAlbum.songCount);
                    Assert.Equal(Math.Round(track.Duration ?? 0), resultAlbum.duration);
                }
            }
            public static void GetAlbumList2ByYearAsync_VariousOffsetAndCount_ReturnsExpectedAlbumDetails(int albumCount, int count, int fromYear, int toYear)
            {
                var dbConnection = OpenSqliteDatabase();

                var dbContextOptionsBuilder = new DbContextOptionsBuilder <MediaInfoContext>()
                                              .DisableClientSideEvaluation()
                                              .UseSqlite(dbConnection);

                using (var dbContext = new MediaInfoContext(dbContextOptionsBuilder.Options))
                {
                    var random  = new RandomPopulator(dbContext);
                    var user    = random.AddUser();
                    var library = random.AddLibrary();
                    var artist  = random.AddArtist();
                    var albums  = new List <Album>();
                    var tracks  = new List <Track>();
                    for (int i = 0; i < albumCount; ++i)
                    {
                        var album = random.AddAlbum(artist);
                        album.Date = 1999_01_01 + (i % 3 * 1_00_00) + (i % 12 * 1_00) + (i % 28);
                        albums.Add(album);
                        var directory = random.AddDirectory(library);
                        var file      = random.AddFile(directory);
                        var track     = random.AddTrack(file, artist, album);
                        tracks.Add(track);
                    }
                    dbContext.SaveChanges();

                    if (fromYear <= toYear)
                    {
                        albums = albums
                                 .Where(a => a.Date >= fromYear * 1_00_00 && a.Date < (toYear + 1) * 1_00_00)
                                 .OrderBy(a => a.Date)
                                 .ThenBy(a => a.SortTitle ?? a.Title, _stringComparer)
                                 .ThenBy(a => a.AlbumId)
                                 .ToList();
                    }
                    else
                    {
                        albums = albums
                                 .Where(a => a.Date >= toYear * 1_00_00 && a.Date < (fromYear + 1) * 1_00_00)
                                 .OrderByDescending(a => a.Date)
                                 .ThenByDescending(a => a.SortTitle ?? a.Title, _stringComparer)
                                 .ThenByDescending(a => a.AlbumId)
                                 .ToList();
                    }
                    Assert.NotEmpty(albums);

                    for (int i = 0; i <= albumCount; ++i)
                    {
                        var result = RestApiQueries.GetAlbumList2ByYearAsync(dbContext, user.UserId, null, i, count, fromYear, toYear, CancellationToken.None).GetAwaiter().GetResult();

                        Assert.Equal(albums.Skip(i).Take(count).Select(a => "a" + a.AlbumId).ToArray(),
                                     result.album.Select(a => a.id).ToArray());
                        foreach (var resultAlbum in result.album)
                        {
                            var album       = albums.Single(a => "a" + a.AlbumId == resultAlbum.id);
                            var albumTracks = tracks.Where(t => t.Album == album);

                            Assert.Equal(album.Title, resultAlbum.name);
                            Assert.Equal(album.Artist.Name, resultAlbum.artist);
                            Assert.Equal("r" + album.ArtistId, resultAlbum.artistId);
                            Assert.Equal(album.CoverPictureId?.ToString("X8"), resultAlbum.coverArt);
                            Assert.Equal(albumTracks.Count(), resultAlbum.songCount);
                            Assert.Equal(Math.Round(albumTracks.Sum(t => t.Duration) ?? 0), resultAlbum.duration);
                            Assert.False(resultAlbum.playCountSpecified);
                            Assert.Equal(default, resultAlbum.playCount);