Welcome to mirror list, hosted at ThFree Co, Russian Federation.

batch_cleaner_service_spec.rb « loose_foreign_keys « services « spec - gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: dcef419cc9a9f0438d03dcd8aaf68de255d4d4f6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
# frozen_string_literal: true

require 'spec_helper'

RSpec.describe LooseForeignKeys::BatchCleanerService do
  include MigrationsHelpers

  def create_table_structure
    migration = ActiveRecord::Migration.new.extend(Gitlab::Database::MigrationHelpers::LooseForeignKeyHelpers)

    migration.create_table :loose_fk_parent_table

    migration.create_table :loose_fk_child_table_1 do |t|
      t.bigint :parent_id
    end

    migration.create_table :loose_fk_child_table_2 do |t|
      t.bigint :parent_id_with_different_column
    end

    migration.track_record_deletions(:loose_fk_parent_table)
  end

  let(:parent_model) do
    Class.new(ApplicationRecord) do
      self.table_name = 'loose_fk_parent_table'

      include LooseForeignKey

      loose_foreign_key :loose_fk_child_table_1, :parent_id, on_delete: :async_delete
      loose_foreign_key :loose_fk_child_table_2, :parent_id_with_different_column, on_delete: :async_nullify
    end
  end

  let(:child_model_1) do
    Class.new(ApplicationRecord) do
      self.table_name = 'loose_fk_child_table_1'
    end
  end

  let(:child_model_2) do
    Class.new(ApplicationRecord) do
      self.table_name = 'loose_fk_child_table_2'
    end
  end

  let(:loose_fk_child_table_1) { table(:loose_fk_child_table_1) }
  let(:loose_fk_child_table_2) { table(:loose_fk_child_table_2) }
  let(:parent_record_1) { parent_model.create! }
  let(:other_parent_record) { parent_model.create! }

  before(:all) do
    create_table_structure
  end

  before do
    parent_record_1

    loose_fk_child_table_1.create!(parent_id: parent_record_1.id)
    loose_fk_child_table_1.create!(parent_id: parent_record_1.id)

    # these will not be deleted
    loose_fk_child_table_1.create!(parent_id: other_parent_record.id)
    loose_fk_child_table_1.create!(parent_id: other_parent_record.id)

    loose_fk_child_table_2.create!(parent_id_with_different_column: parent_record_1.id)
    loose_fk_child_table_2.create!(parent_id_with_different_column: parent_record_1.id)

    # these will not be deleted
    loose_fk_child_table_2.create!(parent_id_with_different_column: other_parent_record.id)
    loose_fk_child_table_2.create!(parent_id_with_different_column: other_parent_record.id)
  end

  after(:all) do
    migration = ActiveRecord::Migration.new
    migration.drop_table :loose_fk_parent_table
    migration.drop_table :loose_fk_child_table_1
    migration.drop_table :loose_fk_child_table_2
  end

  context 'when parent records are deleted' do
    before do
      parent_record_1.delete

      expect(loose_fk_child_table_1.count).to eq(4)
      expect(loose_fk_child_table_2.count).to eq(4)

      described_class.new(parent_klass: parent_model,
                          deleted_parent_records: LooseForeignKeys::DeletedRecord.status_pending.all,
                          models_by_table_name: {
                            'loose_fk_child_table_1' => child_model_1,
                            'loose_fk_child_table_2' => child_model_2
                          }).execute
    end

    it 'cleans up the child records' do
      expect(loose_fk_child_table_1.where(parent_id: parent_record_1.id)).to be_empty
      expect(loose_fk_child_table_2.where(parent_id_with_different_column: nil).count).to eq(2)
    end

    it 'cleans up the parent DeletedRecord' do
      expect(LooseForeignKeys::DeletedRecord.status_pending.count).to eq(0)
    end

    it 'does not delete unrelated records' do
      expect(loose_fk_child_table_1.where(parent_id: other_parent_record.id).count).to eq(2)
      expect(loose_fk_child_table_2.where(parent_id_with_different_column: other_parent_record.id).count).to eq(2)
    end
  end
end