from __future__ import annotations from pathlib import Path import os import pytest from jarca_ledger_mcp import service PDF_PATH = Path("/root/.hermes/cache/documents/doc_5a12af727ae0_KB거래내역조회_5704_2606171043.pdf") PDF_PASSWORD = os.environ.get("KB_BANK_PDF_TEST_PASSWORD", "") def _sample_available(path: Path, password: str) -> bool: if not password: return False try: return path.is_file() except OSError: return False SAMPLE_AVAILABLE = _sample_available(PDF_PATH, PDF_PASSWORD) @pytest.mark.skipif(not SAMPLE_AVAILABLE, reason="sample KB Bank PDF/password is not available") def test_preview_kb_bank_pdf_import_real_sample(tmp_path): result = service.preview_kb_bank_pdf_import(str(PDF_PATH), PDF_PASSWORD, preview_limit=3, db_path=str(tmp_path / "ledger.sqlite3")) assert result["success"] is True assert result["row_count"] == 499 assert result["page_count"] == 20 assert result["metadata"]["account_number_masked"] == "****5704" assert result["metadata"]["final_balance"] == 3_041_678 assert result["validation"]["ok"] is True assert result["validation"]["total_deposit"] == 125_730_389 assert result["validation"]["total_withdrawal"] == 123_565_861 assert result["preview"][0]["transaction_datetime"] == "2026-01-03T09:05:10" assert result["preview"][0]["type"] == "expense" assert result["preview"][0]["amount"] == 200 @pytest.mark.skipif(not SAMPLE_AVAILABLE, reason="sample KB Bank PDF/password is not available") def test_import_kb_bank_pdf_real_sample_and_rollback(tmp_path): db_path = str(tmp_path / "ledger.sqlite3") result = service.import_kb_bank_pdf(str(PDF_PATH), PDF_PASSWORD, db_path=db_path) assert result["success"] is True assert result["parsed_row_count"] == 499 assert result["inserted_count"] == 499 assert result["skipped_duplicate_count"] == 0 assert result["metadata"]["account_number_masked"] == "****5704" duplicated = service.import_kb_bank_pdf(str(PDF_PATH), PDF_PASSWORD, db_path=db_path) assert duplicated["success"] is True assert duplicated["inserted_count"] == 0 assert duplicated["skipped_duplicate_count"] == 499 listed = service.list_ledger_transactions(start_date="2026-01-01", end_date="2026-06-17", limit=1000, db_path=db_path) assert listed["success"] is True assert listed["count"] == 499 sample = next(tx for tx in listed["transactions"] if tx["transaction_datetime"] == "2026-06-15T16:50:50") assert sample["merchant"] == "오아시스마켓" assert sample["balance_after"] == 3_041_678 assert sample["branch"] == "KB카드" accounts = service.list_ledger_accounts(db_path=db_path) assert accounts["count"] == 1 assert accounts["accounts"][0]["institution"] == "KB국민은행" assert accounts["accounts"][0]["last_balance"] == 3_041_678 batches = service.list_ledger_import_batches(source="kb_bank_pdf", db_path=db_path) assert batches["count"] == 2 rollback = service.rollback_ledger_import_batch(result["import_batch_id"], db_path=db_path) assert rollback["success"] is True assert rollback["affected_transactions"] == 499 after = service.list_ledger_transactions(start_date="2026-01-01", end_date="2026-06-17", limit=1000, db_path=db_path) assert after["count"] == 0