DEV: Add rubocop-rspec (#9288)

This adds rubocop-rspec, and enables some cops that were either already passing or are passing now, after fixing them in this commit.

Some new cops are disabled for now, with annotation: "TODO" or "To be decided". Those either need to be discussed first, or require manual changes, or the number of found and fixed offenses is too large to bundle them up in a single PR.

Includes:

* DEV: Update rubocop's `TargetRubyVersion` to 2.6
* DEV: Enable RSpec/VoidExpect
* DEV: Enable RSpec/SharedContext
* DEV: Enable RSpec/EmptyExampleGroup (Removed an obsolete empty spec file)
* DEV: Enable RSpec/ItBehavesLike
* DEV: Remove RSpec/ScatteredLet (It's too strict, as it doesn't recognize fab! as a let-like)
* DEV: Remove RSpec/MultipleExpectations
This commit is contained in:
Jarek Radosz 2020-03-27 17:35:40 +01:00 committed by GitHub
parent b2b7afd310
commit 7ff889574d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 224 additions and 17 deletions

View File

@ -1,8 +1,9 @@
require: require:
- rubocop-discourse - rubocop-discourse
- rubocop-rspec
AllCops: AllCops:
TargetRubyVersion: 2.4 TargetRubyVersion: 2.6
DisabledByDefault: true DisabledByDefault: true
Exclude: Exclude:
- "db/schema.rb" - "db/schema.rb"
@ -143,3 +144,212 @@ Style/GlobalVars:
- 'script/**/*' - 'script/**/*'
- 'spec/**/*.rb' - 'spec/**/*.rb'
- 'plugins/*/spec/**/*' - 'plugins/*/spec/**/*'
# Specs
RSpec/AnyInstance:
Enabled: false # To be decided
RSpec/AroundBlock:
Enabled: true
RSpec/BeforeAfterAll:
Enabled: false # To be decided
RSpec/ContextMethod:
Enabled: false # TODO
RSpec/ContextWording:
Enabled: false # To be decided
RSpec/DescribeClass:
Enabled: false # To be decided
RSpec/DescribeMethod:
Enabled: true
RSpec/DescribeSymbol:
Enabled: false # To be decided
RSpec/DescribedClass:
Enabled: false # To be decided
RSpec/DescribedClassModuleWrapping:
Enabled: false # To be decided
RSpec/EmptyExampleGroup:
Enabled: true
RSpec/EmptyLineAfterExample:
Enabled: false # TODO
RSpec/EmptyLineAfterExampleGroup:
Enabled: false # TODO
RSpec/EmptyLineAfterFinalLet:
Enabled: false # TODO
RSpec/EmptyLineAfterHook:
Enabled: false # TODO
RSpec/EmptyLineAfterSubject:
Enabled: false # TODO
RSpec/ExampleLength:
Enabled: false # To be decided
RSpec/ExampleWithoutDescription:
Enabled: true
RSpec/ExampleWording:
Enabled: false # TODO
RSpec/ExpectActual:
Enabled: true
RSpec/ExpectChange:
Enabled: false # To be decided
RSpec/ExpectInHook:
Enabled: false # To be decided
RSpec/ExpectOutput:
Enabled: true
RSpec/FilePath:
Enabled: false # To be decided
RSpec/Focus:
Enabled: true
RSpec/HookArgument:
Enabled: false # TODO
RSpec/HooksBeforeExamples:
Enabled: false # TODO
RSpec/ImplicitBlockExpectation:
Enabled: true
RSpec/ImplicitExpect:
Enabled: false # To be decided
RSpec/ImplicitSubject:
Enabled: false # To be decided
RSpec/InstanceSpy:
Enabled: true
RSpec/InstanceVariable:
Enabled: false # TODO
RSpec/InvalidPredicateMatcher:
Enabled: true
RSpec/ItBehavesLike:
Enabled: true
RSpec/IteratedExpectation:
Enabled: false # To be decided
RSpec/LeadingSubject:
Enabled: false # TODO
RSpec/LeakyConstantDeclaration:
Enabled: false # To be decided
RSpec/LetBeforeExamples:
Enabled: false # TODO
RSpec/LetSetup:
Enabled: false # TODO
RSpec/MessageChain:
Enabled: true
RSpec/MessageSpies:
Enabled: true
RSpec/MissingExampleGroupArgument:
Enabled: true
RSpec/MultipleDescribes:
Enabled: false # TODO
RSpec/MultipleSubjects:
Enabled: true
RSpec/NamedSubject:
Enabled: false # To be decided
RSpec/NestedGroups:
Enabled: false # To be decided
RSpec/OverwritingSetup:
Enabled: true
RSpec/ReceiveCounts:
Enabled: true
RSpec/ReceiveNever:
Enabled: true
RSpec/RepeatedDescription:
Enabled: false # TODO
RSpec/RepeatedExample:
Enabled: false # TODO
RSpec/RepeatedExampleGroupBody:
Enabled: false # TODO
RSpec/RepeatedExampleGroupDescription:
Enabled: false # TODO
RSpec/ReturnFromStub:
Enabled: true
RSpec/ScatteredSetup:
Enabled: false # TODO
RSpec/SharedContext:
Enabled: true
RSpec/SharedExamples:
Enabled: true
RSpec/SingleArgumentMessageChain:
Enabled: true
RSpec/SubjectStub:
Enabled: true
RSpec/UnspecifiedException:
Enabled: true
RSpec/VerifiedDoubles:
Enabled: true
RSpec/VoidExpect:
Enabled: true
RSpec/Yield:
Enabled: true
Capybara/CurrentPathExpectation:
Enabled: true
Capybara/FeatureMethods:
Enabled: true
FactoryBot/AttributeDefinedStatically:
Enabled: true
FactoryBot/CreateList:
Enabled: true
FactoryBot/FactoryClassName:
Enabled: true
Rails/HttpStatus:
Enabled: true

View File

@ -180,6 +180,7 @@ group :test, :development do
gem 'byebug', require: ENV['RM_INFO'].nil?, platform: :mri gem 'byebug', require: ENV['RM_INFO'].nil?, platform: :mri
gem 'rubocop', require: false gem 'rubocop', require: false
gem "rubocop-discourse", require: false gem "rubocop-discourse", require: false
gem "rubocop-rspec", require: false
gem 'parallel_tests' gem 'parallel_tests'
end end

View File

@ -350,6 +350,8 @@ GEM
unicode-display_width (>= 1.4.0, < 1.7) unicode-display_width (>= 1.4.0, < 1.7)
rubocop-discourse (2.0.1) rubocop-discourse (2.0.1)
rubocop (>= 0.69.0) rubocop (>= 0.69.0)
rubocop-rspec (1.38.1)
rubocop (>= 0.68.1)
ruby-prof (1.3.1) ruby-prof (1.3.1)
ruby-progressbar (1.10.1) ruby-progressbar (1.10.1)
ruby-readability (0.7.0) ruby-readability (0.7.0)
@ -527,6 +529,7 @@ DEPENDENCIES
rtlit rtlit
rubocop rubocop
rubocop-discourse rubocop-discourse
rubocop-rspec
ruby-prof ruby-prof
ruby-readability ruby-readability
rubyzip rubyzip

View File

@ -1,7 +0,0 @@
# frozen_string_literal: true
require 'rails_helper'
describe BackupRestore::Restorer do
end

View File

@ -33,7 +33,7 @@ describe SeedData::Categories do
expect(category.user_id).to eq(Discourse::SYSTEM_USER_ID) expect(category.user_id).to eq(Discourse::SYSTEM_USER_ID)
expect(category.category_groups.count).to eq(1) expect(category.category_groups.count).to eq(1)
expect(category.category_groups.first).to have_attributes(permissions(:staff, :full)) expect(category.category_groups.first).to have_attributes(permissions(:staff, :full))
expect(Topic.exists?(category.topic_id)) expect(Topic.exists?(category.topic_id)).to eq(true)
expect(description_post(category).raw).to eq(I18n.t("staff_category_description")) expect(description_post(category).raw).to eq(I18n.t("staff_category_description"))
expect(SiteSetting.staff_category_id).to eq(category.id) expect(SiteSetting.staff_category_id).to eq(category.id)
end end

View File

@ -120,7 +120,7 @@ describe TopicUploadSecurityManager do
end end
it "changes the upload secure status to true and changes the ACL and rebakes the post and sets the access control post" do it "changes the upload secure status to true and changes the ACL and rebakes the post and sets the access control post" do
expect(Post.any_instance.expects(:rebake!).once) Post.any_instance.expects(:rebake!).once
subject.run subject.run
expect(upload3.reload.secure?).to eq(true) expect(upload3.reload.secure?).to eq(true)
expect(upload3.reload.access_control_post).to eq(post4) expect(upload3.reload.access_control_post).to eq(post4)
@ -146,7 +146,7 @@ describe TopicUploadSecurityManager do
end end
it "does not change the upload secure status and does not set the access control post" do it "does not change the upload secure status and does not set the access control post" do
expect(Post.any_instance.expects(:rebake!).never) Post.any_instance.expects(:rebake!).never
subject.run subject.run
expect(upload3.reload.secure?).to eq(false) expect(upload3.reload.secure?).to eq(false)
expect(upload3.reload.access_control_post).to eq(nil) expect(upload3.reload.access_control_post).to eq(nil)
@ -174,14 +174,14 @@ describe TopicUploadSecurityManager do
end end
def expect_upload_status_not_to_change def expect_upload_status_not_to_change
expect(Post.any_instance.expects(:rebake!).never) Post.any_instance.expects(:rebake!).never
subject.run subject.run
expect(upload.reload.secure?).to eq(true) expect(upload.reload.secure?).to eq(true)
expect(upload2.reload.secure?).to eq(true) expect(upload2.reload.secure?).to eq(true)
end end
def expect_upload_status_to_change_and_rebake def expect_upload_status_to_change_and_rebake
expect(Post.any_instance.expects(:rebake!).twice) Post.any_instance.expects(:rebake!).twice
subject.run subject.run
expect(upload.reload.secure?).to eq(false) expect(upload.reload.secure?).to eq(false)
expect(upload2.reload.secure?).to eq(false) expect(upload2.reload.secure?).to eq(false)

View File

@ -968,7 +968,7 @@ describe UserNotifications do
end end
# notification emails derived from templates are translated into the user's locale # notification emails derived from templates are translated into the user's locale
shared_examples "notification derived from template" do shared_context "notification derived from template" do
let(:user) { Fabricate(:user, locale: locale) } let(:user) { Fabricate(:user, locale: locale) }
let(:mail_type) { mail_type } let(:mail_type) { mail_type }
let(:notification) { Fabricate(:notification, user: user) } let(:notification) { Fabricate(:notification, user: user) }

View File

@ -178,7 +178,7 @@ describe SiteSetting do
end.to change { @fake_logger.warnings.count }.by(2) end.to change { @fake_logger.warnings.count }.by(2)
expect do expect do
expect(SiteSetting.use_https(warn: false)) SiteSetting.use_https(warn: false)
end.to_not change { @fake_logger.warnings } end.to_not change { @fake_logger.warnings }
SiteSetting.use_https = false SiteSetting.use_https = false

View File

@ -1122,7 +1122,7 @@ describe Topic do
context 'closed' do context 'closed' do
let(:status) { 'closed' } let(:status) { 'closed' }
it_should_behave_like 'a status that closes a topic' it_behaves_like 'a status that closes a topic'
it 'should archive group message' do it 'should archive group message' do
group = Fabricate(:group) group = Fabricate(:group)
@ -1135,7 +1135,7 @@ describe Topic do
context 'autoclosed' do context 'autoclosed' do
let(:status) { 'autoclosed' } let(:status) { 'autoclosed' }
it_should_behave_like 'a status that closes a topic' it_behaves_like 'a status that closes a topic'
context 'topic was set to close when it was created' do context 'topic was set to close when it was created' do
it 'includes the autoclose duration in the moderator post' do it 'includes the autoclose duration in the moderator post' do