public void PurchaseService_AddItemAsync_DeveAdicionarOsItensQuandoEmEstadoValido()
        {
            // Arange
            int totalItens = 5;

            Purchase             purchase      = PurchaseFaker.GenerateFaker().Generate();
            IList <PurchaseItem> purchaseItens = PurchaseItemFaker.GenerateFaker(purchase).Generate(totalItens);

            ConfigureMock();

            FactoryService();

            // Act
            foreach (PurchaseItem purchaseItem in purchaseItens)
            {
                _purchaseService.AddItemAsync(purchase, purchaseItem);
            }

            // Assert
            purchase.Items.Should().HaveCount(totalItens);
            purchase.TotalValue.Should().Be(purchaseItens.Sum(x => x.CalculteValue()));
            _purchaseRepositoryMock.Verify(x => x.Update(It.IsAny <Purchase>()), Times.Exactly(totalItens));
            _unitOfWork.Verify(x => x.CommitAsync(), Times.Exactly(totalItens));
            _busHandlerMock.Verify(x => x.PublishDomainEvent(It.IsAny <PurchaseItemAdded>()), Times.Exactly(totalItens));
        }
        public async Task <ApplicationDataResult <PurchaseItemDto> > AddItemAsync(Guid purchaseId,
                                                                                  AddOrUpdatePurchaseItemDto data)
        {
            ValidationResult validationResult = await _validatorPurchaseItem.ValidateAsync(data);

            if (validationResult.IsValid is false)
            {
                return(FactoryFromValidationResult <PurchaseItemDto>(validationResult));
            }

            Purchase purchase = await _purchaseRepository.FindAsync(purchaseId);

            if (purchase is null)
            {
                throw ExceptionsFactory.FactoryNotFoundException <Purchase>(purchaseId);
            }

            Product product = await _productRepository.FindAsync(data.ProductId);

            if (product is null)
            {
                throw ExceptionsFactory.FactoryNotFoundException <Product>(purchaseId);
            }

            PurchaseItem purchaseItem = new(data.Amount, data.Value, purchase, product);

            await _purchaseService.AddItemAsync(purchase, purchaseItem);

            return(FactoryResultFromData(_mapper.Map <PurchaseItemDto>(purchaseItem)));
        }