public async Task <IActionResult> CreateProduct([FromBody] ProductAddResource product) { if (product == null) { return(BadRequest()); } if (!ModelState.IsValid) { return(new UnprocessableEntityObjectResult(ModelState)); } var productModel = _mapper.Map <Product>(product); _productRepository.AddProduct(productModel); if (!await _unitOfWork.SaveAsync()) { throw new Exception("Error occurred when adding"); } var productResource = _mapper.Map <ProductResource>(productModel); var links = CreateLinksForProduct(productModel.Id); var linkedProductResource = productResource.ToDynamic() as IDictionary <string, object>; linkedProductResource.Add("links", links); return(CreatedAtRoute("GetProduct", new { id = linkedProductResource["Id"] }, linkedProductResource)); }
public async Task ThrowExceptionWhenSaveFailed() { _mockUnitOfWork.Setup(x => x.SaveAsync()).ReturnsAsync(false); var productAddResource = new ProductAddResource(); await Assert.ThrowsAsync <Exception>(async() => await _sut.CreateProduct(productAddResource)); }
public async Task SaveWhenModelStateValid() { _mockUnitOfWork.Setup(x => x.SaveAsync()).ReturnsAsync(true); var productAddResource = new ProductAddResource(); await _sut.CreateProduct(productAddResource); _mockProductRepository.Verify(x => x.AddProduct(It.IsAny <Product>())); _mockUnitOfWork.Verify(x => x.SaveAsync(), Times.Once); }
public async Task ProductSavedWhenModelStateValid() { var productFromMapper = new Product { Name = "Name", QuantityPerBox = 10 }; _mockMapper.Setup(x => x.Map <Product>(It.IsAny <ProductAddResource>())).Returns(productFromMapper); var productResourceFromMapper = new ProductResource { Id = 5, Name = "Name", QuantityPerBox = 10 }; _mockMapper.Setup(x => x.Map <ProductResource>(productFromMapper)).Returns(productResourceFromMapper); Product productModelAfterSaved = null; _mockUnitOfWork.Setup(x => x.SaveAsync()).ReturnsAsync(true) .Callback(() => productModelAfterSaved = new Product { Id = 5, Name = productFromMapper.Name, QuantityPerBox = productFromMapper.QuantityPerBox }); var productAddResource = new ProductAddResource(); var result = await _sut.CreateProduct(productAddResource); var createdAtRouteResult = result as CreatedAtRouteResult; _mockProductRepository.Verify(x => x.AddProduct(It.IsAny <Product>()), Times.Once); _mockUnitOfWork.Verify(x => x.SaveAsync(), Times.Once); Assert.IsType <CreatedAtRouteResult>(result); Assert.NotNull(createdAtRouteResult); Assert.IsAssignableFrom <IDictionary <string, object> >(createdAtRouteResult.Value); var dict = createdAtRouteResult.Value as IDictionary <string, object>; Assert.NotNull(dict); Assert.Equal(productModelAfterSaved.Id, (int)createdAtRouteResult.RouteValues["id"]); Assert.Equal(productModelAfterSaved.Name, (string)dict[nameof(productResourceFromMapper.Name)]); Assert.Equal(productModelAfterSaved.QuantityPerBox, (int)dict[nameof(productResourceFromMapper.QuantityPerBox)]); }
public async Task ReturnUnprocessableEntityObjectResultWhenInvalidModelState() { _sut.ModelState.AddModelError("SomeProperty", "A test error"); var productAddResource = new ProductAddResource(); var result = await _sut.CreateProduct(productAddResource); Assert.IsType <UnprocessableEntityObjectResult>(result); var objectResult = result as ObjectResult; Assert.NotNull(objectResult?.Value); var modelState = objectResult.Value as dynamic; Assert.True(modelState?.ContainsKey("SomeProperty")); }