Skip to content

Commit

Permalink
Refactor Ledger.is_balanced?/1
Browse files Browse the repository at this point in the history
Rename from `is_balance?/1` to `is_balanced?/1`
  • Loading branch information
tristanperalta committed Nov 11, 2021
1 parent eea8eeb commit 141c848
Show file tree
Hide file tree
Showing 4 changed files with 56 additions and 28 deletions.
10 changes: 4 additions & 6 deletions lib/ledger.ex
Original file line number Diff line number Diff line change
Expand Up @@ -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
6 changes: 6 additions & 0 deletions lib/transaction.ex
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
8 changes: 4 additions & 4 deletions test/exledger_test.exs
Original file line number Diff line number Diff line change
Expand Up @@ -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})
Expand All @@ -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})
Expand All @@ -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
60 changes: 42 additions & 18 deletions test/transaction_test.exs
Original file line number Diff line number Diff line change
Expand Up @@ -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

0 comments on commit 141c848

Please sign in to comment.