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); }