public async Task EditGenre(EditGenreDto editedGenre)
        {
            using (unitOfWork)
            {
                var genreEntity = await unitOfWork.GenreRepository.GetSingleAsync(i => i.Id == editedGenre.Id);

                if (genreEntity == null)
                {
                    throw new ArgumentException("Invalid Genre Id");
                }


                GenreDto mapped = mapper.Map <GenreDto>(genreEntity);

                mapped.Name        = editedGenre.Name;
                mapped.HeadGenreId = editedGenre.HeadGenreId;

                if (mapped.SubGenres.Any(p => p.HeadGenreId == mapped.Id))
                {
                    var subgenreEntity = await unitOfWork.GenreRepository.GetSingleAsync(i => i.HeadGenreId == mapped.Id);

                    GenreDto submapped = mapper.Map <GenreDto>(subgenreEntity);
                    submapped.HeadGenreId = null;

                    subgenreEntity = mapper.Map(submapped, subgenreEntity);
                    unitOfWork.GenreRepository.Update(subgenreEntity);
                }

                genreEntity = mapper.Map(mapped, genreEntity);

                unitOfWork.GenreRepository.Update(genreEntity);

                await unitOfWork.CommitAsync();
            }
        }
        public void EditGenre_ReceivedInvalidId()
        {
            EditGenreDto editedGenre = new EditGenreDto()
            {
                Id = 1, Name = "NewGenre"
            };
            Genre returnedGenre = new Genre()
            {
                Id = 1, Name = "MotorSport"
            };
            GenreDto dto = new GenreDto()
            {
                Id = 1, Name = "MotorSport", SubGenres = new List <GenreDto>()
            };

            genreRepositoryMoq.Setup((p) => p.GetSingleAsync(It.IsAny <Expression <Func <Genre, bool> > >()))
            .Returns(Task.FromResult(returnedGenre));
            mapperMoq.Setup(p => p.Map <GenreDto>(returnedGenre)).Returns(dto);

            //act

            service.EditGenre(editedGenre);

            //assert
            genreRepositoryMoq.Verify(p => p.Update(It.IsAny <Genre>()), Times.Once);
            unitofworkMoq.Verify(p => p.CommitAsync(), Times.Once);
        }
        public async Task <IActionResult> Put(int id, [FromBody] EditGenreModel value)
        {
            EditGenreDto genreDto = new EditGenreDto()
            {
                Id          = value.Id,
                HeadGenreId = value.HeadGenreId,
                Name        = value.Name
            };

            await genreService.EditGenre(genreDto);

            return(StatusCode((int)HttpStatusCode.NoContent));
        }
        public void EditGenre_ReceivedInvalidId_ThrowsArgumentException()
        {
            EditGenreDto editedGenre = new EditGenreDto()
            {
                Id = 1, Name = "NewGenre"
            };
            Genre NullreturnedGenre = null;

            genreRepositoryMoq.Setup((p) => p.GetSingleAsync(It.IsAny <Expression <Func <Genre, bool> > >()))
            .Returns(Task.FromResult(NullreturnedGenre));


            //act
            Assert.ThrowsAsync <ArgumentException>(async() =>
            {
                await service.EditGenre(editedGenre);
            });

            //assert
            genreRepositoryMoq.Verify(p => p.Delete(It.IsAny <Genre>()), Times.Never);
            unitofworkMoq.Verify(p => p.CommitAsync(), Times.Never);
        }