From b6d67b5348ff5fa25385abd84141cfd8666c829b Mon Sep 17 00:00:00 2001 From: Copilot <198982749+Copilot@users.noreply.github.com> Date: Wed, 7 Jan 2026 20:18:17 +0100 Subject: [PATCH] Fix disabled rules executing during automatic sync (#552) * Initial plan * Fix: Only apply active rules during sync Co-authored-by: jjmata <187772+jjmata@users.noreply.github.com> * FIX test --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: jjmata <187772+jjmata@users.noreply.github.com> Co-authored-by: sokie --- app/models/family/syncer.rb | 2 +- test/models/family/syncer_test.rb | 36 +++++++++++++++++++++++++++++++ 2 files changed, 37 insertions(+), 1 deletion(-) diff --git a/app/models/family/syncer.rb b/app/models/family/syncer.rb index a16c8d6e1..862102509 100644 --- a/app/models/family/syncer.rb +++ b/app/models/family/syncer.rb @@ -10,7 +10,7 @@ class Family::Syncer family.sync_trial_status! Rails.logger.info("Applying rules for family #{family.id}") - family.rules.each do |rule| + family.rules.where(active: true).each do |rule| rule.apply_later end diff --git a/test/models/family/syncer_test.rb b/test/models/family/syncer_test.rb index 7fe01a7eb..026d0348f 100644 --- a/test/models/family/syncer_test.rb +++ b/test/models/family/syncer_test.rb @@ -27,4 +27,40 @@ class Family::SyncerTest < ActiveSupport::TestCase assert_equal "completed", family_sync.reload.status end + + test "only applies active rules during sync" do + family_sync = syncs(:family) + + # Create an active rule + active_rule = @family.rules.create!( + resource_type: "transaction", + active: true, + actions: [ Rule::Action.new(action_type: "exclude_transaction") ] + ) + + # Create a disabled rule + disabled_rule = @family.rules.create!( + resource_type: "transaction", + active: false, + actions: [ Rule::Action.new(action_type: "exclude_transaction") ] + ) + + syncer = Family::Syncer.new(@family) + + # Stub the relation to return our specific instances so expectations work + @family.rules.stubs(:where).with(active: true).returns([ active_rule ]) + + # Expect apply_later to be called only for the active rule + active_rule.expects(:apply_later).once + disabled_rule.expects(:apply_later).never + + # Mock the account and plaid item syncs to avoid side effects + Account.any_instance.stubs(:sync_later) + PlaidItem.any_instance.stubs(:sync_later) + SimplefinItem.any_instance.stubs(:sync_later) + LunchflowItem.any_instance.stubs(:sync_later) + EnableBankingItem.any_instance.stubs(:sync_later) + + syncer.perform_sync(family_sync) + end end