public async Task AddAsyncAddsTheEntityToTheRepository(
            string boulderName,
            string boulderDescription,
            string gradeId,
            string gymId,
            string imageSource,
            string authorId)
        {
            AutoMapperConfig.RegisterMappings(typeof(Test).Assembly, typeof(ErrorViewModel).Assembly);

            var repositoryMock = new Mock <IDeletableEntityRepository <Boulder> >();
            var testData       = new List <Boulder>();

            var boulderInput = new BoulderInputModel()
            {
                Name        = boulderName,
                Description = boulderDescription,
                GradeId     = gradeId,
                GymId       = gymId,
            };

            var imageInput = new ImageInputModel()
            {
                Source = imageSource,
            };

            var saved = false;

            repositoryMock.Setup(x => x.AddAsync(It.IsAny <Boulder>()))
            .Callback((Boulder boulder) =>
            {
                testData.Add(boulder);
            });

            repositoryMock.Setup(x => x.SaveChangesAsync())
            .Callback(() =>
            {
                saved = true;
            });

            var bouldersService = new BouldersService(repositoryMock.Object, AutoMapperConfig.MapperInstance);

            // Act
            await bouldersService.AddAsync(boulderInput, authorId, imageInput);

            // Assert
            var boulder = testData[0];

            Assert.True(saved);
            Assert.Equal(authorId, boulder.AuthorId);
            Assert.Equal(boulderName, boulder.Name);
            Assert.Equal(boulderDescription, boulder.Description);
            Assert.Equal(gradeId, boulder.GradeId);
            Assert.Equal(gymId, boulder.GymId);
            Assert.Equal(imageInput.Source, boulder.Image.Source);
        }
        public async Task AddAsyncThrowsWhenTheImageInputModelIsNull()
        {
            // Arrange
            var mapperMock     = new Mock <IMapper>();
            var repositoryMock = new Mock <IDeletableEntityRepository <Boulder> >();

            var bouldersService = new BouldersService(repositoryMock.Object, mapperMock.Object);

            // Assert
            await Assert.ThrowsAsync <ArgumentNullException>(async() =>
            {
                // Act
                await bouldersService.AddAsync(new BoulderInputModel(), "validId", null);
            });
        }
        public async Task EditAsyncEditsThePorpertiesAndSavesTheChanges(
            string name,
            string description,
            string gradeId,
            string gymId,
            string newName,
            string newDescription,
            string newGradeId,
            string newGymId,
            bool imageNull,
            string imageSource,
            string newImageSource)
        {
            // Arrange
            AutoMapperConfig.RegisterMappings(typeof(Test).Assembly, typeof(ErrorViewModel).Assembly);
            var saved = true;

            var boulder = new Boulder()
            {
                Name        = name,
                Description = description,
                GradeId     = gradeId,
                GymId       = gymId,
                Image       = new Image()
                {
                    Source = imageSource,
                },
            };

            var bouldersList = new List <Boulder>()
            {
                new Boulder(),
                new Boulder(),
                new Boulder(),
                boulder,
                new Boulder(),
                new Boulder(),
            };

            var repositoryMock = new Mock <IDeletableEntityRepository <Boulder> >();

            repositoryMock.Setup(x => x.All())
            .Returns(bouldersList.AsQueryable());

            repositoryMock.Setup(x => x.SaveChangesAsync())
            .Callback(() =>
            {
                saved = true;
            });

            var boulderEditModel = new BoulderInputModel()
            {
                Name        = newName,
                Description = newDescription,
                GymId       = newGymId,
                GradeId     = newGradeId,
            };

            var imageEditModel = new ImageInputModel()
            {
                Source = newImageSource,
            };

            if (imageNull)
            {
                imageEditModel = null;
            }

            var bouldersService = new BouldersService(repositoryMock.Object, AutoMapperConfig.MapperInstance);

            // Act
            await bouldersService.EditAsync(boulder.Id, boulderEditModel, imageEditModel);

            // Assert
            Assert.True(saved);

            Assert.Equal(newName, boulder.Name);
            Assert.Equal(newDescription, boulder.Description);
            Assert.Equal(newGradeId, boulder.GradeId);
            Assert.Equal(newGymId, boulder.GymId);

            var actualImage = boulder.Image;

            if (imageNull)
            {
                Assert.Equal(imageSource, actualImage.Source);
            }
            else
            {
                Assert.Equal(newImageSource, actualImage.Source);
            }
        }