Files
agent_contas/tests/migration/test_dispute_actions_remaining_parity.py

86 lines
4.2 KiB
Python

from __future__ import annotations
from app.domain.contas.workflow_actions import build_contas_workflow_actions
class Client:
def __init__(self):
self.sms_args=None; self.status_payload=None; self.tracking_payload=None; self.protocol_payload=None
self.fail_protocol=False; self.fail_status=False
def sms(self, msisdn, message, **ctx):
self.sms_args=(msisdn,message,ctx)
return {"resource_url":"http://sms/mock","_transport":{"attempts":[{"api_url":"http://mock/sms","status_code":200,"latency_ms":1}]}}
def status_sr(self,payload):
self.status_payload=payload
if self.fail_status: raise RuntimeError("status fail")
return {"ok":True,"_transport":{"attempts":[{"api_url":"http://mock/status","status_code":200,"latency_ms":1}]}}
def tracking(self,payload): self.tracking_payload=payload; return {"ok":True}
def abrir_protocolo(self,payload):
self.protocol_payload=payload
if self.fail_protocol: raise RuntimeError("gateway indisponivel")
return {"interactionProtocol":"CCM-1"}
class Service:
def __init__(self): self.client=Client()
def test_sms_usa_barcode_titular_e_payload_padrao():
s=Service(); a=build_contas_workflow_actions(s).get("enviar_sms")
out=a({"msisdn":"15981110643"},{"input":{"msisdn":"11964200059"},"vars":{"abrir_contestacao_cliente":{"barcode":"3419179001"}}})
assert out["success"] is True
msisdn,message,ctx=s.client.sms_args
assert msisdn == "15981110643"
assert message == "Codigo do boleto: 3419179001"
assert ctx["sender_name"] == "TIM Brasil"
assert ctx["long_url"] == "https://meutim.com.br"
assert out["sms_not_send_error"] is False
def test_sms_falha_nao_interrompe_fluxo_e_marca_flag():
s=Service()
def fail(*args,**kwargs): raise RuntimeError("sms fail")
s.client.sms=fail
a=build_contas_workflow_actions(s).get("enviar_sms")
out=a({"msisdn":"119"},{"input":{}})
assert out["success"] is True
assert out["sms_sent"] is False
assert out["sms_not_send_error"] is True
def test_conta_certa_manual_falha_api_e_best_effort():
s=Service(); s.client.fail_protocol=True
a=build_contas_workflow_actions(s).get("abrir_sr_conta_certa_manual")
out=a({"msisdn":"119","social_sec_no":"123","dia_vencimento":"20"},{"input":{}})
assert out["success"] is True
assert out["status"] == "Encaminhado"
assert out["sr_conta_certa_id"] == ""
assert out["conta_certa_manual_error"] is True
assert s.client.protocol_payload["reason3"].endswith("20")
def test_status_sr_sms_path_e_tracking_completo():
s=Service(); a=build_contas_workflow_actions(s).get("atualizar_status_sr")
state={"input":{},"vars":{
"registrar_protocolo":{"protocolo_id":"PRT-10"},
"enviar_sms":{"sms_sent":True,"sms_not_send_error":False},
"check_invoice_status":{"open_invoices":[{"invoiceId":"300","invoiceStatus":"A Vencer","issueDate":"2026-06-01","dueDate":"2026-06-20","openAmount":"349.29","amount":"349.29"}]},
}}
out=a({"msisdn":"119","scenario":"contestacao","current_invoice_number":"300","social_sec_no":"123.456.789-01","invoice_amount_open":"349.29","invoice_amount":"349.29"},state)
assert out["success"] is True and out["protocol_closed"] is True
assert out["format_text"] == "sms" and out["resolution_type"] == "new_boleto"
assert s.client.status_payload["reason1"] == "Reclamação"
assert s.client.status_payload["reason2"] == "Conta"
assert s.client.status_payload["reason3"] == "Valor"
assert s.client.tracking_payload["protocolNumber"] == "PRT-10"
assert s.client.tracking_payload["invoiceEmissionDate"] == "2026-06-01T00:00:00.00Z"
assert s.client.tracking_payload["invoiceExpirationDate"] == "2026-06-20T00:00:00.00Z"
assert s.client.tracking_payload["invoiceStatus"] == "Aberto"
def test_status_sr_nao_faz_tracking_de_fatura_errada():
s=Service(); a=build_contas_workflow_actions(s).get("atualizar_status_sr")
state={"vars":{"registrar_protocolo":{"protocolo_id":"P"},"check_invoice_status":{"open_invoices":[{"invoiceId":"OTHER"}]}}}
out=a({"msisdn":"119","scenario":"contestacao","current_invoice_number":"TARGET"},state)
assert out["success"] is True
assert s.client.tracking_payload is None