first ruggedy draft

This commit is contained in:
2026-06-28 13:48:15 +02:00
parent c916f64fcb
commit 1053f6a2a3
78 changed files with 20905 additions and 2 deletions

View File

@@ -0,0 +1,104 @@
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"