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"