"""CSV Amazon transaction reader — Belgium/FR June sample shape.""" from __future__ import annotations from pathlib import Path from app.core.csv_reader import CsvReader, parse_amount from app.core.readers import make_reader def test_parse_amount_european(): assert parse_amount("13,49") == 13.49 assert parse_amount("1.234,56") == 1234.56 assert parse_amount("1,234.56") == 1234.56 assert parse_amount("-6,24") == -6.24 assert parse_amount("0") == 0.0 assert parse_amount("") == 0.0 def test_make_reader_routes_csv(tmp_path: Path): p = tmp_path / "sample.csv" p.write_text( "preamble\n" "date/time,settlement id,type,total\n" "1 Jun 2026 00:00:00 UTC,123,Order,10.00\n", encoding="utf-8", ) r = make_reader(str(p)) assert type(r).__name__ == "CsvReader" def test_csv_reader_belgium_headers(tmp_path: Path): # Minimal FR/BE Custom Unified Transaction CSV (preamble + header + 1 row). body = ( '"Comprend les transactions Amazon Marketplace"\n' '"Tous les montants sont en EUR, sauf indication contraire"\n' '"date/heure","Identifiant du paiement","type","Numéro de la commande","SKU",' '"description","quantité","site de vente","expédition","ville de la commande",' '"état de la commande","commande postale","ventes de produits",' '"crédits d’expédition","crédits d’emballage-cadeau","Total des réductions",' '"taxe de ventes prélevée","Taxe Marketplace Facilitator","frais de vente",' '"Frais pour le service Expédié par Amazon","autres frais de transaction",' '"autres","total","Statut de la transaction","Date de délivrance de la transaction"\n' '"31 mai 2026 22:00:44 UTC","27177484042","Commande","405-9354558-3629905",' '"SKU1","desc","2","amazon.com.be","Amazon","Enines","","1350","29,74","0","0","0",' '"6,24","-6,24","-4,68","-11,57","0","0","13,49","Effectuée","8 juin 2026 15:26:40 UTC"\n' ) p = tmp_path / "2026JunMonthlyTransaction.csv" p.write_text(body, encoding="utf-8-sig") reader = CsvReader(str(p)) mapping = reader.detect() assert not mapping.missing_required assert reader.sheet_name == "CSV" assert reader.file_meta.currency == "EUR" rows = list(reader.iter_records()) assert len(rows) == 1 rec = rows[0] assert rec["settlement_id"] == "27177484042" assert rec["txn_type"] == "Commande" assert rec["marketplace"] == "amazon.com.be" assert rec["total"] == 13.49 assert rec["product_sales"] == 29.74 assert rec["_date"].isoformat() == "2026-05-31" assert reader.file_meta.imported_rows == 1 reader.close()