diff --git a/README.md b/README.md index 11b0ace..0712959 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,7 @@ You will just need to add `:numscriptex` as a dependency on your `mix.exs`, and ```elixir def deps do [ - {:numscriptex, "~> 0.2.1"} + {:numscriptex, "~> 0.2.2"} ] end ``` @@ -149,7 +149,7 @@ Where result will be something like this: ```elixir iex> %{ ...> postings: [ -...> %{ + ...> %Numscriptex.Posting{ ...> amount: 100, ...> asset: "USD/2", ...> destination: "bar", @@ -157,19 +157,19 @@ iex> %{ ...> } ...> ], ...> balances: [ -...> %{ +...> %Numscriptex.Balance{ ...> account: "foo", ...> asset: "EUR/2", ...> final_balance: 300, ...> initial_balance: 300 ...> }, -...> %{ +...> %Numscriptex.Balance{ ...> account: "foo", ...> asset: "USD/2", ...> final_balance: 400, ...> initial_balance: 500 ...> }, -...> %{ +...> %Numscriptex.Balance{ ...> account: "bar", ...> asset: "USD/2", ...> final_balance: 100, diff --git a/lib/numscriptex.ex b/lib/numscriptex.ex index e4ac50b..04ecff5 100644 --- a/lib/numscriptex.ex +++ b/lib/numscriptex.ex @@ -8,46 +8,31 @@ defmodule Numscriptex do """ alias Numscriptex.AssetsManager - alias Numscriptex.Balances + alias Numscriptex.Balance alias Numscriptex.CheckLog + alias Numscriptex.Posting alias Numscriptex.Utilities require AssetsManager AssetsManager.ensure_wasm_binary_is_valid() - @type check_log() :: CheckLog.t() - @type check_result() :: %{ required(:script) => binary(), - optional(:hints) => list(check_log()), - optional(:infos) => list(check_log()), - optional(:warnings) => list(check_log()) + optional(:hints) => list(CheckLog.t()), + optional(:infos) => list(CheckLog.t()), + optional(:warnings) => list(CheckLog.t()) } @type run_result() :: %{ - required(:balances) => balances(), - required(:postings) => postings(), + required(:balances) => list(Balance.t()), + required(:postings) => list(Posting.t()), required(:accountsMeta) => map(), required(:txMeta) => map() } - @type balances() :: %{ - required(:initial_balance) => integer(), - required(:final_balance) => integer(), - required(:asset) => binary(), - required(:account) => binary() - } - - @type postings() :: %{ - required(:destination) => binary(), - required(:source) => binary(), - required(:asset) => binary(), - required(:amount) => integer() - } - @type errors() :: %{ - required(:reason) => list(check_log()) | any(), + required(:reason) => list(CheckLog.t()) | any(), optional(:details) => any() } @@ -140,6 +125,7 @@ defmodule Numscriptex do result |> Map.put_new(:accountsMeta, %{}) |> Map.put_new(:txMeta, %{}) + |> Map.update!(:postings, &Posting.from_list/1) {:ok, standardized_result} end @@ -147,12 +133,12 @@ defmodule Numscriptex do defp standardize_run_result({:error, _reason} = errors), do: errors defp maybe_put_final_balance({:ok, %{"postings" => postings} = result}, initial_balance) do - balances = Balances.put(initial_balance, postings) + balances = Balance.put(initial_balance, postings) normalized_result = result - |> Map.put("balances", balances) |> Utilities.normalize_keys(:atom) + |> Map.put(:balances, balances) {:ok, normalized_result} end diff --git a/lib/numscriptex/balances.ex b/lib/numscriptex/balance.ex similarity index 58% rename from lib/numscriptex/balances.ex rename to lib/numscriptex/balance.ex index 440628c..16be138 100644 --- a/lib/numscriptex/balances.ex +++ b/lib/numscriptex/balance.ex @@ -1,10 +1,32 @@ -defmodule Numscriptex.Balances do +defmodule Numscriptex.Balance do @moduledoc """ `Numscriptex.Balances` is responsible for building the account's final balance after running your [Numscript](https://docs.formance.com/numscript/), so you can see the results of all transactions. """ + @derive JSON.Encoder + defstruct account: nil, + asset: nil, + final_balance: nil, + initial_balance: nil + + @typedoc """ + Type that represents `Numscriptex.Balance` struct. + + ## Fields + * `:account` the account name + * `:asset` the asset were the transaction was made + * `:final_balance` balance after the transactions + * `:initial_balance` balance before the transactions + """ + @type t() :: %__MODULE__{ + account: bitstring(), + asset: bitstring(), + final_balance: non_neg_integer(), + initial_balance: non_neg_integer() + } + @doc """ Receives the account assets (balance field from `%Numscriptex.Run{}`), and the postings that are generated after running the numscript transaction. @@ -29,25 +51,25 @@ defmodule Numscriptex.Balances do ...> } ...> ] ...> - ...> Numscriptex.Balances.put(account_assets, postings) + ...> Numscriptex.Balance.put(account_assets, postings) [ - %{ - "account" => "foo", - "asset" => "EUR/2", - "final_balance" => 300, - "initial_balance" => 300 + %Numscriptex.Balance{ + account: "foo", + asset: "EUR/2", + final_balance: 300, + initial_balance: 300 }, - %{ - "account" => "foo", - "asset" => "USD/2", - "final_balance" => 400, - "initial_balance" => 500 + %Numscriptex.Balance{ + account: "foo", + asset: "USD/2", + final_balance: 400, + initial_balance: 500 }, - %{ - "account" => "bar", - "asset" => "USD/2", - "final_balance" => 100, - "initial_balance" => 0 + %Numscriptex.Balance{ + account: "bar", + asset: "USD/2", + final_balance: 100, + initial_balance: 0 } ] ``` @@ -60,6 +82,9 @@ defmodule Numscriptex.Balances do |> handle_initial_balance(account_assets) |> handle_final_balance(postings) |> maybe_drop_balance() + |> then(fn balances -> + Enum.map(balances, &struct(__MODULE__, &1)) + end) end defp build_balances(account_assets, postings) do @@ -73,10 +98,10 @@ defmodule Numscriptex.Balances do Enum.flat_map(account_assets, fn {account, assets} -> Enum.map(assets, fn {asset, _amount} -> %{ - "account" => account, - "asset" => asset, - "initial_balance" => 0, - "final_balance" => 0 + account: account, + asset: asset, + initial_balance: 0, + final_balance: 0 } end) end) @@ -86,16 +111,16 @@ defmodule Numscriptex.Balances do Enum.flat_map(postings, fn posting -> [ %{ - "account" => posting["source"], - "asset" => posting["asset"], - "initial_balance" => 0, - "final_balance" => 0 + account: posting["source"], + asset: posting["asset"], + initial_balance: 0, + final_balance: 0 }, %{ - "account" => posting["destination"], - "asset" => posting["asset"], - "initial_balance" => 0, - "final_balance" => 0 + account: posting["destination"], + asset: posting["asset"], + initial_balance: 0, + final_balance: 0 } ] end) @@ -103,18 +128,18 @@ defmodule Numscriptex.Balances do defp handle_initial_balance(balances, account_assets) do Enum.map(balances, fn balance -> - account = balance["account"] - asset = balance["asset"] + account = balance.account + asset = balance.asset initial_balance = account_assets[account][asset] || 0 - %{balance | "initial_balance" => initial_balance} + %{balance | initial_balance: initial_balance} end) end defp handle_final_balance(balances, postings) do Enum.map(balances, fn balance -> - initial_balance = balance["initial_balance"] + initial_balance = balance.initial_balance Enum.reduce(postings, {%{}, initial_balance}, fn posting, {_map, acc} -> final_balance = calculate_final_balance(balance, posting, acc) @@ -123,14 +148,14 @@ defmodule Numscriptex.Balances do end) end) |> Enum.map(fn {balance, final_balance} -> - %{balance | "final_balance" => final_balance} + %{balance | final_balance: final_balance} end) end defp calculate_final_balance(balance, posting, initial_balance) do - same_asset? = posting["asset"] == balance["asset"] - source? = posting["source"] == balance["account"] - destination? = posting["destination"] == balance["account"] + same_asset? = posting["asset"] == balance.asset + source? = posting["source"] == balance.account + destination? = posting["destination"] == balance.account cond do source? and destination? and same_asset? -> @@ -149,8 +174,7 @@ defmodule Numscriptex.Balances do defp maybe_drop_balance(balances) do Enum.reject(balances, fn balance -> - balance["initial_balance"] == 0 and - balance["final_balance"] == 0 + balance.initial_balance == 0 and balance.final_balance == 0 end) end end diff --git a/lib/numscriptex/check_log.ex b/lib/numscriptex/check_log.ex index f88c8e3..b19121f 100644 --- a/lib/numscriptex/check_log.ex +++ b/lib/numscriptex/check_log.ex @@ -5,7 +5,6 @@ defmodule Numscriptex.CheckLog do """ @derive JSON.Encoder - defstruct character: nil, level: nil, line: nil, diff --git a/lib/numscriptex/posting.ex b/lib/numscriptex/posting.ex new file mode 100644 index 0000000..b9900ed --- /dev/null +++ b/lib/numscriptex/posting.ex @@ -0,0 +1,37 @@ +defmodule Numscriptex.Posting do + @moduledoc """ + `Numscriptex.Postings` represents a financial transaction made with [Numscript](https://docs.formance.com/numscript/) + """ + + @derive JSON.Encoder + defstruct amount: nil, + asset: nil, + destination: nil, + source: nil + + @typedoc """ + Type that represents `Numscriptex.Posting` struct. + + ## Fields + * `:source` account whose the money came from + * `:asset` the asset were the transaction was made + * `:destination` account whose the money will go to + * `:amount` amount of mone transferred (in integer) + """ + @type t() :: %__MODULE__{ + amount: pos_integer(), + asset: bitstring(), + destination: bitstring(), + source: bitstring() + } + + @spec from_list(map()) :: list(__MODULE__.t()) + def from_list(postings) do + Enum.map(postings, &from_map/1) + end + + @spec from_list(map()) :: __MODULE__.t() + def from_map(map) do + struct(%__MODULE__{}, map) + end +end diff --git a/lib/numscriptex/run.ex b/lib/numscriptex/run.ex index a5f62b2..2f06229 100644 --- a/lib/numscriptex/run.ex +++ b/lib/numscriptex/run.ex @@ -6,7 +6,6 @@ defmodule Numscriptex.Run do """ @derive JSON.Encoder - defstruct variables: %{}, balances: %{}, metadata: %{} diff --git a/test/numscriptex/balances_test.exs b/test/numscriptex/balance_test.exs similarity index 64% rename from test/numscriptex/balances_test.exs rename to test/numscriptex/balance_test.exs index 3f2427c..24e5280 100644 --- a/test/numscriptex/balances_test.exs +++ b/test/numscriptex/balance_test.exs @@ -1,9 +1,9 @@ -defmodule Numscriptex.BalancesTest do +defmodule Numscriptex.BalanceTest do use ExUnit.Case - alias Numscriptex.Balances + alias Numscriptex.Balance - doctest Balances + doctest Balance setup_all do postings = @@ -34,12 +34,27 @@ defmodule Numscriptex.BalancesTest do } target = [ - %{"account" => "bar", "asset" => "USD/2", "final_balance" => 50, "initial_balance" => 0}, - %{"account" => "baz", "asset" => "USD/2", "final_balance" => 49, "initial_balance" => 0}, - %{"account" => "foo", "asset" => "USD/2", "final_balance" => 1, "initial_balance" => 100} + %Numscriptex.Balance{ + account: "bar", + asset: "USD/2", + final_balance: 50, + initial_balance: 0 + }, + %Numscriptex.Balance{ + account: "baz", + asset: "USD/2", + final_balance: 49, + initial_balance: 0 + }, + %Numscriptex.Balance{ + account: "foo", + asset: "USD/2", + final_balance: 1, + initial_balance: 100 + } ] - assert balances = Balances.put(initial_balances, postings) + assert balances = Balance.put(initial_balances, postings) assert balances == target end @@ -54,7 +69,7 @@ defmodule Numscriptex.BalancesTest do refute any_asset_on_postings?("BRL/2", postings) refute any_asset_on_postings?("EUR/2", postings) - assert balances = Balances.put(initial_balances, postings) + assert balances = Balance.put(initial_balances, postings) assert asset_untouched?("EUR/2", balances) assert asset_untouched?("BRL/2", balances) refute asset_untouched?("USD/2", balances) @@ -68,8 +83,8 @@ defmodule Numscriptex.BalancesTest do end defp asset_untouched?(asset, balances) do - target = Enum.find(balances, false, fn balance -> balance["asset"] == asset end) + target = Enum.find(balances, false, fn balance -> balance.asset == asset end) - if target, do: target["final_balance"] == target["initial_balance"] + if target, do: target.final_balance == target.initial_balance end end diff --git a/test/numscriptex/check_log_test.exs b/test/numscriptex/check_log_test.exs index 1aa0557..218eead 100644 --- a/test/numscriptex/check_log_test.exs +++ b/test/numscriptex/check_log_test.exs @@ -1,11 +1,12 @@ defmodule Numscriptex.CheckLogTest do use ExUnit.Case - doctest Numscriptex.CheckLog alias Numscriptex.CheckLog + doctest Numscriptex.CheckLog + describe "from_map/1" do - test "creates a new struct from a map" do + test "transforms a map into %CheckLog{}" do map = %{ character: 10, level: :warning, diff --git a/test/numscriptex/posting_tests.exs b/test/numscriptex/posting_tests.exs new file mode 100644 index 0000000..8ee1e2d --- /dev/null +++ b/test/numscriptex/posting_tests.exs @@ -0,0 +1,58 @@ +defmodule Numscriptex.PostingTest do + use ExUnit.Case + + alias Numscriptex.Posting + + doctest Numscriptex.Posting + + describe "from_map/1" do + setup_all do + postings = [ + %{ + amount: 100, + asset: "USD/2", + destination: "bar", + source: "foo" + }, + %{ + amount: 100, + asset: "USD/2", + destination: "baz", + source: "foo" + } + ] + + %{postings: postings} + end + + test "transforms a list of maps into a list of %Posting{}", %{postings: list} do + assert postings = Posting.from_list(list) + + assert postings == [ + %Numscriptex.Posting{ + amount: 100, + asset: "USD/2", + destination: "bar", + source: "foo" + }, + %Numscriptex.Posting{ + amount: 100, + asset: "USD/2", + destination: "baz", + source: "bar" + } + ] + end + + test "transforms a map into %Posting{}", %{postings: [map | _]} do + assert posting = Posting.from_map(map) + + assert posting == %Numscriptex.Posting{ + amount: 100, + asset: "USD/2", + destination: "bar", + source: "foo" + } + end + end +end diff --git a/test/numscriptex_test.exs b/test/numscriptex_test.exs index 682a000..fecb4b8 100644 --- a/test/numscriptex_test.exs +++ b/test/numscriptex_test.exs @@ -102,7 +102,7 @@ defmodule NumscriptexTest do assert {:ok, result} = Numscriptex.run(script, struct) assert result.postings == [ - %{ + %Numscriptex.Posting{ amount: 100, asset: "USD/2", destination: "bar", @@ -111,19 +111,19 @@ defmodule NumscriptexTest do ] assert result.balances == [ - %{ + %Numscriptex.Balance{ account: "foo", asset: "EUR/2", final_balance: 300, initial_balance: 300 }, - %{ + %Numscriptex.Balance{ account: "foo", asset: "USD/2", final_balance: 400, initial_balance: 500 }, - %{ + %Numscriptex.Balance{ account: "bar", asset: "USD/2", final_balance: 100, @@ -154,13 +154,33 @@ defmodule NumscriptexTest do assert {:ok, result} = Numscriptex.run(script, struct) assert result.postings == [ - %{amount: 100, asset: "USD/2", destination: "bar", source: "foo"}, - %{amount: 100, asset: "USD/2", destination: "baz", source: "bar"} + %Numscriptex.Posting{ + amount: 100, + asset: "USD/2", + destination: "bar", + source: "foo" + }, + %Numscriptex.Posting{ + amount: 100, + asset: "USD/2", + destination: "baz", + source: "bar" + } ] assert result.balances == [ - %{account: "foo", asset: "USD/2", final_balance: 400, initial_balance: 500}, - %{account: "baz", asset: "USD/2", final_balance: 100, initial_balance: 0} + %Numscriptex.Balance{ + account: "foo", + asset: "USD/2", + final_balance: 400, + initial_balance: 500 + }, + %Numscriptex.Balance{ + account: "baz", + asset: "USD/2", + final_balance: 100, + initial_balance: 0 + } ] end @@ -192,25 +212,25 @@ defmodule NumscriptexTest do assert {:ok, result} = Numscriptex.run(script, struct) assert result.postings == [ - %{ + %Numscriptex.Posting{ amount: 5000, asset: "USD/2", destination: "orders:4567:payment", source: "users:1234:main" }, - %{ + %Numscriptex.Posting{ amount: 1000, asset: "USD/2", destination: "orders:4567:payment", source: "users:1234:vouchers:2024-01-31" }, - %{ + %Numscriptex.Posting{ amount: 3000, asset: "USD/2", destination: "orders:4567:payment", source: "users:1234:vouchers:2024-02-17" }, - %{ + %Numscriptex.Posting{ amount: 1000, asset: "USD/2", destination: "orders:4567:payment", @@ -219,31 +239,31 @@ defmodule NumscriptexTest do ] assert result.balances == [ - %{ + %Numscriptex.Balance{ account: "users:1234:main", asset: "USD/2", final_balance: 0, initial_balance: 5000 }, - %{ + %Numscriptex.Balance{ account: "users:1234:vouchers:2024-01-31", asset: "USD/2", final_balance: 0, initial_balance: 1000 }, - %{ + %Numscriptex.Balance{ account: "users:1234:vouchers:2024-02-17", asset: "USD/2", final_balance: 0, initial_balance: 3000 }, - %{ + %Numscriptex.Balance{ account: "users:1234:vouchers:2024-03-22", asset: "USD/2", final_balance: 9000, initial_balance: 10_000 }, - %{ + %Numscriptex.Balance{ account: "orders:4567:payment", asset: "USD/2", final_balance: 10_000, @@ -289,47 +309,52 @@ defmodule NumscriptexTest do assert {:ok, result} = Numscriptex.run(script, struct) assert result.postings == [ - %{ + %Numscriptex.Posting{ amount: 2000, asset: "USD/2", destination: "payments:4567", source: "coupons:FALL24" }, - %{ + %Numscriptex.Posting{ amount: 27_900, asset: "USD/2", destination: "payments:4567", source: "users:1234" }, - %{ + %Numscriptex.Posting{ amount: 900, asset: "USD/2", destination: "payments:5678", source: "coupons:FALL24" }, - %{amount: 8100, asset: "USD/2", destination: "payments:5678", source: "users:1234"} + %Numscriptex.Posting{ + amount: 8100, + asset: "USD/2", + destination: "payments:5678", + source: "users:1234" + } ] assert result.balances == [ - %{ + %Numscriptex.Balance{ account: "coupons:FALL24", asset: "USD/2", final_balance: 97_000, initial_balance: 99_900 }, - %{ + %Numscriptex.Balance{ account: "users:1234", asset: "USD/2", final_balance: 64_000, initial_balance: 100_000 }, - %{ + %Numscriptex.Balance{ account: "payments:4567", asset: "USD/2", final_balance: 29_900, initial_balance: 0 }, - %{ + %Numscriptex.Balance{ account: "payments:5678", asset: "USD/2", final_balance: 9000, @@ -358,19 +383,39 @@ defmodule NumscriptexTest do assert {:ok, result} = Numscriptex.run(script, struct) assert result.postings == [ - %{amount: 10, asset: "USD/2", destination: "platform:fees", source: "orders:1234"}, - %{amount: 90, asset: "USD/2", destination: "merchants:6789", source: "orders:1234"} + %Numscriptex.Posting{ + amount: 10, + asset: "USD/2", + destination: "platform:fees", + source: "orders:1234" + }, + %Numscriptex.Posting{ + amount: 90, + asset: "USD/2", + destination: "merchants:6789", + source: "orders:1234" + } ] assert result.balances == [ - %{ + %Numscriptex.Balance{ account: "orders:1234", asset: "USD/2", final_balance: 900, initial_balance: 1000 }, - %{account: "platform:fees", asset: "USD/2", final_balance: 10, initial_balance: 0}, - %{account: "merchants:6789", asset: "USD/2", final_balance: 90, initial_balance: 0} + %Numscriptex.Balance{ + account: "platform:fees", + asset: "USD/2", + final_balance: 10, + initial_balance: 0 + }, + %Numscriptex.Balance{ + account: "merchants:6789", + asset: "USD/2", + final_balance: 90, + initial_balance: 0 + } ] end @@ -401,25 +446,25 @@ defmodule NumscriptexTest do assert {:ok, result} = Numscriptex.run(script, struct) assert result.postings == [ - %{ + %Numscriptex.Posting{ amount: 300, asset: "USD/2", destination: "platform:commission:sales_tax", source: "orders:1234" }, - %{ + %Numscriptex.Posting{ amount: 1200, asset: "USD/2", destination: "platform:commission:revenue", source: "orders:1234" }, - %{ + %Numscriptex.Posting{ amount: 500, asset: "USD/2", destination: "users:1234:cashback", source: "orders:1234" }, - %{ + %Numscriptex.Posting{ amount: 8000, asset: "USD/2", destination: "merchants:6789", @@ -428,31 +473,31 @@ defmodule NumscriptexTest do ] assert result.balances == [ - %{ + %Numscriptex.Balance{ account: "orders:1234", asset: "USD/2", final_balance: 0, initial_balance: 10_000 }, - %{ + %Numscriptex.Balance{ account: "platform:commission:sales_tax", asset: "USD/2", final_balance: 300, initial_balance: 0 }, - %{ + %Numscriptex.Balance{ account: "platform:commission:revenue", asset: "USD/2", final_balance: 1200, initial_balance: 0 }, - %{ + %Numscriptex.Balance{ account: "users:1234:cashback", asset: "USD/2", final_balance: 500, initial_balance: 0 }, - %{ + %Numscriptex.Balance{ account: "merchants:6789", asset: "USD/2", final_balance: 8000, @@ -478,12 +523,27 @@ defmodule NumscriptexTest do assert {:ok, result} = Numscriptex.run(script, struct) assert result.postings == [ - %{amount: 500, asset: "USD/2", destination: "payment", source: "users:1234"} + %Numscriptex.Posting{ + amount: 500, + asset: "USD/2", + destination: "payment", + source: "users:1234" + } ] assert result.balances == [ - %{account: "users:1234", asset: "USD/2", final_balance: 0, initial_balance: 500}, - %{account: "payment", asset: "USD/2", final_balance: 500, initial_balance: 0} + %Numscriptex.Balance{ + account: "users:1234", + asset: "USD/2", + final_balance: 0, + initial_balance: 500 + }, + %Numscriptex.Balance{ + account: "payment", + asset: "USD/2", + final_balance: 500, + initial_balance: 0 + } ] end @@ -512,14 +572,19 @@ defmodule NumscriptexTest do assert {:ok, result} = Numscriptex.run(script, struct) assert result.postings == [ - %{amount: 100, asset: "USD/2", destination: "payments:4567", source: "users:1234"}, - %{ + %Numscriptex.Posting{ + amount: 100, + asset: "USD/2", + destination: "payments:4567", + source: "users:1234" + }, + %Numscriptex.Posting{ amount: 1000, asset: "USD/2", destination: "payments:4567", source: "users:2345:credit" }, - %{ + %Numscriptex.Posting{ amount: 5000, asset: "USD/2", destination: "payments:4567", @@ -528,20 +593,25 @@ defmodule NumscriptexTest do ] assert result.balances == [ - %{ + %Numscriptex.Balance{ account: "users:2345:main", asset: "USD/2", final_balance: 0, initial_balance: 5000 }, - %{account: "users:1234", asset: "USD/2", final_balance: -100, initial_balance: 0}, - %{ + %Numscriptex.Balance{ + account: "users:1234", + asset: "USD/2", + final_balance: -100, + initial_balance: 0 + }, + %Numscriptex.Balance{ account: "payments:4567", asset: "USD/2", final_balance: 6100, initial_balance: 0 }, - %{ + %Numscriptex.Balance{ account: "users:2345:credit", asset: "USD/2", final_balance: -1000, @@ -570,12 +640,27 @@ defmodule NumscriptexTest do assert {:ok, result} = Numscriptex.run(script, struct) assert result.postings == [ - %{amount: 5, asset: "USD/2", destination: "platform:fees", source: "users:1234"} + %Numscriptex.Posting{ + amount: 5, + asset: "USD/2", + destination: "platform:fees", + source: "users:1234" + } ] assert result.balances == [ - %{account: "users:1234", asset: "USD/2", final_balance: 495, initial_balance: 500}, - %{account: "platform:fees", asset: "USD/2", final_balance: 5, initial_balance: 0} + %Numscriptex.Balance{ + account: "users:1234", + asset: "USD/2", + final_balance: 495, + initial_balance: 500 + }, + %Numscriptex.Balance{ + account: "platform:fees", + asset: "USD/2", + final_balance: 5, + initial_balance: 0 + } ] end @@ -608,21 +693,66 @@ defmodule NumscriptexTest do assert {:ok, result} = Numscriptex.run(script, struct) assert result.postings == [ - %{amount: 50, asset: "USD/2", destination: "bar", source: "foo"}, - %{amount: 49, asset: "USD/2", destination: "baz", source: "foo"}, - %{amount: 20, asset: "USD/2", destination: "b", source: "a"}, - %{amount: 20, asset: "USD/2", destination: "c", source: "a"}, - %{amount: 59, asset: "USD/2", destination: "d", source: "a"} + %Numscriptex.Posting{ + amount: 50, + asset: "USD/2", + destination: "bar", + source: "foo" + }, + %Numscriptex.Posting{ + amount: 49, + asset: "USD/2", + destination: "baz", + source: "foo" + }, + %Numscriptex.Posting{amount: 20, asset: "USD/2", destination: "b", source: "a"}, + %Numscriptex.Posting{amount: 20, asset: "USD/2", destination: "c", source: "a"}, + %Numscriptex.Posting{amount: 59, asset: "USD/2", destination: "d", source: "a"} ] assert result.balances == [ - %{account: "a", asset: "USD/2", final_balance: 901, initial_balance: 1000}, - %{account: "foo", asset: "USD/2", final_balance: 901, initial_balance: 1000}, - %{account: "bar", asset: "USD/2", final_balance: 50, initial_balance: 0}, - %{account: "baz", asset: "USD/2", final_balance: 49, initial_balance: 0}, - %{account: "b", asset: "USD/2", final_balance: 20, initial_balance: 0}, - %{account: "c", asset: "USD/2", final_balance: 20, initial_balance: 0}, - %{account: "d", asset: "USD/2", final_balance: 59, initial_balance: 0} + %Numscriptex.Balance{ + account: "a", + asset: "USD/2", + final_balance: 901, + initial_balance: 1000 + }, + %Numscriptex.Balance{ + account: "foo", + asset: "USD/2", + final_balance: 901, + initial_balance: 1000 + }, + %Numscriptex.Balance{ + account: "bar", + asset: "USD/2", + final_balance: 50, + initial_balance: 0 + }, + %Numscriptex.Balance{ + account: "baz", + asset: "USD/2", + final_balance: 49, + initial_balance: 0 + }, + %Numscriptex.Balance{ + account: "b", + asset: "USD/2", + final_balance: 20, + initial_balance: 0 + }, + %Numscriptex.Balance{ + account: "c", + asset: "USD/2", + final_balance: 20, + initial_balance: 0 + }, + %Numscriptex.Balance{ + account: "d", + asset: "USD/2", + final_balance: 59, + initial_balance: 0 + } ] end @@ -652,8 +782,13 @@ defmodule NumscriptexTest do assert {:ok, result} = Numscriptex.run(script, struct) assert result.postings == [ - %{amount: 20, asset: "USD/2", destination: "platform:tax", source: "users:1234"}, - %{ + %Numscriptex.Posting{ + amount: 20, + asset: "USD/2", + destination: "platform:tax", + source: "users:1234" + }, + %Numscriptex.Posting{ amount: 80, asset: "USD/2", destination: "platform:revenue", @@ -662,14 +797,19 @@ defmodule NumscriptexTest do ] assert result.balances == [ - %{ + %Numscriptex.Balance{ account: "users:1234", asset: "USD/2", final_balance: 9900, initial_balance: 10_000 }, - %{account: "platform:tax", asset: "USD/2", final_balance: 20, initial_balance: 0}, - %{ + %Numscriptex.Balance{ + account: "platform:tax", + asset: "USD/2", + final_balance: 20, + initial_balance: 0 + }, + %Numscriptex.Balance{ account: "platform:revenue", asset: "USD/2", final_balance: 80, @@ -708,13 +848,13 @@ defmodule NumscriptexTest do assert {:ok, result} = Numscriptex.run(script, struct) assert result.postings == [ - %{ + %Numscriptex.Posting{ amount: 150, asset: "USD/2", destination: "platform:fees", source: "orders:2345" }, - %{ + %Numscriptex.Posting{ amount: 850, asset: "USD/2", destination: "merchants:1234", @@ -723,14 +863,19 @@ defmodule NumscriptexTest do ] assert result.balances == [ - %{account: "orders:2345", asset: "USD/2", final_balance: 0, initial_balance: 1000}, - %{ + %Numscriptex.Balance{ + account: "orders:2345", + asset: "USD/2", + final_balance: 0, + initial_balance: 1000 + }, + %Numscriptex.Balance{ account: "platform:fees", asset: "USD/2", final_balance: 150, initial_balance: 0 }, - %{ + %Numscriptex.Balance{ account: "merchants:1234", asset: "USD/2", final_balance: 850, @@ -753,7 +898,7 @@ defmodule NumscriptexTest do assert {:ok, result} = Numscriptex.run(script, struct) assert result.postings == [ - %{ + %Numscriptex.Posting{ amount: 1000, asset: "USD/2", destination: "user", @@ -762,7 +907,7 @@ defmodule NumscriptexTest do ] assert result.balances == [ - %{ + %Numscriptex.Balance{ account: "user", asset: "USD/2", final_balance: 1000, @@ -789,19 +934,19 @@ defmodule NumscriptexTest do assert {:ok, result} = Numscriptex.run(script, struct) assert result.postings == [ - %{ + %Numscriptex.Posting{ amount: 620, asset: "USD/2", destination: "user", source: "user" }, - %{ + %Numscriptex.Posting{ amount: 270, asset: "USD/2", destination: "user2", source: "user" }, - %{ + %Numscriptex.Posting{ source: "user", destination: "user3", amount: 110, @@ -810,19 +955,19 @@ defmodule NumscriptexTest do ] assert result.balances == [ - %{ + %Numscriptex.Balance{ account: "user", asset: "USD/2", final_balance: 620, initial_balance: 1000 }, - %{ + %Numscriptex.Balance{ account: "user2", asset: "USD/2", final_balance: 1270, initial_balance: 1000 }, - %{ + %Numscriptex.Balance{ account: "user3", asset: "USD/2", final_balance: 110,