Ejemplo n.º 1
0
        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));
        }
Ejemplo n.º 2
0
        public async Task ThrowExceptionWhenSaveFailed()
        {
            _mockUnitOfWork.Setup(x => x.SaveAsync()).ReturnsAsync(false);

            var productAddResource = new ProductAddResource();
            await Assert.ThrowsAsync <Exception>(async() => await _sut.CreateProduct(productAddResource));
        }
Ejemplo n.º 3
0
        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);
        }
Ejemplo n.º 4
0
        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)]);
        }
Ejemplo n.º 5
0
        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"));
        }