rubocop-rspec 1.4.1 → 1.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +19 -3
- data/README.md +1 -1
- data/config/default.yml +14 -2
- data/lib/rubocop-rspec.rb +2 -0
- data/lib/rubocop/cop/rspec/any_instance.rb +8 -5
- data/lib/rubocop/cop/rspec/describe_class.rb +2 -1
- data/lib/rubocop/cop/rspec/example_length.rb +60 -0
- data/lib/rubocop/cop/rspec/file_path.rb +13 -3
- data/lib/rubocop/cop/rspec/focus.rb +67 -0
- data/lib/rubocop/cop/rspec/not_to_not.rb +21 -20
- data/lib/rubocop/cop/rspec/verified_doubles.rb +12 -2
- data/lib/rubocop/rspec/version.rb +1 -1
- data/rubocop-rspec.gemspec +1 -1
- data/spec/rubocop/cop/rspec/any_instance_spec.rb +24 -9
- data/spec/rubocop/cop/rspec/describe_class_spec.rb +28 -8
- data/spec/rubocop/cop/rspec/described_class_spec.rb +107 -53
- data/spec/rubocop/cop/rspec/example_length_spec.rb +83 -0
- data/spec/rubocop/cop/rspec/example_wording_spec.rb +12 -5
- data/spec/rubocop/cop/rspec/file_path_spec.rb +121 -61
- data/spec/rubocop/cop/rspec/focus_spec.rb +70 -0
- data/spec/rubocop/cop/rspec/instance_variable_spec.rb +18 -9
- data/spec/rubocop/cop/rspec/multiple_describes_spec.rb +22 -7
- data/spec/rubocop/cop/rspec/not_to_not_spec.rb +15 -5
- data/spec/rubocop/cop/rspec/verified_doubles_spec.rb +41 -3
- metadata +12 -6
@@ -0,0 +1,70 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
describe RuboCop::Cop::RSpec::Focus do
|
4
|
+
subject(:cop) { described_class.new }
|
5
|
+
|
6
|
+
[
|
7
|
+
:example_group, :describe, :context, :xdescribe, :xcontext,
|
8
|
+
:it, :example, :specify, :xit, :xexample, :xspecify,
|
9
|
+
:feature, :scenario, :xfeature, :xscenario
|
10
|
+
].each do |block_type|
|
11
|
+
it "finds `#{block_type}` blocks with `focus: true`" do
|
12
|
+
inspect_source(
|
13
|
+
cop,
|
14
|
+
[
|
15
|
+
"#{block_type} 'test', focus: true do",
|
16
|
+
'end'
|
17
|
+
]
|
18
|
+
)
|
19
|
+
expect(cop.offenses.size).to eq(1)
|
20
|
+
expect(cop.offenses.map(&:line).sort).to eq([1])
|
21
|
+
expect(cop.messages).to eq(['Focused spec found.'])
|
22
|
+
expect(cop.highlights).to eq(['focus: true'])
|
23
|
+
end
|
24
|
+
|
25
|
+
it "finds `#{block_type}` blocks with `:focus`" do
|
26
|
+
inspect_source(
|
27
|
+
cop,
|
28
|
+
[
|
29
|
+
"#{block_type} 'test', :focus do",
|
30
|
+
'end'
|
31
|
+
]
|
32
|
+
)
|
33
|
+
expect(cop.offenses.size).to eq(1)
|
34
|
+
expect(cop.offenses.map(&:line).sort).to eq([1])
|
35
|
+
expect(cop.messages).to eq(['Focused spec found.'])
|
36
|
+
expect(cop.highlights).to eq([':focus'])
|
37
|
+
end
|
38
|
+
|
39
|
+
it 'detects no offense when spec is not focused' do
|
40
|
+
inspect_source(
|
41
|
+
cop,
|
42
|
+
[
|
43
|
+
"#{block_type} 'test' do",
|
44
|
+
'end'
|
45
|
+
]
|
46
|
+
)
|
47
|
+
expect(subject.messages).to be_empty
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
[
|
52
|
+
:fdescribe, :fcontext,
|
53
|
+
:focus, :fexample, :fit, :fspecify,
|
54
|
+
:ffeature, :fscenario
|
55
|
+
].each do |block_type|
|
56
|
+
it "finds `#{block_type}` blocks" do
|
57
|
+
inspect_source(
|
58
|
+
cop,
|
59
|
+
[
|
60
|
+
"#{block_type} 'test' do",
|
61
|
+
'end'
|
62
|
+
]
|
63
|
+
)
|
64
|
+
expect(cop.offenses.size).to eq(1)
|
65
|
+
expect(cop.offenses.map(&:line).sort).to eq([1])
|
66
|
+
expect(cop.messages).to eq(['Focused spec found.'])
|
67
|
+
expect(cop.highlights).to eq(["#{block_type} 'test'"])
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
@@ -4,27 +4,36 @@ describe RuboCop::Cop::RSpec::InstanceVariable do
|
|
4
4
|
subject(:cop) { described_class.new }
|
5
5
|
|
6
6
|
it 'finds an instance variable inside a describe' do
|
7
|
-
inspect_source(
|
8
|
-
|
9
|
-
|
10
|
-
|
7
|
+
inspect_source(
|
8
|
+
cop,
|
9
|
+
[
|
10
|
+
'describe MyClass do',
|
11
|
+
' before { @foo = [] }',
|
12
|
+
' it { expect(@foo).to be_empty }',
|
13
|
+
'end'
|
14
|
+
]
|
15
|
+
)
|
11
16
|
expect(cop.offenses.size).to eq(1)
|
12
17
|
expect(cop.offenses.map(&:line).sort).to eq([3])
|
13
18
|
expect(cop.messages).to eq(['Use `let` instead of an instance variable'])
|
14
19
|
end
|
15
20
|
|
16
21
|
it 'finds an instance variable inside a shared example' do
|
17
|
-
inspect_source(
|
18
|
-
|
19
|
-
|
22
|
+
inspect_source(
|
23
|
+
cop,
|
24
|
+
[
|
25
|
+
"shared_examples 'shared example' do",
|
26
|
+
' it { expect(@foo).to be_empty }',
|
27
|
+
'end'
|
28
|
+
]
|
29
|
+
)
|
20
30
|
expect(cop.offenses.size).to eq(1)
|
21
31
|
expect(cop.offenses.map(&:line).sort).to eq([2])
|
22
32
|
expect(cop.messages).to eq(['Use `let` instead of an instance variable'])
|
23
33
|
end
|
24
34
|
|
25
35
|
it 'ignores an instance variable without describe' do
|
26
|
-
inspect_source(cop, ['@foo = []',
|
27
|
-
'@foo.empty?'])
|
36
|
+
inspect_source(cop, ['@foo = []', '@foo.empty?'])
|
28
37
|
expect(cop.offenses).to be_empty
|
29
38
|
end
|
30
39
|
end
|
@@ -4,8 +4,13 @@ describe RuboCop::Cop::RSpec::MultipleDescribes do
|
|
4
4
|
subject(:cop) { described_class.new }
|
5
5
|
|
6
6
|
it 'finds multiple top level describes with class and method' do
|
7
|
-
inspect_source(
|
8
|
-
|
7
|
+
inspect_source(
|
8
|
+
cop,
|
9
|
+
[
|
10
|
+
"describe MyClass, '.do_something' do; end",
|
11
|
+
"describe MyClass, '.do_something_else' do; end"
|
12
|
+
]
|
13
|
+
)
|
9
14
|
expect(cop.offenses.size).to eq(1)
|
10
15
|
expect(cop.offenses.map(&:line).sort).to eq([1])
|
11
16
|
expect(cop.messages).to eq(['Do not use multiple top level describes - ' \
|
@@ -13,8 +18,13 @@ describe RuboCop::Cop::RSpec::MultipleDescribes do
|
|
13
18
|
end
|
14
19
|
|
15
20
|
it 'finds multiple top level describes only with class' do
|
16
|
-
inspect_source(
|
17
|
-
|
21
|
+
inspect_source(
|
22
|
+
cop,
|
23
|
+
[
|
24
|
+
'describe MyClass do; end',
|
25
|
+
'describe MyOtherClass do; end'
|
26
|
+
]
|
27
|
+
)
|
18
28
|
expect(cop.offenses.size).to eq(1)
|
19
29
|
expect(cop.offenses.map(&:line).sort).to eq([1])
|
20
30
|
expect(cop.messages).to eq(['Do not use multiple top level describes - ' \
|
@@ -22,9 +32,14 @@ describe RuboCop::Cop::RSpec::MultipleDescribes do
|
|
22
32
|
end
|
23
33
|
|
24
34
|
it 'skips single top level describe' do
|
25
|
-
inspect_source(
|
26
|
-
|
27
|
-
|
35
|
+
inspect_source(
|
36
|
+
cop,
|
37
|
+
[
|
38
|
+
"require 'spec_helper'",
|
39
|
+
'',
|
40
|
+
'describe MyClass do; end'
|
41
|
+
]
|
42
|
+
)
|
28
43
|
expect(cop.offenses).to be_empty
|
29
44
|
end
|
30
45
|
end
|
@@ -3,13 +3,13 @@
|
|
3
3
|
describe RuboCop::Cop::RSpec::NotToNot, :config do
|
4
4
|
subject(:cop) { described_class.new(config) }
|
5
5
|
|
6
|
-
context 'when
|
7
|
-
let(:cop_config) { { '
|
6
|
+
context 'when EnforcedStyle is `not_to`' do
|
7
|
+
let(:cop_config) { { 'EnforcedStyle' => 'not_to' } }
|
8
8
|
|
9
9
|
it 'detects the `to_not` offense' do
|
10
10
|
inspect_source(subject, 'it { expect(false).to_not be_true }')
|
11
11
|
|
12
|
-
expect(subject.messages).to eq(['
|
12
|
+
expect(subject.messages).to eq(['Prefer `not_to` over `to_not`'])
|
13
13
|
expect(subject.highlights).to eq(['expect(false).to_not be_true'])
|
14
14
|
expect(subject.offenses.map(&:line).sort).to eq([1])
|
15
15
|
end
|
@@ -19,15 +19,20 @@ describe RuboCop::Cop::RSpec::NotToNot, :config do
|
|
19
19
|
|
20
20
|
expect(subject.messages).to be_empty
|
21
21
|
end
|
22
|
+
|
23
|
+
it 'auto-corrects `to_not` to `not_to`' do
|
24
|
+
corrected = autocorrect_source(cop, ['it { expect(0).to_not equal 1 }'])
|
25
|
+
expect(corrected).to eq 'it { expect(0).not_to equal 1 }'
|
26
|
+
end
|
22
27
|
end
|
23
28
|
|
24
29
|
context 'when AcceptedMethod is `to_not`' do
|
25
|
-
let(:cop_config) { { '
|
30
|
+
let(:cop_config) { { 'EnforcedStyle' => 'to_not' } }
|
26
31
|
|
27
32
|
it 'detects the `not_to` offense' do
|
28
33
|
inspect_source(subject, 'it { expect(false).not_to be_true }')
|
29
34
|
|
30
|
-
expect(subject.messages).to eq(['
|
35
|
+
expect(subject.messages).to eq(['Prefer `to_not` over `not_to`'])
|
31
36
|
expect(subject.highlights).to eq(['expect(false).not_to be_true'])
|
32
37
|
expect(subject.offenses.map(&:line).sort).to eq([1])
|
33
38
|
end
|
@@ -37,5 +42,10 @@ describe RuboCop::Cop::RSpec::NotToNot, :config do
|
|
37
42
|
|
38
43
|
expect(subject.messages).to be_empty
|
39
44
|
end
|
45
|
+
|
46
|
+
it 'auto-corrects `not_to` to `to_not`' do
|
47
|
+
corrected = autocorrect_source(cop, ['it { expect(0).not_to equal 1 }'])
|
48
|
+
expect(corrected).to eq 'it { expect(0).to_not equal 1 }'
|
49
|
+
end
|
40
50
|
end
|
41
51
|
end
|
@@ -1,9 +1,9 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
|
3
|
-
describe RuboCop::Cop::RSpec::VerifiedDoubles do
|
4
|
-
subject(:cop) { described_class.new }
|
3
|
+
describe RuboCop::Cop::RSpec::VerifiedDoubles, :config do
|
4
|
+
subject(:cop) { described_class.new(config) }
|
5
5
|
|
6
|
-
it 'finds `double` instead of
|
6
|
+
it 'finds a `double` instead of an `instance_double`' do
|
7
7
|
inspect_source(cop, ['it do',
|
8
8
|
' foo = double("Widget")',
|
9
9
|
'end'])
|
@@ -12,4 +12,42 @@ describe RuboCop::Cop::RSpec::VerifiedDoubles do
|
|
12
12
|
expect(cop.highlights).to eq(['double("Widget")'])
|
13
13
|
expect(cop.offenses.map(&:line).sort).to eq([2])
|
14
14
|
end
|
15
|
+
|
16
|
+
it 'finds a `spy` instead of an `instance_spy`' do
|
17
|
+
inspect_source(cop, ['it do',
|
18
|
+
' foo = spy("Widget")',
|
19
|
+
'end'])
|
20
|
+
expect(cop.messages)
|
21
|
+
.to eq(['Prefer using verifying doubles over normal doubles.'])
|
22
|
+
expect(cop.highlights).to eq(['spy("Widget")'])
|
23
|
+
expect(cop.offenses.map(&:line).sort).to eq([2])
|
24
|
+
end
|
25
|
+
|
26
|
+
it 'find doubles whose name is a symbol' do
|
27
|
+
inspect_source(cop, ['it do',
|
28
|
+
' foo = double(:widget)',
|
29
|
+
'end'])
|
30
|
+
expect(cop.messages)
|
31
|
+
.to eq(['Prefer using verifying doubles over normal doubles.'])
|
32
|
+
expect(cop.highlights).to eq(['double(:widget)'])
|
33
|
+
expect(cop.offenses.map(&:line).sort).to eq([2])
|
34
|
+
end
|
35
|
+
|
36
|
+
context 'when configured to ignore symbolic names' do
|
37
|
+
let(:cop_config) { { 'IgnoreSymbolicNames' => true } }
|
38
|
+
|
39
|
+
it 'ignores doubles whose name is a symbol' do
|
40
|
+
inspect_source(cop, ['it do',
|
41
|
+
' foo = double(:widget)',
|
42
|
+
'end'])
|
43
|
+
expect(cop.messages).to be_empty
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
it 'ignores doubles without a name' do
|
48
|
+
inspect_source(cop, ['it do',
|
49
|
+
' foo = double',
|
50
|
+
'end'])
|
51
|
+
expect(cop.messages).to be_empty
|
52
|
+
end
|
15
53
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rubocop-rspec
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ian MacLeod
|
@@ -9,22 +9,22 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2016-
|
12
|
+
date: 2016-05-18 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rubocop
|
16
16
|
requirement: !ruby/object:Gem::Requirement
|
17
17
|
requirements:
|
18
|
-
- -
|
18
|
+
- - ">="
|
19
19
|
- !ruby/object:Gem::Version
|
20
|
-
version: 0.
|
20
|
+
version: 0.40.0
|
21
21
|
type: :runtime
|
22
22
|
prerelease: false
|
23
23
|
version_requirements: !ruby/object:Gem::Requirement
|
24
24
|
requirements:
|
25
|
-
- -
|
25
|
+
- - ">="
|
26
26
|
- !ruby/object:Gem::Version
|
27
|
-
version: 0.
|
27
|
+
version: 0.40.0
|
28
28
|
- !ruby/object:Gem::Dependency
|
29
29
|
name: rake
|
30
30
|
requirement: !ruby/object:Gem::Requirement
|
@@ -90,8 +90,10 @@ files:
|
|
90
90
|
- lib/rubocop/cop/rspec/describe_class.rb
|
91
91
|
- lib/rubocop/cop/rspec/describe_method.rb
|
92
92
|
- lib/rubocop/cop/rspec/described_class.rb
|
93
|
+
- lib/rubocop/cop/rspec/example_length.rb
|
93
94
|
- lib/rubocop/cop/rspec/example_wording.rb
|
94
95
|
- lib/rubocop/cop/rspec/file_path.rb
|
96
|
+
- lib/rubocop/cop/rspec/focus.rb
|
95
97
|
- lib/rubocop/cop/rspec/instance_variable.rb
|
96
98
|
- lib/rubocop/cop/rspec/multiple_describes.rb
|
97
99
|
- lib/rubocop/cop/rspec/not_to_not.rb
|
@@ -105,8 +107,10 @@ files:
|
|
105
107
|
- spec/rubocop/cop/rspec/describe_class_spec.rb
|
106
108
|
- spec/rubocop/cop/rspec/describe_method_spec.rb
|
107
109
|
- spec/rubocop/cop/rspec/described_class_spec.rb
|
110
|
+
- spec/rubocop/cop/rspec/example_length_spec.rb
|
108
111
|
- spec/rubocop/cop/rspec/example_wording_spec.rb
|
109
112
|
- spec/rubocop/cop/rspec/file_path_spec.rb
|
113
|
+
- spec/rubocop/cop/rspec/focus_spec.rb
|
110
114
|
- spec/rubocop/cop/rspec/instance_variable_spec.rb
|
111
115
|
- spec/rubocop/cop/rspec/multiple_describes_spec.rb
|
112
116
|
- spec/rubocop/cop/rspec/not_to_not_spec.rb
|
@@ -142,8 +146,10 @@ test_files:
|
|
142
146
|
- spec/rubocop/cop/rspec/describe_class_spec.rb
|
143
147
|
- spec/rubocop/cop/rspec/describe_method_spec.rb
|
144
148
|
- spec/rubocop/cop/rspec/described_class_spec.rb
|
149
|
+
- spec/rubocop/cop/rspec/example_length_spec.rb
|
145
150
|
- spec/rubocop/cop/rspec/example_wording_spec.rb
|
146
151
|
- spec/rubocop/cop/rspec/file_path_spec.rb
|
152
|
+
- spec/rubocop/cop/rspec/focus_spec.rb
|
147
153
|
- spec/rubocop/cop/rspec/instance_variable_spec.rb
|
148
154
|
- spec/rubocop/cop/rspec/multiple_describes_spec.rb
|
149
155
|
- spec/rubocop/cop/rspec/not_to_not_spec.rb
|