public IHttpActionResult CreateAd(AdBindingModel adBindingModel)
        {
            if (adBindingModel == null)
            {
                return this.BadRequest("Your data is missing");
            }

            if (!this.ModelState.IsValid)
            {
                return this.BadRequest(this.ModelState);
            }

            if (!adBindingModel.Categories.Any() || adBindingModel.Categories.Count() > 3)
            {
                return this.BadRequest("Categories count must be between 1 and 3");
            }

            var ad = new Ad();
            ad.OwnerId = this.UserIdProvider.GetUserId();
            ad.Name = adBindingModel.Name;
            ad.Description = adBindingModel.Description;
            ad.Price = adBindingModel.Price;
            ad.PostedOn = DateTime.Now;

            var type = this.Data.AdTypes.All().FirstOrDefault(t => t.Id == adBindingModel.TypeId);
            if (type != null)
            {
                ad.Type = type;
            }

            ad.Categories = new List<Category>();
            foreach (var categoryId in adBindingModel.Categories)
            {
                var category = this.Data.Categories.All().FirstOrDefault(c => c.Id == categoryId);
                if (category != null)
                {
                    ad.Categories.Add(category);
                }
            }

            this.Data.Ads.Add(ad);
            this.Data.SaveChanges();

            var adViewModel = this.Data.Ads.All()
                .Where(a => a.Id == ad.Id)
                .Select(AdViewModel.Create)
                .FirstOrDefault();

            return this.Ok(adViewModel);
        }
        public void CreateAd_Should_Successfully_Add_To_Repository()
        {
            var ads = new List<Ad>();

            var fakeUser = this.mocks.UserRepositoryMock.Object.All().FirstOrDefault();
            if (fakeUser == null)
            {
                Assert.Fail("Cannot perform test - no user available.");
            }

            this.mocks.AdRepositoryMock
                .Setup(r => r.Add(It.IsAny<Ad>()))
                .Callback((Ad ad) =>
                    {
                        ad.Owner = fakeUser;
                        ads.Add(ad);
                    });

            var mockContext = new Mock<IOnlineShopData>();
            mockContext.Setup(c => c.Ads)
                .Returns(this.mocks.AdRepositoryMock.Object);
            mockContext.Setup(c => c.AdTypes)
                .Returns(this.mocks.AdTypeRepositoryMock.Object);
            mockContext.Setup(c => c.Users)
                .Returns(this.mocks.UserRepositoryMock.Object);
            mockContext.Setup(c => c.Categories)
                .Returns(this.mocks.CategoryRepositoryMock.Object);

            var mockIdProvider = new Mock<IUserIdProvider>();
            mockIdProvider.Setup(ip => ip.GetUserId())
                .Returns(fakeUser.Id);

            var adsController = new AdsController(mockContext.Object, mockIdProvider.Object);
            this.SetupController(adsController);

            var randomName = Guid.NewGuid().ToString();
            var newAd = new AdBindingModel
                {
                    Name = randomName, 
                    Price = 555, 
                    TypeId = 1, 
                    Description = "No description", 
                    Categories = new[] { 1 }
                };

            var response = adsController.CreateAd(newAd).ExecuteAsync(CancellationToken.None).Result;
            Assert.AreEqual(HttpStatusCode.OK, response.StatusCode);

            mockContext.Verify(c => c.SaveChanges(), Times.Once);

            Assert.AreEqual(1, ads.Count);
            Assert.AreEqual(randomName, ads[0].Name);
        }