示例#1
0
        public async Task Deve_notificar_servico_de_pagamento_sobre_atualizacao_do_cartao_de_credito()
        {
            var          idDoPedido = _faker.Random.Int(0);
            const string expiracaoDoCartaoDeCredito  = "02/27";
            var          nomeDoDonoDoCartao          = _faker.Person.FirstName;
            var          numeroDoNovoCartaoDeCredito = _faker.Random.Int(0).ToString();
            var          cvvDoNovoCartao             = _faker.Random.Int(100, 999).ToString();
            var          cartaoDeCreditoDto          = new CartaoDeCreditoDto
            {
                Expiracao = expiracaoDoCartaoDeCredito,
                Nome      = nomeDoDonoDoCartao,
                CVV       = cvvDoNovoCartao,
                Numero    = numeroDoNovoCartaoDeCredito
            };
            var pedido = PedidoBuilder.Novo().Criar();

            _pedidoRepositorio.Setup(pr => pr.ObterPedidoPeloId(idDoPedido)).Returns(pedido);
            _pedidoRepositorio.Setup(pr => pr.Adicionar(It.IsAny <Pedido>()));

            await _atualizacaoDePedido.AtualizarCartaoDeCredito(idDoPedido, cartaoDeCreditoDto);

            _mensageria.Verify(m => m.PublishAsync(
                                   It.Is <AlterouCartaoDeCreditoDoPedidoEvento>(a
                                                                                => a.IdDoPedido == pedido.Id && a.NomeDoUsuario == nomeDoDonoDoCartao && a.NumeroDoCartao == numeroDoNovoCartaoDeCredito)));
        }
示例#2
0
        public async Task Deve_salvar_um_evento_de_pedido_criado_ao_criar_pedido()
        {
            var produto            = _faker.Random.Word();
            var quantidade         = _faker.Random.Int(0);
            var valor              = _faker.Random.Decimal();
            var cartaoDeCreditoDto = new CartaoDeCreditoDto
            {
                Numero    = _faker.Random.Int(0).ToString(),
                Nome      = _faker.Person.FirstName,
                CVV       = _faker.Random.Int(100, 999).ToString(),
                Expiracao = "03/27"
            };
            var cartaoDeCredito = MapeadorDeCartaoDeCredito.Mapear(cartaoDeCreditoDto);
            var pedidoDto       = new PedidoDto
            {
                Produto            = produto,
                Quantidade         = quantidade,
                Valor              = valor,
                CartaoDeCreditoDto = cartaoDeCreditoDto
            };
            var pedidoCriado = PedidoBuilder.Novo().ComProduto(produto).ComQuantidade(quantidade).ComValor(valor)
                               .ComCartaoDeCredito(cartaoDeCredito).Criar();
            var eventoEsperado = new PedidoCriadoEvento(pedidoCriado.Id, pedidoCriado.CartaoDeCredito.Nome,
                                                        pedidoCriado.CartaoDeCredito.Numero, pedidoCriado.Produto, pedidoCriado.Valor);

            await _criacaoDePedido.Criar(pedidoDto);

            _eventoRepositorio.Verify(pr => pr.Salvar(It.Is <PedidoCriadoEvento>(evento
                                                                                 => evento.ToExpectedObject(ctx => ctx.Ignore(p => p.Id)).Matches(eventoEsperado))));
        }
示例#3
0
        public async Task Deve_salvar_evento_de_alteracao_de_cartao_de_credito_do_pedido()
        {
            var          idDoPedido = _faker.Random.Int(0);
            const string expiracaoDoCartaoDeCredito  = "01/27";
            var          nomeDoDonoDoCartao          = _faker.Person.FirstName;
            var          numeroDoNovoCartaoDeCredito = _faker.Random.Int(0).ToString();
            var          cvvDoNovoCartao             = _faker.Random.Int(100, 999).ToString();
            var          cartaoDeCreditoDto          = new CartaoDeCreditoDto
            {
                Expiracao = expiracaoDoCartaoDeCredito,
                Nome      = nomeDoDonoDoCartao,
                CVV       = cvvDoNovoCartao,
                Numero    = numeroDoNovoCartaoDeCredito
            };
            var pedido = PedidoBuilder.Novo().Criar();

            _pedidoRepositorio.Setup(pr => pr.ObterPedidoPeloId(idDoPedido)).Returns(pedido);
            _pedidoRepositorio.Setup(pr => pr.Adicionar(It.IsAny <Pedido>()));


            await _atualizacaoDePedido.AtualizarCartaoDeCredito(idDoPedido, cartaoDeCreditoDto);

            _eventoRepositorio.Verify(er
                                      => er.Salvar(It.Is <AlterouCartaoDeCreditoDoPedidoEvento>(e
                                                                                                => e.IdDoPedido == pedido.Id && e.NomeDoUsuario == nomeDoDonoDoCartao && e.NumeroDoCartao == numeroDoNovoCartaoDeCredito)));
        }
示例#4
0
        public void Deve_realizar_uma_busca_nos_lotes_pelo_nome_da_cerveja()
        {
            var primeiroPedido         = PedidoBuilder.Novo().Criar();
            var cervejaDoSegundoPedido = CervejaBuilder.Novo().ComNome("Budweiser").ComPreco(6.75).Criar();
            var segundoPedido          = PedidoBuilder.Novo().ComCerveja(cervejaDoSegundoPedido).Criar();

            _pedidos.Add(primeiroPedido);
            _pedidos.Add(segundoPedido);
            var comanda = ComandaBuilder.Novo().ComPedidos(_pedidos).Criar();
            var lotesQueContemPrimeiraCerveja = new List <Lote>()
            {
                new Lote(primeiroPedido.Cerveja, 7),
                new Lote(primeiroPedido.Cerveja, 3)
            };
            var lotesQueContemSegundaCerveja = new List <Lote>()
            {
                new Lote(segundoPedido.Cerveja, 7),
                new Lote(segundoPedido.Cerveja, 3)
            };

            _repositorioDeLotes.Setup(repositorio => repositorio.ObterLotesPeloNomeDaCerveja(primeiroPedido.Cerveja.Nome))
            .Returns(lotesQueContemPrimeiraCerveja);
            _repositorioDeLotes.Setup(repositorio => repositorio.ObterLotesPeloNomeDaCerveja(segundoPedido.Cerveja.Nome))
            .Returns(lotesQueContemSegundaCerveja);

            _realizacaoDaVenda.Vender(comanda);

            _repositorioDeLotes.Verify(repositorio =>
                                       repositorio.ObterLotesPeloNomeDaCerveja(It.Is <string>(nomeDaCerveja => nomeDaCerveja == primeiroPedido.Cerveja.Nome)));
            _repositorioDeLotes.Verify(repositorio =>
                                       repositorio.ObterLotesPeloNomeDaCerveja(It.Is <string>(nomeDaCerveja => nomeDaCerveja == segundoPedido.Cerveja.Nome)));
        }
示例#5
0
        public void Deve_mapear_pedido()
        {
            var produto            = _faker.Random.Word();
            var quantidade         = _faker.Random.Int(0);
            var valor              = _faker.Random.Decimal();
            var cartaoDeCreditoDto = new CartaoDeCreditoDto
            {
                Numero    = _faker.Random.Int(0).ToString(),
                Nome      = _faker.Person.FirstName,
                CVV       = _faker.Random.Int(100, 999).ToString(),
                Expiracao = "03/27"
            };
            var cartaoDeCredito = MapeadorDeCartaoDeCredito.Mapear(cartaoDeCreditoDto);
            var pedidoDto       = new PedidoDto
            {
                Produto            = produto,
                Quantidade         = quantidade,
                Valor              = valor,
                CartaoDeCreditoDto = cartaoDeCreditoDto
            };
            var pedidoEsperado = PedidoBuilder.Novo().ComProduto(produto).ComQuantidade(quantidade).ComValor(valor)
                                 .ComCartaoDeCredito(cartaoDeCredito).Criar();

            var pedidoObtido = MapeadorDePedido.Mapear(pedidoDto);

            pedidoEsperado.ToExpectedObject(ctx => ctx.Ignore(p => p.Id)).ShouldMatch(pedidoObtido);
        }
示例#6
0
        public void Deve_aprovar_pagamento_do_pedido()
        {
            var pedido = PedidoBuilder.Novo().Criar();

            pedido.AprovarPagamento();

            Assert.Equal(SituacaoDoPedido.PagamentoAprovado, pedido.Situacao);
        }
示例#7
0
        public void Nao_deve_permitir_quantidade_invalida()
        {
            const int quantidadeInvalida = -6;

            Action acao = () => PedidoBuilder.Novo().ComQuantidade(quantidadeInvalida).Criar();

            Assert.Throws <ExcecaoDeDominio>(acao).ComMensagem(Resource.QuantidadeInvalida);
        }
示例#8
0
        public void Nao_deve_alterar_para_uma_quantidade_invalida()
        {
            const int quantidadeInvalida = -6;
            var       pedido             = PedidoBuilder.Novo().Criar();

            Action acao = () => pedido.AlterarQuantidade(quantidadeInvalida);

            Assert.Throws <ExcecaoDeDominio>(acao).ComMensagem(Resource.QuantidadeInvalida);
        }
示例#9
0
        public void Deve_alterar_a_quantidade()
        {
            const int quantidadeEsperada = 5;
            var       pedido             = PedidoBuilder.Novo().Criar();

            pedido.AlterarQuantidade(quantidadeEsperada);

            Assert.Equal(quantidadeEsperada, pedido.Quantidade);
        }
示例#10
0
        public void Nao_deve_realizar_uma_venda_caso_nao_tenha_quantidade_necessaria()
        {
            var pedido = PedidoBuilder.Novo().ComQuantidade(6).Criar();

            _lotes.Add(new Lote(pedido.Cerveja, 2));
            _lotes.Add(new Lote(pedido.Cerveja, 3));
            _repositorioDeLotes.Setup(repositorio => repositorio.ObterLotesPeloNomeDaCerveja(pedido.Cerveja.Nome))
            .Returns(_lotes);

            Action acao = () => _realizacaoDaVenda.ValidarVenda(_lotes, pedido);

            Assert.Throws <ExcecaoDeDominio>(acao).ComMensagem(Resource.QuantidadeIndisponivel);
        }
示例#11
0
        public void Deve_atualizar_o_lote_com_a_nova_quantidade_no_repositorio()
        {
            var pedido = PedidoBuilder.Novo().ComQuantidade(7).Criar();

            _pedidos.Add(pedido);
            var comanda      = ComandaBuilder.Novo().ComPedidos(_pedidos).Criar();
            var primeiroLote = new Lote(pedido.Cerveja, 8);

            _lotes.Add(primeiroLote);
            _repositorioDeLotes.Setup(repositorio => repositorio.ObterLotesPeloNomeDaCerveja(pedido.Cerveja.Nome))
            .Returns(_lotes);

            _realizacaoDaVenda.Vender(comanda);

            _repositorioDeLotes.Verify(repositorio => repositorio.AtualizarQuantidade
                                           (It.Is <string>(loteId => loteId == primeiroLote.Identificador),
                                           It.Is <int>(loteQuantidade => loteQuantidade == primeiroLote.Quantidade)));
        }
示例#12
0
        public void Deve_diminuir_quantidade_do_lote_caso_o_do_pedido_for_menor()
        {
            const int quantidadeEsperada = 1;
            var       pedido             = PedidoBuilder.Novo().ComQuantidade(7).Criar();

            _pedidos.Add(pedido);
            var primeiroLote = new Lote(pedido.Cerveja, 8);

            _lotes.Add(primeiroLote);
            var comanda = ComandaBuilder.Novo().ComPedidos(_pedidos).Criar();

            _repositorioDeLotes.Setup(repositorio => repositorio.ObterLotesPeloNomeDaCerveja(pedido.Cerveja.Nome))
            .Returns(_lotes);

            _realizacaoDaVenda.Vender(comanda);

            Assert.Equal(quantidadeEsperada, primeiroLote.Quantidade);
        }
示例#13
0
        public async Task Deve_salvar_evennto_de_pagamentorecusado_ao_negar_pagamento()
        {
            var idDoPedido                  = _faker.Random.Int(0);
            var nomeDoDonoDoCartao          = _faker.Person.FirstName;
            var numeroDoNovoCartaoDeCredito = _faker.Random.Int(0).ToString();
            var produto = _faker.Random.Word();
            var valor   = _faker.Random.Decimal();
            var pedido  = PedidoBuilder.Novo().Criar();
            var pagamentoRecusadoEvento = new PagamentoRecusadoEvento(idDoPedido, nomeDoDonoDoCartao, numeroDoNovoCartaoDeCredito, produto, valor);

            _pedidoRepositorio.Setup(pr => pr.ObterPedidoPeloId(idDoPedido)).Returns(pedido);
            _pedidoRepositorio.Setup(pr => pr.AtualizarPedido(It.IsAny <Pedido>()));
            _eventoRepositorio.Setup(er => er.Salvar(It.IsAny <PagamentoRecusadoEvento>()));

            await _atualizacaoDePedido.NegarPagamento(pagamentoRecusadoEvento);

            _eventoRepositorio.Verify(er => er.Salvar(It.Is <PagamentoRecusadoEvento>(
                                                          evento => evento.ToExpectedObject().Matches(pagamentoRecusadoEvento))));
        }
示例#14
0
        public async Task Deve_aprovar_pagamento()
        {
            var idDoPedido                  = _faker.Random.Int(0);
            var nomeDoDonoDoCartao          = _faker.Person.FirstName;
            var numeroDoNovoCartaoDeCredito = _faker.Random.Int(0).ToString();
            var produto = _faker.Random.Word();
            var valor   = _faker.Random.Decimal();
            var pedido  = PedidoBuilder.Novo().Criar();
            var pagamentoAprovadoEvento = new PagamentoAprovadoEvento(idDoPedido, nomeDoDonoDoCartao, numeroDoNovoCartaoDeCredito, produto, valor);

            _pedidoRepositorio.Setup(pr => pr.ObterPedidoPeloId(idDoPedido)).Returns(pedido);
            _pedidoRepositorio.Setup(pr => pr.AtualizarPedido(It.IsAny <Pedido>()));
            _eventoRepositorio.Setup(er => er.Salvar(It.IsAny <PagamentoAprovadoEvento>()));

            await _atualizacaoDePedido.AprovarPagamento(pagamentoAprovadoEvento);

            _pedidoRepositorio.Verify(pr => pr.AtualizarPedido(It.Is <Pedido>(
                                                                   p => p.Id == pedido.Id && p.Situacao == SituacaoDoPedido.PagamentoAprovado)));
        }
示例#15
0
        public void Deve_excluir_lote_caso_a_quantidade_do_pedido_for_maior()
        {
            var pedido = PedidoBuilder.Novo().ComQuantidade(10).Criar();

            _pedidos.Add(pedido);
            var comanda      = ComandaBuilder.Novo().ComPedidos(_pedidos).Criar();
            var primeiroLote = new Lote(pedido.Cerveja, 5);
            var segundoLote  = new Lote(pedido.Cerveja, 3);
            var terceiroLote = new Lote(pedido.Cerveja, 4);

            _lotes.Add(primeiroLote);
            _lotes.Add(segundoLote);
            _lotes.Add(terceiroLote);
            _repositorioDeLotes.Setup(repositorio => repositorio.ObterLotesPeloNomeDaCerveja(pedido.Cerveja.Nome))
            .Returns(_lotes);

            _realizacaoDaVenda.Vender(comanda);

            _repositorioDeLotes.Verify(repositorio => repositorio.Excluir(It.Is <Lote>(lote => lote == primeiroLote)));
            _repositorioDeLotes.Verify(repositorio => repositorio.Excluir(It.Is <Lote>(lote => lote == segundoLote)));
        }
示例#16
0
        public void Simular_alteracao_do_cartao_de_credito()
        {
            const int idDoPedido         = 5;
            var       cartaoDeCreditoDto = new CartaoDeCreditoDto
            {
                CVV       = "788",
                Expiracao = "03/28",
                Nome      = _nomeDoNovoDonoDoCartaoDeCredito,
                Numero    = _novoNumeroDoCartaoDeCredito
            };
            var cartaoDeCredito     = CartaoDeCreditoBuilder.Novo().ComNumero(_antigoNumeroDoCartaoDeCredito).ComNome(_nomeDoAntigoDonoDoCartaoDeCredito).Criar();
            var pedido              = PedidoBuilder.Novo().ComCartaoDeCredito(cartaoDeCredito).Criar();
            var pedidoRepositorio   = new Mock <IPedidoRepositorio>();
            var eventoRepositorio   = new Mock <IEventoRepositorio>();
            var mensageria          = new Mock <IBus>();
            var atualizacaoDePedido = new AtualizacaoDePedido(pedidoRepositorio.Object, eventoRepositorio.Object, mensageria.Object);

            pedidoRepositorio.Setup(pr => pr.ObterPedidoPeloId(It.IsAny <int>())).Returns(pedido);
            pedidoRepositorio.Setup(pr => pr.Adicionar(It.IsAny <Pedido>()));

            atualizacaoDePedido.AtualizarCartaoDeCredito(idDoPedido, cartaoDeCreditoDto);
        }