Files
jarca-ledger-mcp/tests/test_settlement_draft_liability_registration.py
T

57 lines
3.5 KiB
Python

"""Registration semantics for draft unregistered-liability status."""
from jarca_ledger_mcp import service as s
from jarca_ledger_mcp.db import init_db
def ok(result):
assert result["success"], result
return result
def test_unregistered_liabilities_tracks_registered_targets_not_evidence_completeness(tmp_path):
path = str(tmp_path / "synthetic-liability-registration.sqlite3")
init_db(path)
empty = ok(s.create_settlement_draft("2026-09", "synthetic", "empty", db_path=path))["draft"]
empty_review = ok(s.review_settlement_draft(empty["id"], db_path=path))
assert empty_review["unregistered_liabilities"] is True
loan = ok(s.create_ledger_account("Synthetic loan", type="loan", liquidity_bucket="loan", db_path=path))["account"]["id"]
loan_draft = ok(s.create_settlement_draft("2026-10", "synthetic", "loan", db_path=path))["draft"]
loan_review = ok(s.review_settlement_draft(loan_draft["id"], db_path=path))
loan_item = next(item for item in loan_review["items"] if item["source_id"] == loan)
assert loan_item["amount"] is None
assert loan_review["unregistered_liabilities"] is False
manual = ok(s.create_manual_asset("Synthetic manual liability", 50, "2026-10-31", "loan", db_path=path))["manual_asset"]["id"]
refreshed = ok(s.refresh_settlement_draft_targets(loan_draft["id"], loan_draft["version"], "synthetic", db_path=path))["draft"]
manual_item = next(item for item in ok(s.get_settlement_draft(refreshed["id"], db_path=path))["items"] if item["source_id"] == manual)
excluded = ok(s.set_settlement_draft_item(refreshed["id"], "manual_asset", manual, refreshed["version"], "synthetic", included=False, exclusion_reason="synthetic excluded", db_path=path))["draft"]
excluded_review = ok(s.review_settlement_draft(excluded["id"], db_path=path))
assert manual_item["amount"] == 50
assert next(item for item in excluded_review["excluded_items"] if item["source_id"] == manual)
assert excluded_review["unregistered_liabilities"] is False
assert excluded_review["missing_items"]
def test_manual_only_frozen_liability_registration_and_missing_exclusion_are_independent(tmp_path):
path = str(tmp_path / "manual-only-frozen-liability.sqlite3")
init_db(path)
manual = ok(s.create_manual_asset("Manual-only debt", 75, "2026-10-31", "loan", db_path=path))["manual_asset"]["id"]
draft = ok(s.create_settlement_draft("2026-10", "synthetic", "manual-only", db_path=path))["draft"]
# Freeze the target list without any registered loan account.
frozen = ok(s.refresh_settlement_draft_targets(draft["id"], draft["version"], "synthetic", db_path=path))["draft"]
frozen_items = ok(s.get_settlement_draft(frozen["id"], db_path=path))["items"]
item = next(item for item in frozen_items if item["source_id"] == manual)
assert item["amount"] == 75
assert not any(item.get("source_type") == "account" for item in frozen_items)
review = ok(s.review_settlement_draft(frozen["id"], db_path=path))
assert review["unregistered_liabilities"] is False
assert isinstance(review["missing_items"], list)
excluded = ok(s.set_settlement_draft_item(frozen["id"], "manual_asset", manual, frozen["version"], "synthetic", included=False, exclusion_reason="not registered", db_path=path))["draft"]
excluded_review = ok(s.review_settlement_draft(excluded["id"], db_path=path))
assert any(item["source_id"] == manual for item in excluded_review["excluded_items"])
assert excluded_review["unregistered_liabilities"] is False
assert isinstance(excluded_review["missing_items"], list)