cuke_linter 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (36) hide show
  1. checksums.yaml +4 -4
  2. data/.simplecov +8 -0
  3. data/.travis.yml +16 -14
  4. data/CHANGELOG.md +11 -2
  5. data/Gemfile +6 -6
  6. data/README.md +160 -148
  7. data/Rakefile +48 -23
  8. data/cuke_linter.gemspec +3 -0
  9. data/environments/cucumber_env.rb +10 -0
  10. data/environments/rspec_env.rb +3 -0
  11. data/lib/cuke_linter/formatters/pretty_formatter.rb +4 -0
  12. data/lib/cuke_linter/linters/example_without_name_linter.rb +24 -0
  13. data/lib/cuke_linter/linters/feature_without_scenarios_linter.rb +6 -4
  14. data/lib/cuke_linter/linters/outline_with_single_example_row_linter.rb +27 -0
  15. data/lib/cuke_linter/linters/test_with_too_many_steps_linter.rb +26 -0
  16. data/lib/cuke_linter/version.rb +4 -3
  17. data/lib/cuke_linter.rb +14 -1
  18. data/testing/cucumber/features/linters/default_linters.feature +8 -1
  19. data/testing/cucumber/features/linters/example_without_name.feature +27 -0
  20. data/testing/cucumber/features/linters/feature_without_scenarios.feature +7 -2
  21. data/testing/cucumber/features/linters/outline_with_single_example_row.feature +23 -0
  22. data/testing/cucumber/features/linters/test_with_too_many_steps.feature +33 -0
  23. data/testing/cucumber/step_definitions/action_steps.rb +5 -1
  24. data/testing/cucumber/step_definitions/setup_steps.rb +12 -0
  25. data/testing/cucumber/step_definitions/verification_steps.rb +3 -2
  26. data/testing/model_factory.rb +36 -0
  27. data/testing/rspec/spec/integration/cuke_linter_integration_spec.rb +6 -0
  28. data/testing/rspec/spec/integration/linters/example_without_name_linter_integration_spec.rb +8 -0
  29. data/testing/rspec/spec/integration/linters/outline_with_single_example_row_linter_integration_spec.rb +8 -0
  30. data/testing/rspec/spec/integration/linters/test_with_too_many_steps_linter_integration_spec.rb +8 -0
  31. data/testing/rspec/spec/unit/formatters/pretty_formatter_unit_spec.rb +5 -1
  32. data/testing/rspec/spec/unit/linters/example_without_name_linter_unit_spec.rb +83 -0
  33. data/testing/rspec/spec/unit/linters/feature_without_scenarios_linter_unit_spec.rb +52 -2
  34. data/testing/rspec/spec/unit/linters/outline_with_single_example_row_linter_unit_spec.rb +231 -0
  35. data/testing/rspec/spec/unit/linters/test_with_too_many_steps_linter_unit_spec.rb +156 -0
  36. metadata +57 -2
@@ -0,0 +1,231 @@
1
+ require_relative '../../../../../environments/rspec_env'
2
+
3
+
4
+ RSpec.describe CukeLinter::OutlineWithSingleExampleRowLinter do
5
+
6
+ let(:good_data) do
7
+ outline_text = 'Scenario Outline:
8
+ * a step
9
+ Examples:
10
+ | param |
11
+ | value 1 |
12
+ | value 2 |'
13
+
14
+ CukeLinter::ModelFactory.generate_outline_model(source_text: outline_text)
15
+ end
16
+
17
+ let(:bad_data) do
18
+ outline_text = 'Scenario Outline:
19
+ * a step
20
+ Examples:
21
+ | param |
22
+ | value 1 |'
23
+
24
+ CukeLinter::ModelFactory.generate_outline_model(source_text: outline_text)
25
+ end
26
+
27
+
28
+ it_should_behave_like 'a linter at the unit level'
29
+
30
+
31
+ it 'has a name' do
32
+ expect(subject.name).to eq('OutlineWithSingleExampleRowLinter')
33
+ end
34
+
35
+ describe 'linting' do
36
+
37
+ context 'an outline with only one example row' do
38
+
39
+ context 'with only one example set' do
40
+
41
+ let(:test_model) do
42
+ gherkin = 'Scenario Outline:
43
+ * a step
44
+ Examples:
45
+ | param |
46
+ | value |'
47
+
48
+ CukeLinter::ModelFactory.generate_outline_model(source_text: gherkin)
49
+ end
50
+
51
+ it 'records a problem' do
52
+ results = subject.lint(test_model)
53
+
54
+ expect(results.first[:problem]).to eq('Outline has only one example row')
55
+ end
56
+
57
+ end
58
+
59
+ context 'with multiple example sets' do
60
+
61
+ let(:test_model) do
62
+ gherkin = 'Scenario Outline:
63
+ * a step
64
+ Examples:
65
+ | param |
66
+ Examples:
67
+ | param |
68
+ | value |'
69
+
70
+ CukeLinter::ModelFactory.generate_outline_model(source_text: gherkin)
71
+ end
72
+
73
+ it 'records a problem' do
74
+ results = subject.lint(test_model)
75
+
76
+ expect(results.first[:problem]).to eq('Outline has only one example row')
77
+ end
78
+
79
+ end
80
+
81
+
82
+ it 'records the location of the problem' do
83
+ gherkin = 'Scenario Outline:
84
+ * a step
85
+ Examples:
86
+ | param |
87
+ | value |'
88
+
89
+ model_1 = CukeLinter::ModelFactory.generate_outline_model(source_text: gherkin, parent_file_path: 'path_to_file')
90
+ model_2 = CukeLinter::ModelFactory.generate_outline_model(source_text: gherkin, parent_file_path: 'path_to_file')
91
+
92
+ model_1.source_line = 1
93
+ model_2.source_line = 3
94
+
95
+ results = subject.lint(model_1)
96
+ expect(results.first[:location]).to eq('path_to_file:1')
97
+
98
+ results = subject.lint(model_2)
99
+ expect(results.first[:location]).to eq('path_to_file:3')
100
+ end
101
+
102
+ end
103
+
104
+ context 'an outline with more than one example row' do
105
+
106
+ context 'with only one example set' do
107
+
108
+ let(:test_model) do
109
+ gherkin = 'Scenario Outline:
110
+ * a step
111
+ Examples:
112
+ | param |
113
+ | value 1 |
114
+ | value 2 |'
115
+
116
+ CukeLinter::ModelFactory.generate_outline_model(source_text: gherkin)
117
+ end
118
+
119
+ it 'does not record a problem' do
120
+ expect(subject.lint(test_model)).to eq([])
121
+ end
122
+
123
+ end
124
+
125
+ context 'with multiple example sets' do
126
+
127
+ let(:test_model) do
128
+ gherkin = 'Scenario Outline:
129
+ * a step
130
+ Examples:
131
+ | param |
132
+ | value 1 |
133
+ Examples:
134
+ | param |
135
+ | value 1 |'
136
+
137
+ CukeLinter::ModelFactory.generate_outline_model(source_text: gherkin)
138
+ end
139
+
140
+ it 'does not record a problem' do
141
+ expect(subject.lint(test_model)).to eq([])
142
+ end
143
+
144
+ end
145
+
146
+ end
147
+
148
+ context 'an outline with no example rows' do
149
+
150
+ context 'because it has no example sets' do
151
+
152
+ context 'because its examples are nil' do
153
+
154
+ let(:test_model) do
155
+ model = CukeLinter::ModelFactory.generate_outline_model
156
+ model.examples = nil
157
+
158
+ model
159
+ end
160
+
161
+ it 'does not record a problem' do
162
+ expect(subject.lint(test_model)).to eq([])
163
+ end
164
+
165
+ end
166
+
167
+ context 'because its examples are empty' do
168
+ let(:test_model) do
169
+ model = CukeLinter::ModelFactory.generate_outline_model
170
+ model.examples = []
171
+
172
+ model
173
+ end
174
+
175
+ it 'does not record a problem' do
176
+ expect(subject.lint(test_model)).to eq([])
177
+ end
178
+
179
+ end
180
+
181
+ end
182
+
183
+ context 'with only one example set' do
184
+
185
+ let(:test_model) do
186
+ gherkin = 'Scenario Outline:
187
+ * a step
188
+ Examples:
189
+ | param |'
190
+
191
+ CukeLinter::ModelFactory.generate_outline_model(source_text: gherkin)
192
+ end
193
+
194
+ it 'does not record a problem' do
195
+ expect(subject.lint(test_model)).to eq([])
196
+ end
197
+
198
+ end
199
+
200
+ context 'with multiple example sets' do
201
+
202
+ let(:test_model) do
203
+ gherkin = 'Scenario Outline:
204
+ * a step
205
+ Examples:
206
+ | param |
207
+ Examples:
208
+ | param |'
209
+
210
+ CukeLinter::ModelFactory.generate_outline_model(source_text: gherkin)
211
+ end
212
+
213
+ it 'does not record a problem' do
214
+ expect(subject.lint(test_model)).to eq([])
215
+ end
216
+
217
+ end
218
+
219
+ end
220
+
221
+ context 'a non-outline model' do
222
+
223
+ it 'returns an empty set of results' do
224
+ results = subject.lint(CukeModeler::Model.new)
225
+
226
+ expect(results).to eq([])
227
+ end
228
+
229
+ end
230
+ end
231
+ end
@@ -0,0 +1,156 @@
1
+ require_relative '../../../../../environments/rspec_env'
2
+
3
+
4
+ RSpec.describe CukeLinter::TestWithTooManyStepsLinter do
5
+
6
+ let(:good_data) do
7
+ model = CukeLinter::ModelFactory.generate_scenario_model
8
+ model.steps = [:step_1]
9
+
10
+ model
11
+ end
12
+
13
+ let(:bad_data) do
14
+ model = CukeLinter::ModelFactory.generate_scenario_model
15
+ model.steps = [:step_1,
16
+ :step_2,
17
+ :step_3,
18
+ :step_4,
19
+ :step_5,
20
+ :step_6,
21
+ :step_7,
22
+ :step_8,
23
+ :step_9,
24
+ :step_10,
25
+ :step_11]
26
+
27
+ model
28
+ end
29
+
30
+
31
+ it_should_behave_like 'a linter at the unit level'
32
+
33
+
34
+ it 'has a name' do
35
+ expect(subject.name).to eq('TestWithTooManyStepsLinter')
36
+ end
37
+
38
+ describe 'linting' do
39
+
40
+ ['scenario', 'outline'].each do |model_type|
41
+
42
+ context "with a #{model_type} that has too many steps" do
43
+
44
+ let(:test_model) do
45
+ model = CukeLinter::ModelFactory.send("generate_#{model_type}_model", parent_file_path: 'path_to_file')
46
+ model.steps = [:step_1,
47
+ :step_2,
48
+ :step_3,
49
+ :step_4,
50
+ :step_5,
51
+ :step_6,
52
+ :step_7,
53
+ :step_8,
54
+ :step_9,
55
+ :step_10,
56
+ :step_11]
57
+
58
+ model
59
+ end
60
+
61
+ it 'records a problem' do
62
+ results = subject.lint(test_model)
63
+
64
+ expect(results.first[:problem]).to match(/^Test has too many steps. \d+ steps found \(max 10\)/)
65
+ end
66
+
67
+ it 'records the location of the problem' do
68
+ test_model.source_line = 1
69
+ results = subject.lint(test_model)
70
+ expect(results.first[:location]).to eq('path_to_file:1')
71
+
72
+ test_model.source_line = 3
73
+ results = subject.lint(test_model)
74
+ expect(results.first[:location]).to eq('path_to_file:3')
75
+ end
76
+
77
+ it 'includes the number of steps found in the problem record' do
78
+ step_count = test_model.steps.count
79
+ results = subject.lint(test_model)
80
+ expect(results.first[:problem]).to eq("Test has too many steps. #{step_count} steps found (max 10)")
81
+
82
+ test_model.steps << :another_step
83
+ results = subject.lint(test_model)
84
+ expect(results.first[:problem]).to eq("Test has too many steps. #{step_count + 1} steps found (max 10)")
85
+ end
86
+
87
+ end
88
+
89
+ context "with a #{model_type} that does not have too many steps" do
90
+
91
+ context 'because it has fewer than 10 steps' do
92
+
93
+ let(:test_model) do
94
+ model = CukeLinter::ModelFactory.send("generate_#{model_type}_model", parent_file_path: 'path_to_file')
95
+ model.steps = [:step_1]
96
+
97
+ model
98
+ end
99
+
100
+ it 'does not record a problem' do
101
+ expect(subject.lint(test_model)).to eq([])
102
+ end
103
+
104
+ end
105
+
106
+ context 'because it has no steps' do
107
+
108
+ context 'because its steps are empty' do
109
+
110
+ let(:test_model) do
111
+ model = CukeLinter::ModelFactory.send("generate_#{model_type}_model", parent_file_path: 'path_to_file')
112
+ model.steps = []
113
+
114
+ model
115
+ end
116
+
117
+ it 'does not record a problem' do
118
+ expect(subject.lint(test_model)).to eq([])
119
+ end
120
+
121
+ end
122
+
123
+ context 'because its steps are nil' do
124
+
125
+ let(:test_model) do
126
+ model = CukeLinter::ModelFactory.send("generate_#{model_type}_model", parent_file_path: 'path_to_file')
127
+ model.steps = nil
128
+
129
+ model
130
+ end
131
+
132
+ it 'does not record a problem' do
133
+ expect(subject.lint(test_model)).to eq([])
134
+ end
135
+
136
+ end
137
+
138
+ end
139
+
140
+ end
141
+
142
+ end
143
+
144
+ context 'a non-test model' do
145
+
146
+ let(:test_model) { CukeModeler::Model.new }
147
+
148
+ it 'returns an empty set of results' do
149
+ results = subject.lint(test_model)
150
+
151
+ expect(results).to eq([])
152
+ end
153
+
154
+ end
155
+ end
156
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cuke_linter
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Eric Kessler
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2019-02-11 00:00:00.000000000 Z
11
+ date: 2019-03-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: cuke_modeler
@@ -108,6 +108,48 @@ dependencies:
108
108
  - - "~>"
109
109
  - !ruby/object:Gem::Version
110
110
  version: '3.0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: simplecov
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - "<"
116
+ - !ruby/object:Gem::Version
117
+ version: 1.0.0
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - "<"
123
+ - !ruby/object:Gem::Version
124
+ version: 1.0.0
125
+ - !ruby/object:Gem::Dependency
126
+ name: coveralls
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - "<"
130
+ - !ruby/object:Gem::Version
131
+ version: 1.0.0
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - "<"
137
+ - !ruby/object:Gem::Version
138
+ version: 1.0.0
139
+ - !ruby/object:Gem::Dependency
140
+ name: colorize
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - "<"
144
+ - !ruby/object:Gem::Version
145
+ version: 1.0.0
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - "<"
151
+ - !ruby/object:Gem::Version
152
+ version: 1.0.0
111
153
  description:
112
154
  email:
113
155
  - morrow748@gmail.com
@@ -117,6 +159,7 @@ extensions: []
117
159
  extra_rdoc_files: []
118
160
  files:
119
161
  - ".gitignore"
162
+ - ".simplecov"
120
163
  - ".travis.yml"
121
164
  - CHANGELOG.md
122
165
  - Gemfile
@@ -133,12 +176,18 @@ files:
133
176
  - exe/cuke_linter
134
177
  - lib/cuke_linter.rb
135
178
  - lib/cuke_linter/formatters/pretty_formatter.rb
179
+ - lib/cuke_linter/linters/example_without_name_linter.rb
136
180
  - lib/cuke_linter/linters/feature_without_scenarios_linter.rb
181
+ - lib/cuke_linter/linters/outline_with_single_example_row_linter.rb
182
+ - lib/cuke_linter/linters/test_with_too_many_steps_linter.rb
137
183
  - lib/cuke_linter/version.rb
138
184
  - testing/cucumber/features/command_line.feature
139
185
  - testing/cucumber/features/formatters/pretty_formatter.feature
140
186
  - testing/cucumber/features/linters/default_linters.feature
187
+ - testing/cucumber/features/linters/example_without_name.feature
141
188
  - testing/cucumber/features/linters/feature_without_scenarios.feature
189
+ - testing/cucumber/features/linters/outline_with_single_example_row.feature
190
+ - testing/cucumber/features/linters/test_with_too_many_steps.feature
142
191
  - testing/cucumber/step_definitions/action_steps.rb
143
192
  - testing/cucumber/step_definitions/setup_steps.rb
144
193
  - testing/cucumber/step_definitions/verification_steps.rb
@@ -149,13 +198,19 @@ files:
149
198
  - testing/rspec/spec/integration/cuke_linter_integration_spec.rb
150
199
  - testing/rspec/spec/integration/formatters/formatter_integration_specs.rb
151
200
  - testing/rspec/spec/integration/formatters/pretty_formatter_integration_spec.rb
201
+ - testing/rspec/spec/integration/linters/example_without_name_linter_integration_spec.rb
152
202
  - testing/rspec/spec/integration/linters/feature_without_scenarios_linter_integration_spec.rb
153
203
  - testing/rspec/spec/integration/linters/linter_integration_specs.rb
204
+ - testing/rspec/spec/integration/linters/outline_with_single_example_row_linter_integration_spec.rb
205
+ - testing/rspec/spec/integration/linters/test_with_too_many_steps_linter_integration_spec.rb
154
206
  - testing/rspec/spec/unit/cuke_linter_unit_spec.rb
155
207
  - testing/rspec/spec/unit/formatters/formatter_unit_specs.rb
156
208
  - testing/rspec/spec/unit/formatters/pretty_formatter_unit_spec.rb
209
+ - testing/rspec/spec/unit/linters/example_without_name_linter_unit_spec.rb
157
210
  - testing/rspec/spec/unit/linters/feature_without_scenarios_linter_unit_spec.rb
158
211
  - testing/rspec/spec/unit/linters/linter_unit_specs.rb
212
+ - testing/rspec/spec/unit/linters/outline_with_single_example_row_linter_unit_spec.rb
213
+ - testing/rspec/spec/unit/linters/test_with_too_many_steps_linter_unit_spec.rb
159
214
  homepage: https://github.com/enkessler/cuke_linter
160
215
  licenses:
161
216
  - MIT