From be9cfc1ac57f7fce21ca50a69340ff63ec365b6c Mon Sep 17 00:00:00 2001 From: Wei-Meng Lee Date: Fri, 6 Sep 2019 15:01:43 +0800 Subject: [PATCH 1/4] Prevent project's approval rules having same name --- ee/app/models/approval_project_rule.rb | 2 ++ ee/spec/models/approval_project_rule_spec.rb | 14 ++++++++++++++ 2 files changed, 16 insertions(+) diff --git a/ee/app/models/approval_project_rule.rb b/ee/app/models/approval_project_rule.rb index c1222a366f6df8..4ee5d6dc1bc48d 100644 --- a/ee/app/models/approval_project_rule.rb +++ b/ee/app/models/approval_project_rule.rb @@ -13,6 +13,8 @@ class ApprovalProjectRule < ApplicationRecord alias_method :code_owner, :code_owner? + validates :name, uniqueness: { scope: :project_id } + def source_rule nil end diff --git a/ee/spec/models/approval_project_rule_spec.rb b/ee/spec/models/approval_project_rule_spec.rb index c09b81b2229a10..c1b2d82441033c 100644 --- a/ee/spec/models/approval_project_rule_spec.rb +++ b/ee/spec/models/approval_project_rule_spec.rb @@ -5,6 +5,20 @@ describe ApprovalProjectRule do subject { create(:approval_project_rule) } + describe 'validations' do + it 'enforces uniqueness of rule names scoped to a project' do + new_rule = build(:approval_project_rule, name: subject.name, project: subject.project) + + expect(new_rule).to_not be_valid + end + + it 'does not enforce uniqueness of rule names across projects' do + new_rule = build(:approval_project_rule, name: subject.name) + + expect(new_rule).to be_valid + end + end + describe '.regular' do it 'returns non-report_approver records' do rules = create_list(:approval_project_rule, 2) -- GitLab From 146e5988123ea3092d45e7629b6b8f19aa5e3602 Mon Sep 17 00:00:00 2001 From: Wei-Meng Lee Date: Fri, 6 Sep 2019 15:05:15 +0800 Subject: [PATCH 2/4] Add changelog entry --- .../weimeng-prevent-approval-group-name-collision.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 ee/changelogs/unreleased/weimeng-prevent-approval-group-name-collision.yml diff --git a/ee/changelogs/unreleased/weimeng-prevent-approval-group-name-collision.yml b/ee/changelogs/unreleased/weimeng-prevent-approval-group-name-collision.yml new file mode 100644 index 00000000000000..0167427775b7ab --- /dev/null +++ b/ee/changelogs/unreleased/weimeng-prevent-approval-group-name-collision.yml @@ -0,0 +1,5 @@ +--- +title: Prevent project's approval rules having same name +merge_request: 16216 +author: +type: fixed -- GitLab From 413ac021fd48662d156fbd903611d430b76202eb Mon Sep 17 00:00:00 2001 From: Wei-Meng Lee Date: Wed, 11 Sep 2019 16:37:07 +0800 Subject: [PATCH 3/4] Fix failing tests --- ee/spec/factories/approval_rules.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ee/spec/factories/approval_rules.rb b/ee/spec/factories/approval_rules.rb index 83a164bd09de25..d89025071211bb 100644 --- a/ee/spec/factories/approval_rules.rb +++ b/ee/spec/factories/approval_rules.rb @@ -22,7 +22,7 @@ factory :approval_project_rule do project - name ApprovalRuleLike::DEFAULT_NAME + sequence(:name) { |n| "#{ApprovalRuleLike::DEFAULT_NAME}-#{n}" } rule_type :regular trait :security_report do -- GitLab From 7b61f8b8f7773ec1bb77172ead40d9915090d13b Mon Sep 17 00:00:00 2001 From: Wei-Meng Lee Date: Wed, 11 Sep 2019 16:37:22 +0800 Subject: [PATCH 4/4] Use shoulda-matchers instead --- ee/spec/models/approval_project_rule_spec.rb | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/ee/spec/models/approval_project_rule_spec.rb b/ee/spec/models/approval_project_rule_spec.rb index c1b2d82441033c..5ad418de83fbd8 100644 --- a/ee/spec/models/approval_project_rule_spec.rb +++ b/ee/spec/models/approval_project_rule_spec.rb @@ -6,17 +6,7 @@ subject { create(:approval_project_rule) } describe 'validations' do - it 'enforces uniqueness of rule names scoped to a project' do - new_rule = build(:approval_project_rule, name: subject.name, project: subject.project) - - expect(new_rule).to_not be_valid - end - - it 'does not enforce uniqueness of rule names across projects' do - new_rule = build(:approval_project_rule, name: subject.name) - - expect(new_rule).to be_valid - end + it { is_expected.to validate_uniqueness_of(:name).scoped_to(:project_id) } end describe '.regular' do -- GitLab