Commit 04b3cd95 authored by Alex Kalderimis's avatar Alex Kalderimis

Enable RSpec/MultipleMemoizedHelpers by default

We bring this cop into the main config, and set a lower threshold.

Some files are excluded (migration specs, which we don't want to touch),
others are fixed, and some have explicit disablements.

The threshold of 28 is chosen as it accounts for the vast majority of
our usage. We should aim to bring this down to 20, and eventually closer
to 10.

Note that at present let_it_be is not counted.
parent 3cbb152c
...@@ -90,6 +90,17 @@ RSpec/FilePath: ...@@ -90,6 +90,17 @@ RSpec/FilePath:
- 'ee/spec/frontend/fixtures/*' - 'ee/spec/frontend/fixtures/*'
- 'spec/requests/api/v3/*' - 'spec/requests/api/v3/*'
# Configuration parameters: AllowSubject.
RSpec/MultipleMemoizedHelpers:
Max: 28
AllowSubject: true
Exclude:
- 'spec/migrations/**/*.rb'
- 'spec/lib/gitlab/background_migration/populate_project_snippet_statistics_spec.rb'
- 'spec/lib/gitlab/background_migration/populate_finding_uuid_for_vulnerability_feedback_spec.rb'
- 'ee/spec/lib/ee/gitlab/background_migration/populate_uuids_for_security_findings_spec.rb'
- 'ee/spec/lib/gitlab/background_migration/user_mentions/create_resource_user_mention_spec.rb'
Naming/FileName: Naming/FileName:
ExpectMatchingDefinition: true ExpectMatchingDefinition: true
Exclude: Exclude:
......
...@@ -463,11 +463,6 @@ RSpec/ExpectChange: ...@@ -463,11 +463,6 @@ RSpec/ExpectChange:
RSpec/ExpectInHook: RSpec/ExpectInHook:
Enabled: false Enabled: false
# Offense count: 16403
# Configuration parameters: AllowSubject.
RSpec/MultipleMemoizedHelpers:
Max: 40
# Offense count: 2352 # Offense count: 2352
# Cop supports --auto-correct. # Cop supports --auto-correct.
# Configuration parameters: Strict, EnforcedStyle, AllowedExplicitMatchers. # Configuration parameters: Strict, EnforcedStyle, AllowedExplicitMatchers.
......
...@@ -334,15 +334,15 @@ RSpec.describe Boards::Issues::MoveService, services: true do ...@@ -334,15 +334,15 @@ RSpec.describe Boards::Issues::MoveService, services: true do
let(:subgroup) { create(:group, parent: group) } let(:subgroup) { create(:group, parent: group) }
let(:subgroup_project) { create(:project, namespace: subgroup) } let(:subgroup_project) { create(:project, namespace: subgroup) }
let(:params) { { board_id: board1.id, from_list_id: label_list1.id, to_list_id: label_list1.id } }
let(:issue) { create(:labeled_issue, project: subgroup_project, labels: [bug, development]) }
let(:issue0) { create(:labeled_issue, project: subgroup_project, labels: [bug, development]) }
let(:issue1) { create(:labeled_issue, project: project, labels: [bug, development]) }
let(:issue2) { create(:labeled_issue, project: project, labels: [bug, development]) }
it 'sorts issues included in subgroups' do it 'sorts issues included in subgroups' do
reorder_issues(params, issues: [issue, issue0, issue1, issue2]) labels = [bug, development]
issue = create(:labeled_issue, project: subgroup_project, labels: labels)
issue0 = create(:labeled_issue, project: subgroup_project, labels: labels)
issue1 = create(:labeled_issue, project: project, labels: labels)
issue2 = create(:labeled_issue, project: project, labels: labels)
params = { board_id: board1.id, from_list_id: label_list1.id, to_list_id: label_list1.id }
reorder_issues(params, issues: [issue, issue0, issue1, issue2])
described_class.new(parent, user, params).execute(issue) described_class.new(parent, user, params).execute(issue)
expect(issue.relative_position).to be_between(issue0.relative_position, issue1.relative_position) expect(issue.relative_position).to be_between(issue0.relative_position, issue1.relative_position)
......
...@@ -2,6 +2,7 @@ ...@@ -2,6 +2,7 @@
require 'spec_helper' require 'spec_helper'
# rubocop: disable RSpec/MultipleMemoizedHelpers
RSpec.describe Security::MergeReportsService, '#execute' do RSpec.describe Security::MergeReportsService, '#execute' do
let(:scanner_1) { build(:ci_reports_security_scanner, external_id: 'scanner-1', name: 'Scanner 1') } let(:scanner_1) { build(:ci_reports_security_scanner, external_id: 'scanner-1', name: 'Scanner 1') }
let(:scanner_2) { build(:ci_reports_security_scanner, external_id: 'scanner-2', name: 'Scanner 2') } let(:scanner_2) { build(:ci_reports_security_scanner, external_id: 'scanner-2', name: 'Scanner 2') }
...@@ -338,3 +339,4 @@ RSpec.describe Security::MergeReportsService, '#execute' do ...@@ -338,3 +339,4 @@ RSpec.describe Security::MergeReportsService, '#execute' do
end end
end end
end end
# rubocop: enable RSpec/MultipleMemoizedHelpers
...@@ -2,6 +2,7 @@ ...@@ -2,6 +2,7 @@
require 'spec_helper' require 'spec_helper'
# rubocop: disable RSpec/MultipleMemoizedHelpers
RSpec.describe Gitlab::SidekiqMiddleware::ServerMetrics do RSpec.describe Gitlab::SidekiqMiddleware::ServerMetrics do
context "with worker attribution" do context "with worker attribution" do
subject { described_class.new } subject { described_class.new }
...@@ -287,3 +288,4 @@ RSpec.describe Gitlab::SidekiqMiddleware::ServerMetrics do ...@@ -287,3 +288,4 @@ RSpec.describe Gitlab::SidekiqMiddleware::ServerMetrics do
end end
end end
end end
# rubocop: enable RSpec/MultipleMemoizedHelpers
...@@ -4,40 +4,41 @@ require 'spec_helper' ...@@ -4,40 +4,41 @@ require 'spec_helper'
RSpec.describe Boards::Issues::ListService do RSpec.describe Boards::Issues::ListService do
describe '#execute' do describe '#execute' do
context 'when parent is a project' do let_it_be(:user) { create(:user) }
let(:user) { create(:user) }
let(:project) { create(:project) }
let(:board) { create(:board, project: project) }
let(:m1) { create(:milestone, project: project) }
let(:m2) { create(:milestone, project: project) }
let(:bug) { create(:label, project: project, name: 'Bug') }
let(:development) { create(:label, project: project, name: 'Development') }
let(:testing) { create(:label, project: project, name: 'Testing') }
let(:p1) { create(:label, title: 'P1', project: project, priority: 1) }
let(:p2) { create(:label, title: 'P2', project: project, priority: 2) }
let(:p3) { create(:label, title: 'P3', project: project, priority: 3) }
let!(:backlog) { create(:backlog_list, board: board) }
let!(:list1) { create(:list, board: board, label: development, position: 0) }
let!(:list2) { create(:list, board: board, label: testing, position: 1) }
let!(:closed) { create(:closed_list, board: board) }
let!(:opened_issue1) { create(:labeled_issue, project: project, milestone: m1, title: 'Issue 1', labels: [bug]) } context 'when parent is a project' do
let!(:opened_issue2) { create(:labeled_issue, project: project, milestone: m2, title: 'Issue 2', labels: [p2]) } let_it_be(:project) { create(:project, :empty_repo) }
let!(:reopened_issue1) { create(:issue, :opened, project: project, title: 'Reopened Issue 1' ) } let_it_be(:board) { create(:board, project: project) }
let!(:list1_issue1) { create(:labeled_issue, project: project, milestone: m1, labels: [p2, development]) } let_it_be(:m1) { create(:milestone, project: project) }
let!(:list1_issue2) { create(:labeled_issue, project: project, milestone: m2, labels: [development]) } let_it_be(:m2) { create(:milestone, project: project) }
let!(:list1_issue3) { create(:labeled_issue, project: project, milestone: m1, labels: [development, p1]) }
let!(:list2_issue1) { create(:labeled_issue, project: project, milestone: m1, labels: [testing]) } let_it_be(:bug) { create(:label, project: project, name: 'Bug') }
let_it_be(:development) { create(:label, project: project, name: 'Development') }
let!(:closed_issue1) { create(:labeled_issue, :closed, project: project, labels: [bug], closed_at: 1.day.ago) } let_it_be(:testing) { create(:label, project: project, name: 'Testing') }
let!(:closed_issue2) { create(:labeled_issue, :closed, project: project, labels: [p3], closed_at: 2.days.ago) } let_it_be(:p1) { create(:label, title: 'P1', project: project, priority: 1) }
let!(:closed_issue3) { create(:issue, :closed, project: project, closed_at: 1.week.ago) } let_it_be(:p2) { create(:label, title: 'P2', project: project, priority: 2) }
let!(:closed_issue4) { create(:labeled_issue, :closed, project: project, labels: [p1], closed_at: 1.year.ago) } let_it_be(:p3) { create(:label, title: 'P3', project: project, priority: 3) }
let!(:closed_issue5) { create(:labeled_issue, :closed, project: project, labels: [development], closed_at: 2.years.ago) }
let_it_be(:backlog) { create(:backlog_list, board: board) }
let_it_be(:list1) { create(:list, board: board, label: development, position: 0) }
let_it_be(:list2) { create(:list, board: board, label: testing, position: 1) }
let_it_be(:closed) { create(:closed_list, board: board) }
let_it_be(:opened_issue1) { create(:labeled_issue, project: project, milestone: m1, title: 'Issue 1', labels: [bug]) }
let_it_be(:opened_issue2) { create(:labeled_issue, project: project, milestone: m2, title: 'Issue 2', labels: [p2]) }
let_it_be(:reopened_issue1) { create(:issue, :opened, project: project, title: 'Reopened Issue 1' ) }
let_it_be(:list1_issue1) { create(:labeled_issue, project: project, milestone: m1, labels: [p2, development]) }
let_it_be(:list1_issue2) { create(:labeled_issue, project: project, milestone: m2, labels: [development]) }
let_it_be(:list1_issue3) { create(:labeled_issue, project: project, milestone: m1, labels: [development, p1]) }
let_it_be(:list2_issue1) { create(:labeled_issue, project: project, milestone: m1, labels: [testing]) }
let_it_be(:closed_issue1) { create(:labeled_issue, :closed, project: project, labels: [bug], closed_at: 1.day.ago) }
let_it_be(:closed_issue2) { create(:labeled_issue, :closed, project: project, labels: [p3], closed_at: 2.days.ago) }
let_it_be(:closed_issue3) { create(:issue, :closed, project: project, closed_at: 1.week.ago) }
let_it_be(:closed_issue4) { create(:labeled_issue, :closed, project: project, labels: [p1], closed_at: 1.year.ago) }
let_it_be(:closed_issue5) { create(:labeled_issue, :closed, project: project, labels: [development], closed_at: 2.years.ago) }
let(:parent) { project } let(:parent) { project }
...@@ -48,14 +49,16 @@ RSpec.describe Boards::Issues::ListService do ...@@ -48,14 +49,16 @@ RSpec.describe Boards::Issues::ListService do
it_behaves_like 'issues list service' it_behaves_like 'issues list service'
context 'when project is archived' do context 'when project is archived' do
let(:project) { create(:project, :archived) } before do
project.update!(archived: true)
end
it_behaves_like 'issues list service' it_behaves_like 'issues list service'
end end
end end
# rubocop: disable RSpec/MultipleMemoizedHelpers
context 'when parent is a group' do context 'when parent is a group' do
let(:user) { create(:user) }
let(:project) { create(:project, :empty_repo, namespace: group) } let(:project) { create(:project, :empty_repo, namespace: group) }
let(:project1) { create(:project, :empty_repo, namespace: group) } let(:project1) { create(:project, :empty_repo, namespace: group) }
let(:project_archived) { create(:project, :empty_repo, :archived, namespace: group) } let(:project_archived) { create(:project, :empty_repo, :archived, namespace: group) }
...@@ -104,7 +107,7 @@ RSpec.describe Boards::Issues::ListService do ...@@ -104,7 +107,7 @@ RSpec.describe Boards::Issues::ListService do
group.add_developer(user) group.add_developer(user)
end end
context 'and group has no parent' do context 'when the group has no parent' do
let(:parent) { group } let(:parent) { group }
let(:group) { create(:group) } let(:group) { create(:group) }
let(:board) { create(:board, group: group) } let(:board) { create(:board, group: group) }
...@@ -112,7 +115,7 @@ RSpec.describe Boards::Issues::ListService do ...@@ -112,7 +115,7 @@ RSpec.describe Boards::Issues::ListService do
it_behaves_like 'issues list service' it_behaves_like 'issues list service'
end end
context 'and group is an ancestor' do context 'when the group is an ancestor' do
let(:parent) { create(:group) } let(:parent) { create(:group) }
let(:group) { create(:group, parent: parent) } let(:group) { create(:group, parent: parent) }
let!(:backlog) { create(:backlog_list, board: board) } let!(:backlog) { create(:backlog_list, board: board) }
...@@ -125,5 +128,6 @@ RSpec.describe Boards::Issues::ListService do ...@@ -125,5 +128,6 @@ RSpec.describe Boards::Issues::ListService do
it_behaves_like 'issues list service' it_behaves_like 'issues list service'
end end
end end
# rubocop: enable RSpec/MultipleMemoizedHelpers
end end
end end
...@@ -4,9 +4,9 @@ require 'spec_helper' ...@@ -4,9 +4,9 @@ require 'spec_helper'
RSpec.describe Labels::PromoteService do RSpec.describe Labels::PromoteService do
describe '#execute' do describe '#execute' do
let!(:user) { create(:user) } let_it_be(:user) { create(:user) }
context 'project without group' do context 'without a group' do
let!(:project_1) { create(:project) } let!(:project_1) { create(:project) }
let!(:project_label_1_1) { create(:label, project: project_1) } let!(:project_label_1_1) { create(:label, project: project_1) }
...@@ -18,40 +18,40 @@ RSpec.describe Labels::PromoteService do ...@@ -18,40 +18,40 @@ RSpec.describe Labels::PromoteService do
end end
end end
context 'project with group' do context 'with a group' do
let!(:promoted_label_name) { "Promoted Label" } let_it_be(:promoted_label_name) { "Promoted Label" }
let!(:untouched_label_name) { "Untouched Label" } let_it_be(:untouched_label_name) { "Untouched Label" }
let!(:promoted_description) { "Promoted Description" } let_it_be(:promoted_description) { "Promoted Description" }
let!(:promoted_color) { "#0000FF" } let_it_be(:promoted_color) { "#0000FF" }
let!(:label_2_1_priority) { 1 } let_it_be(:label_2_1_priority) { 1 }
let!(:label_3_1_priority) { 2 } let_it_be(:label_3_1_priority) { 2 }
let!(:group_1) { create(:group) } let_it_be(:group_1) { create(:group) }
let!(:group_2) { create(:group) } let_it_be(:group_2) { create(:group) }
let!(:project_1) { create(:project, namespace: group_1) } let_it_be(:project_1) { create(:project, :repository, namespace: group_1) }
let!(:project_2) { create(:project, namespace: group_1) } let_it_be(:project_2) { create(:project, :repository, namespace: group_1) }
let!(:project_3) { create(:project, namespace: group_1) } let_it_be(:project_3) { create(:project, :repository, namespace: group_1) }
let!(:project_4) { create(:project, namespace: group_2) } let_it_be(:project_4) { create(:project, :repository, namespace: group_2) }
# Labels/issues can't be lazily created so we might as well eager initialize # Labels/issues can't be lazily created so we might as well eager initialize
# all other objects too since we use them inside # all other objects too since we use them inside
let!(:project_label_1_1) { create(:label, project: project_1, name: promoted_label_name, color: promoted_color, description: promoted_description) } let_it_be(:project_label_1_1) { create(:label, project: project_1, name: promoted_label_name, color: promoted_color, description: promoted_description) }
let!(:project_label_1_2) { create(:label, project: project_1, name: untouched_label_name) } let_it_be(:project_label_1_2) { create(:label, project: project_1, name: untouched_label_name) }
let!(:project_label_2_1) { create(:label, project: project_2, priority: label_2_1_priority, name: promoted_label_name, color: "#FF0000") } let_it_be(:project_label_2_1) { create(:label, project: project_2, priority: label_2_1_priority, name: promoted_label_name, color: "#FF0000") }
let!(:project_label_3_1) { create(:label, project: project_3, priority: label_3_1_priority, name: promoted_label_name) } let_it_be(:project_label_3_1) { create(:label, project: project_3, priority: label_3_1_priority, name: promoted_label_name) }
let!(:project_label_3_2) { create(:label, project: project_3, priority: 1, name: untouched_label_name) } let_it_be(:project_label_3_2) { create(:label, project: project_3, priority: 1, name: untouched_label_name) }
let!(:project_label_4_1) { create(:label, project: project_4, name: promoted_label_name) } let_it_be(:project_label_4_1) { create(:label, project: project_4, name: promoted_label_name) }
let!(:issue_1_1) { create(:labeled_issue, project: project_1, labels: [project_label_1_1, project_label_1_2]) } let_it_be(:issue_1_1) { create(:labeled_issue, project: project_1, labels: [project_label_1_1, project_label_1_2]) }
let!(:issue_1_2) { create(:labeled_issue, project: project_1, labels: [project_label_1_2]) } let_it_be(:issue_1_2) { create(:labeled_issue, project: project_1, labels: [project_label_1_2]) }
let!(:issue_2_1) { create(:labeled_issue, project: project_2, labels: [project_label_2_1]) } let_it_be(:issue_2_1) { create(:labeled_issue, project: project_2, labels: [project_label_2_1]) }
let!(:issue_4_1) { create(:labeled_issue, project: project_4, labels: [project_label_4_1]) } let_it_be(:issue_4_1) { create(:labeled_issue, project: project_4, labels: [project_label_4_1]) }
let!(:merge_3_1) { create(:labeled_merge_request, source_project: project_3, target_project: project_3, labels: [project_label_3_1, project_label_3_2]) } let_it_be(:merge_3_1) { create(:labeled_merge_request, source_project: project_3, target_project: project_3, labels: [project_label_3_1, project_label_3_2]) }
let!(:issue_board_2_1) { create(:board, project: project_2) } let_it_be(:issue_board_2_1) { create(:board, project: project_2) }
let!(:issue_board_list_2_1) { create(:list, board: issue_board_2_1, label: project_label_2_1) } let_it_be(:issue_board_list_2_1) { create(:list, board: issue_board_2_1, label: project_label_2_1) }
let(:new_label) { group_1.labels.find_by(title: promoted_label_name) } let(:new_label) { group_1.labels.find_by(title: promoted_label_name) }
...@@ -82,8 +82,8 @@ RSpec.describe Labels::PromoteService do ...@@ -82,8 +82,8 @@ RSpec.describe Labels::PromoteService do
expect { service.execute(project_label_1_1) }.to change { Subscription.count }.from(4).to(3) expect { service.execute(project_label_1_1) }.to change { Subscription.count }.from(4).to(3)
expect(new_label.subscribed?(user)).to be_truthy expect(new_label).to be_subscribed(user)
expect(new_label.subscribed?(user2)).to be_truthy expect(new_label).to be_subscribed(user2)
end end
it 'recreates priorities' do it 'recreates priorities' do
...@@ -165,12 +165,12 @@ RSpec.describe Labels::PromoteService do ...@@ -165,12 +165,12 @@ RSpec.describe Labels::PromoteService do
service.execute(project_label_1_1) service.execute(project_label_1_1)
Label.reflect_on_all_associations.each do |association| Label.reflect_on_all_associations.each do |association|
expect(project_label_1_1.send(association.name).any?).to be_falsey expect(project_label_1_1.send(association.name).reset).not_to be_any
end end
end end
end end
context 'if there is an existing identical group label' do context 'when there is an existing identical group label' do
let!(:existing_group_label) { create(:group_label, group: group_1, title: project_label_1_1.title ) } let!(:existing_group_label) { create(:group_label, group: group_1, title: project_label_1_1.title ) }
it 'uses the existing group label' do it 'uses the existing group label' do
...@@ -187,7 +187,7 @@ RSpec.describe Labels::PromoteService do ...@@ -187,7 +187,7 @@ RSpec.describe Labels::PromoteService do
it_behaves_like 'promoting a project label to a group label' it_behaves_like 'promoting a project label to a group label'
end end
context 'if there is no existing identical group label' do context 'when there is no existing identical group label' do
let(:existing_group_label) { nil } let(:existing_group_label) { nil }
it 'recreates the label as a group label' do it 'recreates the label as a group label' do
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment