from __future__ import annotations from datetime import datetime from pathlib import Path import io import json import tempfile import unittest from unittest.mock import patch from hibor_fast_collection.cli import main from helpers import task_spec class CliDryRunTests(unittest.TestCase): def test_dry_run_no_ledger_creation(self): class FixedDateTime(datetime): @classmethod def now(cls, tz=None): return cls(2026, 7, 29, 12, 0, 0, tzinfo=tz) with tempfile.TemporaryDirectory() as tmp: root = Path(tmp) (root / "adb.exe").write_bytes(b"tool") (root / "pdfinfo.exe").write_bytes(b"tool") task = root / "task.json" task.write_text(json.dumps(task_spec(root), ensure_ascii=False, separators=(",", ":")), encoding="utf-8") fake_stdout = type("Stdout", (), {"buffer": io.BytesIO()})() with patch("sys.stdout", fake_stdout), patch( "hibor_fast_collection.workflow.datetime", FixedDateTime): code = main(["--task", str(task), "--dry-run"]) self.assertEqual(code, 0) self.assertFalse((root / "quota.csv").exists()) output = json.loads(fake_stdout.buffer.getvalue()) self.assertEqual(output["schema_version"], "HIBOR_FAST_REPORT_COLLECTION_TERMINAL_V009") self.assertEqual(output["quota_cumulative_consumed"], 3) if __name__ == "__main__": unittest.main()