#!/usr/bin/env elixir # Test our Mercury ISO8583 implementation with actual data Application.put_env(:mix, :env, :dev) Code.prepend_path("_build/dev/lib/da_product_app/ebin") defmodule TestMercuryDecode do def test_decode do # Load our implementation alias DaProductApp.MercuryISO8583 # Your actual received data raw_data = <<0, 205, 96, 0, 120, 32, 0, 4, 0, 112, 60, 7, 128, 0, 194, 130, 5, 21, 55, 71, 64, 66, 49, 50, 0, 144, 0, 128, 0, 0, 0, 0, 0, 5, 0, 0, 0, 6, 20, 0, 16, 9, 18, 37, 4, 0, 81, 0, 0, 7, 130, 0, 49, 50, 51, 52, 53, 54, 55, 51, 49, 50, 51, 52, 53, 54, 55, 56, 57, 48, 49, 50, 51, 52, 53, 0, 129, 123, 34, 111, 114, 105, 103, 68, 97, 116, 101, 34, 58, 34, 50, 48, 50, 53, 48, 57, 49, 50, 34, 44, 34, 111, 114, 105, 103, 77, 116, 105, 34, 58, 34, 48, 50, 48, 48, 34, 44, 34, 111, 114, 105, 103, 84, 114, 97, 99, 101, 34, 58, 34, 48, 48, 48, 48, 48, 54, 34, 44, 34, 111, 114, 105, 103, 84, 105, 109, 101, 34, 58, 34, 49, 52, 48, 48, 49, 48, 34, 125, 55, 56, 52, 0, 40, 149, 5, 0, 64, 4, 0, 0, 159, 30, 8, 50, 51, 55, 51, 48, 48, 48, 49, 159, 16, 7, 6, 1, 1, 3, 160, 168, 2, 0, 6, 48, 48, 48, 48, 48, 49, 18, 52, 86, 120, 18, 52, 86, 120>> IO.puts("=== Testing Mercury ISO8583 Implementation ===") IO.puts("Raw data: #{byte_size(raw_data)} bytes") IO.puts("") # Extract message without length header <<_length::16-big, message_data::binary>> = raw_data IO.puts("Testing MercuryISO8583.decode with TPDU...") case MercuryISO8583.decode(message_data) do {:ok, message} -> IO.puts("✅ SUCCESS! Decoded message:") IO.puts("MTI: #{message.mti}") IO.puts("TPDU: #{if message.tpdu, do: Base.encode16(message.tpdu), else: "none"}") IO.puts("Fields count: #{map_size(message.fields)}") IO.puts("") IO.puts("Fields:") message.fields |> Enum.sort_by(fn {k, _} -> String.to_integer(k) end) |> Enum.each(fn {field, value} -> IO.puts(" Field #{field}: #{inspect(value)}") end) IO.puts("") IO.puts("Testing field access...") IO.puts("Amount (field 4): #{MercuryISO8583.get(message, "4")}") IO.puts("STAN (field 11): #{MercuryISO8583.get(message, "11")}") IO.puts("Terminal ID (field 41): #{MercuryISO8583.get(message, "41")}") {:error, reason} -> IO.puts("❌ FAILED to decode: #{inspect(reason)}") IO.puts("") IO.puts("Testing detailed decode...") case MercuryISO8583.decode_detailed(message_data) do {:ok, message, steps} -> IO.puts("✅ Detailed decode succeeded!") IO.puts("Steps:") Enum.each(steps, fn step -> IO.puts(" #{inspect(step)}") end) {:error, reason, steps} -> IO.puts("❌ Detailed decode failed: #{reason}") IO.puts("Steps before failure:") Enum.each(steps, fn step -> IO.puts(" #{inspect(step)}") end) end end end end TestMercuryDecode.test_decode()