feat: add us-cpa case intake workflow
This commit is contained in:
80
skills/us-cpa/tests/test_cases.py
Normal file
80
skills/us-cpa/tests/test_cases.py
Normal file
@@ -0,0 +1,80 @@
|
||||
from __future__ import annotations
|
||||
|
||||
import json
|
||||
import tempfile
|
||||
import unittest
|
||||
from pathlib import Path
|
||||
|
||||
from us_cpa.cases import CaseConflictError, CaseManager
|
||||
|
||||
|
||||
class CaseManagerTests(unittest.TestCase):
|
||||
def test_create_case_builds_expected_layout(self) -> None:
|
||||
with tempfile.TemporaryDirectory() as temp_dir:
|
||||
case_dir = Path(temp_dir) / "2025-jane-doe"
|
||||
manager = CaseManager(case_dir)
|
||||
|
||||
manifest = manager.create_case(case_label="Jane Doe", tax_year=2025)
|
||||
|
||||
self.assertEqual(manifest["caseLabel"], "Jane Doe")
|
||||
self.assertEqual(manifest["taxYear"], 2025)
|
||||
for name in (
|
||||
"input",
|
||||
"extracted",
|
||||
"return",
|
||||
"output",
|
||||
"reports",
|
||||
"issues",
|
||||
"sources",
|
||||
):
|
||||
self.assertTrue((case_dir / name).is_dir())
|
||||
self.assertTrue((case_dir / "case-manifest.json").exists())
|
||||
|
||||
def test_intake_registers_documents_and_user_facts(self) -> None:
|
||||
with tempfile.TemporaryDirectory() as temp_dir:
|
||||
root = Path(temp_dir)
|
||||
case_dir = root / "2025-jane-doe"
|
||||
document = root / "w2.txt"
|
||||
document.write_text("sample w2")
|
||||
manager = CaseManager(case_dir)
|
||||
manager.create_case(case_label="Jane Doe", tax_year=2025)
|
||||
|
||||
result = manager.intake(
|
||||
tax_year=2025,
|
||||
user_facts={"filingStatus": "single", "taxpayer.ssnLast4": "1234"},
|
||||
document_paths=[document],
|
||||
)
|
||||
|
||||
self.assertEqual(result["status"], "accepted")
|
||||
self.assertEqual(len(result["registeredDocuments"]), 1)
|
||||
self.assertTrue((case_dir / "input" / "w2.txt").exists())
|
||||
facts = json.loads((case_dir / "extracted" / "facts.json").read_text())
|
||||
self.assertEqual(facts["facts"]["filingStatus"]["value"], "single")
|
||||
|
||||
def test_conflicting_facts_raise_structured_issue(self) -> None:
|
||||
with tempfile.TemporaryDirectory() as temp_dir:
|
||||
case_dir = Path(temp_dir) / "2025-jane-doe"
|
||||
manager = CaseManager(case_dir)
|
||||
manager.create_case(case_label="Jane Doe", tax_year=2025)
|
||||
manager.intake(
|
||||
tax_year=2025,
|
||||
user_facts={"filingStatus": "single"},
|
||||
document_paths=[],
|
||||
)
|
||||
|
||||
with self.assertRaises(CaseConflictError) as context:
|
||||
manager.intake(
|
||||
tax_year=2025,
|
||||
user_facts={"filingStatus": "married_filing_jointly"},
|
||||
document_paths=[],
|
||||
)
|
||||
|
||||
issue = context.exception.issue
|
||||
self.assertEqual(issue["status"], "needs_resolution")
|
||||
self.assertEqual(issue["issueType"], "fact_conflict")
|
||||
self.assertEqual(issue["field"], "filingStatus")
|
||||
self.assertTrue((case_dir / "issues" / "open-issues.json").exists())
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main()
|
||||
@@ -4,6 +4,7 @@ import json
|
||||
import os
|
||||
import subprocess
|
||||
import sys
|
||||
import tempfile
|
||||
import unittest
|
||||
from pathlib import Path
|
||||
|
||||
@@ -66,6 +67,67 @@ class UsCpaCliSmokeTests(unittest.TestCase):
|
||||
self.assertNotEqual(result.returncode, 0)
|
||||
self.assertIn("case directory", result.stderr.lower())
|
||||
|
||||
def test_extract_docs_can_create_case_and_register_facts(self) -> None:
|
||||
with tempfile.TemporaryDirectory() as temp_dir:
|
||||
case_dir = Path(temp_dir) / "2025-jane-doe"
|
||||
facts_path = Path(temp_dir) / "facts.json"
|
||||
facts_path.write_text(json.dumps({"filingStatus": "single"}))
|
||||
|
||||
result = self.run_cli(
|
||||
"extract-docs",
|
||||
"--tax-year",
|
||||
"2025",
|
||||
"--case-dir",
|
||||
str(case_dir),
|
||||
"--create-case",
|
||||
"--case-label",
|
||||
"Jane Doe",
|
||||
"--facts-json",
|
||||
str(facts_path),
|
||||
)
|
||||
|
||||
self.assertEqual(result.returncode, 0, result.stderr)
|
||||
payload = json.loads(result.stdout)
|
||||
self.assertEqual(payload["status"], "accepted")
|
||||
self.assertEqual(payload["factCount"], 1)
|
||||
self.assertTrue((case_dir / "case-manifest.json").exists())
|
||||
|
||||
def test_extract_docs_stops_on_conflicts(self) -> None:
|
||||
with tempfile.TemporaryDirectory() as temp_dir:
|
||||
case_dir = Path(temp_dir) / "2025-jane-doe"
|
||||
first_facts = Path(temp_dir) / "facts-1.json"
|
||||
second_facts = Path(temp_dir) / "facts-2.json"
|
||||
first_facts.write_text(json.dumps({"filingStatus": "single"}))
|
||||
second_facts.write_text(json.dumps({"filingStatus": "married_filing_jointly"}))
|
||||
|
||||
first = self.run_cli(
|
||||
"extract-docs",
|
||||
"--tax-year",
|
||||
"2025",
|
||||
"--case-dir",
|
||||
str(case_dir),
|
||||
"--create-case",
|
||||
"--case-label",
|
||||
"Jane Doe",
|
||||
"--facts-json",
|
||||
str(first_facts),
|
||||
)
|
||||
self.assertEqual(first.returncode, 0, first.stderr)
|
||||
|
||||
second = self.run_cli(
|
||||
"extract-docs",
|
||||
"--tax-year",
|
||||
"2025",
|
||||
"--case-dir",
|
||||
str(case_dir),
|
||||
"--facts-json",
|
||||
str(second_facts),
|
||||
)
|
||||
self.assertNotEqual(second.returncode, 0)
|
||||
payload = json.loads(second.stdout)
|
||||
self.assertEqual(payload["status"], "needs_resolution")
|
||||
self.assertEqual(payload["issueType"], "fact_conflict")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main()
|
||||
|
||||
Reference in New Issue
Block a user