"""Tests for the GET /api/claims/{id}/serialize-837 endpoint (SP8).""" import io from pathlib import Path from fastapi.testclient import TestClient from cyclone.api import app def _seed_claim(client: TestClient) -> str: fixture = Path("tests/fixtures/co_medicaid_837p.txt").read_text() r = client.post( "/api/parse-837", files={"file": ("claim.txt", io.BytesIO(fixture.encode()), "text/plain")}, headers={"Accept": "application/json"}, ) assert r.status_code == 200, r.text claim_id = r.json()["claims"][0]["claim_id"] return claim_id def test_endpoint_returns_x12_attachment(): with TestClient(app) as client: claim_id = _seed_claim(client) r = client.get(f"/api/claims/{claim_id}/serialize-837") assert r.status_code == 200 assert r.headers["content-type"].startswith("text/x12") cd = r.headers["content-disposition"] assert "attachment" in cd assert f"claim-{claim_id}.x12" in cd assert r.text.startswith("ISA*") def test_endpoint_404_for_missing_claim(): with TestClient(app) as client: r = client.get("/api/claims/CLM-DOES-NOT-EXIST/serialize-837") assert r.status_code == 404 body = r.json() assert body["error"] == "Not found" assert "CLM-DOES-NOT-EXIST" in body["detail"] def test_endpoint_regenerated_text_round_trips_through_parser(): """The endpoint's body should be a parseable 837 — round-trip test.""" from cyclone.parsers.parse_837 import parse from cyclone.parsers.payer import PayerConfig with TestClient(app) as client: claim_id = _seed_claim(client) r = client.get(f"/api/claims/{claim_id}/serialize-837") assert r.status_code == 200 result = parse(r.text, PayerConfig(name="CO_MEDICAID")) assert result.claims, "endpoint body didn't parse back to any claims" assert result.claims[0].claim.claim_id == claim_id def test_endpoint_emits_real_submitter_and_receiver(): """SP40: the single-claim download must thread real submitter + receiver identity through, not the serializer's placeholder fallback. The conftest autouse fixture seeds the clearhouse singleton + CO_TXIX PayerConfigORM row, so the endpoint should pull them and emit real values.""" from cyclone import db as cycl_db from cyclone.db import ClearhouseORM from cyclone.store import store as cycl_store cycl_db.init_db() cycl_store.ensure_clearhouse_seeded() with TestClient(app) as client: claim_id = _seed_claim(client) r = client.get(f"/api/claims/{claim_id}/serialize-837") assert r.status_code == 200 body = r.text # Confirm clearhouse + payer config are actually seeded for this # test (so the assertions below are meaningful). with cycl_db.SessionLocal()() as s: ch = s.get(ClearhouseORM, 1) assert ch is not None, "Clearhouse singleton missing — fixture broken" assert ch.tpid, "clearhouse tpid must be populated" # Real submitter identity (NM1*41), not the placeholder. assert "Dzinesco" in body, body[:500] assert ch.tpid in body, body[:500] # Real submitter contact (PER segment). assert "Tyler Martinez" in body, body[:500] assert "tyler@dzinesco.com" in body, body[:500] # Real receiver (NM1*40). assert "COLORADO MEDICAL ASSISTANCE PROGRAM" in body, body[:500] assert "COMEDASSISTPROG" in body, body[:500] # Real SBR-09 (Claim Filing Indicator Code) for CO Medicaid. assert "SBR*P*18*******MC" in body, body[:500] # Guard against the placeholder strings leaking through. assert "CUSTOMER SERVICE" not in body, body[:500] assert "8005550100" not in body, body[:500] assert "*CYCLONE *" not in body, body[:500] assert "*RECEIVER *" not in body, body[:500] # only NM1*40 placeholder