diff --git a/db/migrate/20260606000000_add_cascade_to_rejected_transfers_foreign_keys.rb b/db/migrate/20260606000000_add_cascade_to_rejected_transfers_foreign_keys.rb new file mode 100644 index 000000000..2cc3f486e --- /dev/null +++ b/db/migrate/20260606000000_add_cascade_to_rejected_transfers_foreign_keys.rb @@ -0,0 +1,11 @@ +class AddCascadeToRejectedTransfersForeignKeys < ActiveRecord::Migration[7.2] + def change + remove_foreign_key :rejected_transfers, to_table: :transactions, column: :inflow_transaction_id + remove_foreign_key :rejected_transfers, to_table: :transactions, column: :outflow_transaction_id + + add_foreign_key :rejected_transfers, :transactions, + column: :inflow_transaction_id, on_delete: :cascade + add_foreign_key :rejected_transfers, :transactions, + column: :outflow_transaction_id, on_delete: :cascade + end +end diff --git a/db/schema.rb b/db/schema.rb index d904bf0f2..8c4274404 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -2134,8 +2134,8 @@ ActiveRecord::Schema[7.2].define(version: 2026_06_07_071000) do add_foreign_key "recurring_transactions", "accounts", on_delete: :cascade add_foreign_key "recurring_transactions", "families" add_foreign_key "recurring_transactions", "merchants" - add_foreign_key "rejected_transfers", "transactions", column: "inflow_transaction_id" - add_foreign_key "rejected_transfers", "transactions", column: "outflow_transaction_id" + add_foreign_key "rejected_transfers", "transactions", column: "inflow_transaction_id", on_delete: :cascade + add_foreign_key "rejected_transfers", "transactions", column: "outflow_transaction_id", on_delete: :cascade add_foreign_key "rule_actions", "rules" add_foreign_key "rule_conditions", "rule_conditions", column: "parent_id" add_foreign_key "rule_conditions", "rules" diff --git a/test/controllers/transactions/bulk_deletions_controller_test.rb b/test/controllers/transactions/bulk_deletions_controller_test.rb index aa981d6c4..f6fbf96c8 100644 --- a/test/controllers/transactions/bulk_deletions_controller_test.rb +++ b/test/controllers/transactions/bulk_deletions_controller_test.rb @@ -21,4 +21,28 @@ class Transactions::BulkDeletionsControllerTest < ActionDispatch::IntegrationTes assert_redirected_to transactions_url assert_equal "#{delete_count} transactions deleted", flash[:notice] end + + test "bulk delete with rejected transfers" do + entry = entries(:transaction) + other_entry = entries(:transfer_out) + + # Create a rejected_transfer referencing the entry's transaction + RejectedTransfer.create!( + inflow_transaction: entry.entryable, + outflow_transaction: other_entry.entryable + ) + + assert_difference "RejectedTransfer.count", -1 do + assert_difference [ "Transaction.count", "Entry.count" ], -1 do + post transactions_bulk_deletion_url, params: { + bulk_delete: { + entry_ids: [ entry.id ] + } + } + end + end + + assert_redirected_to transactions_url + assert_equal "1 transaction deleted", flash[:notice] + end end