Ejemplo n.º 1
0
        public async Task <MovimentationOutputModel> Post([FromBody] MovimentationInputModel movimentationInputModel, CancellationToken cancellationToken)
        {
            movimentationInputModel.UserId = HttpContext.GetLoggedUserId();
            var result = await movimentationService.AddMovimentation(movimentationInputModel, cancellationToken);

            return(result);
        }
        public async Task MovimentationModelIsValid_MovimentationHasBeenInsertedAndInventoryUpdated_ReturnsMovimentationOutputAsResultMessage()
        {
            //arrange
            var product            = new Product("Skol lata", 2.39M);
            var user               = new User("Vinicius Santana", "11155863437", new Credentials());
            var movimentation      = new Movimentation(MovimentationType.Buy, 100, product, user);
            var movimentationInput = new MovimentationInputModel(Guid.NewGuid(), MovimentationType.Buy, 100, 2.39M)
            {
                UserId = Guid.NewGuid()
            };
            var movimentationOutput = new MovimentationOutputModel(Guid.NewGuid(), 100)
            {
                User    = "******",
                Product = "Skol lata",
                Type    = "Cerveja"
            };
            var inventory = new Inventory(product, 100);

            var mockInventoryService = new Mock <IInventoryService>();

            mockInventoryService.Setup(x => x.UpdateInventory(It.IsAny <MovimentationInputModel>(), It.IsAny <CancellationToken>())).Returns(Task.CompletedTask);

            var mockMovimentationRepository = new Mock <IMovimentationRepository>();

            mockMovimentationRepository.Setup(x => x.Add(It.IsAny <Movimentation>(), It.IsAny <CancellationToken>())).Returns(Task.FromResult(movimentation));

            var mockProductRepository = new Mock <IProductRepository>();

            mockProductRepository.Setup(x => x.Get(It.IsAny <Expression <Func <Product, bool> > >(), It.IsAny <CancellationToken>())).Returns(Task.FromResult(product));

            var mockUserRepository = new Mock <IUserRepository>();

            mockUserRepository.Setup(x => x.Get(It.IsAny <Expression <Func <User, bool> > >(), It.IsAny <CancellationToken>())).Returns(Task.FromResult(user));

            var mockMapper = new Mock <IMapper>();

            mockMapper.Setup(x => x.Map <Movimentation>(It.IsAny <MovimentationInputModel>())).Returns(movimentation);
            mockMapper.Setup(x => x.Map <MovimentationOutputModel>(It.IsAny <Movimentation>())).Returns(movimentationOutput);

            var inventoryService = new MovimentationService(mockProductRepository.Object, mockUserRepository.Object, mockMovimentationRepository.Object,
                                                            mockInventoryService.Object, mockMapper.Object);

            //act
            var result = await inventoryService.AddMovimentation(movimentationInput, new CancellationToken());

            //assert

            Assert.NotNull(result);
            Assert.Equal(result.Quantity, movimentationOutput.Quantity);
            Assert.Equal(result.Product, movimentationOutput.Product);
            Assert.Equal(result.User, movimentationOutput.User);
        }
        public async Task <MovimentationOutputModel> AddMovimentation(MovimentationInputModel movimentationModel, CancellationToken cancellationToken)
        {
            var movimentation = mapper.Map <Movimentation>(movimentationModel);

            movimentation.Product = await productRepository.Get(e => e.Id.Equals(movimentationModel.ProductId), cancellationToken);

            movimentation.User = await userRepository.Get(e => e.Id.Equals(movimentationModel.UserId), cancellationToken);

            await inventoryService.UpdateInventory(movimentationModel, cancellationToken);

            var result = await movimentationRepository.Add(movimentation, cancellationToken);

            return(mapper.Map <MovimentationOutputModel>(result));
        }
        public async Task UpdateInventory(MovimentationInputModel movimentationModel, CancellationToken cancellationToken)
        {
            var quantity  = 0;
            var inventory = await inventoryRepository.Get(e => e.Product.Id.Equals(movimentationModel.ProductId), cancellationToken)
                            ?? throw new NotFoundException("Não foi possível encontrar o estoque do produto informado!");

            if (movimentationModel.Type.Equals(MovimentationType.Buy))
            {
                quantity = inventory.Quantity + movimentationModel.Quantity;
            }
            else
            {
                quantity = inventory.Quantity - movimentationModel.Quantity;
            }

            inventory.ChangeQuantity(quantity);

            await inventoryRepository.Update(inventory, cancellationToken);
        }