public async Task AdminSongService_TotalAsync_ShouldReturnTotalSongs()
        {
            //Arrenge
            var db = this.GetDatabase();

            await this.PopulateDbAsync(db);

            var adminSongService = new AdminSongService(db);

            //Act
            var result = await adminSongService.TotalAsync();

            //Assert
            result.Should().Be(TotalSongsCount);
        }
        public async Task AdminSongService_ExistAsync_ShouldReturnTrueForValidSong()
        {
            //Arrenge
            var db = this.GetDatabase();

            await this.PopulateDbAsync(db);


            var adminSongService = new AdminSongService(db);
            //Act

            var result = await adminSongService.ExistAsync(SongId);

            //Assert
            result.Should().Be(true);
        }
        public async Task AdminSongService_EditAsync_ShouldDoNotEditWhenSongsDoesNotExist()
        {
            //Arrenge
            var db = this.GetDatabase();

            await this.PopulateDbAsync(db);

            var adminSongService = new AdminSongService(db);

            //Act
            await adminSongService.EditAsync(10, EditedSongName, SongPrice, SongDuration, SongArtistId, SongGanre);

            var editedSong = await db.Songs.FindAsync(10);

            //Assert
            editedSong.Should().BeNull();
        }
        public async Task AdminSongService_DeleteAsync_ShouldReturnFalseWhenSongDoesNotExist()
        {
            //Arrenge
            var db = this.GetDatabase();

            await this.PopulateDbAsync(db);

            var adminSongService = new AdminSongService(db);
            var song             = await db.Songs.FindAsync(SongId + 10);

            //Act

            var result = await adminSongService.DeleteAsync(SongId + 10);

            //Assert
            result.Should().Be(false);
            song.Should().BeNull();
        }
        public async Task AdminSongService_DeleteAsync_ShouldDeleteAndSaveCorrectSong()
        {
            //Arrenge
            var db = this.GetDatabase();

            await this.PopulateDbAsync(db);

            var adminSongService = new AdminSongService(db);
            var song             = await db.Songs.FindAsync(SongId);

            //Act

            var result = await adminSongService.DeleteAsync(SongId);

            //Assert
            result.Should().Be(true);
            db.Songs.Should().NotContain(song);
            song.Should().NotBeNull();
        }
        public async Task AdminSongService_GetByIdAsync_ShouldReturnTrueForValidSong()
        {
            //Arrenge
            var db = this.GetDatabase();

            await this.PopulateDbAsync(db);


            var adminSongService = new AdminSongService(db);
            //Act

            var result = await adminSongService.GetByIdAsync(SongId);

            //Assert
            result.Name.Should().Be(SongName);
            result.Price.Should().Be(SongPrice);
            result.Duration.Should().Be(SongDuration);
            result.Artist.Should().Be(ArtistName);
        }
        public async Task AdminSongService_AllAsyncBasic_ShouldReturnValidSongs()
        {
            //Arrenge
            var db = this.GetDatabase();

            await this.PopulateDbAsync(db);


            var adminSongService = new AdminSongService(db);
            //Act

            var result = await adminSongService.AllBasicAsync(SongArtistId);

            //Assert
            result
            .Should()
            .HaveCount(1)
            .And
            .Match(s => s.Last().Name == SongName);
        }
        public async Task AdminSongService_AllAsync_ShouldReturnCollectionOfSongs()
        {
            //Arrenge
            var db = this.GetDatabase();

            await this.PopulateDbAsync(db);


            var adminSongService = new AdminSongService(db);
            //Act

            var result = await adminSongService.AllAsync();

            //Assert
            result
            .Should()
            .Match(s => s.ElementAt(0).Id == 3 && s.ElementAt(2).Id == 1)
            .And
            .HaveCount(3);
        }
        public async Task AdminSongService_CreateAsync_ShouldCreateAndSaveCorrectSong()
        {
            //Arrenge
            var db = this.GetDatabase();

            var adminSongService = new AdminSongService(db);

            //Act
            await adminSongService.CreateAsync(SongName, SongPrice, SongDuration, SongArtistId, SongGanre);

            var savedSong = await db.Songs.FirstOrDefaultAsync();

            //Assert
            savedSong.Should().NotBeNull();
            savedSong.Id.Should().Be(SongId);
            savedSong.Name.Should().Be(SongName);
            savedSong.Price.Should().Be(SongPrice);
            savedSong.Duration.Should().Be(SongDuration);
            savedSong.ArtistId.Should().Be(SongArtistId);
            savedSong.Ganre.Should().Be(SongGanre);
        }
        public async Task AdminSongService_EditAsync_ShouldEditWhenSongsExist()
        {
            //Arrenge
            var db = this.GetDatabase();

            await this.PopulateDbAsync(db);

            var adminSongService = new AdminSongService(db);

            //Act
            await adminSongService.EditAsync(SongId, EditedSongName, SongPrice, SongDuration, SongArtistId, SongGanre);

            var editedSong = await db.Songs.FindAsync(SongId);

            //Assert
            editedSong.Should().NotBeNull();
            editedSong.Id.Should().Be(SongId);
            editedSong.Name.Should().Be(EditedSongName);
            editedSong.Price.Should().Be(SongPrice);
            editedSong.Duration.Should().Be(SongDuration);
            editedSong.ArtistId.Should().Be(SongArtistId);
            editedSong.Ganre.Should().Be(SongGanre);
        }