Back to Repositories

Testing Account Management and Balance Calculations in Maybe Finance

This test suite validates account management functionality in the Maybe Finance application, focusing on account grouping, balance series generation, and currency handling. The tests ensure proper financial data organization and calculation accuracy.

Test Coverage Overview

The test suite provides comprehensive coverage of account-related functionality:

  • Account grouping by type (assets and liabilities)
  • Balance series generation with different time periods
  • Currency conversion scenarios
  • Edge cases for empty balances and missing exchange rates

Implementation Analysis

The testing approach utilizes ActiveSupport::TestCase with the SyncableInterfaceTest module for Ruby on Rails integration. The implementation leverages Minitest’s assertion methods and fixture data to validate account operations, balance calculations, and data transformations.

Technical Details

  • Testing Framework: Minitest
  • Test Helper Integration
  • Fixture Data Usage
  • Environment Variable Management
  • Period-based Testing
  • Currency Handling

Best Practices Demonstrated

The test suite exemplifies several testing best practices:

  • Proper test setup and teardown
  • Isolated test cases
  • Comprehensive assertion coverage
  • Environment variable handling
  • Edge case consideration
  • Clear test naming conventions

maybe-finance/maybe

test/models/account_test.rb

            
require "test_helper"

class AccountTest < ActiveSupport::TestCase
  include SyncableInterfaceTest

  setup do
    @account = @syncable = accounts(:depository)
    @family = families(:dylan_family)
  end

  test "groups accounts by type" do
    result = @family.accounts.by_group(period: Period.all)
    assets = result[:assets]
    liabilities = result[:liabilities]

    assert_equal @family.assets, assets.sum
    assert_equal @family.liabilities, liabilities.sum

    depositories = assets.children.find { |group| group.name == "Depository" }
    properties = assets.children.find { |group| group.name == "Property" }
    vehicles = assets.children.find { |group| group.name == "Vehicle" }
    investments = assets.children.find { |group| group.name == "Investment" }
    other_assets = assets.children.find { |group| group.name == "OtherAsset" }

    credits = liabilities.children.find { |group| group.name == "CreditCard" }
    loans = liabilities.children.find { |group| group.name == "Loan" }
    other_liabilities = liabilities.children.find { |group| group.name == "OtherLiability" }

    assert_equal 2, depositories.children.count
    assert_equal 1, properties.children.count
    assert_equal 1, vehicles.children.count
    assert_equal 1, investments.children.count
    assert_equal 1, other_assets.children.count

    assert_equal 1, credits.children.count
    assert_equal 1, loans.children.count
    assert_equal 1, other_liabilities.children.count
  end

  test "generates balance series" do
    assert_equal 2, @account.series.values.count
  end

  test "generates balance series with single value if no balances" do
    @account.balances.delete_all
    assert_equal 1, @account.series.values.count
  end

  test "generates balance series in period" do
    @account.balances.delete_all
    @account.balances.create! date: 31.days.ago.to_date, balance: 5000, currency: "USD" # out of period range
    @account.balances.create! date: 30.days.ago.to_date, balance: 5000, currency: "USD" # in range

    assert_equal 1, @account.series(period: Period.last_30_days).values.count
  end

  test "generates empty series if no balances and no exchange rate" do
    with_env_overrides SYNTH_API_KEY: nil do
      assert_equal 0, @account.series(currency: "NZD").values.count
    end
  end
end