from __future__ import annotations from jarca_ledger_mcp import service def test_ledger_category_create_list_delete_reactivate(tmp_path): db_path = str(tmp_path / "ledger.sqlite3") health = service.health_check(db_path) assert health["schema_version"] == "14" created = service.create_ledger_category("반려동물", "사료", sort_order=250, memo="test", db_path=db_path) assert created["success"] is True assert created["category"]["category"] == "반려동물" assert created["category"]["subcategory"] == "사료" assert created["category"]["cashflow_kind"] == "expense" assert created["category"]["active"] is True listed = service.list_ledger_categories(db_path=db_path) assert listed["count"] == 1 assert listed["grouped"] == {"반려동물": ["사료"]} deleted = service.delete_ledger_category("반려동물", "사료", db_path=db_path) assert deleted["success"] is True assert service.list_ledger_categories(db_path=db_path)["count"] == 0 assert service.list_ledger_categories(active_only=False, db_path=db_path)["categories"][0]["active"] is False reactivated = service.create_ledger_category("반려동물", "사료", sort_order=260, db_path=db_path) assert reactivated["success"] is True assert reactivated["category"]["active"] is True assert reactivated["category"]["sort_order"] == 260 def test_ledger_category_cashflow_kind(tmp_path): db_path = str(tmp_path / "ledger.sqlite3") income = service.create_ledger_category("기타수입", "상금", cashflow_kind="income", db_path=db_path) assert income["success"] is True assert income["category"]["cashflow_kind"] == "income" invalid = service.create_ledger_category("테스트", "", cashflow_kind="bad", db_path=db_path) assert invalid["success"] is False assert invalid["error_code"] == "validation_error" def test_ledger_category_hard_delete_requires_force_when_in_use(tmp_path): db_path = str(tmp_path / "ledger.sqlite3") service.create_ledger_category("식비", "마트", db_path=db_path) service.create_ledger_transaction("2026-06-01", "expense", 10000, category="식비", subcategory="마트", merchant="테스트마트", db_path=db_path) blocked = service.delete_ledger_category("식비", "마트", hard_delete=True, db_path=db_path) assert blocked["success"] is False assert blocked["error_code"] == "category_in_use" soft = service.delete_ledger_category("식비", "마트", db_path=db_path) assert soft["success"] is True assert soft["transaction_count"] == 1 txs = service.list_ledger_transactions(category="식비", db_path=db_path) assert txs["count"] == 1