def test_processar_dados_de_pagamento_define_dados_pagamento(
         self, cria_pedido_mock):
     entregador = servicos.EntregaPagamento(1234, dados={'passo': 'pre'})
     entregador.servico = mock.MagicMock()
     entregador.configuracao = mock.MagicMock(loja_id=8)
     entregador.pedido = mock.MagicMock(
         numero=123,
         valor_total=15.70,
         conteudo_json={'mptransparente': {
             'valor_parcela': 15.7
         }})
     entregador.malote = mock.MagicMock(transaction_amount=15.70,
                                        payment_method_id='visa')
     entregador.resposta = mock.MagicMock(sucesso=True,
                                          requisicao_invalida=False,
                                          conteudo={
                                              'status': 'approved',
                                              'status_detail': 'accredited',
                                              'id': 'transacao-id',
                                              'transaction_amount': 123.45,
                                              'payment_method_id': 'visa'
                                          })
     cria_pedido_mock.return_value = mock.MagicMock(situacao_id=9)
     entregador.processa_dados_pagamento()
     cria_pedido_mock.assert_called_with('Pedido', numero=123, loja_id=8)
     entregador.dados_pagamento.should.be.equal({
         'conteudo_json': {
             'bandeira': 'visa',
             'mensagem_retorno': u'Seu pagamento foi aprovado com sucesso.',
             'numero_parcelas': 1,
             'valor_parcela': 15.7
         },
         'transacao_id': 'transacao-id',
         'valor_pago': 15.7
     })
 def test_deve_definir_credenciais(self, credenciador_mock):
     entregador = servicos.EntregaPagamento(1234, dados={'passo': 'pre'})
     credenciador_mock.return_value = 'credenciador'
     entregador.configuracao = 'configuracao'
     entregador.define_credenciais()
     entregador.conexao.credenciador.should.be.equal('credenciador')
     credenciador_mock.assert_called_with(configuracao='configuracao')
 def test_deve_reenviar_pagamento_se_tentativa_eh_um(self):
     entregador = servicos.EntregaPagamento(1234)
     entregador.malote = mock.MagicMock()
     entregador.malote.to_dict.return_value = {
         'zas': 'malote-como-dicionario'
     }
     entregador.conexao = mock.MagicMock()
     entregador.pedido = mock.MagicMock(situacao_id=None)
     entregador.dados = {'next_url': 'zas'}
     resposta_not_autorized = mock.MagicMock(
         nao_autorizado=True,
         nao_autenticado=False,
         conteudo={'message': 'invalid_token'})
     resposta_ok = mock.MagicMock(sucesso=True,
                                  nao_autorizado=False,
                                  nao_autenticado=False,
                                  conteudo={})
     entregador.conexao.post.side_effect = [
         resposta_not_autorized, resposta_ok
     ]
     entregador.envia_pagamento()
     entregador.dados_enviados.should.be.equal({
         'tentativa':
         2,
         'zas':
         'malote-como-dicionario'
     })
 def test_enviar_pagamento_dispara_erro_pedido_ja_realizado_e_pago(self):
     entregador = servicos.EntregaPagamento(8, dados={})
     entregador.pedido = mock.MagicMock(numero=1234, situacao_id=4)
     entregador.envia_pagamento.when.called_with().should.throw(
         entregador.PedidoJaRealizado,
         u'Já foi realizado um pedido com o número 1234 e ele está como Pedido Pago.\nSeu pagamento já está pago e estamos processando o envio'
     )
 def test_processar_dados_de_pagamento_dispara_erro_sem_ser_parameter(self):
     entregador = servicos.EntregaPagamento(8, dados={'passo': 'pre'})
     entregador.malote = mock.MagicMock()
     entregador.malote.to_dict.return_value = {
         'card_hash': None,
         'capture': 'false',
         'transaction_amount': 2900,
         'installments': 1,
         'payment_method': 'credit_card'
     }
     entregador.pedido = mock.MagicMock(numero=1234)
     entregador.resposta = mock.MagicMock(
         sucesso=False,
         requisicao_invalida=True,
         conteudo={
             u'url':
             u'/transactions',
             u'errors': [{
                 u'message': u'Nome do portador do cartão está faltando',
                 u'type': u'whatever'
             }, {
                 u'message': u'Data de expiração do cartão está faltando',
                 u'type': u'whatever'
             }],
             u'method':
             u'post'
         })
     entregador.processa_dados_pagamento.when.called_with().should.throw(
         entregador.EnvioNaoRealizado,
         u'Dados inválidos enviados ao MercadoPago')
 def test_enviar_pagamento_dispara_erro_pedido_ja_realizado_e_cancelado(
         self):
     entregador = servicos.EntregaPagamento(8, dados={})
     entregador.pedido = mock.MagicMock(numero=1234, situacao_id=8)
     entregador.envia_pagamento.when.called_with().should.throw(
         entregador.PedidoJaRealizado,
         u'Já foi realizado um pedido com o número 1234 e ele está como Pedido Cancelado.\nSeu pedido foi cancelado e não pode ser mais usado. Você precisa fazer um novo pedido na loja.'
     )
 def test_deve_definir_configuracao_e_pedido_de_servico(self, define_mock):
     entregador = servicos.EntregaPagamento(1234, dados={'passo': 'pre'})
     entregador.configuracao = 'configuracao'
     entregador.pedido = 'pedido'
     entregador.define_pedido_e_configuracao(1234)
     define_mock.assert_called_with(1234)
     entregador.configuracao.should.be.equal('configuracao')
     entregador.pedido.should.be.equal('pedido')
 def test_deve_usar_post_ao_enviar_pagamento(self):
     entregador = servicos.EntregaPagamento(1234, dados={'passo': 'pre'})
     entregador.malote = mock.MagicMock()
     entregador.malote.to_dict.return_value = {
         'zas': 'malote-como-dicionario'
     }
     entregador.conexao = mock.MagicMock()
     entregador.pedido = mock.MagicMock(situacao_id=None)
     entregador.envia_pagamento()
     entregador.conexao.post.assert_called_with(
         entregador.url, {'zas': 'malote-como-dicionario'})
 def test_deve_nao_reenviar_pagamento_se_tentativa_eh_dois(self):
     entregador = servicos.EntregaPagamento(1234)
     entregador.malote = mock.MagicMock()
     entregador.malote.to_dict.return_value = {
         'zas': 'malote-como-dicionario'
     }
     entregador.conexao = mock.MagicMock()
     entregador.pedido = mock.MagicMock(situacao_id=None)
     entregador.dados = {'next_url': 'zas'}
     resposta_mock = mock.MagicMock(nao_autorizado=True,
                                    nao_autenticado=False,
                                    conteudo={'message': 'invalid_token'})
     entregador.conexao.post.return_value = resposta_mock
     entregador.envia_pagamento.when.called_with(
         tentativa=2).should_not.throw(entregador.EnvioNaoRealizado)
 def test_processar_dados_de_pagamento_retorna_se_notificacao_jah_atualizou(
         self, cria_pedido_mock):
     entregador = servicos.EntregaPagamento(1234, dados={'passo': 'pre'})
     entregador.servico = mock.MagicMock()
     entregador.configuracao = mock.MagicMock(loja_id=8)
     entregador.pedido = mock.MagicMock(numero=123)
     cria_pedido_mock.return_value = mock.MagicMock(situacao_id=4)
     entregador.processa_dados_pagamento()
     cria_pedido_mock.assert_called_with('Pedido', numero=123, loja_id=8)
     entregador.dados_pagamento.should.be.none
     entregador.resultado.should.be.equal({
         'fatal':
         False,
         'mensagem':
         '',
         'resultado':
         'alterado_por_notificacao'
     })
 def test_deve_enviar_pagamento_se_der_erro_de_token(self):
     entregador = servicos.EntregaPagamento(1234)
     entregador.malote = mock.MagicMock()
     entregador.malote.to_dict.return_value = {
         'zas': 'malote-como-dicionario'
     }
     entregador.conexao = mock.MagicMock()
     entregador.pedido = mock.MagicMock(situacao_id=None)
     entregador.dados = {'next_url': 'zas'}
     resposta_bad = mock.MagicMock(nao_autorizado=False,
                                   nao_autenticado=False,
                                   sucesso=False,
                                   requisicao_invalida=True,
                                   conteudo={
                                       "status":
                                       400,
                                       "message":
                                       "Invalid card token",
                                       "cause": [{
                                           "code":
                                           2062,
                                           "data":
                                           None,
                                           "description":
                                           "Invalid card token"
                                       }],
                                       "error":
                                       "bad_request"
                                   })
     resposta_ok = mock.MagicMock(sucesso=True,
                                  requisicao_invalida=False,
                                  nao_autorizado=False,
                                  nao_autenticado=False,
                                  conteudo={"status": 200})
     entregador.conexao.post.side_effect = [resposta_bad, resposta_ok]
     entregador.envia_pagamento()
     entregador.dados_enviados.should.be.equal({
         'tentativa':
         2,
         'zas':
         'malote-como-dicionario'
     })
 def test_deve_enviar_pagamento_se_pedido_esta_efetuado(self):
     entregador = servicos.EntregaPagamento(1234)
     entregador.malote = mock.MagicMock()
     entregador.malote.to_dict.return_value = {
         'zas': 'malote-como-dicionario'
     }
     entregador.conexao = mock.MagicMock()
     entregador.pedido = mock.MagicMock(numero=1234, situacao_id=9)
     entregador.dados = {'next_url': 'zas'}
     resposta_mock = mock.MagicMock(nao_autorizado=False,
                                    nao_autenticado=False)
     entregador.conexao.post.return_value = resposta_mock
     entregador.envia_pagamento()
     entregador.dados_enviados.should.be.equal({
         'tentativa':
         1,
         'zas':
         'malote-como-dicionario'
     })
     entregador.resposta.should.be.equal(resposta_mock)
 def test_processar_dados_de_pagamento_define_identificador_id(self):
     entregador = servicos.EntregaPagamento(1234, dados={'passo': 'pre'})
     entregador.configuracao = mock.MagicMock(aplicacao='test')
     entregador.pedido = mock.MagicMock(
         numero=123,
         valor_total=15.70,
         conteudo_json={'mptransparente': {
             'valor_parcela': 15.7
         }})
     entregador.malote = mock.MagicMock(transaction_amount=15.70,
                                        payment_method_id='visa')
     entregador.servico = mock.MagicMock()
     entregador.resposta = mock.MagicMock(sucesso=True,
                                          requisicao_invalida=False,
                                          conteudo={
                                              'status': 'approved',
                                              'status_detail': 'accredited',
                                              'id': 'transacao-id',
                                              'transaction_amount': 123.45,
                                              'payment_method_id': 'visa'
                                          })
     entregador.processa_dados_pagamento()
     entregador.identificacao_pagamento.should.be.equal('transacao-id')
 def test_deve_dizer_que_tem_malote(self):
     entregador = servicos.EntregaPagamento(1234, dados={'passo': 'pre'})
     entregador.tem_malote.should.be.truthy
 def test_deve_montar_conexao(self, obter_mock):
     conexao = mock.MagicMock()
     obter_mock.return_value = conexao
     entregador = servicos.EntregaPagamento(1234, dados={'passo': 'pre'})
     entregador.conexao.should.be.equal(conexao)
     obter_mock.assert_called_with()
 def test_deve_definir_url(self):
     entregador = servicos.EntregaPagamento(1234, dados={'passo': 'pre'})
     entregador.url.should.be.equal(
         'https://api.mercadopago.com/v1/payments')
 def test_deve_definir_resposta(self):
     entregador = servicos.EntregaPagamento(1234, dados={'passo': 'pre'})
     entregador.resposta.should.be.none
 def test_deve_dizer_que_faz_http(self):
     entregador = servicos.EntregaPagamento(1234, dados={'passo': 'pre'})
     entregador.faz_http.should.be.truthy