2024-02-02 09:05:04 -06:00
|
|
|
require "test_helper"
|
2024-03-11 16:32:13 -04:00
|
|
|
require "csv"
|
2024-02-02 09:05:04 -06:00
|
|
|
|
|
|
|
class FamilyTest < ActiveSupport::TestCase
|
2024-06-19 06:52:08 -04:00
|
|
|
include FamilySnapshotTestHelper
|
|
|
|
|
2024-02-03 13:07:23 -06:00
|
|
|
def setup
|
2024-03-04 08:31:22 -05:00
|
|
|
@family = families(:dylan_family)
|
|
|
|
@family.accounts.each do |account|
|
|
|
|
account.sync
|
|
|
|
end
|
2024-02-03 13:07:23 -06:00
|
|
|
end
|
|
|
|
|
|
|
|
test "should have many users" do
|
2024-03-04 08:31:22 -05:00
|
|
|
assert @family.users.size > 0
|
|
|
|
assert @family.users.include?(users(:family_admin))
|
2024-02-03 13:07:23 -06:00
|
|
|
end
|
|
|
|
|
|
|
|
test "should have many accounts" do
|
2024-03-04 08:31:22 -05:00
|
|
|
assert @family.accounts.size > 0
|
2024-02-03 13:07:23 -06:00
|
|
|
end
|
|
|
|
|
|
|
|
test "should destroy dependent users" do
|
2024-03-04 08:31:22 -05:00
|
|
|
assert_difference("User.count", -@family.users.count) do
|
|
|
|
@family.destroy
|
2024-02-03 13:07:23 -06:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
test "should destroy dependent accounts" do
|
2024-03-04 08:31:22 -05:00
|
|
|
assert_difference("Account.count", -@family.accounts.count) do
|
|
|
|
@family.destroy
|
2024-02-03 13:07:23 -06:00
|
|
|
end
|
|
|
|
end
|
2024-03-04 08:31:22 -05:00
|
|
|
|
2024-03-07 19:15:50 +01:00
|
|
|
test "should destroy dependent transaction categories" do
|
|
|
|
assert_difference("Transaction::Category.count", -@family.transaction_categories.count) do
|
|
|
|
@family.destroy
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2024-04-29 21:17:28 +02:00
|
|
|
test "should destroy dependent merchants" do
|
|
|
|
assert_difference("Transaction::Merchant.count", -@family.transaction_merchants.count) do
|
|
|
|
@family.destroy
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2024-03-04 08:31:22 -05:00
|
|
|
test "should calculate total assets" do
|
2024-06-19 06:52:08 -04:00
|
|
|
expected = get_today_snapshot_value_for :assets
|
|
|
|
assert_in_delta expected, @family.assets.amount, 0.01
|
2024-03-04 08:31:22 -05:00
|
|
|
end
|
|
|
|
|
|
|
|
test "should calculate total liabilities" do
|
2024-06-19 06:52:08 -04:00
|
|
|
expected = get_today_snapshot_value_for :liabilities
|
|
|
|
assert_in_delta expected, @family.liabilities.amount, 0.01
|
2024-03-04 08:31:22 -05:00
|
|
|
end
|
|
|
|
|
|
|
|
test "should calculate net worth" do
|
2024-06-19 06:52:08 -04:00
|
|
|
expected = get_today_snapshot_value_for :net_worth
|
|
|
|
assert_in_delta expected, @family.net_worth.amount, 0.01
|
2024-03-04 08:31:22 -05:00
|
|
|
end
|
|
|
|
|
2024-06-19 06:52:08 -04:00
|
|
|
test "calculates asset time series" do
|
|
|
|
series = @family.snapshot[:asset_series]
|
|
|
|
expected_series = get_expected_balances_for :assets
|
2024-03-11 16:32:13 -04:00
|
|
|
|
2024-06-19 06:52:08 -04:00
|
|
|
assert_time_series_balances series, expected_series
|
|
|
|
end
|
2024-03-11 16:32:13 -04:00
|
|
|
|
2024-06-19 06:52:08 -04:00
|
|
|
test "calculates liability time series" do
|
|
|
|
series = @family.snapshot[:liability_series]
|
|
|
|
expected_series = get_expected_balances_for :liabilities
|
2024-03-11 16:32:13 -04:00
|
|
|
|
2024-06-19 06:52:08 -04:00
|
|
|
assert_time_series_balances series, expected_series
|
2024-03-11 16:32:13 -04:00
|
|
|
end
|
|
|
|
|
2024-06-19 06:52:08 -04:00
|
|
|
test "calculates net worth time series" do
|
|
|
|
series = @family.snapshot[:net_worth_series]
|
|
|
|
expected_series = get_expected_balances_for :net_worth
|
|
|
|
|
|
|
|
assert_time_series_balances series, expected_series
|
|
|
|
end
|
2024-04-24 13:34:50 +01:00
|
|
|
|
2024-06-19 06:52:08 -04:00
|
|
|
test "calculates rolling expenses" do
|
|
|
|
series = @family.snapshot_transactions[:spending_series]
|
|
|
|
expected_series = get_expected_balances_for :rolling_spend
|
2024-04-24 13:34:50 +01:00
|
|
|
|
2024-06-19 06:52:08 -04:00
|
|
|
assert_time_series_balances series, expected_series, ignore_count: true
|
|
|
|
end
|
2024-04-24 13:34:50 +01:00
|
|
|
|
2024-06-19 06:52:08 -04:00
|
|
|
test "calculates rolling income" do
|
|
|
|
series = @family.snapshot_transactions[:income_series]
|
|
|
|
expected_series = get_expected_balances_for :rolling_income
|
|
|
|
|
|
|
|
assert_time_series_balances series, expected_series, ignore_count: true
|
|
|
|
end
|
|
|
|
|
|
|
|
test "calculates savings rate series" do
|
|
|
|
series = @family.snapshot_transactions[:savings_rate_series]
|
|
|
|
expected_series = get_expected_balances_for :savings_rate
|
|
|
|
|
|
|
|
series.values.each do |tsb|
|
|
|
|
expected_balance = expected_series.find { |eb| eb[:date] == tsb.date }
|
|
|
|
assert_in_delta expected_balance[:balance], tsb.value, 0.0001, "Balance incorrect on date: #{tsb.date}"
|
2024-04-24 13:34:50 +01:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2024-03-07 10:55:51 -05:00
|
|
|
test "should exclude disabled accounts from calculations" do
|
|
|
|
assets_before = @family.assets
|
|
|
|
liabilities_before = @family.liabilities
|
|
|
|
net_worth_before = @family.net_worth
|
|
|
|
|
|
|
|
disabled_checking = accounts(:checking)
|
|
|
|
disabled_cc = accounts(:credit_card)
|
|
|
|
|
|
|
|
disabled_checking.update!(is_active: false)
|
|
|
|
disabled_cc.update!(is_active: false)
|
|
|
|
|
|
|
|
assert_equal assets_before - disabled_checking.balance, @family.assets
|
|
|
|
assert_equal liabilities_before - disabled_cc.balance, @family.liabilities
|
|
|
|
assert_equal net_worth_before - disabled_checking.balance + disabled_cc.balance, @family.net_worth
|
|
|
|
end
|
2024-06-19 06:52:08 -04:00
|
|
|
|
|
|
|
private
|
|
|
|
|
|
|
|
def assert_time_series_balances(time_series_balances, expected_balances, ignore_count: false)
|
|
|
|
assert_equal time_series_balances.values.count, expected_balances.count unless ignore_count
|
|
|
|
|
|
|
|
time_series_balances.values.each do |tsb|
|
|
|
|
expected_balance = expected_balances.find { |eb| eb[:date] == tsb.date }
|
|
|
|
assert_in_delta expected_balance[:balance], tsb.value.amount, 0.01, "Balance incorrect on date: #{tsb.date}"
|
|
|
|
end
|
|
|
|
end
|
2024-02-02 09:05:04 -06:00
|
|
|
end
|