Esempio n. 1
0
        public async Task Webhook_AoCriarumPedidoComClienteNaoAutenticado_RetornarSucesso()
        {
            // Arrange
            var pedidoId = Guid.NewGuid();
            var command  = new WebhookPagamentoCommand(pedidoId, PagamentoStatus.Aprovado);

            var pedido    = Pedido.Criar(pedidoId, 999);
            var pagamento = PedidoPagamento.Criar(pedido, "4242424242424242", DateTime.Now.AddDays(1), 123);

            pedido.AdicionarPagamento(pagamento);
            pedido.AtualizarStatus(PedidoStatus.ProcessandoPagamento);

            //Obter pedido
            _mocker.GetMock <IUnitOfWork>()
            .Setup(p => p.Pedidos.ObterPorIdAsync(pedido.Id))
            .Returns(Task.FromResult(pedido));

            //Obter EventBus
            _mocker.GetMock <IEventBus>()
            .Setup(p => p.Publish(It.IsAny <string>(), It.IsAny <Event>(), It.IsAny <string>()))
            .Returns(Task.CompletedTask);

            // Act
            var responseResult = await _handler.Handle(command, CancellationToken.None);

            // Assert
            Assert.False(responseResult.HasFails);
            _mocker.GetMock <IUnitOfWork>().Verify(o => o.SaveAsync(), Times.Once);
        }
        public async Task <ResponseResult> Handle(CriarPagamentoCommand request, CancellationToken cancellationToken)
        {
            request.Validate();
            if (request.Notifications.Any())
            {
                _response.AddNotifications(request.Notifications);
                return(_response);
            }

            var pedido = await _unitOfWork.Pedidos.ObterPorIdAsync(request.PedidoId);

            if (pedido == null)
            {
                _response.AddNotification(new Notification("pagamento", Erros.ErroPedido_NaoEncontrado));
                return(_response);
            }

            if (pedido.Status != PedidoStatus.AguardandoPagamento)
            {
                _response.AddNotification(new Notification("pagamento", Erros.ErroPedido_PedidoNaoEstaAguardandoPgto));
                return(_response);
            }


            var pagamento = PedidoPagamento.Criar(
                pedido,
                request.NumeroCartao,
                request.VencimentoCartao,
                request.CodigoSeguranca);

            if (!pagamento.ValidarCartao())
            {
                _response.AddNotification(new Notification("pagamento", Erros.ErroPagamento_CartaoInvalido));
                return(_response);
            }


            /******************/
            /******************/
            /* MOCK - Gateway de Pagamento*/
            var token = await _gatewayPagamento.EnviarParaPagamento(pedido);

            pagamento.AdicionarToken(token);
            /******************/


            pedido.AdicionarPagamento(pagamento);
            pedido.AtualizarStatus(PedidoStatus.ProcessandoPagamento);

            //publica o evento para o bus
            await _eventBus.Publish("pedido-atualizado-event", new PedidoAtualizadoEvent(pedido.Id, pedido.Status), pedido.Id.ToString());

            await _unitOfWork.Pedidos.AdicionarPagamentoAsync(pagamento);

            await _unitOfWork.SaveAsync();

            return(_response);
        }
        public async Task Pagamento_AoCriarumPagamentoComComandoValido_RetornarSucesso()
        {
            // Arrange
            var pedidoId = Guid.NewGuid();
            var command  = new CriarPagamentoCommand("4242424242424242", DateTime.Now.AddDays(1), 123);

            command.MarcarPedidoId(pedidoId);

            var pedido    = Pedido.Criar(pedidoId, 999);
            var pagamento = PedidoPagamento.Criar(pedido, "4242424242424242", DateTime.Now.AddDays(1), 123);

            pedido.AdicionarPagamento(pagamento);
            pedido.AtualizarStatus(PedidoStatus.AguardandoPagamento);

            //Obter pedido
            _mocker.GetMock <IUnitOfWork>()
            .Setup(p => p.Pedidos.ObterPorIdAsync(pedido.Id))
            .Returns(Task.FromResult(pedido));

            //Obter Gateway
            _mocker.GetMock <IGatewayPagamento>()
            .Setup(p => p.EnviarParaPagamento(It.IsAny <Pedido>()))
            .Returns(Task.FromResult("token"));

            //Obter EventBus
            _mocker.GetMock <IEventBus>()
            .Setup(p => p.Publish(It.IsAny <Event>()))
            .Returns(Task.CompletedTask);

            //adicionar pagamento pedido
            _mocker.GetMock <IUnitOfWork>()
            .Setup(p => p.Pedidos.AdicionarPagamentoAsync(pagamento))
            .Returns(Task.CompletedTask);

            //Salvar operação
            _mocker.GetMock <IUnitOfWork>()
            .Setup(p => p.SaveAsync())
            .Returns(Task.CompletedTask);



            // Act
            var responseResult = await _handler.Handle(command, CancellationToken.None);

            // Assert
            Assert.False(responseResult.HasFails);
            _mocker.GetMock <IUnitOfWork>().Verify(o => o.SaveAsync(), Times.Once);
        }