71 lines
2.6 KiB
Python
71 lines
2.6 KiB
Python
import json
|
|
from pathlib import Path
|
|
|
|
import pytest
|
|
from click.testing import CliRunner
|
|
|
|
from cyclone.cli import main
|
|
from cyclone.parsers.payer import PayerConfig
|
|
|
|
|
|
FIXTURE = Path(__file__).parent / "fixtures" / "minimal_837p.txt"
|
|
|
|
|
|
def test_cli_parse_837_writes_outputs(tmp_path: Path):
|
|
runner = CliRunner()
|
|
result = runner.invoke(main, ["parse-837", str(FIXTURE), "--output-dir", str(tmp_path)])
|
|
assert result.exit_code == 0, result.output
|
|
written = list(tmp_path.glob("claim-*.json"))
|
|
assert len(written) == 1
|
|
summary = json.loads((tmp_path / "summary.json").read_text())
|
|
assert summary["total_claims"] == 1
|
|
assert summary["passed"] == 1
|
|
|
|
|
|
def test_cli_parse_837_with_strict(tmp_path: Path):
|
|
runner = CliRunner()
|
|
result = runner.invoke(main, ["parse-837", str(FIXTURE), "--output-dir", str(tmp_path), "--strict"])
|
|
assert result.exit_code == 0
|
|
# Strict should not change anything on a passing claim
|
|
summary = json.loads((tmp_path / "summary.json").read_text())
|
|
assert summary["passed"] == 1
|
|
|
|
|
|
def test_cli_parse_837_with_no_raw_segments(tmp_path: Path):
|
|
runner = CliRunner()
|
|
result = runner.invoke(main, ["parse-837", str(FIXTURE), "--output-dir", str(tmp_path), "--no-raw-segments"])
|
|
assert result.exit_code == 0
|
|
data = json.loads(next(tmp_path.glob("claim-*.json")).read_text())
|
|
assert data["raw_segments"] == []
|
|
|
|
|
|
def test_cli_unknown_payer_uses_generic(tmp_path: Path):
|
|
runner = CliRunner()
|
|
result = runner.invoke(main, ["parse-837", str(FIXTURE), "--output-dir", str(tmp_path), "--payer", "generic_837p"])
|
|
assert result.exit_code == 0
|
|
|
|
|
|
def test_cli_missing_file_exits_2(tmp_path: Path):
|
|
runner = CliRunner()
|
|
result = runner.invoke(main, ["parse-837", "/no/such/file.txt", "--output-dir", str(tmp_path)])
|
|
assert result.exit_code == 2
|
|
|
|
|
|
@pytest.mark.skipif(
|
|
not (Path(__file__).parent.parent.parent / "docs" / "prodfiles" / "837p-from-axiscare").exists(),
|
|
reason="prodfile corpus not present",
|
|
)
|
|
def test_cli_runs_against_prodfiles(tmp_path: Path):
|
|
"""Smoke test: run the CLI against a real production file if available."""
|
|
from glob import glob
|
|
runner = CliRunner()
|
|
corpus = Path(__file__).parent.parent.parent / "docs" / "prodfiles" / "837p-from-axiscare"
|
|
files = sorted(glob(str(corpus / "*.txt")))
|
|
if not files:
|
|
pytest.skip("no prodfile .txt files in corpus")
|
|
sample = files[0]
|
|
result = runner.invoke(main, ["parse-837", sample, "--output-dir", str(tmp_path)])
|
|
assert result.exit_code == 0, result.output
|
|
summary = json.loads((tmp_path / "summary.json").read_text())
|
|
assert summary["total_claims"] >= 1
|