"""Tests for the 835 ERA Pydantic models.""" import json from datetime import date from decimal import Decimal from cyclone.parsers.models import Address, BatchSummary, Envelope from cyclone.parsers.models_835 import ( ClaimAdjustment, ClaimPayment, FinancialInfo, ParseResult835, Payer835, Payee835, ReassociationTrace, ServicePayment, claim_status_label, ) def _build_result() -> ParseResult835: return ParseResult835( envelope=Envelope( sender_id="COMEDASSISTPROG", receiver_id="TPID001", control_number="991102984", transaction_date=date(2026, 6, 17), implementation_guide="005010X221A1", ), financial_info=FinancialInfo( handling_code="C", paid_amount=Decimal("85.00"), credit_debit_flag="C", payment_method="ACH", payer_tax_id="81-1725341", payment_date=date(2026, 6, 17), ), trace=ReassociationTrace( trace_type_code="1", trace_number="991102984", originating_company_id="TPID001", payer_id="81-1725341", ), payer=Payer835( name="CO_TXIX", id="7912900843", contact_url="hcpf.colorado.gov", address=Address(line1="PO BOX 11000", city="DENVER", state="CO", zip="802110000"), ), payee=Payee835( name="TOC, Inc.", npi="1881068062", address=Address(line1="1100 East Main St", line2="Suite A", city="Montrose", state="CO", zip="814014063"), ), claims=[ ClaimPayment( payer_claim_control_number="CLM001", status_code="1", status_label="Processed as Primary", total_charge=Decimal("100.00"), total_paid=Decimal("85.00"), patient_responsibility=Decimal("15.00"), claim_filing_indicator="MC", original_claim_id="CLM001", facility_type="12", frequency_code="1", per_diem_covered_days=None, ref_benefit_plan=None, service_payments=[ ServicePayment( line_number=1, procedure_qualifier="HC", procedure_code="S5130", modifiers=["U2"], charge=Decimal("60.00"), payment=Decimal("50.00"), units=Decimal("7.73"), unit_type="UN", service_date=date(2026, 6, 2), adjustments=[ ClaimAdjustment(group_code="CO", reason_code="45", amount=Decimal("10.00"), quantity=None), ], ref_benefit_plan=None, ), ], raw_segments=[["CLP", "CLM001", "1", "100.00", "85.00"]], ) ], summary=BatchSummary( input_file="f", control_number="991102984", transaction_date=date(2026, 6, 17), total_claims=1, passed=1, failed=0, ), ) def test_financial_info_decimal_paid_amount(): f = FinancialInfo(handling_code="C", paid_amount=Decimal("85.00"), credit_debit_flag="C") assert f.paid_amount == Decimal("85.00") assert f.payer_tax_id is None assert f.payment_date is None def test_reassociation_trace_required(): t = ReassociationTrace(trace_type_code="1", trace_number="X", originating_company_id="Y") assert t.payer_id is None def test_payer835_optional_fields(): p = Payer835(name="X") assert p.id is None assert p.address is None assert p.contact_url is None def test_payee835_required_npi(): p = Payee835(name="TOC", npi="1881068062") assert p.npi == "1881068062" def test_claim_adjustment_quantity_optional(): a = ClaimAdjustment(group_code="CO", reason_code="45", amount=Decimal("10.00")) assert a.quantity is None def test_service_payment_modifiers_default_empty(): sp = ServicePayment( line_number=1, procedure_qualifier="HC", procedure_code="99213", charge=Decimal("100.00"), payment=Decimal("85.00"), ) assert sp.modifiers == [] assert sp.adjustments == [] def test_claim_payment_status_label_decoded(): c = ClaimPayment( payer_claim_control_number="X", status_code="1", total_charge=Decimal("100"), total_paid=Decimal("85"), ) assert c.status_label == "Processed as Primary" assert claim_status_label("4") == "Denied" assert claim_status_label("25") == "Predetermination Pricing Only" assert claim_status_label("99") is None # unknown → None def test_parse_result835_date_serializes_to_iso(): r = _build_result() blob = r.model_dump() assert blob["envelope"]["transaction_date"] == "2026-06-17" assert blob["financial_info"]["payment_date"] == "2026-06-17" assert blob["claims"][0]["service_payments"][0]["service_date"] == "2026-06-02" def test_parse_result835_full_round_trip(): r = _build_result() blob = json.loads(r.model_dump_json()) assert blob["envelope"]["control_number"] == "991102984" assert blob["payer"]["name"] == "CO_TXIX" assert blob["payee"]["npi"] == "1881068062" assert blob["claims"][0]["payer_claim_control_number"] == "CLM001" # Round-trip back to a model r2 = ParseResult835.model_validate(blob) assert r2.claims[0].total_paid == Decimal("85.00") assert r2.payer.contact_url == "hcpf.colorado.gov"