def test_repr(self): comercial = Comercial( numero=1006993069, chave= '25fbb99741c739dd84d7b06ec78c9bac718838630f30b112d033ce2e621b34f3') cartao = Cartao(numero=4012001037141112, validade=201805, indicador=1, codigo_seguranca=123, nome_portador='Fulano Silva') pedido = Pedido(numero='1234', valor=10000, moeda=986, data_hora='2016-03-05T05:01:30.738727') pagamento = Pagamento(bandeira='visa', produto='1', parcelas=1) transacao = Transacao(comercial=comercial, cartao=cartao, pedido=pedido, pagamento=pagamento, autorizar=3, capturar=True) self.assertEqual( repr(transacao), '<Transacao(comercial=<Comercial(numero=1006993069, chave=25fbb99741c739dd84d7b06ec78c9bac718838630f30b112d033ce2e621b34f3)>, cartao=<Cartao(numero=4012001037141112, validade=201805, indicador=1, codigo_seguranca=123, nome_portador=Fulano Silva, token=None)>, pedido=<Pedido(numero=1234, valor=10000, moeda=986, data_hora=2016-03-05T05:01:30.738727, descricao=None, idioma=PT, taxa_embarque=None, soft_descriptor=None)>, pagamento=<Pagamento(bandeira=visa, produto=1, parcelas=1)>, url_retorno=None, autorizar=3, capturar=True, campo_livre=None, bin=None, gerar_token=None, avs=None, autenticacao=None, autorizacao=None, captura=None, token=None, cancelamento=None, tid=None, pan=None, status=None, url_autenticacao=None)>' )
def test_autorizar_com_erro(self): transacao = Transacao(comercial=self.comercial, cartao=self.cartao, pedido=self.pedido, pagamento=self.pagamento, autorizar=3, capturar=True) with pytest.raises(CieloRequestError) as excinfo: self.request.autorizar(transacao) assert '000 - Mensagem' in str(excinfo.value)
def test_autorizar(self): with pytest.raises(TypeError) as excinfo: self.request.autorizar('transacao') assert 'transacao precisa ser do tipo Transacao.' in str(excinfo.value) transacao = Transacao(comercial=self.comercial, cartao=self.cartao, pedido=self.pedido, pagamento=self.pagamento, autorizar=3, capturar=True) transacao = self.request.autorizar(transacao=transacao) self.assertTrue(isinstance(transacao, Transacao)) self.assertEqual(transacao.tid, '1006993069484E8B1001') self.assertEqual(transacao.pan, 'IqVz7P9zaIgTYdU41HaW/OB/d7Idwttqwb2vaTt8MT0=')
def get_in_progress_transaction(numero=1, valor="", produto="", bandeira="", parcelas=1, tid="", return_url=AUTH_URL): return Transacao( pedido=dict_to_pedido({'numero':str(numero), 'valor':valor, 'moeda':941, 'data-hora':'2016-01-01T01:00Z'}), pagamento=dict_to_pagamento({'bandeira':bandeira, # CieloCardBrand.Visa, 'produto':produto, # CieloProduct.Credit, 'parcelas':parcelas}), token=None, captura=None, cancelamento=None, tid=tid, pan=None, status=CieloTransactionStatus.InProgress.value, url_autenticacao=return_url, )
def test_autorizar_com_rejeicao(self): self.pedido = Pedido( numero='1234', valor=553482920, moeda=986, data_hora=datetime.now().isoformat(), ) transacao = Transacao(comercial=self.comercial, cartao=self.cartao, pedido=self.pedido, pagamento=self.pagamento, autorizar=3, capturar=True) transacao = self.request.autorizar(transacao=transacao) self.assertTrue(isinstance(transacao, Transacao)) self.assertEqual(transacao.tid, '100699306900050E36EA') self.assertEqual(transacao.pan, 'IqVz7P9zaIgTYdU41HaW/OB/d7Idwttqwb2vaTt8MT0=') self.assertEqual(transacao.autorizacao.mensagem, 'Autorizacao negada')
def test_validate(self): comercial = Comercial(numero=1234, chave='1234') cartao = Cartao(numero=1234, validade=201805, indicador=1, codigo_seguranca=123, nome_portador='Fulano Silva') pedido = Pedido( numero='1234', valor=10000, moeda=986, data_hora='2011-12-07T11:43:37', ) pagamento = Pagamento(bandeira='visa', produto='1', parcelas=1) autenticacao = Autenticacao(codigo=1, mensagem='msg', data_hora='2011-12-07T11:43:37', valor=10000, eci=7) autorizacao = Autorizacao(codigo=1, mensagem='msg', data_hora='2011-12-07T11:43:37', valor=10000, lr=1, arp=1, nsu=1) token = Token(codigo='codigo', status=1, numero='1234') avs = Avs(endereco='Rua 1', complemento='', numero=1, bairro='Bairro', cep='00000-000') captura = Captura(codigo=1, mensagem='mensagem', data_hora='2011-12-07T11:43:37', valor=10000, taxa_embarque=0) cancelamento = Cancelamento( codigo=1, mensagem='mensagem', data_hora='2011-12-07T11:43:37', valor=10000, ) with pytest.raises(TypeError) as excinfo: Transacao( comercial=1, cartao=cartao, pedido=pedido, pagamento=pagamento, ) assert 'comercial precisa ser do tipo Comercial.' in str(excinfo.value) with pytest.raises(TypeError) as excinfo: Transacao( comercial=comercial, cartao=1, pedido=pedido, pagamento=pagamento, ) assert 'cartao precisa ser do tipo Cartao.' in str(excinfo.value) with pytest.raises(TypeError) as excinfo: Transacao( comercial=comercial, cartao=cartao, pedido=1, pagamento=pagamento, ) assert 'pedido precisa ser do tipo Pedido.' in str(excinfo.value) with pytest.raises(TypeError) as excinfo: Transacao( comercial=comercial, cartao=cartao, pedido=pedido, pagamento=1, ) assert 'pagamento precisa ser do tipo Pagamento.' in str(excinfo.value) with pytest.raises(TypeError) as excinfo: Transacao(comercial=comercial, cartao=cartao, pedido=pedido, pagamento=pagamento, autorizar='1') assert 'autorizar precisa ser do tipo inteiro.' in str(excinfo.value) with pytest.raises(TypeError) as excinfo: Transacao(comercial=comercial, cartao=cartao, pedido=pedido, pagamento=pagamento, autorizar=1, url_retorno=1) assert 'url_retorno precisa ser do tipo string.' in str(excinfo.value) with pytest.raises(TypeError) as excinfo: Transacao(comercial=comercial, cartao=cartao, pedido=pedido, pagamento=pagamento, capturar='false') assert 'capturar precisa ser do tipo booleano.' in str(excinfo.value) with pytest.raises(TypeError) as excinfo: Transacao(comercial=comercial, cartao=cartao, pedido=pedido, pagamento=pagamento, campo_livre=1) assert 'campo_livre precisa ser do tipo string.' in str(excinfo.value) with pytest.raises(TypeError) as excinfo: Transacao(comercial=comercial, cartao=cartao, pedido=pedido, pagamento=pagamento, bin='1234') assert 'bin precisa ser do tipo inteiro.' in str(excinfo.value) with pytest.raises(TypeError) as excinfo: Transacao(comercial=comercial, cartao=cartao, pedido=pedido, pagamento=pagamento, gerar_token='false', avs=avs) assert 'gerar_token precisa ser do tipo booleano.' in str( excinfo.value) with pytest.raises(TypeError) as excinfo: Transacao(comercial=comercial, cartao=cartao, pedido=pedido, pagamento=pagamento, avs=1) assert 'avs precisa ser do tipo Avs.' in str(excinfo.value) with pytest.raises(TypeError) as excinfo: Transacao(comercial=comercial, cartao=cartao, pedido=pedido, pagamento=pagamento, autenticacao=1, autorizacao=autorizacao) assert 'autenticacao precisa ser do tipo Autenticacao.' in str( excinfo.value) with pytest.raises(TypeError) as excinfo: Transacao(comercial=comercial, cartao=cartao, pedido=pedido, pagamento=pagamento, autenticacao=autenticacao, autorizacao=1, captura=captura) assert 'autorizacao precisa ser do tipo Autorizacao.' in str( excinfo.value) with pytest.raises(TypeError) as excinfo: Transacao(comercial=comercial, cartao=cartao, pedido=pedido, pagamento=pagamento, autenticacao=autenticacao, autorizacao=autorizacao, captura=1) assert 'captura precisa ser do tipo Captura.' in str(excinfo.value) with pytest.raises(TypeError) as excinfo: Transacao(comercial=comercial, cartao=cartao, pedido=pedido, pagamento=pagamento, tid=1, pan='pan', status=1) assert 'tid precisa ser do tipo string.' in str(excinfo.value) with pytest.raises(TypeError) as excinfo: Transacao(comercial=comercial, cartao=cartao, pedido=pedido, pagamento=pagamento, tid='1', pan=1, status=1) assert 'pan precisa ser do tipo string.' in str(excinfo.value) with pytest.raises(TypeError) as excinfo: Transacao(comercial=comercial, cartao=cartao, pedido=pedido, pagamento=pagamento, tid='1', pan='pan', status='1', url_autenticacao='http://google.com') assert 'status precisa ser do tipo inteiro.' in str(excinfo.value) with pytest.raises(TypeError) as excinfo: Transacao(comercial=comercial, cartao=cartao, pedido=pedido, pagamento=pagamento, tid='1', pan='pan', status=1, url_autenticacao=1, token=token) assert 'url_autenticacao precisa ser do tipo string.' in str( excinfo.value) with pytest.raises(TypeError) as excinfo: Transacao(comercial=comercial, cartao=cartao, pedido=pedido, pagamento=pagamento, tid='1', pan='pan', status=1, token=1, cancelamento=cancelamento) assert 'token precisa ser do tipo Token.' in str(excinfo.value) with pytest.raises(TypeError) as excinfo: Transacao(comercial=comercial, cartao=cartao, pedido=pedido, pagamento=pagamento, tid='1', pan='pan', status=1, cancelamento=1) assert 'cancelamento precisa ser do tipo Cancelamento.' in str( excinfo.value)
def form_valid(self, form): # verifica se existe alguma transação pendente na sessão # se sim, cancela a autorização antiga para fazer uma nova if self.request.cielo.transaction: try: self.request.cielo.transaction.safe_cancel( self.request.cielo.transaction.total_value) except: logger.exception(_("Failed to cancel old Cielo transaction")) # populate the basket with all the checkout stuff _configure_basket(self.request) order_total = self.request.basket.taxful_total_price.value service = self.request.basket.payment_method.choice_identifier cc_info = form.cleaned_data transaction_total = order_total interest_amount = Decimal() installments = safe_int(cc_info['installments']) cielo_config = self.request.shop.cielo_config produto = CieloProduct.Credit if service == CIELO_SERVICE_CREDIT: if installments > 1: installment_choices = InstallmentContext( order_total, cielo_config).get_intallments_choices() # verifica se o número da parcela existe nas opções if installments <= len(installment_choices): produto = CieloProduct.InstallmentCredit # obtém o valor da transação de acordo com a parcela escolhida transaction_total = installment_choices[installments - 1][2] interest_amount = installment_choices[installments - 1][3] else: installments = 1 else: # debito produto = CieloProduct.Debit installments = 1 cielo_order = CieloOrderTransaction.objects.create() comercial = Comercial(numero=safe_int(cielo_config.ec_num), chave=cielo_config.ec_key) cartao = Cartao( numero=safe_int(cc_info['cc_number']), validade=safe_int("{0}{1}".format(cc_info['cc_valid_year'], cc_info['cc_valid_month'])), indicador=1, # sempre sera necessario o digito verificador codigo_seguranca=safe_int(cc_info['cc_security_code']), nome_portador=cc_info['cc_holder']) pedido = Pedido( numero="{0}".format(cielo_order.pk), valor=decimal_to_int_cents(transaction_total), moeda=986, # Fixo data_hora=now().isoformat()) pagamento = Pagamento(bandeira=cc_info['cc_brand'], produto=produto, parcelas=installments) return_url = self.request.build_absolute_uri( reverse("shuup:cielo_transaction_return", kwargs={"cielo_order_pk": cielo_order.id})) transacao = Transacao(comercial=comercial, cartao=cartao, pedido=pedido, pagamento=pagamento, autorizar=cielo_config.authorization_mode, capturar=cielo_config.auto_capture, url_retorno=return_url) cielo_request = CieloRequest(sandbox=cielo_config.sandbox) # base response data response_data = {"success": False} cielo_transaction = None try: response_transaction = cielo_request.autorizar(transacao=transacao) cielo_transaction = CieloTransaction.objects.create( shop=self.request.shop, order_transaction=cielo_order, tid=response_transaction.tid, status=response_transaction.status, total_value=transaction_total, cc_holder=cc_info['cc_holder'], cc_brand=cc_info['cc_brand'], cc_product=produto, installments=installments, interest_value=interest_amount) # se existe uma URL para autenticacao, vamos redirecionar primeiro if response_transaction.url_autenticacao: response_data["success"] = True response_data[ "redirect_url"] = response_transaction.url_autenticacao # transação autorizada, vamos para a página de retorno para # efetivar elif response_transaction.autorizacao: if response_transaction.autorizacao.lr in CIELO_AUTHORIZED_STATUSES: response_data["success"] = True response_data["redirect_url"] = return_url else: response_data["success"] = False error = _p("Transaction not authorized: {0}").format( CieloAuthorizationCode.get( response_transaction.autorizacao.lr, {}).get('msg', CIELO_UKNOWN_ERROR_MSG)) response_data["error"] = error else: response_data["success"] = False response_data["error"] = _p("Transaction not authorized: {0}" ).format(CIELO_UKNOWN_ERROR_MSG) except CieloRequestError: response_data["success"] = False response_data["error"] = _p("Internal error") logger.exception(_("Cielo transaction error.")) else: self.request.cielo.set_order_transaction(cielo_order) self.request.cielo.set_transaction(cielo_transaction) self.request.cielo.commit() return self.render_to_response(response_data)