From 141c8489563119abe029859816afb2e654e0b53e Mon Sep 17 00:00:00 2001 From: Tristan Peralta Date: Thu, 11 Nov 2021 10:42:11 +0800 Subject: [PATCH] Refactor Ledger.is_balanced?/1 Rename from `is_balance?/1` to `is_balanced?/1` --- lib/ledger.ex | 10 +++---- lib/transaction.ex | 6 ++++ test/exledger_test.exs | 8 +++--- test/transaction_test.exs | 60 +++++++++++++++++++++++++++------------ 4 files changed, 56 insertions(+), 28 deletions(-) diff --git a/lib/ledger.ex b/lib/ledger.ex index c41a3bb..5421297 100644 --- a/lib/ledger.ex +++ b/lib/ledger.ex @@ -11,11 +11,9 @@ defmodule ExLedger.Ledger do struct!(%__MODULE__{}, attrs) end - @spec is_balance?(__MODULE__.t()) :: bool() - def is_balance?(%{transactions: transactions} = _ledger) do - Enum.flat_map(transactions, fn txn -> - Keyword.values(txn.balances) - end) - |> Enum.all?(&(&1 == 0)) + @spec is_balanced?(__MODULE__.t()) :: bool() + def is_balanced?(%{transactions: transactions} = _ledger) do + Enum.map(transactions, &Transaction.is_balanced?/1) + |> Enum.all?() end end diff --git a/lib/transaction.ex b/lib/transaction.ex index f92b0fb..e3785f0 100644 --- a/lib/transaction.ex +++ b/lib/transaction.ex @@ -32,6 +32,12 @@ defmodule ExLedger.Transaction do Map.put(txn, :balances, update_balance(txn.balances, amount)) end + @spec is_balanced?(__MODULE__.t()) :: bool() + def is_balanced?(txn) do + Keyword.values(txn.balances) + |> Enum.all?(&(&1 == 0)) + end + def transactions(entries) do entries |> Enum.map(& &1.entries) diff --git a/test/exledger_test.exs b/test/exledger_test.exs index 79d4214..de41fdf 100644 --- a/test/exledger_test.exs +++ b/test/exledger_test.exs @@ -2,7 +2,7 @@ defmodule ExledgerTest do use ExUnit.Case use ExLedger.LedgerBuilder - test "Ledger.is_balance?/1" do + test "Ledger.is_balanced?/1" do transaction = Transaction.new("test transaction") |> Transaction.add_entry("assets", {1, :USD}) @@ -12,10 +12,10 @@ defmodule ExledgerTest do ledger = Ledger.new(transactions: [transaction]) - assert Ledger.is_balance?(ledger) + assert Ledger.is_balanced?(ledger) end - test "Ledger.is_balance?/1 imbalance" do + test "Ledger.is_balanced?/1 imbalance" do transaction = Transaction.new("test transaction") |> Transaction.add_entry("assets", {1, :USD}) @@ -24,6 +24,6 @@ defmodule ExledgerTest do ledger = Ledger.new(transactions: [transaction]) - assert false == Ledger.is_balance?(ledger) + assert false == Ledger.is_balanced?(ledger) end end diff --git a/test/transaction_test.exs b/test/transaction_test.exs index 257a73c..2f94216 100644 --- a/test/transaction_test.exs +++ b/test/transaction_test.exs @@ -2,28 +2,52 @@ defmodule Exledger.TransactionTest do use ExUnit.Case use ExLedger.LedgerBuilder - test "add_entry/3" do - assert %{balances: [usd: 1]} = - Transaction.new("test transaction") - |> Transaction.add_entry("assets", {1, :usd}) - end + describe "add_entry/3" do + setup [:build_transaction] + + test "single currency", %{transaction: txn} do + assert %{balances: [usd: 1]} = txn + end - test "add_entry/3 sum 2 common currency" do - assert %{balances: [usd: 6]} = - Transaction.new("test transaction") - |> Transaction.add_entry("assets", {1, :usd}) - |> Transaction.add_entry("assets", {5, :usd}) + test "sums 2 common currency", %{transaction: txn} do + assert %{balances: [usd: 6]} = + txn + |> Transaction.add_entry("assets", {5, :usd}) + end + + test "multiple currency", %{transaction: txn} do + assert %{balances: [usd: 0, php: 0]} = + txn + |> Transaction.add_entry("expenses", {-1, :usd}) + |> Transaction.add_entry("assets", {1, :php}) + |> Transaction.add_entry("expenses", {-1, :php}) + end end - test "compute balances" do + describe "is_balanced?/1" do + test "returns true when all balances is 0" do + txn = + Transaction.new("test transaction") + |> Transaction.add_entry("assets", {-100, :usd}) + |> Transaction.add_entry("expenses", {100, :usd}) + + assert Transaction.is_balanced?(txn) + end + + test "returns false when all imbalances is 0" do + txn = + Transaction.new("test transaction") + |> Transaction.add_entry("assets", {-100, :usd}) + + refute Transaction.is_balanced?(txn) + end end - test "add_entry/3 with multiple currency" do - assert %{balances: [usd: 0, php: 0]} = - Transaction.new("test transaction") - |> Transaction.add_entry("assets", {1, :usd}) - |> Transaction.add_entry("expenses", {-1, :usd}) - |> Transaction.add_entry("assets", {1, :php}) - |> Transaction.add_entry("expenses", {-1, :php}) + defp build_transaction(_context) do + transaction = + Transaction.new("test transaction") + |> Transaction.add_entry("assets", {1, :usd}) + + [transaction: transaction] end end