Files
sure/test/models/simplefin_item/importer_inactive_test.rb
LPW e121969f2c Fix false positive inactive hints for SimpleFin accounts during chunked imports (#573)
* Add tests and logic for zero balance handling and inactivity detection

- Updated `SimplefinItem::ImporterInactiveTest` to include cases for chunked imports, credit cards, and loans.
- Added logic to skip zero balance detection for liability accounts (e.g., credit cards, loans).
- Ensured zero balance runs are counted only once per sync to avoid false positives during chunked imports.

* Add nil safety

---------

Co-authored-by: Josh Waldrep <joshua.waldrep5+github@gmail.com>
2026-01-08 11:44:38 +01:00

119 lines
4.2 KiB
Ruby

require "test_helper"
class SimplefinItem::ImporterInactiveTest < ActiveSupport::TestCase
setup do
@family = families(:dylan_family)
@item = SimplefinItem.create!(family: @family, name: "SF Conn", access_url: "https://example.com/access")
@sync = Sync.create!(syncable: @item)
end
def importer
@importer ||= SimplefinItem::Importer.new(@item, simplefin_provider: mock(), sync: @sync)
end
test "marks inactive when payload indicates closed or hidden" do
account_data = { id: "a1", name: "Old Checking", balance: 0, currency: "USD", closed: true }
importer.send(:import_account, account_data)
stats = @sync.reload.sync_stats
assert stats.dig("inactive", "a1"), "should be inactive when closed flag present"
end
test "counts zero runs once per sync even with multiple imports" do
account_data = { id: "a2", name: "Dormant", balance: 0, "available-balance": 0, currency: "USD" }
# Multiple imports in the same sync (simulating chunked imports) should only count once
5.times { importer.send(:import_account, account_data) }
stats = @sync.reload.sync_stats
assert_equal 1, stats.dig("zero_runs", "a2"), "should only count once per sync despite multiple imports"
assert_equal false, stats.dig("inactive", "a2"), "should not be inactive after single count"
end
test "resets zero_runs and inactive when activity returns" do
account_data = { id: "a3", name: "Dormant", balance: 0, "available-balance": 0, currency: "USD" }
importer.send(:import_account, account_data)
stats = @sync.reload.sync_stats
assert_equal 1, stats.dig("zero_runs", "a3")
# Activity returns: non-zero balance
active_data = { id: "a3", name: "Dormant", balance: 10, currency: "USD" }
importer.send(:import_account, active_data)
stats = @sync.reload.sync_stats
assert_equal 0, stats.dig("zero_runs", "a3")
assert_equal false, stats.dig("inactive", "a3")
end
test "does not count zero run when both balances are missing and no holdings" do
account_data = { id: "a4", name: "Unknown", currency: "USD" } # no balance keys, no holdings
importer.send(:import_account, account_data)
stats = @sync.reload.sync_stats
assert_equal 0, stats.dig("zero_runs", "a4").to_i
assert_equal false, stats.dig("inactive", "a4")
end
test "skips zero balance detection for credit cards" do
# Create a SimplefinAccount linked to a CreditCard account
sfa = SimplefinAccount.create!(
simplefin_item: @item,
name: "Paid Off Card",
account_id: "cc1",
account_type: "credit",
currency: "USD",
current_balance: 0
)
credit_card = CreditCard.create!
account = @family.accounts.create!(
name: "Paid Off Card",
balance: 0,
currency: "USD",
accountable: credit_card,
simplefin_account_id: sfa.id
)
account_data = { id: "cc1", name: "Paid Off Card", balance: 0, "available-balance": 0, currency: "USD" }
# Even with zero balance and no holdings, credit cards should not trigger the counter
importer.send(:import_account, account_data)
stats = @sync.reload.sync_stats
assert_nil stats.dig("zero_runs", "cc1"), "should not count zero runs for credit cards"
assert_equal false, stats.dig("inactive", "cc1")
end
test "skips zero balance detection for loans" do
# Create a SimplefinAccount linked to a Loan account
sfa = SimplefinAccount.create!(
simplefin_item: @item,
name: "Paid Off Loan",
account_id: "loan1",
account_type: "loan",
currency: "USD",
current_balance: 0
)
loan = Loan.create!
account = @family.accounts.create!(
name: "Paid Off Loan",
balance: 0,
currency: "USD",
accountable: loan,
simplefin_account_id: sfa.id
)
account_data = { id: "loan1", name: "Paid Off Loan", balance: 0, "available-balance": 0, currency: "USD" }
# Even with zero balance and no holdings, loans should not trigger the counter
importer.send(:import_account, account_data)
stats = @sync.reload.sync_stats
assert_nil stats.dig("zero_runs", "loan1"), "should not count zero runs for loans"
assert_equal false, stats.dig("inactive", "loan1")
end
end