from __future__ import annotations from pathlib import Path import pytest from jarca_ledger_mcp import service from jarca_ledger_mcp.toss_securities_pdf import parse_toss_securities_pdf SAMPLE = Path("/root/.hermes/cache/documents/doc_f4cfe8e0221f_거래내역서_20250618_20260617_1.pdf") @pytest.mark.skipif(not SAMPLE.exists(), reason="sample Toss Securities PDF is not available") def test_parse_toss_securities_pdf_sample(): parsed = parse_toss_securities_pdf(str(SAMPLE)) assert parsed["metadata"]["holder_name"] == "고진환" assert parsed["metadata"]["account_number_masked"] == "123-01-048829" assert parsed["page_count"] == 15 assert len(parsed["transactions"]) == 207 assert any(tx.action == "구매" and tx.code == "A012510" for tx in parsed["transactions"]) assert any(tx.action == "이체입금(주식회사 케이뱅크)" for tx in parsed["transactions"]) assert any(tx.section == "USD" and tx.action == "외화증권배당금입금" for tx in parsed["transactions"]) @pytest.mark.skipif(not SAMPLE.exists(), reason="sample Toss Securities PDF is not available") def test_preview_and_import_toss_securities_pdf_sample(tmp_path): db_path = str(tmp_path / "ledger.sqlite3") preview = service.preview_toss_securities_pdf_import(str(SAMPLE), db_path=db_path) assert preview["success"] is True assert preview["row_count"] == 207 assert preview["duplicate_count"] == 0 imported = service.import_toss_securities_pdf(str(SAMPLE), db_path=db_path) assert imported["success"] is True assert imported["inserted_count"] == 207 assert imported["skipped_duplicate_count"] == 0 imported_again = service.import_toss_securities_pdf(str(SAMPLE), db_path=db_path) assert imported_again["success"] is True assert imported_again["inserted_count"] == 0 assert imported_again["skipped_duplicate_count"] == 207 txs = service.list_ledger_transactions(account_id=imported["account_id"], limit=300, db_path=db_path) assert txs["count"] == 207 assert any(t["category"] == "수입" and t["subcategory"] == "배당" for t in txs["transactions"]) assert any(t["category"] == "이체" and t["subcategory"] == "투자이동" for t in txs["transactions"]) assert any( t["merchant"] == "토스증권 이체출금(국민은행) 조상문" and t["category"] == "이체" and t["subcategory"] == "확인필요" for t in txs["transactions"] ) assert any( t["merchant"] == "토스증권 이체입금(국민은행) 고진환" and t["category"] == "이체" and t["subcategory"] == "투자이동" for t in txs["transactions"] )