defmodule DaProductApp.Settlements.Refund.CsvParserTest do use ExUnit.Case alias DaProductApp.Settlements.Refund.CsvParser describe "parse_file/2" do test "parses valid CSV with refund transactions" do content = """ transactionRequestId,transactionType,fundDirection,transactionAmount,transactionCurrency refund_001,REFUND,DEBIT,100.50,AED refund_002,PAYMENT,CREDIT,200.00,AED refund_003,REFUND,DEBIT,75.25,AED """ assert {:ok, result} = CsvParser.parse_file("test.csv", content) assert result.filename == "test.csv" assert result.total_count == 2 # Only REFUND + DEBIT transactions assert Decimal.equal?(result.total_amount, Decimal.new("175.75")) assert length(result.transactions) == 2 # Check first refund transaction first_refund = Enum.at(result.transactions, 0) assert first_refund.transaction_request_id == "refund_001" assert first_refund.transaction_type == "REFUND" assert first_refund.fund_direction == "DEBIT" assert Decimal.equal?(first_refund.transaction_amount, Decimal.new("100.50")) end test "filters out non-refund transactions" do content = """ transactionRequestId,transactionType,fundDirection,transactionAmount,transactionCurrency payment_001,PAYMENT,CREDIT,100.00,AED refund_001,REFUND,DEBIT,50.00,AED refund_002,REFUND,CREDIT,25.00,AED """ assert {:ok, result} = CsvParser.parse_file("test.csv", content) assert result.total_count == 1 # Only REFUND + DEBIT assert length(result.transactions) == 1 refund = hd(result.transactions) assert refund.transaction_request_id == "refund_001" assert refund.transaction_type == "REFUND" assert refund.fund_direction == "DEBIT" end test "handles empty CSV" do content = """ transactionRequestId,transactionType,fundDirection,transactionAmount,transactionCurrency """ assert {:ok, result} = CsvParser.parse_file("test.csv", content) assert result.total_count == 0 assert result.transactions == [] assert Decimal.equal?(result.total_amount, Decimal.new(0)) end test "returns error for missing required fields" do content = """ transactionId,amount,currency tx_001,100.00,AED """ assert {:error, reason} = CsvParser.parse_file("test.csv", content) assert reason == "Missing required fields: transactionRequestId, transactionType, fundDirection" end test "handles invalid UTF-8 content" do invalid_content = <<0xFF, 0xFE, 0x00, 0x00>> assert {:error, "Invalid UTF-8 content"} = CsvParser.parse_file("test.csv", invalid_content) end test "handles CSV with quoted fields" do content = """ "transactionRequestId","transactionType","fundDirection","transactionAmount","transactionCurrency" "refund_001","REFUND","DEBIT","100.50","AED" """ assert {:ok, result} = CsvParser.parse_file("test.csv", content) assert result.total_count == 1 refund = hd(result.transactions) assert refund.transaction_request_id == "refund_001" end end end