Files

172 lines
5.6 KiB
Python

"""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"