105 lines
3.9 KiB
Python
105 lines
3.9 KiB
Python
from __future__ import annotations
|
|
|
|
from mousehold_agent.statement_importer import parse_klarna_statement, parse_paypal_statement
|
|
|
|
|
|
def test_paypal_activity_download_report_imports_confirmed_expense() -> None:
|
|
csv_text = (
|
|
"Date,Time,TimeZone,Name,Type,Status,Currency,Gross,Fee,Net,Transaction ID,Item Title\n"
|
|
"01/15/2024,10:30:00,PST,Example Merchant,Payment Sent,Completed,EUR,"
|
|
"-20.15,0.00,-20.15,TXN123456789,Order 12345\n"
|
|
)
|
|
|
|
result = parse_paypal_statement(
|
|
csv_text,
|
|
household_id="household-1",
|
|
owner_user_id="user-1",
|
|
source_account_id="paypal-account",
|
|
filename="Download.CSV",
|
|
)
|
|
|
|
assert result["importable_count"] == 1
|
|
observation = result["observations"][0]
|
|
assert observation["source_type"] == "paypal_csv"
|
|
assert observation["event_type"] == "expense"
|
|
assert observation["status"] == "confirmed"
|
|
assert observation["amount"] == "20.15"
|
|
assert observation["provider_transaction_id"] == "TXN123456789"
|
|
|
|
|
|
def test_paypal_report_reference_sample_fields_import() -> None:
|
|
csv_text = (
|
|
"Transaction ID,Date,Type,Status,Amount,Currency,Fee,Net\n"
|
|
"TXN123456789,2024-01-15,PAYMENT,SUCCESS,100.00,USD,3.20,96.80\n"
|
|
)
|
|
|
|
result = parse_paypal_statement(
|
|
csv_text,
|
|
household_id="household-1",
|
|
owner_user_id=None,
|
|
source_account_id=None,
|
|
)
|
|
|
|
assert result["importable_count"] == 1
|
|
assert result["observations"][0]["event_type"] == "income"
|
|
assert result["observations"][0]["amount"] == "96.80"
|
|
|
|
|
|
def test_klarna_settlement_report_with_summary_imports_transaction_rows() -> None:
|
|
csv_text = (
|
|
"total_sale_amount;total_fee_amount;payment_reference;settlement_currency;payout_date;merchant_settlement_type\n"
|
|
'"100.00";"-3.20";"100162627";"EUR";"2026-05-14T00:00:00.000Z";"NET"\n'
|
|
"type;order_id;capture_id;amount;detailed_type;sale_date;capture_date;posting_currency;merchant_reference1\n"
|
|
'"SALE";"00000000-0000-0000-0000-000000000001";"11111111-1111-1111-1111-000000000001";"100.00";"PURCHASE";"2026-05-12";"2026-05-14";"EUR";"SO-0001"\n'
|
|
'"FEE";"00000000-0000-0000-0000-000000000001";"11111111-1111-1111-1111-000000000001";"-3.20";"PURCHASE_FEE_PERCENTAGE";"2026-05-12";"2026-05-14";"EUR";"SO-0001"\n'
|
|
)
|
|
|
|
result = parse_klarna_statement(
|
|
csv_text,
|
|
household_id="household-1",
|
|
owner_user_id="user-1",
|
|
source_account_id="klarna-account",
|
|
filename="sample_purchase_with_vat.csv",
|
|
)
|
|
|
|
assert result["row_count"] == 2
|
|
assert result["importable_count"] == 2
|
|
assert result["observations"][0]["source_type"] == "klarna_csv"
|
|
assert result["observations"][0]["event_type"] == "income"
|
|
assert result["observations"][1]["event_type"] == "fee"
|
|
|
|
|
|
def test_klarna_consumer_style_statement_imports_liability_payment() -> None:
|
|
csv_text = (
|
|
"Datum;Beschreibung;Betrag;Währung;Referenz;Typ\n"
|
|
"01.06.2026;Klarna Zahlung Example Shop;-84,00;EUR;KR-123;Zahlung\n"
|
|
)
|
|
|
|
result = parse_klarna_statement(
|
|
csv_text,
|
|
household_id="household-1",
|
|
owner_user_id="user-1",
|
|
source_account_id="klarna-account",
|
|
)
|
|
|
|
assert result["importable_count"] == 1
|
|
observation = result["observations"][0]
|
|
assert observation["event_type"] == "liability_payment"
|
|
assert observation["status"] == "confirmed"
|
|
assert observation["provider_transaction_id"] == "KR-123"
|
|
assert observation["amount"] == "84.00"
|
|
|
|
|
|
def test_statement_rows_without_amount_are_skipped() -> None:
|
|
result = parse_paypal_statement(
|
|
"Date,Name,Type,Status,Currency,Gross,Transaction ID\n"
|
|
"2024-01-15,Example Merchant,Note,Completed,EUR,,TXN123\n",
|
|
household_id="household-1",
|
|
owner_user_id=None,
|
|
source_account_id=None,
|
|
)
|
|
|
|
assert result["importable_count"] == 0
|
|
assert result["skipped_count"] == 1
|
|
assert result["rows"][0]["skip_reason"] == "No amount found"
|