76 lines
2.9 KiB
Python
76 lines
2.9 KiB
Python
from __future__ import annotations
|
|
|
|
import json
|
|
import tempfile
|
|
import unittest
|
|
from io import BytesIO
|
|
from pathlib import Path
|
|
|
|
from reportlab.pdfgen import canvas
|
|
|
|
from us_cpa.cases import CaseManager
|
|
from us_cpa.prepare import EfileExporter, PrepareEngine
|
|
from us_cpa.sources import TaxYearCorpus, bootstrap_irs_catalog
|
|
|
|
|
|
class PrepareEngineTests(unittest.TestCase):
|
|
def build_case(self, temp_dir: str) -> tuple[CaseManager, TaxYearCorpus]:
|
|
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={
|
|
"taxpayer.fullName": "Jane Doe",
|
|
"filingStatus": "single",
|
|
"wages": 50000,
|
|
"taxableInterest": 100,
|
|
"federalWithholding": 6000,
|
|
},
|
|
document_paths=[],
|
|
)
|
|
|
|
corpus = TaxYearCorpus(cache_root=Path(temp_dir) / "cache")
|
|
|
|
def fake_fetch(url: str) -> bytes:
|
|
buffer = BytesIO()
|
|
pdf = canvas.Canvas(buffer)
|
|
pdf.drawString(72, 720, f"Template for {url}")
|
|
pdf.save()
|
|
return buffer.getvalue()
|
|
|
|
corpus.download_catalog(2025, bootstrap_irs_catalog(2025), fetcher=fake_fetch)
|
|
return manager, corpus
|
|
|
|
def test_prepare_creates_normalized_return_and_artifacts(self) -> None:
|
|
with tempfile.TemporaryDirectory() as temp_dir:
|
|
manager, corpus = self.build_case(temp_dir)
|
|
engine = PrepareEngine(corpus=corpus)
|
|
|
|
result = engine.prepare_case(manager.case_dir)
|
|
|
|
self.assertEqual(result["status"], "prepared")
|
|
self.assertEqual(result["summary"]["requiredForms"], ["f1040"])
|
|
self.assertEqual(result["summary"]["reviewRequiredArtifacts"], ["f1040"])
|
|
self.assertTrue((manager.case_dir / "return" / "normalized-return.json").exists())
|
|
self.assertTrue((manager.case_dir / "output" / "artifacts.json").exists())
|
|
normalized = json.loads((manager.case_dir / "return" / "normalized-return.json").read_text())
|
|
self.assertEqual(normalized["totals"]["adjustedGrossIncome"], 50100.0)
|
|
self.assertEqual(normalized["totals"]["taxableIncome"], 34350.0)
|
|
|
|
def test_exporter_writes_efile_ready_payload(self) -> None:
|
|
with tempfile.TemporaryDirectory() as temp_dir:
|
|
manager, corpus = self.build_case(temp_dir)
|
|
engine = PrepareEngine(corpus=corpus)
|
|
engine.prepare_case(manager.case_dir)
|
|
|
|
export = EfileExporter().export_case(manager.case_dir)
|
|
|
|
self.assertEqual(export["status"], "draft")
|
|
self.assertTrue((manager.case_dir / "output" / "efile-ready.json").exists())
|
|
self.assertEqual(export["returnSummary"]["requiredForms"], ["f1040"])
|
|
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main()
|