public async Task AddAsyncThrowsWhenTheInputModelIsNull()
        {
            // Arrange
            var mapperMock     = new Mock <IMapper>();
            var repositoryMock = new Mock <IDeletableEntityRepository <Gym> >();

            var gymsService = new GymsService(repositoryMock.Object, mapperMock.Object);

            // Assert
            await Assert.ThrowsAsync <ArgumentNullException>(async() =>
            {
                // Act
                await gymsService.AddAsync(null, new ImageInputModel());
            });
        }
        public async Task AddMapsTheInputModelAndImageAndAddsThem(
            string name,
            string description,
            string cityId,
            bool nullImage,
            string imageSource)
        {
            // Arrange
            AutoMapperConfig.RegisterMappings(typeof(Test).Assembly, typeof(ErrorViewModel).Assembly);

            var saved    = true;
            var gymsList = new List <Gym>();

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

            repositoryMock.Setup(x => x.AddAsync(It.IsAny <Gym>()))
            .Callback((Gym gym) =>
            {
                gymsList.Add(gym);
            });

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

            var gymViewModel = new GymInputModel()
            {
                Name        = name,
                CityId      = cityId,
                Description = description,
            };

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

            if (nullImage)
            {
                imageInputModel = null;
            }

            var gymsService = new GymsService(repositoryMock.Object, AutoMapperConfig.MapperInstance);

            // Act
            await gymsService.AddAsync(gymViewModel, imageInputModel);

            // Assert
            var actualGym = gymsList[0];

            Assert.True(saved);
            Assert.Equal(name, actualGym.Name);
            Assert.Equal(cityId, actualGym.CityId);
            Assert.Equal(description, actualGym.Description);

            var actualImage = actualGym.Image;

            if (nullImage)
            {
                Assert.Null(actualImage);
            }
            else
            {
                Assert.Equal(imageSource, actualImage.Source);
            }
        }
        public async Task EditAsyncEditsThePropertiesAndSavesTheChanges(
            string name,
            string description,
            string cityId,
            string newName,
            string newDescription,
            string newCityId,
            bool imageNull,
            string imageSource,
            string newImageSource)
        {
            // Arrange
            AutoMapperConfig.RegisterMappings(typeof(Test).Assembly, typeof(ErrorViewModel).Assembly);
            var saved = true;

            var gym = new Gym()
            {
                Name        = name,
                Description = description,
                CityId      = cityId,
            };

            var gymsList = new List <Gym>()
            {
                new Gym(),
                gym,
                new Gym(),
                new Gym(),
            };

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

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

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

            var gymEditModel = new GymInputModel()
            {
                Name        = newName,
                Description = newDescription,
                CityId      = newCityId,
            };

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

            if (imageNull)
            {
                imageEditModel = null;
            }

            var gymsService = new GymsService(repositoryMock.Object, AutoMapperConfig.MapperInstance);

            // Act
            await gymsService.EditAsync(gym.Id, gymEditModel, imageEditModel);

            // Assert
            Assert.True(saved);

            Assert.Equal(newName, gym.Name);
            Assert.Equal(newDescription, gym.Description);
            Assert.Equal(newCityId, gym.CityId);

            var actualImage = gym.Image;

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