diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2020-06-18 00:08:24 +0300 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2020-06-18 00:08:24 +0300 |
commit | 1b16af5ff9da84ff7779ea7d7db977d7c056baca (patch) | |
tree | 09aabef12bdae93174d8dff4a5e53a424dc0c526 /spec/migrations | |
parent | 6b922f9bb0a09fa74565a45e4af324d0324adba9 (diff) |
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'spec/migrations')
-rw-r--r-- | spec/migrations/20200526231421_update_index_approval_rule_name_for_code_owners_rule_type_spec.rb | 178 |
1 files changed, 178 insertions, 0 deletions
diff --git a/spec/migrations/20200526231421_update_index_approval_rule_name_for_code_owners_rule_type_spec.rb b/spec/migrations/20200526231421_update_index_approval_rule_name_for_code_owners_rule_type_spec.rb new file mode 100644 index 00000000000..df98316490b --- /dev/null +++ b/spec/migrations/20200526231421_update_index_approval_rule_name_for_code_owners_rule_type_spec.rb @@ -0,0 +1,178 @@ +# frozen_string_literal: true + +require 'spec_helper' +require Rails.root.join('db', 'migrate', '20200526231421_update_index_approval_rule_name_for_code_owners_rule_type.rb') + +describe UpdateIndexApprovalRuleNameForCodeOwnersRuleType do + let(:migration) { described_class.new } + + let(:approval_rules) { table(:approval_merge_request_rules) } + let(:namespace) { table(:namespaces).create!(name: 'gitlab', path: 'gitlab') } + + let(:project) do + table(:projects).create!( + namespace_id: namespace.id, + name: 'gitlab', + path: 'gitlab' + ) + end + + let(:merge_request) do + table(:merge_requests).create!( + target_project_id: project.id, + source_project_id: project.id, + target_branch: 'feature', + source_branch: 'master' + ) + end + + let(:index_names) do + ActiveRecord::Base.connection + .indexes(:approval_merge_request_rules) + .collect(&:name) + end + + def create_sectional_approval_rules + approval_rules.create!( + merge_request_id: merge_request.id, + name: "*.rb", + code_owner: true, + rule_type: 2, + section: "First Section" + ) + + approval_rules.create!( + merge_request_id: merge_request.id, + name: "*.rb", + code_owner: true, + rule_type: 2, + section: "Second Section" + ) + end + + def create_two_matching_nil_section_approval_rules + 2.times do + approval_rules.create!( + merge_request_id: merge_request.id, + name: "nil_section", + code_owner: true, + rule_type: 2 + ) + end + end + + before do + approval_rules.delete_all + end + + describe "#up" do + it "creates the new index and removes the 'legacy' indices" do + # Confirm that existing legacy indices prevent duplicate entries + # + expect { create_sectional_approval_rules } + .to raise_exception(ActiveRecord::RecordNotUnique) + expect { create_two_matching_nil_section_approval_rules } + .to raise_exception(ActiveRecord::RecordNotUnique) + + approval_rules.delete_all + + disable_migrations_output { migrate! } + + # After running the migration, expect `section == nil` rules to still + # be blocked by the legacy indices, but sectional rules are allowed. + # + expect { create_sectional_approval_rules } + .to change { approval_rules.count }.by(2) + expect { create_two_matching_nil_section_approval_rules } + .to raise_exception(ActiveRecord::RecordNotUnique) + + # Attempt to rerun the creation of sectional rules, and see that sectional + # rules are unique by section + # + expect { create_sectional_approval_rules } + .to raise_exception(ActiveRecord::RecordNotUnique) + + expect(index_names).to include( + described_class::SECTIONAL_INDEX_NAME, + described_class::LEGACY_INDEX_NAME_RULE_TYPE, + described_class::LEGACY_INDEX_NAME_CODE_OWNERS + ) + end + end + + describe "#down" do + context "run as FOSS" do + before do + expect(Gitlab).to receive(:ee?).twice.and_return(false) + end + + it "recreates legacy indices, but does not invoke EE-specific code" do + disable_migrations_output { migrate! } + + expect(index_names).to include( + described_class::SECTIONAL_INDEX_NAME, + described_class::LEGACY_INDEX_NAME_RULE_TYPE, + described_class::LEGACY_INDEX_NAME_CODE_OWNERS + ) + + # Since ApprovalMergeRequestRules are EE-specific, we expect none to + # be deleted during the migration. + # + expect { disable_migrations_output { migration.down } } + .not_to change { approval_rules.count } + + index_names = ActiveRecord::Base.connection + .indexes(:approval_merge_request_rules) + .collect(&:name) + + expect(index_names).not_to include(described_class::SECTIONAL_INDEX_NAME) + expect(index_names).to include( + described_class::LEGACY_INDEX_NAME_RULE_TYPE, + described_class::LEGACY_INDEX_NAME_CODE_OWNERS + ) + end + end + + context "EE" do + it "recreates 'legacy' indices and removes duplicate code owner approval rules" do + skip("This test is skipped under FOSS") unless Gitlab.ee? + + disable_migrations_output { migrate! } + + expect { create_sectional_approval_rules } + .to change { approval_rules.count }.by(2) + expect { create_two_matching_nil_section_approval_rules } + .to raise_exception(ActiveRecord::RecordNotUnique) + + # Run the down migration. This will remove the 2 approval rules we create + # above, and call MergeRequests::SyncCodeOwnerApprovalRules to recreate + # new ones. + # + expect(MergeRequests::SyncCodeOwnerApprovalRules) + .to receive(:new).with(MergeRequest.find(merge_request.id)).once.and_call_original + + # We expect approval_rules.count to be changed by -2 as we're deleting the + # 3 rules created above, and MergeRequests::SyncCodeOwnerApprovalRules + # will not be able to create new one with an empty (or missing) + # CODEOWNERS file. + # + expect { disable_migrations_output { migration.down } } + .to change { approval_rules.count }.by(-3) + + # Test that the index does not allow us to create the same rules as the + # previous sectional index. + # + expect { create_sectional_approval_rules } + .to raise_exception(ActiveRecord::RecordNotUnique) + expect { create_two_matching_nil_section_approval_rules } + .to raise_exception(ActiveRecord::RecordNotUnique) + + expect(index_names).not_to include(described_class::SECTIONAL_INDEX_NAME) + expect(index_names).to include( + described_class::LEGACY_INDEX_NAME_RULE_TYPE, + described_class::LEGACY_INDEX_NAME_CODE_OWNERS + ) + end + end + end +end |