From 570aed41da5ffea02bdd61ad448fb40ed04452d2 Mon Sep 17 00:00:00 2001 From: Ricardo Date: Tue, 1 Oct 2019 01:23:35 -0500 Subject: [PATCH] Revert "Revert "Upgrade stpmex" (#97)" This reverts commit b656625dff3a41d640070c953e02645cad42fea8. --- Makefile | 4 +- README.md | 2 +- env.template | 2 +- requirements.txt | 4 +- speid/__init__.py | 10 +- speid/commands/spei.py | 58 +-- speid/models/events.py | 2 +- speid/models/helpers.py | 8 +- speid/models/requests.py | 2 +- speid/models/transaction.py | 68 ++- speid/tasks/__init__.py | 2 +- speid/tasks/orders.py | 5 +- speid/types.py | 2 +- speid/utils.py | 9 +- speid/validations/speid_transaction.py | 14 +- .../validations/speid_transaction_factory.py | 1 + speid/views.py | 32 +- tests/commands/test_spei.py | 7 +- tests/conftest.py | 397 +++++++++--------- tests/helpers/test_callback_helper.py | 7 +- tests/models/test_transactions.py | 75 +++- tests/tasks/test_orders.py | 4 +- tests/views/conftest.py | 7 +- tests/views/test_general.py | 49 ++- 24 files changed, 438 insertions(+), 333 deletions(-) diff --git a/Makefile b/Makefile index 0e9d9c03..c4a81a8c 100644 --- a/Makefile +++ b/Makefile @@ -18,8 +18,8 @@ lint: pycodestyle --ignore=E402 speid/ tests/ polish: - black -S -l 79 speid/* - isort -rc --atomic speid/* + black -S -l 79 speid/ tests/ + isort -rc --atomic speid/ tests/ clean-pyc: find . -name '__pycache__' -exec rm -r "{}" + diff --git a/README.md b/README.md index 2f70b7bf..800bf7e6 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ ## SPEID [![Build Status](https://travis-ci.com/cuenca-mx/speid.svg?branch=master)](https://travis-ci.com/cuenca-mx/speid) -[![Coverage Status](https://coveralls.io/repos/github/cuenca-mx/speid/badge.svg?branch=master&t=1b4Ddg)](https://coveralls.io/github/cuenca-mx/speid?branch=master) +[![Coverage Status](https://coveralls.io/repos/github/cuenca-mx/speid/badge.svg?branch=HEAD)](https://coveralls.io/github/cuenca-mx/speid?branch=HEAD) [![](https://images.microbadger.com/badges/image/cuenca/speid:1.9.4.svg)](https://microbadger.com/images/cuenca/speid:1.9.4 "Get your own image badge on microbadger.com") [![](https://images.microbadger.com/badges/version/cuenca/speid:1.9.4.svg)](https://microbadger.com/images/cuenca/speid:1.9.4 "Get your own version badge on microbadger.com") [![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/ambv/black) diff --git a/env.template b/env.template index 719a1d40..deae6c63 100644 --- a/env.template +++ b/env.template @@ -5,7 +5,7 @@ PYTHONPATH=/speid FLASK_SKIP_DOTENV=1 AMPQ_ADDRESS=rabbitmq AMPQ_ADDRESS_TYPE=host -SPEID_ENV=prod +SPEID_ENV=debug FLASK_APP=speid FLASK_ENV=development STP_WSDL=tests/conf_files/stp_wsdl.wsdl diff --git a/requirements.txt b/requirements.txt index b1b2eace..0688f827 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,11 +1,11 @@ Flask>=1.0,<1.1 -stpmex>=1.0.0,<2.0.0 +stpmex>=2.0.4,<3.0.0 boto3>=1.9,<2.0 celery>=4.2,<4.3 python-hosts>=0.4,<0.5 clabe>=0.2.1,<0.3 luhnmod10>=1.0.2 -sentry-sdk>=0.5.3 +sentry-sdk>=0.11.1 vcrpy>=2.0.1 flask-mongoengine>=0.9.5 blinker>=1.4 diff --git a/speid/__init__.py b/speid/__init__.py index f0de5196..0eef6cdb 100644 --- a/speid/__init__.py +++ b/speid/__init__.py @@ -5,16 +5,15 @@ import boto3 import sentry_sdk -import stpmex from flask import Flask from flask_mongoengine import MongoEngine from python_hosts import Hosts, HostsEntry from sentry_sdk.integrations.celery import CeleryIntegration from sentry_sdk.integrations.flask import FlaskIntegration +from stpmex import Client class CJSONEncoder(json.JSONEncoder): - def default(self, o): if isinstance(o, Enum): encoded = o.name @@ -74,14 +73,13 @@ def default(self, o): with open(STP_PRIVATE_LOCATION) as fp: private_key = fp.read() -stpmex.configure( - wsdl_path=STP_WSDL, +stpmex_client = Client( empresa=STP_EMPRESA, priv_key=private_key, priv_key_passphrase=STP_KEY_PASSPHRASE, - prefijo=int(STP_PREFIJO), + demo=SPEID_ENV is not 'prod', ) +import speid.commands import speid.models import speid.views -import speid.commands diff --git a/speid/commands/spei.py b/speid/commands/spei.py index 2f41b11c..ed40168b 100644 --- a/speid/commands/spei.py +++ b/speid/commands/spei.py @@ -1,14 +1,13 @@ from datetime import datetime import click +import pandas -from speid import app +from speid import app, stpmex_client from speid.helpers import callback_helper from speid.models import Event, Request, Transaction from speid.types import Estado, EventType -import pandas - @app.cli.group('speid') def speid_group(): @@ -34,8 +33,9 @@ def callback_spei_transaction(transaction_id, transaction_status): callback_helper.set_status_transaction( transaction.speid_id, transaction.estado.name ) - transaction.events.append(Event(type=event_type, - metadata=str('Reversed by SPEID command'))) + transaction.events.append( + Event(type=event_type, metadata=str('Reversed by SPEID command')) + ) transaction.save() return transaction @@ -54,27 +54,31 @@ def re_execute_transactions(speid_id): order = transaction.get_order() transaction.save() - order.monto = order.monto / 100 - - res = order.registra() + res = stpmex_client.registrar_orden(order) if res is not None and res.id > 0: transaction.stp_id = res.id - transaction.events.append(Event(type=EventType.completed, - metadata=str(res))) + transaction.events.append( + Event(type=EventType.completed, metadata=str(res)) + ) else: - transaction.events.append(Event(type=EventType.error, - metadata=str(res))) + transaction.events.append( + Event(type=EventType.error, metadata=str(res)) + ) transaction.save() @speid_group.command() -@click.option('--transactions', default='transactions.csv', - help='CSV file with transactions') +@click.option( + '--transactions', + default='transactions.csv', + help='CSV file with transactions', +) @click.option('--events', default='events.csv', help='CSV file with events') -@click.option('--requests', default='requests.csv', - help='CSV file with requests') +@click.option( + '--requests', default='requests.csv', help='CSV file with requests' +) def migrate_from_csv(transactions, events, requests): """ Hace la migración de una base de datos Postgres a MongoDB, los datos deben @@ -91,13 +95,14 @@ def migrate_from_csv(transactions, events, requests): institucion_ordenante=lambda x: str(x), institucion_beneficiaria=lambda x: str(x), cuenta_ordenante=lambda x: str(x), - cuenta_beneficiario=lambda x: str(x) - )) + cuenta_beneficiario=lambda x: str(x), + ), + ) transactions_list = transactions_list.where( - (pandas.notnull(transactions_list)), None) + (pandas.notnull(transactions_list)), None + ) events_list = pandas.read_csv(events) - events_list = events_list.where( - (pandas.notnull(events_list)), None) + events_list = events_list.where((pandas.notnull(events_list)), None) transactions = [] for _, t in transactions_list.iterrows(): t['stp_id'] = t['orden_id'] @@ -116,16 +121,17 @@ def migrate_from_csv(transactions, events, requests): Event( type=EventType[e['type']], metadata=e['meta'], - created_at=datetime.strptime(e['created_at'], - '%Y-%m-%d %H:%M:%S.%f') - )) + created_at=datetime.strptime( + e['created_at'], '%Y-%m-%d %H:%M:%S.%f' + ), + ) + ) transaction.id = None transactions.append(transaction) requests_list = pandas.read_csv(requests) - requests_list = requests_list.where( - (pandas.notnull(requests_list)), None) + requests_list = requests_list.where((pandas.notnull(requests_list)), None) requests = [] for _, r in requests_list.iterrows(): r['method'] = r['method'].upper() diff --git a/speid/models/events.py b/speid/models/events.py index ede31f5c..78b8e599 100644 --- a/speid/models/events.py +++ b/speid/models/events.py @@ -2,7 +2,7 @@ from speid.types import EventType -from .helpers import date_now, EnumField +from .helpers import EnumField, date_now class Event(Document): diff --git a/speid/models/helpers.py b/speid/models/helpers.py index b627837a..a61c939d 100644 --- a/speid/models/helpers.py +++ b/speid/models/helpers.py @@ -45,11 +45,6 @@ def camel_to_snake(s): return _underscorer2.sub(r'\1_\2', subbed).lower() -def snake_to_camel(s): - words = s.split('_') - return words[0] + "".join(r.title() for r in words[1:]) - - def handler(event): """ http://docs.mongoengine.org/guide/signals.html?highlight=update @@ -144,7 +139,8 @@ def mongo_to_dict(obj, exclude_fields: list = None) -> Union[dict, None]: return_data[field_name] = data else: return_data[field_name] = mongo_to_python_type( - obj._fields[field_name], data) + obj._fields[field_name], data + ) return return_data diff --git a/speid/models/requests.py b/speid/models/requests.py index 00e5cfa4..3c66629c 100644 --- a/speid/models/requests.py +++ b/speid/models/requests.py @@ -2,7 +2,7 @@ from speid.types import HttpRequestMethod -from .helpers import date_now, EnumField +from .helpers import EnumField, date_now class Request(Document): diff --git a/speid/models/transaction.py b/speid/models/transaction.py index 3e37965c..9a692756 100644 --- a/speid/models/transaction.py +++ b/speid/models/transaction.py @@ -1,14 +1,13 @@ from mongoengine import (DateTimeField, Document, IntField, ListField, ReferenceField, StringField) from stpmex import Orden -from stpmex.ordenes import ORDEN_FIELDNAMES +from speid import STP_EMPRESA from speid.helpers import callback_helper from speid.types import Estado, EventType from .events import Event -from .helpers import (EnumField, date_now, mongo_to_dict, snake_to_camel, - updated_at) +from .helpers import EnumField, date_now, mongo_to_dict, updated_at @updated_at.apply @@ -110,27 +109,52 @@ def confirm_callback_transaction(self): Event(type=EventType.completed, metadata=str(response)) ) - def get_order(self): - trx_dict = self.to_dict() - order_dict = { - snake_to_camel(k): v - for k, v in trx_dict.items() - if snake_to_camel(k) in ORDEN_FIELDNAMES and ( - trx_dict[k] is not None) - } - order = Orden(**order_dict) - order.fechaOperacion = None - order.institucionOperante = self.institucion_ordenante - order.institucionContraparte = self.institucion_beneficiaria - order.nombreBeneficiario = self.nombre_beneficiario[:38].strip() - order.nombreOrdenante = self.nombre_ordenante[:38].strip() + def get_order(self) -> Orden: + order = Orden( + monto=self.monto / 100.0, + conceptoPago=self.concepto_pago, + nombreBeneficiario=self.nombre_beneficiario, + cuentaBeneficiario=self.cuenta_beneficiario, + institucionContraparte=self.institucion_beneficiaria, + tipoCuentaBeneficiario=self.tipo_cuenta_beneficiario, + nombreOrdenante=self.nombre_ordenante, + cuentaOrdenante=self.cuenta_ordenante, + rfcCurpOrdenante=self.rfc_curp_ordenante, + tipoCuentaOrdenante=self.tipo_cuenta_ordenante, + iva=self.iva, + ) + + if self.institucion_ordenante: + order.institucionOperante = self.institucion_ordenante + + if self.clave_rastreo: + order.claveRastreo = self.clave_rastreo + + if self.referencia_numerica: + order.referenciaNumerica = self.referencia_numerica + + if self.rfc_curp_beneficiario: + order.rfcCurpBeneficiario = self.rfc_curp_beneficiario + + if self.medio_entrega: + order.medioEntrega = self.medio_entrega + + if self.prioridad: + order.prioridad = self.prioridad + + if self.tipo_pago: + order.tipoPago = self.tipo_pago + + if self.topologia: + order.topologia = self.topologia + self.clave_rastreo = self.clave_rastreo or order.claveRastreo - self.tipo_cuenta_beneficiario = self.tipo_cuenta_beneficiario or ( - order.tipoCuentaBeneficiario) self.rfc_curp_beneficiario = self.rfc_curp_beneficiario or ( - order.rfcCurpBeneficiario) + order.rfcCurpBeneficiario + ) self.referencia_numerica = self.referencia_numerica or ( - order.referenciaNumerica) - self.empresa = self.empresa or order.empresa + order.referenciaNumerica + ) + self.empresa = self.empresa or STP_EMPRESA return order diff --git a/speid/tasks/__init__.py b/speid/tasks/__init__.py index 404d97cb..ee2fd0ae 100644 --- a/speid/tasks/__init__.py +++ b/speid/tasks/__init__.py @@ -9,7 +9,7 @@ def make_celery(app): celery_app = Celery( app.import_name, broker=app.config['CELERY_BROKER_URL'], - include=['speid.tasks.orders'] + include=['speid.tasks.orders'], ) celery_app.conf.update(app.config) celery_app.conf.task_default_queue = os.environ['TASK_DEFAULT_QUEUE'] diff --git a/speid/tasks/orders.py b/speid/tasks/orders.py index 23e650b1..7b419f5e 100644 --- a/speid/tasks/orders.py +++ b/speid/tasks/orders.py @@ -5,6 +5,7 @@ from mongoengine import DoesNotExist from sentry_sdk import capture_exception +from speid import stpmex_client from speid.exc import MalformedOrderException from speid.models import Event, Transaction from speid.tasks import celery @@ -68,9 +69,7 @@ def execute(order_val): transaction.save() # Send order to STP - order.monto = order.monto / 100 - - res = order.registra() + res = stpmex_client.registrar_orden(order) if res is not None and res.id > 0: transaction.stp_id = res.id diff --git a/speid/types.py b/speid/types.py index 9a273c58..a20db12c 100644 --- a/speid/types.py +++ b/speid/types.py @@ -8,7 +8,7 @@ class HttpRequestMethod(Enum): class EventType(Enum): created = 'CREATE' # When a transaction has been received - retry = 'RETRY' # When the transaction has been retry + retry = 'RETRY' # When the transaction has been retry completed = 'COMPLETE' # The request was processed with no errors error = 'ERROR' # Something happened when the response was obtained received = 'RECEIVED' # When we get the response from a transaction made diff --git a/speid/utils.py b/speid/utils.py index 1feb48a0..c27bc9a8 100644 --- a/speid/utils.py +++ b/speid/utils.py @@ -13,8 +13,7 @@ def decorated(*args, **kwargs): return make_response(jsonify(body), status_code) endpoint = options.pop('endpoint', None) - app.add_url_rule( - rule, endpoint, decorated, methods=['GET'], **options) + app.add_url_rule(rule, endpoint, decorated, methods=['GET'], **options) return view return decorator @@ -29,7 +28,8 @@ def decorated(*args, **kwargs): endpoint = options.pop('endpoint', None) app.add_url_rule( - rule, endpoint, decorated, methods=['PATCH'], **options) + rule, endpoint, decorated, methods=['PATCH'], **options + ) return view return decorator @@ -44,7 +44,8 @@ def decorated(*args, **kwargs): endpoint = options.pop('endpoint', None) app.add_url_rule( - rule, endpoint, decorated, methods=['POST'], **options) + rule, endpoint, decorated, methods=['POST'], **options + ) return view return decorator diff --git a/speid/validations/speid_transaction.py b/speid/validations/speid_transaction.py index 7778e352..3c50304f 100644 --- a/speid/validations/speid_transaction.py +++ b/speid/validations/speid_transaction.py @@ -1,8 +1,6 @@ -from datetime import datetime - from pydantic import StrictStr from pydantic.dataclasses import dataclass -from stpmex.types import AccountType +from stpmex.types import TipoCuenta from speid.models import Transaction from speid.types import Estado @@ -52,11 +50,15 @@ def to_dict(self): } def __post_init__(self): - if len(self.cuenta_beneficiario) == 16: - self.tipo_cuenta_beneficiario = AccountType.DEBIT_CARD.value + cuenta_len = len(self.cuenta_beneficiario) + if cuenta_len == 18: + self.tipo_cuenta_beneficiario = TipoCuenta.clabe.value + elif cuenta_len in {15, 16}: + self.tipo_cuenta_beneficiario = TipoCuenta.card.value + else: + raise ValueError(f'{cuenta_len} is not a valid cuenta length') def transform(self): transaction = Transaction(**self.to_dict()) - transaction.fecha_operacion = datetime.today() transaction.estado = Estado.submitted return transaction diff --git a/speid/validations/speid_transaction_factory.py b/speid/validations/speid_transaction_factory.py index 6dc449c6..53a28502 100644 --- a/speid/validations/speid_transaction_factory.py +++ b/speid/validations/speid_transaction_factory.py @@ -2,6 +2,7 @@ class TransactionFactory: """ from: https://realpython.com/factory-method-python/ """ + def __init__(self): self._builders = dict() diff --git a/speid/views.py b/speid/views.py index a26ec1f4..40f59b45 100644 --- a/speid/views.py +++ b/speid/views.py @@ -1,16 +1,16 @@ import json import os -from flask import request, abort + +from flask import abort, request from mongoengine import DoesNotExist from sentry_sdk import capture_exception, capture_message -from speid import app +from speid import app, stpmex_client from speid.models import Event, Request, Transaction from speid.types import Estado, EventType, HttpRequestMethod from speid.utils import get, patch, post from speid.validations import StpTransaction - CLABES_BLOCKED = os.getenv('CLABES_BLOCKED', '') @@ -55,7 +55,7 @@ def create_orden(): clave_rastreo=transaction.clave_rastreo, cuenta_ordenante=transaction.cuenta_ordenante, cuenta_beneficiario=transaction.cuenta_beneficiario, - monto=transaction.monto + monto=transaction.monto, ) assert len(previous_trx) == 0 @@ -75,10 +75,12 @@ def create_orden(): @get('/transactions') def get_orders(): estado = request.args.get('estado', default=None, type=str) - prefix_ordenante = request.args.get('prefix_ordenante', default=None, - type=str) - prefix_beneficiario = request.args.get('prefix_beneficiario', default=None, - type=str) + prefix_ordenante = request.args.get( + 'prefix_ordenante', default=None, type=str + ) + prefix_beneficiario = request.args.get( + 'prefix_beneficiario', default=None, type=str + ) query = dict() if estado: query['estado'] = estado @@ -94,17 +96,16 @@ def get_orders(): @patch('/transactions//process') def process_transaction(transaction_id): try: - transaction = Transaction.objects.get(id=transaction_id, - estado=Estado.submitted) + transaction = Transaction.objects.get( + id=transaction_id, estado=Estado.submitted + ) except DoesNotExist: abort(401) order = transaction.get_order() transaction.save() - order.monto = order.monto / 100 - - res = order.registra() + res = stpmex_client.registrar_orden(order) if res is not None and res.id > 0: transaction.stp_id = res.id @@ -124,8 +125,9 @@ def process_transaction(transaction_id): @patch('/transactions//reverse') def reverse_transaction(transaction_id): try: - transaction = Transaction.objects.get(id=transaction_id, - estado=Estado.submitted) + transaction = Transaction.objects.get( + id=transaction_id, estado=Estado.submitted + ) except DoesNotExist: abort(401) diff --git a/tests/commands/test_spei.py b/tests/commands/test_spei.py index 66bababc..282d300b 100644 --- a/tests/commands/test_spei.py +++ b/tests/commands/test_spei.py @@ -24,9 +24,10 @@ def test_callback_spei_transaction(runner, mock_callback_api): id_trx = transaction.id assert transaction.estado is Estado.submitted - runner.invoke(callback_spei_transaction, - ['transaction_id', id_trx, - 'transaction_status', 'succeeded']) + runner.invoke( + callback_spei_transaction, + ['transaction_id', id_trx, 'transaction_status', 'succeeded'], + ) transaction = Transaction.objects.get(id=id_trx) assert transaction.estado is Estado.succeeded diff --git a/tests/conftest.py b/tests/conftest.py index 408eb0c5..ba77df64 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -16,6 +16,7 @@ def substitute_patch_status(*_, **__): @pytest.fixture def mock_callback_api(monkeypatch): import requests + monkeypatch.setattr(requests, 'patch', substitute_patch_status) monkeypatch.setattr(requests, 'post', substitute_patch_status) @@ -29,209 +30,215 @@ def vcr_config(): @pytest.fixture(scope='module') def file_recon(): - body = ("STP received successfully (1):\n" - "{'id': 22673742, 'institucion': 'STP', 'contraparte': 'BANORTE/I" - "XE', 'rastreo': 'CR1547453521', 'fecha_operacion': 20181213, 'mo" - "nto': 1232, 'estado_orden': 'Liquidada', 'referencia_numerica': " - "7382934, 'ordenante': 'BANCO', 'cuenta_ordenante': '072696273648" - "711499', 'rfc_curp_ordenante': 'ND', 'beneficiario': 'Carlos Gon" - "zalez', 'cuenta_beneficiario': '646180827000027384', 'rfc_curp_b" - "eneficiario': 'ND', 'concepto_pago': 'PRUEBA', 'empresa': 'TAMIZ" - "I'}\n\nSTP sent successfully (1):\n{'id': 25663741, 'institucion" - "': 'STP', 'contraparte': 'BANORTE/IXE', 'rastreo': 'CUENCA263', " - "'fecha_operacion': 20190301, 'monto': 2500000, 'estado_orden': '" - "Liquidada', 'referencia_numerica': 3526516, 'ordenante': 'TAMIZI" - " SA DE CV', 'cuenta_ordenante': '646187283000000004', 'rfc_curp_" - "ordenante': 'TAM180309C16', 'beneficiario': 'Optimizacion de Rec" - "ursos Regalii', 'cuenta_beneficiario': '072078002960364722', 'rf" - "c_curp_beneficiario': 'None', 'concepto_pago': 'mas dinero', 'em" - "presa': 'TAMIZI'}\n\nSTP others (1):\n{'id': 7432344, 'instituci" - "on': 'STP', 'contraparte': 'ACCENDO BANCO', 'rastreo': 'MANU-006" - "47368751', 'fecha_operacion': 20190116, 'monto': 100000, 'estado" - "_orden': 'Devuelta', 'referencia_numerica': 19843, 'ordenante': " - "'None', 'cuenta_ordenante': 'None', 'rfc_curp_ordenante': 'None'" - ", 'beneficiario': 'Josefina Antonieta Caras Noriega', 'cuenta_be" - "neficiario': '646180157020536253', 'rfc_curp_beneficiario': 'ND'" - ", 'concepto_pago': 'FONDEO', 'empresa': 'TAMIZI'}\n\nSPEID submi" - "tted (1):\n{'orden_id': 'None', 'institucion_ordenante': 646, 'i" - "nstitucion_beneficiaria': 14, 'clave_rastreo': 'CR1540950253', '" - "fecha_operacion': 20181031, 'monto': 120, 'estado': 'submitted'," - " 'cuenta_ordenante': '12180026543282738', 'cuenta_beneficiario':" - " '14180567188562673'}\n\nSPEID success (1):\n{'orden_id': 244834" - "6, 'institucion_ordenante': 12, 'institucion_beneficiaria': 'Non" - "e', 'clave_rastreo': 'PRUEBATAMIZI1', 'fecha_operacion': 2018061" - "8, 'monto': 10000, 'estado': 'success', 'cuenta_ordenante': '846" - "267300500000008', 'cuenta_beneficiario': '646180157000037824'}\n" - "\nSPEID others (0):\n\nCUENCA created (1):\n{'id': '" - "SP36XEZuOVZms7VtutjzYvcf', 'clave_rastreo': 'CUENCA1552184653', " - "'created_at': '09-03-2019 04:03:1552104253', 'amount': 3450, 'st" - "atus': 'created', 'numero_referencia': '7263564'}\n\nCUENCA subm" - "itted (1):\n{'id': 'LT2F8RtCjZwI2DQvJAPe5b00', 'clave_rastreo': " - "'CUENCA1541512409', 'created_at': '06-11-2018 13:11:1541512409'," - " 'amount': 1000, 'status': 'submitted', 'numero_referencia': '56" - "65503'}\n\nCUENCA succeeded (0):\n\nCUENCA others (0):\n\nSTP/CU" - "ENCA (0):\n\nSTP/SPEID same status (2):\n{'id': 6345658, 'instit" - "ucion': 'STP', 'contraparte': 'BBVA BANCOMER', 'rastreo': '00264" - "73000265786', 'fecha_operacion': 20181031, 'monto': 675600, 'est" - "ado_orden': 'Confirmada', 'referencia_numerica': 3165364, 'orden" - "ante': 'CC MEXICO HOLDINGS S DE RL DE CV', 'cuenta_ordenante': " - "'012180001571847460', 'rfc_curp_ordenante': 'CMH6476252M1', 'ben" - "eficiario': 'Dario Davila', 'cuenta_beneficiario': '646180157029" - "907647', 'rfc_curp_beneficiario': 'None', 'concepto_pago': 'CITA" - "DEL74651591', 'empresa': 'TAMIZI'}\n{'orden_id': 6345658, 'insti" - "tucion_ordenante': 12, 'institucion_beneficiaria': 'None', 'clav" - "e_rastreo': '0026473000265786', 'fecha_operacion': 20181031, 'mo" - "nto': 3165364, 'estado': 'success', 'cuenta_ordenante': '0121800" - "01571847460', 'cuenta_beneficiario': '646180157029907647'}\n\nST" - "P/SPEID different status (2):\n{'id': 21073705, 'institucion': '" - "STP', 'contraparte': 'BANORTE/IXE', 'rastreo': 'CR1539036578', '" - "fecha_operacion': 20181008, 'monto': 2046, 'estado_orden': 'Liqu" - "idada', 'referencia_numerica': 3314058, 'ordenante': 'BANCO', 'c" - "uenta_ordenante': '646180157000000004', 'rfc_curp_ordenante': 'N" - "D', 'beneficiario': 'Ricardo Sánchez', 'cuenta_beneficiario': '0" - "72691004495711499', 'rfc_curp_beneficiario': 'ND', 'concepto_pag" - "o': 'PRUEBA', 'empresa': 'TAMIZI'}\n{'orden_id': 21073705, 'inst" - "itucion_ordenante': 646, 'institucion_beneficiaria': 72, 'clave_" - "rastreo': 'CR1539036578', 'fecha_operacion': 20181008, 'monto': " - "2046, 'estado': 'submitted', 'cuenta_ordenante': '64618015700000" - "0004', 'cuenta_beneficiario': '72691004495711499'}\n\nSPEID/CUEN" - "CA submitted (2):\n{'orden_id': 'None', 'institucion_ordenante':" - " 646, 'institucion_beneficiaria': 72, 'clave_rastreo': 'CUENCA15" - "44567707', 'fecha_operacion': 20181211, 'monto': 231, 'estado': " - "'submitted', 'cuenta_ordenante': '646180157063641989', 'cuenta_b" - "eneficiario': '72691004495711499'}\n{'id': 'SP5q1a3wCVC3g4BU0uY5" - "fZE', 'clave_rastreo': 'CUENCA1544567707', 'created_at': '11-12-" - "2018 22:12:1544567707', 'amount': 231, 'status': 'submitted', 'n" - "umero_referencia': '4091444'}\n\nSPEID/CUENCA succeeded (2):\n{'" - "orden_id': 28282738, 'institucion_ordenante': 90646, 'institucio" - "n_beneficiaria': 40012, 'clave_rastreo': 'CUENCA1556029364', 'fe" - "cha_operacion': 20190423, 'monto': 150000, 'estado': 'succeeded'" - ", 'cuenta_ordenante': '646180157062370426', 'cuenta_beneficiario" - "': '4152313498971212'}\n{'id': 'SP3qKlB2zTEtrSIbXrJZGcA2', 'clav" - "e_rastreo': 'CUENCA1556029364', 'created_at': '23-04-2019 14:04:" - "1556029441', 'amount': 150000, 'status': 'succeeded', 'numero_re" - "ferencia': '5705984'}\n\nSPEID/CUENCA different status (2):\n{'o" - "rden_id': 8489980, 'institucion_ordenante': 40127, 'institucion_" - "beneficiaria': 90646, 'clave_rastreo': '190423070825308455I', 'f" - "echa_operacion': 20190423, 'monto': 10000, 'estado': 'None', 'cu" - "enta_ordenante': '127180013501165438', 'cuenta_beneficiario': '6" - "46180157029206957'}\n{'id': 'SP4v371cyTNvV1TgQtRWbCz8', 'clave_r" - "astreo': '190423070825308455I', 'created_at': '23-04-2019 03:04:" - "1555989127', 'amount': 10000, 'status': 'succeeded', 'numero_ref" - "erencia': '206957'}\n\nSPEID/CUENCA others (0):\n") + body = ( + "STP received successfully (1):\n" + "{'id': 22673742, 'institucion': 'STP', 'contraparte': 'BANORTE/I" + "XE', 'rastreo': 'CR1547453521', 'fecha_operacion': 20181213, 'mo" + "nto': 1232, 'estado_orden': 'Liquidada', 'referencia_numerica': " + "7382934, 'ordenante': 'BANCO', 'cuenta_ordenante': '072696273648" + "711499', 'rfc_curp_ordenante': 'ND', 'beneficiario': 'Carlos Gon" + "zalez', 'cuenta_beneficiario': '646180827000027384', 'rfc_curp_b" + "eneficiario': 'ND', 'concepto_pago': 'PRUEBA', 'empresa': 'TAMIZ" + "I'}\n\nSTP sent successfully (1):\n{'id': 25663741, 'institucion" + "': 'STP', 'contraparte': 'BANORTE/IXE', 'rastreo': 'CUENCA263', " + "'fecha_operacion': 20190301, 'monto': 2500000, 'estado_orden': '" + "Liquidada', 'referencia_numerica': 3526516, 'ordenante': 'TAMIZI" + " SA DE CV', 'cuenta_ordenante': '646187283000000004', 'rfc_curp_" + "ordenante': 'TAM180309C16', 'beneficiario': 'Optimizacion de Rec" + "ursos Regalii', 'cuenta_beneficiario': '072078002960364722', 'rf" + "c_curp_beneficiario': 'None', 'concepto_pago': 'mas dinero', 'em" + "presa': 'TAMIZI'}\n\nSTP others (1):\n{'id': 7432344, 'instituci" + "on': 'STP', 'contraparte': 'ACCENDO BANCO', 'rastreo': 'MANU-006" + "47368751', 'fecha_operacion': 20190116, 'monto': 100000, 'estado" + "_orden': 'Devuelta', 'referencia_numerica': 19843, 'ordenante': " + "'None', 'cuenta_ordenante': 'None', 'rfc_curp_ordenante': 'None'" + ", 'beneficiario': 'Josefina Antonieta Caras Noriega', 'cuenta_be" + "neficiario': '646180157020536253', 'rfc_curp_beneficiario': 'ND'" + ", 'concepto_pago': 'FONDEO', 'empresa': 'TAMIZI'}\n\nSPEID submi" + "tted (1):\n{'orden_id': 'None', 'institucion_ordenante': 646, 'i" + "nstitucion_beneficiaria': 14, 'clave_rastreo': 'CR1540950253', '" + "fecha_operacion': 20181031, 'monto': 120, 'estado': 'submitted'," + " 'cuenta_ordenante': '12180026543282738', 'cuenta_beneficiario':" + " '14180567188562673'}\n\nSPEID success (1):\n{'orden_id': 244834" + "6, 'institucion_ordenante': 12, 'institucion_beneficiaria': 'Non" + "e', 'clave_rastreo': 'PRUEBATAMIZI1', 'fecha_operacion': 2018061" + "8, 'monto': 10000, 'estado': 'success', 'cuenta_ordenante': '846" + "267300500000008', 'cuenta_beneficiario': '646180157000037824'}\n" + "\nSPEID others (0):\n\nCUENCA created (1):\n{'id': '" + "SP36XEZuOVZms7VtutjzYvcf', 'clave_rastreo': 'CUENCA1552184653', " + "'created_at': '09-03-2019 04:03:1552104253', 'amount': 3450, 'st" + "atus': 'created', 'numero_referencia': '7263564'}\n\nCUENCA subm" + "itted (1):\n{'id': 'LT2F8RtCjZwI2DQvJAPe5b00', 'clave_rastreo': " + "'CUENCA1541512409', 'created_at': '06-11-2018 13:11:1541512409'," + " 'amount': 1000, 'status': 'submitted', 'numero_referencia': '56" + "65503'}\n\nCUENCA succeeded (0):\n\nCUENCA others (0):\n\nSTP/CU" + "ENCA (0):\n\nSTP/SPEID same status (2):\n{'id': 6345658, 'instit" + "ucion': 'STP', 'contraparte': 'BBVA BANCOMER', 'rastreo': '00264" + "73000265786', 'fecha_operacion': 20181031, 'monto': 675600, 'est" + "ado_orden': 'Confirmada', 'referencia_numerica': 3165364, 'orden" + "ante': 'CC MEXICO HOLDINGS S DE RL DE CV', 'cuenta_ordenante': " + "'012180001571847460', 'rfc_curp_ordenante': 'CMH6476252M1', 'ben" + "eficiario': 'Dario Davila', 'cuenta_beneficiario': '646180157029" + "907647', 'rfc_curp_beneficiario': 'None', 'concepto_pago': 'CITA" + "DEL74651591', 'empresa': 'TAMIZI'}\n{'orden_id': 6345658, 'insti" + "tucion_ordenante': 12, 'institucion_beneficiaria': 'None', 'clav" + "e_rastreo': '0026473000265786', 'fecha_operacion': 20181031, 'mo" + "nto': 3165364, 'estado': 'success', 'cuenta_ordenante': '0121800" + "01571847460', 'cuenta_beneficiario': '646180157029907647'}\n\nST" + "P/SPEID different status (2):\n{'id': 21073705, 'institucion': '" + "STP', 'contraparte': 'BANORTE/IXE', 'rastreo': 'CR1539036578', '" + "fecha_operacion': 20181008, 'monto': 2046, 'estado_orden': 'Liqu" + "idada', 'referencia_numerica': 3314058, 'ordenante': 'BANCO', 'c" + "uenta_ordenante': '646180157000000004', 'rfc_curp_ordenante': 'N" + "D', 'beneficiario': 'Ricardo Sánchez', 'cuenta_beneficiario': '0" + "72691004495711499', 'rfc_curp_beneficiario': 'ND', 'concepto_pag" + "o': 'PRUEBA', 'empresa': 'TAMIZI'}\n{'orden_id': 21073705, 'inst" + "itucion_ordenante': 646, 'institucion_beneficiaria': 72, 'clave_" + "rastreo': 'CR1539036578', 'fecha_operacion': 20181008, 'monto': " + "2046, 'estado': 'submitted', 'cuenta_ordenante': '64618015700000" + "0004', 'cuenta_beneficiario': '72691004495711499'}\n\nSPEID/CUEN" + "CA submitted (2):\n{'orden_id': 'None', 'institucion_ordenante':" + " 646, 'institucion_beneficiaria': 72, 'clave_rastreo': 'CUENCA15" + "44567707', 'fecha_operacion': 20181211, 'monto': 231, 'estado': " + "'submitted', 'cuenta_ordenante': '646180157063641989', 'cuenta_b" + "eneficiario': '72691004495711499'}\n{'id': 'SP5q1a3wCVC3g4BU0uY5" + "fZE', 'clave_rastreo': 'CUENCA1544567707', 'created_at': '11-12-" + "2018 22:12:1544567707', 'amount': 231, 'status': 'submitted', 'n" + "umero_referencia': '4091444'}\n\nSPEID/CUENCA succeeded (2):\n{'" + "orden_id': 28282738, 'institucion_ordenante': 90646, 'institucio" + "n_beneficiaria': 40012, 'clave_rastreo': 'CUENCA1556029364', 'fe" + "cha_operacion': 20190423, 'monto': 150000, 'estado': 'succeeded'" + ", 'cuenta_ordenante': '646180157062370426', 'cuenta_beneficiario" + "': '4152313498971212'}\n{'id': 'SP3qKlB2zTEtrSIbXrJZGcA2', 'clav" + "e_rastreo': 'CUENCA1556029364', 'created_at': '23-04-2019 14:04:" + "1556029441', 'amount': 150000, 'status': 'succeeded', 'numero_re" + "ferencia': '5705984'}\n\nSPEID/CUENCA different status (2):\n{'o" + "rden_id': 8489980, 'institucion_ordenante': 40127, 'institucion_" + "beneficiaria': 90646, 'clave_rastreo': '190423070825308455I', 'f" + "echa_operacion': 20190423, 'monto': 10000, 'estado': 'None', 'cu" + "enta_ordenante': '127180013501165438', 'cuenta_beneficiario': '6" + "46180157029206957'}\n{'id': 'SP4v371cyTNvV1TgQtRWbCz8', 'clave_r" + "astreo': '190423070825308455I', 'created_at': '23-04-2019 03:04:" + "1555989127', 'amount': 10000, 'status': 'succeeded', 'numero_ref" + "erencia': '206957'}\n\nSPEID/CUENCA others (0):\n" + ) return body @pytest.fixture(scope='module') def file_recon1(): - body = ("STP received successfully (1):\n" - "{'id': 22672732, 'institucion': 'STP', 'contraparte': 'BAN" - "ORTE/IXE', 'rastreo': 'HG745321', 'fecha_operacion': 20181213, '" - "monto': 1435, 'estado_orden': 'Liquidada', 'referencia_numerica'" - ": 7382253, 'ordenante': 'BANCO', 'cuenta_ordenante': '0726962736" - "48711499', 'rfc_curp_ordenante': 'ND', 'beneficiario': 'Carlos C" - "astro', 'cuenta_beneficiario': '646180827000027384', 'rfc_curp_b" - "eneficiario': 'ND', 'concepto_pago': 'PRUEBA', 'empresa': 'TAMIZ" - "I'}\n\nSTP sent successfully (1):\n{'id': 25663741, 'institucion" - "': 'STP', 'contraparte': 'BANORTE/IXE', 'rastreo': 'CUENCA263', " - "'fecha_operacion': 20190301, 'monto': 2500000, 'estado_orden': '" - "Liquidada', 'referencia_numerica': 3526516, 'ordenante': 'TAMIZI" - " SA DE CV', 'cuenta_ordenante': '646187283000000004', 'rfc_curp_" - "ordenante': 'TAM180309C16', 'beneficiario': 'Optimizacion de Rec" - "ursos Regalii', 'cuenta_beneficiario': '072078002960364722', 'rf" - "c_curp_beneficiario': 'None', 'concepto_pago': 'mas dinero', 'em" - "presa': 'TAMIZI'}\n\nSTP others (1):\n{'id': 7432344, 'instituci" - "on': 'STP', 'contraparte': 'ACCENDO BANCO', 'rastreo': 'MANU-006" - "47368751', 'fecha_operacion': 20190116, 'monto': 100000, 'estado" - "_orden': 'Devuelta', 'referencia_numerica': 19843, 'ordenante': " - "'None', 'cuenta_ordenante': 'None', 'rfc_curp_ordenante': 'None'" - ", 'beneficiario': 'Josefina Antonieta Caras Noriega', 'cuenta_be" - "neficiario': '646180157020536253', 'rfc_curp_beneficiario': 'ND'" - ", 'concepto_pago': 'FONDEO', 'empresa': 'TAMIZI'}\n\nSPEID submi" - "tted (1):\n{'orden_id': 'None', 'institucion_ordenante': 646, 'i" - "nstitucion_beneficiaria': 14, 'clave_rastreo': 'CR1540950253', '" - "fecha_operacion': 20181031, 'monto': 120, 'estado': 'submitted'," - " 'cuenta_ordenante': '12180026543282738', 'cuenta_beneficiario':" - " '14180567188562673'}\n\nSPEID success (1):\n{'orden_id': 244834" - "6, 'institucion_ordenante': 12, 'institucion_beneficiaria': 'Non" - "e', 'clave_rastreo': 'PRUEBATAMIZI1', 'fecha_operacion': 2018061" - "8, 'monto': 10000, 'estado': 'success', 'cuenta_ordenante': '846" - "267300500000008', 'cuenta_beneficiario': '646180157000037824'}\n" - "\nSPEID others (0):\n\nCUENCA created (1):\n{'id': '" - "SP36XEZuOVZms7VtutjzYvcf', 'clave_rastreo': 'CUENCA1552184653', " - "'created_at': '09-03-2019 04:03:1552104253', 'amount': 3450, 'st" - "atus': 'created', 'numero_referencia': '7263564'}\n\nCUENCA subm" - "itted (1):\n{'id': 'LT2F8RtCjZwI2DQvJAPe5b00', 'clave_rastreo': " - "'CUENCA1541512409', 'created_at': '06-11-2018 13:11:1541512409'," - " 'amount': 1000, 'status': 'submitted', 'numero_referencia': '56" - "65503'}\n\nCUENCA succeeded (0):\n\nCUENCA others (0):\n\nSTP/CU" - "ENCA (0):\n\nSTP/SPEID same status (2):\n{'id': 6345658, 'instit" - "ucion': 'STP', 'contraparte': 'BBVA BANCOMER', 'rastreo': '00264" - "73000265786', 'fecha_operacion': 20181031, 'monto': 675600, 'est" - "ado_orden': 'Confirmada', 'referencia_numerica': 3165364, 'orden" - "ante': 'CC MEXICO HOLDINGS S DE RL DE CV', 'cuenta_ordenante': " - "'012180001571847460', 'rfc_curp_ordenante': 'CMH6476252M1', 'ben" - "eficiario': 'Dario Davila', 'cuenta_beneficiario': '646180157029" - "907647', 'rfc_curp_beneficiario': 'None', 'concepto_pago': 'CITA" - "DEL74651591', 'empresa': 'TAMIZI'}\n{'orden_id': 6345658, 'insti" - "tucion_ordenante': 12, 'institucion_beneficiaria': 'None', 'clav" - "e_rastreo': '0026473000265786', 'fecha_operacion': 20181031, 'mo" - "nto': 3165364, 'estado': 'success', 'cuenta_ordenante': '0121800" - "01571847460', 'cuenta_beneficiario': '646180157029907647'}\n\nST" - "P/SPEID different status (2):\n{'id': 21073705, 'institucion': '" - "STP', 'contraparte': 'BANORTE/IXE', 'rastreo': 'CR1539036578', '" - "fecha_operacion': 20181008, 'monto': 2046, 'estado_orden': 'Liqu" - "idada', 'referencia_numerica': 3314058, 'ordenante': 'BANCO', 'c" - "uenta_ordenante': '646180157000000004', 'rfc_curp_ordenante': 'N" - "D', 'beneficiario': 'Ricardo Sánchez', 'cuenta_beneficiario': '0" - "72691004495711499', 'rfc_curp_beneficiario': 'ND', 'concepto_pag" - "o': 'PRUEBA', 'empresa': 'TAMIZI'}\n{'orden_id': 21073705, 'inst" - "itucion_ordenante': 646, 'institucion_beneficiaria': 72, 'clave_" - "rastreo': 'CR1539036578', 'fecha_operacion': 20181008, 'monto': " - "2046, 'estado': 'submitted', 'cuenta_ordenante': '64618015700000" - "0004', 'cuenta_beneficiario': '72691004495711499'}\n\nSPEID/CUEN" - "CA submitted (2):\n{'orden_id': 'None', 'institucion_ordenante':" - " 646, 'institucion_beneficiaria': 72, 'clave_rastreo': 'CUENCA15" - "44567707', 'fecha_operacion': 20181211, 'monto': 231, 'estado': " - "'submitted', 'cuenta_ordenante': '646180157063641989', 'cuenta_b" - "eneficiario': '72691004495711499'}\n{'id': 'SP5q1a3wCVC3g4BU0uY5" - "fZE', 'clave_rastreo': 'CUENCA1544567707', 'created_at': '11-12-" - "2018 22:12:1544567707', 'amount': 231, 'status': 'submitted', 'n" - "umero_referencia': '4091444'}\n\nSPEID/CUENCA succeeded (2):\n{'" - "orden_id': 28282738, 'institucion_ordenante': 90646, 'institucio" - "n_beneficiaria': 40012, 'clave_rastreo': 'CUENCA1556029364', 'fe" - "cha_operacion': 20190423, 'monto': 150000, 'estado': 'succeeded'" - ", 'cuenta_ordenante': '646180157062370426', 'cuenta_beneficiario" - "': '4152313498971212'}\n{'id': 'SP3qKlB2zTEtrSIbXrJZGcA2', 'clav" - "e_rastreo': 'CUENCA1556029364', 'created_at': '23-04-2019 14:04:" - "1556029441', 'amount': 150000, 'status': 'succeeded', 'numero_re" - "ferencia': '5705984'}\n\nSPEID/CUENCA different status (2):\n{'o" - "rden_id': 8489980, 'institucion_ordenante': 40127, 'institucion_" - "beneficiaria': 90646, 'clave_rastreo': '190423070825308455I', 'f" - "echa_operacion': 20190423, 'monto': 10000, 'estado': 'None', 'cu" - "enta_ordenante': '127180013501165438', 'cuenta_beneficiario': '6" - "46180157029206957'}\n{'id': 'SP4v371cyTNvV1TgQtRWbCz8', 'clave_r" - "astreo': '190423070825308455I', 'created_at': '23-04-2019 03:04:" - "1555989127', 'amount': 10000, 'status': 'succeeded', 'numero_ref" - "erencia': '206957'}\n\nSPEID/CUENCA others (0):\n") + body = ( + "STP received successfully (1):\n" + "{'id': 22672732, 'institucion': 'STP', 'contraparte': 'BAN" + "ORTE/IXE', 'rastreo': 'HG745321', 'fecha_operacion': 20181213, '" + "monto': 1435, 'estado_orden': 'Liquidada', 'referencia_numerica'" + ": 7382253, 'ordenante': 'BANCO', 'cuenta_ordenante': '0726962736" + "48711499', 'rfc_curp_ordenante': 'ND', 'beneficiario': 'Carlos C" + "astro', 'cuenta_beneficiario': '646180827000027384', 'rfc_curp_b" + "eneficiario': 'ND', 'concepto_pago': 'PRUEBA', 'empresa': 'TAMIZ" + "I'}\n\nSTP sent successfully (1):\n{'id': 25663741, 'institucion" + "': 'STP', 'contraparte': 'BANORTE/IXE', 'rastreo': 'CUENCA263', " + "'fecha_operacion': 20190301, 'monto': 2500000, 'estado_orden': '" + "Liquidada', 'referencia_numerica': 3526516, 'ordenante': 'TAMIZI" + " SA DE CV', 'cuenta_ordenante': '646187283000000004', 'rfc_curp_" + "ordenante': 'TAM180309C16', 'beneficiario': 'Optimizacion de Rec" + "ursos Regalii', 'cuenta_beneficiario': '072078002960364722', 'rf" + "c_curp_beneficiario': 'None', 'concepto_pago': 'mas dinero', 'em" + "presa': 'TAMIZI'}\n\nSTP others (1):\n{'id': 7432344, 'instituci" + "on': 'STP', 'contraparte': 'ACCENDO BANCO', 'rastreo': 'MANU-006" + "47368751', 'fecha_operacion': 20190116, 'monto': 100000, 'estado" + "_orden': 'Devuelta', 'referencia_numerica': 19843, 'ordenante': " + "'None', 'cuenta_ordenante': 'None', 'rfc_curp_ordenante': 'None'" + ", 'beneficiario': 'Josefina Antonieta Caras Noriega', 'cuenta_be" + "neficiario': '646180157020536253', 'rfc_curp_beneficiario': 'ND'" + ", 'concepto_pago': 'FONDEO', 'empresa': 'TAMIZI'}\n\nSPEID submi" + "tted (1):\n{'orden_id': 'None', 'institucion_ordenante': 646, 'i" + "nstitucion_beneficiaria': 14, 'clave_rastreo': 'CR1540950253', '" + "fecha_operacion': 20181031, 'monto': 120, 'estado': 'submitted'," + " 'cuenta_ordenante': '12180026543282738', 'cuenta_beneficiario':" + " '14180567188562673'}\n\nSPEID success (1):\n{'orden_id': 244834" + "6, 'institucion_ordenante': 12, 'institucion_beneficiaria': 'Non" + "e', 'clave_rastreo': 'PRUEBATAMIZI1', 'fecha_operacion': 2018061" + "8, 'monto': 10000, 'estado': 'success', 'cuenta_ordenante': '846" + "267300500000008', 'cuenta_beneficiario': '646180157000037824'}\n" + "\nSPEID others (0):\n\nCUENCA created (1):\n{'id': '" + "SP36XEZuOVZms7VtutjzYvcf', 'clave_rastreo': 'CUENCA1552184653', " + "'created_at': '09-03-2019 04:03:1552104253', 'amount': 3450, 'st" + "atus': 'created', 'numero_referencia': '7263564'}\n\nCUENCA subm" + "itted (1):\n{'id': 'LT2F8RtCjZwI2DQvJAPe5b00', 'clave_rastreo': " + "'CUENCA1541512409', 'created_at': '06-11-2018 13:11:1541512409'," + " 'amount': 1000, 'status': 'submitted', 'numero_referencia': '56" + "65503'}\n\nCUENCA succeeded (0):\n\nCUENCA others (0):\n\nSTP/CU" + "ENCA (0):\n\nSTP/SPEID same status (2):\n{'id': 6345658, 'instit" + "ucion': 'STP', 'contraparte': 'BBVA BANCOMER', 'rastreo': '00264" + "73000265786', 'fecha_operacion': 20181031, 'monto': 675600, 'est" + "ado_orden': 'Confirmada', 'referencia_numerica': 3165364, 'orden" + "ante': 'CC MEXICO HOLDINGS S DE RL DE CV', 'cuenta_ordenante': " + "'012180001571847460', 'rfc_curp_ordenante': 'CMH6476252M1', 'ben" + "eficiario': 'Dario Davila', 'cuenta_beneficiario': '646180157029" + "907647', 'rfc_curp_beneficiario': 'None', 'concepto_pago': 'CITA" + "DEL74651591', 'empresa': 'TAMIZI'}\n{'orden_id': 6345658, 'insti" + "tucion_ordenante': 12, 'institucion_beneficiaria': 'None', 'clav" + "e_rastreo': '0026473000265786', 'fecha_operacion': 20181031, 'mo" + "nto': 3165364, 'estado': 'success', 'cuenta_ordenante': '0121800" + "01571847460', 'cuenta_beneficiario': '646180157029907647'}\n\nST" + "P/SPEID different status (2):\n{'id': 21073705, 'institucion': '" + "STP', 'contraparte': 'BANORTE/IXE', 'rastreo': 'CR1539036578', '" + "fecha_operacion': 20181008, 'monto': 2046, 'estado_orden': 'Liqu" + "idada', 'referencia_numerica': 3314058, 'ordenante': 'BANCO', 'c" + "uenta_ordenante': '646180157000000004', 'rfc_curp_ordenante': 'N" + "D', 'beneficiario': 'Ricardo Sánchez', 'cuenta_beneficiario': '0" + "72691004495711499', 'rfc_curp_beneficiario': 'ND', 'concepto_pag" + "o': 'PRUEBA', 'empresa': 'TAMIZI'}\n{'orden_id': 21073705, 'inst" + "itucion_ordenante': 646, 'institucion_beneficiaria': 72, 'clave_" + "rastreo': 'CR1539036578', 'fecha_operacion': 20181008, 'monto': " + "2046, 'estado': 'submitted', 'cuenta_ordenante': '64618015700000" + "0004', 'cuenta_beneficiario': '72691004495711499'}\n\nSPEID/CUEN" + "CA submitted (2):\n{'orden_id': 'None', 'institucion_ordenante':" + " 646, 'institucion_beneficiaria': 72, 'clave_rastreo': 'CUENCA15" + "44567707', 'fecha_operacion': 20181211, 'monto': 231, 'estado': " + "'submitted', 'cuenta_ordenante': '646180157063641989', 'cuenta_b" + "eneficiario': '72691004495711499'}\n{'id': 'SP5q1a3wCVC3g4BU0uY5" + "fZE', 'clave_rastreo': 'CUENCA1544567707', 'created_at': '11-12-" + "2018 22:12:1544567707', 'amount': 231, 'status': 'submitted', 'n" + "umero_referencia': '4091444'}\n\nSPEID/CUENCA succeeded (2):\n{'" + "orden_id': 28282738, 'institucion_ordenante': 90646, 'institucio" + "n_beneficiaria': 40012, 'clave_rastreo': 'CUENCA1556029364', 'fe" + "cha_operacion': 20190423, 'monto': 150000, 'estado': 'succeeded'" + ", 'cuenta_ordenante': '646180157062370426', 'cuenta_beneficiario" + "': '4152313498971212'}\n{'id': 'SP3qKlB2zTEtrSIbXrJZGcA2', 'clav" + "e_rastreo': 'CUENCA1556029364', 'created_at': '23-04-2019 14:04:" + "1556029441', 'amount': 150000, 'status': 'succeeded', 'numero_re" + "ferencia': '5705984'}\n\nSPEID/CUENCA different status (2):\n{'o" + "rden_id': 8489980, 'institucion_ordenante': 40127, 'institucion_" + "beneficiaria': 90646, 'clave_rastreo': '190423070825308455I', 'f" + "echa_operacion': 20190423, 'monto': 10000, 'estado': 'None', 'cu" + "enta_ordenante': '127180013501165438', 'cuenta_beneficiario': '6" + "46180157029206957'}\n{'id': 'SP4v371cyTNvV1TgQtRWbCz8', 'clave_r" + "astreo': '190423070825308455I', 'created_at': '23-04-2019 03:04:" + "1555989127', 'amount': 10000, 'status': 'succeeded', 'numero_ref" + "erencia': '206957'}\n\nSPEID/CUENCA others (0):\n" + ) return body @pytest.fixture(scope='module') def file_recon2(): - body = ("STP received successfully (1):\n" - "{'id': 22673745, 'institucion': 'STP', 'contraparte': 'BAN" - "ORTE/IXE', 'rastreo': 'GH458434', 'fecha_operacion': 20181213, '" - "monto': 3000, 'estado_orden': 'Liquidada', 'referencia_numerica'" - ": 7382253, 'ordenante': 'BANCO', 'cuenta_ordenante': '3336962736" - "48711499', 'rfc_curp_ordenante': 'ND', 'beneficiario': 'Carlos C" - "astro', 'cuenta_beneficiario': '646180827000027384', 'rfc_curp_b" - "eneficiario': 'ND', 'concepto_pago': 'PRUEBA', 'empresa': 'TAMIZ" - "I'}\n\nSTP sent successfully (0):\n\nSTP others (0):\n\nSPEID su" - "ccess (0):\n\nSPEID others (0):\n\nCUENCA created (0):\n\nCUENCA" - " submitted (0):\n\nCUENCA succeeded (0):\n\nCUENCA others (0):\n" - "\nSTP/CUENCA (0):\n\nSTP/SPEID same status (0):\n\nSTP/SPEID dif" - "ferent status (0):\n\nSPEID/CUENCA submitted (0):\n\nSPEID/CUENC" - "A succeeded (0):\n\nSPEID/CUENCA different status (0):\n\nSPEID/" - "CUENCA others (0):\n") + body = ( + "STP received successfully (1):\n" + "{'id': 22673745, 'institucion': 'STP', 'contraparte': 'BAN" + "ORTE/IXE', 'rastreo': 'GH458434', 'fecha_operacion': 20181213, '" + "monto': 3000, 'estado_orden': 'Liquidada', 'referencia_numerica'" + ": 7382253, 'ordenante': 'BANCO', 'cuenta_ordenante': '3336962736" + "48711499', 'rfc_curp_ordenante': 'ND', 'beneficiario': 'Carlos C" + "astro', 'cuenta_beneficiario': '646180827000027384', 'rfc_curp_b" + "eneficiario': 'ND', 'concepto_pago': 'PRUEBA', 'empresa': 'TAMIZ" + "I'}\n\nSTP sent successfully (0):\n\nSTP others (0):\n\nSPEID su" + "ccess (0):\n\nSPEID others (0):\n\nCUENCA created (0):\n\nCUENCA" + " submitted (0):\n\nCUENCA succeeded (0):\n\nCUENCA others (0):\n" + "\nSTP/CUENCA (0):\n\nSTP/SPEID same status (0):\n\nSTP/SPEID dif" + "ferent status (0):\n\nSPEID/CUENCA submitted (0):\n\nSPEID/CUENC" + "A succeeded (0):\n\nSPEID/CUENCA different status (0):\n\nSPEID/" + "CUENCA others (0):\n" + ) return body diff --git a/tests/helpers/test_callback_helper.py b/tests/helpers/test_callback_helper.py index 06542bd0..85bf637d 100644 --- a/tests/helpers/test_callback_helper.py +++ b/tests/helpers/test_callback_helper.py @@ -1,11 +1,8 @@ import json from datetime import datetime -from speid.helpers.callback_helper import ( - auth_header, - send_transaction, - set_status_transaction, -) +from speid.helpers.callback_helper import (auth_header, send_transaction, + set_status_transaction) from speid.models import Transaction diff --git a/tests/models/test_transactions.py b/tests/models/test_transactions.py index 48853135..7d0efd15 100644 --- a/tests/models/test_transactions.py +++ b/tests/models/test_transactions.py @@ -1,5 +1,6 @@ import pytest from pydantic import ValidationError +from stpmex.types import TipoCuenta from speid.models import Event, Transaction from speid.types import Estado, EventType @@ -142,31 +143,87 @@ def test_transaction_speid_input_validation_error(): SpeidTransaction(**order) -def test_get_order(): - transaction = Transaction( +def test_transaction_speid_clabe_cuenta_beneficiario(): + order = dict( concepto_pago='PRUEBA', institucion_ordenante='646', cuenta_beneficiario='072691004495711499', institucion_beneficiaria='072', monto=1020, + nombre_beneficiario='Ricardo Sánchez', + nombre_ordenante='BANCO', + cuenta_ordenante='646180157000000004', + rfc_curp_ordenante='ND', + speid_id='speid_id', + version=1, + ) + input = SpeidTransaction(**order) + assert input.tipo_cuenta_beneficiario is TipoCuenta.clabe.value + + +def test_transaction_speid_card_cuenta_beneficiario(): + order = dict( + concepto_pago='PRUEBA', + institucion_ordenante='646', + cuenta_beneficiario='5439240312453006', + institucion_beneficiaria='072', + monto=1020, + nombre_beneficiario='Ricardo Sánchez', + nombre_ordenante='BANCO', + cuenta_ordenante='646180157000000004', + rfc_curp_ordenante='ND', + speid_id='speid_id', + version=1, + ) + input = SpeidTransaction(**order) + assert input.tipo_cuenta_beneficiario is TipoCuenta.card.value + + +def test_transaction_speid_non_valid_cuenta_beneficiario(): + order = dict( + concepto_pago='PRUEBA', + institucion_ordenante='646', + cuenta_beneficiario='12345', + institucion_beneficiaria='072', + monto=1020, + nombre_beneficiario='Ricardo Sánchez', + nombre_ordenante='BANCO', + cuenta_ordenante='646180157000000004', + rfc_curp_ordenante='ND', + speid_id='speid_id', + version=1, + ) + with pytest.raises(ValueError): + SpeidTransaction(**order) + + +def test_get_order(): + transaction = Transaction( + concepto_pago='PRUEBA', + institucion_ordenante='90646', + cuenta_beneficiario='072691004495711499', + institucion_beneficiaria='40072', + monto=1020, nombre_beneficiario='Ricardo Sánchez Castillo de la Mancha S.A. de CV', - nombre_ordenante='Ricardo Sánchez Castillo de la Mancha S.A. de CV', + nombre_ordenante=' Ricardo Sánchez Castillo de la Mancha S.A. de CV', cuenta_ordenante='646180157000000004', rfc_curp_ordenante='ND', speid_id='speid_id', + tipo_cuenta_beneficiario=40, ) order = transaction.get_order() - assert order.fechaOperacion is None assert order.institucionOperante == transaction.institucion_ordenante assert order.institucionContraparte == transaction.institucion_beneficiaria + assert order.monto == 10.20 assert transaction.clave_rastreo == order.claveRastreo assert transaction.tipo_cuenta_beneficiario == order.tipoCuentaBeneficiario assert transaction.rfc_curp_beneficiario == order.rfcCurpBeneficiario assert transaction.referencia_numerica == order.referenciaNumerica - assert transaction.empresa == order.empresa - assert order.nombreBeneficiario == 'Ricardo Sánchez Castillo de la Mancha' - assert order.nombreOrdenante == 'Ricardo Sánchez Castillo de la Mancha' - assert len(order.nombreBeneficiario) == 37 - assert len(order.nombreOrdenante) == 37 + assert order.nombreBeneficiario == ( + 'Ricardo Sanchez Castillo de la Mancha' ' S' + ) + assert order.nombreOrdenante == 'Ricardo Sanchez Castillo de la Mancha S' + assert len(order.nombreBeneficiario) == 39 + assert len(order.nombreOrdenante) == 39 diff --git a/tests/tasks/test_orders.py b/tests/tasks/test_orders.py index cacaf840..91bb3c12 100644 --- a/tests/tasks/test_orders.py +++ b/tests/tasks/test_orders.py @@ -55,9 +55,9 @@ def test_malformed_order_worker(mock_callback_api): def test_create_order_debit_card(): order = dict( concepto_pago='DebitCardTest', - institucion_ordenante='646', + institucion_ordenante='90646', cuenta_beneficiario='4242424242424242', - institucion_beneficiaria='072', + institucion_beneficiaria='40072', monto=1020, nombre_beneficiario='Pach', nombre_ordenante='BANCO', diff --git a/tests/views/conftest.py b/tests/views/conftest.py index b1d3cfe3..16080777 100644 --- a/tests/views/conftest.py +++ b/tests/views/conftest.py @@ -16,11 +16,12 @@ def client(): def default_outcome_transaction(): return dict( concepto_pago='PRUEBA', - institucion_ordenante='646', + institucion_ordenante='90646', cuenta_beneficiario='072691004495711499', - institucion_beneficiaria='072', + institucion_beneficiaria='40072', monto=2511, nombre_beneficiario='Ricardo Sánchez', + tipo_cuenta_beneficiario=40, nombre_ordenante='BANCO', cuenta_ordenante='646180157000000004', rfc_curp_ordenante='ND', @@ -48,7 +49,7 @@ def default_blocked_transaction(): RFCCurpBeneficiario="ND", ConceptoPago="PRUEBA BLOQUEO", ReferenciaNumerica=2423, - Empresa="TAMIZI" + Empresa="TAMIZI", ) diff --git a/tests/views/test_general.py b/tests/views/test_general.py index 33776fbf..d01928ed 100644 --- a/tests/views/test_general.py +++ b/tests/views/test_general.py @@ -96,8 +96,9 @@ def test_invalid_id_order_event(client, default_outcome_transaction): trx.delete() -def test_order_event_duplicated(client, default_outcome_transaction, - mock_callback_api): +def test_order_event_duplicated( + client, default_outcome_transaction, mock_callback_api +): trx = Transaction(**default_outcome_transaction) trx.stp_id = DEFAULT_ORDEN_ID trx.save() @@ -127,8 +128,9 @@ def test_create_orden(client, default_income_transaction, mock_callback_api): transaction.delete() -def test_create_orden_duplicated(client, default_income_transaction, - mock_callback_api): +def test_create_orden_duplicated( + client, default_income_transaction, mock_callback_api +): resp = client.post('/ordenes', json=default_income_transaction) transaction = Transaction.objects.order_by('-created_at').first() assert transaction.estado is Estado.succeeded @@ -152,10 +154,12 @@ def test_create_orden_duplicated(client, default_income_transaction, def test_create_orden_blocked( - client, default_blocked_transaction, mock_callback_api): + client, default_blocked_transaction, mock_callback_api +): resp = client.post('/ordenes', json=default_blocked_transaction) transaction = Transaction.objects.get( - stp_id=default_blocked_transaction['Clave']) + stp_id=default_blocked_transaction['Clave'] + ) assert transaction.estado is Estado.error assert resp.status_code == 201 assert resp.json['estado'] == 'LIQUIDACION' @@ -201,8 +205,12 @@ def test_create_orden_without_ordenante(client, mock_callback_api): transaction.delete() -def test_get_transactions(client, default_income_transaction, - default_outcome_transaction, mock_callback_api): +def test_get_transactions( + client, + default_income_transaction, + default_outcome_transaction, + mock_callback_api, +): resp = client.post('/ordenes', json=default_income_transaction) assert resp.status_code == 201 trx_in = Transaction.objects.order_by('-created_at').first() @@ -211,13 +219,15 @@ def test_get_transactions(client, default_income_transaction, trx_out.stp_id = DEFAULT_ORDEN_ID trx_out.save() - resp = client.get('/transactions?' - 'status=submitted&prefix_ordenante=6461801570') + resp = client.get( + '/transactions?' 'status=submitted&prefix_ordenante=6461801570' + ) assert resp.status_code == 200 assert str(trx_out.id) == resp.json[0]['_id']['$oid'] - resp = client.get('/transactions?' - 'status=submitted&prefix_beneficiario=6461801570') + resp = client.get( + '/transactions?' 'status=submitted&prefix_beneficiario=6461801570' + ) assert resp.status_code == 200 assert str(trx_in.id) == resp.json[0]['_id']['$oid'] @@ -234,8 +244,9 @@ def test_process_transaction(client, default_outcome_transaction): assert trx.estado is Estado.submitted - resp = client.get('/transactions?' - 'status=submitted&prefix_ordenante=6461801570') + resp = client.get( + '/transactions?' 'status=submitted&prefix_ordenante=6461801570' + ) assert resp.status_code == 200 resp = client.patch(f'/transactions/{resp.json[0]["_id"]["$oid"]}/process') @@ -247,16 +258,18 @@ def test_process_transaction(client, default_outcome_transaction): trx.delete() -def test_reverse_transaction(client, default_outcome_transaction, - mock_callback_api): +def test_reverse_transaction( + client, default_outcome_transaction, mock_callback_api +): trx = Transaction(**default_outcome_transaction) trx.stp_id = DEFAULT_ORDEN_ID trx.save() assert trx.estado is Estado.submitted - resp = client.get('/transactions?' - 'status=submitted&prefix_ordenante=6461801570') + resp = client.get( + '/transactions?' 'status=submitted&prefix_ordenante=6461801570' + ) assert resp.status_code == 200 resp = client.patch(f'/transactions/{resp.json[0]["_id"]["$oid"]}/reverse')