diff options
Diffstat (limited to 'spec/models/concerns/batch_nullify_dependent_associations_spec.rb')
-rw-r--r-- | spec/models/concerns/batch_nullify_dependent_associations_spec.rb | 49 |
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 |