summaryrefslogtreecommitdiff
path: root/spec/models/concerns/batch_nullify_dependent_associations_spec.rb
diff options
context:
space:
mode:
Diffstat (limited to 'spec/models/concerns/batch_nullify_dependent_associations_spec.rb')
-rw-r--r--spec/models/concerns/batch_nullify_dependent_associations_spec.rb49
1 files changed, 49 insertions, 0 deletions
diff --git a/spec/models/concerns/batch_nullify_dependent_associations_spec.rb b/spec/models/concerns/batch_nullify_dependent_associations_spec.rb
new file mode 100644
index 00000000000..933464f301a
--- /dev/null
+++ b/spec/models/concerns/batch_nullify_dependent_associations_spec.rb
@@ -0,0 +1,49 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe BatchNullifyDependentAssociations do
+ before do
+ test_user = Class.new(ActiveRecord::Base) do
+ self.table_name = 'users'
+
+ has_many :closed_issues, foreign_key: :closed_by_id, class_name: 'Issue', dependent: :nullify
+ has_many :issues, foreign_key: :author_id, class_name: 'Issue', dependent: :nullify
+ has_many :updated_issues, foreign_key: :updated_by_id, class_name: 'Issue'
+
+ include BatchNullifyDependentAssociations
+ end
+
+ stub_const('TestUser', test_user)
+ end
+
+ describe '.dependent_associations_to_nullify' do
+ it 'returns only associations with `dependent: :nullify` associations' do
+ expect(TestUser.dependent_associations_to_nullify.map(&:name)).to match_array([:closed_issues, :issues])
+ end
+ end
+
+ describe '#nullify_dependent_associations_in_batches' do
+ let_it_be(:user) { create(:user) }
+ let_it_be(:updated_by_issue) { create(:issue, updated_by: user) }
+
+ before do
+ create(:issue, closed_by: user)
+ create(:issue, closed_by: user)
+ end
+
+ it 'nullifies multiple settings' do
+ expect do
+ test_user = TestUser.find(user.id)
+ test_user.nullify_dependent_associations_in_batches
+ end.to change { Issue.where(closed_by_id: user.id).count }.by(-2)
+ end
+
+ it 'excludes associations' do
+ expect do
+ test_user = TestUser.find(user.id)
+ test_user.nullify_dependent_associations_in_batches(exclude: [:closed_issues])
+ end.not_to change { Issue.where(closed_by_id: user.id).count }
+ end
+ end
+end