cuke_linter 0.9.0 → 0.10.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.
Files changed (55) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +17 -1
  3. data/CONTRIBUTING.md +26 -0
  4. data/README.md +2 -15
  5. data/lib/cuke_linter.rb +36 -18
  6. data/lib/cuke_linter/linters/example_without_name_linter.rb +1 -1
  7. data/lib/cuke_linter/linters/feature_with_too_many_different_tags_linter.rb +38 -0
  8. data/lib/cuke_linter/linters/test_should_use_background_linter.rb +28 -0
  9. data/lib/cuke_linter/linters/test_with_action_step_as_final_step_linter.rb +23 -0
  10. data/lib/cuke_linter/linters/test_with_setup_step_after_action_step_linter.rb +31 -0
  11. data/lib/cuke_linter/linters/test_with_setup_step_after_verification_step_linter.rb +31 -0
  12. data/lib/cuke_linter/linters/test_with_setup_step_as_final_step_linter.rb +23 -0
  13. data/lib/cuke_linter/version.rb +1 -1
  14. data/testing/cucumber/features/default_linters.feature +20 -14
  15. data/testing/cucumber/features/linters/example_without_name.feature +8 -6
  16. data/testing/cucumber/features/linters/feature_with_too_many_different_tags.feature +56 -0
  17. data/testing/cucumber/features/linters/step_with_end_period.feature +1 -1
  18. data/testing/cucumber/features/linters/test_should_use_background.feature +29 -0
  19. data/testing/cucumber/features/linters/test_with_action_as_final_step.feature +28 -0
  20. data/testing/cucumber/features/linters/test_with_setup_step_after_action_step.feature +30 -0
  21. data/testing/cucumber/features/linters/test_with_setup_step_after_verification_step.feature +30 -0
  22. data/testing/cucumber/features/linters/test_with_setup_step_as_final_step.feature +28 -0
  23. data/testing/cucumber/features/linters/test_with_too_many_steps.feature +5 -0
  24. data/testing/cucumber/step_definitions/setup_steps.rb +28 -0
  25. data/testing/model_factory.rb +1 -1
  26. data/testing/rspec/spec/integration/cuke_linter_integration_spec.rb +12 -0
  27. data/testing/rspec/spec/integration/linters/feature_with_too_many_different_tags_linter_integration_spec.rb +8 -0
  28. data/testing/rspec/spec/integration/linters/test_should_use_background_linter_integration_spec.rb +8 -0
  29. data/testing/rspec/spec/integration/linters/test_with_action_step_as_final_step_linter_integration_spec.rb +8 -0
  30. data/testing/rspec/spec/integration/linters/test_with_setup_step_after_action_step_linter_integration_spec.rb +8 -0
  31. data/testing/rspec/spec/integration/linters/test_with_setup_step_after_verification_step_linter_integration_spec.rb +8 -0
  32. data/testing/rspec/spec/integration/linters/test_with_setup_step_as_final_step_linter_integration_spec.rb +8 -0
  33. data/testing/rspec/spec/unit/linters/background_does_more_than_setup_linter_unit_spec.rb +20 -57
  34. data/testing/rspec/spec/unit/linters/element_with_too_many_tags_linter_unit_spec.rb +18 -52
  35. data/testing/rspec/spec/unit/linters/example_without_name_linter_unit_spec.rb +41 -43
  36. data/testing/rspec/spec/unit/linters/feature_with_too_many_different_tags_linter_unit_spec.rb +293 -0
  37. data/testing/rspec/spec/unit/linters/feature_without_description_linter_unit_spec.rb +25 -42
  38. data/testing/rspec/spec/unit/linters/feature_without_name_linter_unit_spec.rb +10 -38
  39. data/testing/rspec/spec/unit/linters/feature_without_scenarios_linter_unit_spec.rb +32 -52
  40. data/testing/rspec/spec/unit/linters/linter_unit_spec.rb +27 -10
  41. data/testing/rspec/spec/unit/linters/linter_unit_specs.rb +26 -12
  42. data/testing/rspec/spec/unit/linters/outline_with_single_example_row_linter_unit_spec.rb +19 -66
  43. data/testing/rspec/spec/unit/linters/single_test_background_linter_unit_spec.rb +12 -39
  44. data/testing/rspec/spec/unit/linters/step_with_end_period_linter_unit_spec.rb +9 -28
  45. data/testing/rspec/spec/unit/linters/step_with_too_many_characters_linter_unit_spec.rb +19 -45
  46. data/testing/rspec/spec/unit/linters/test_should_use_background_linter_unit_spec.rb +226 -0
  47. data/testing/rspec/spec/unit/linters/test_with_action_step_as_final_step_linter_unit_spec.rb +98 -0
  48. data/testing/rspec/spec/unit/linters/test_with_no_action_step_linter_unit_spec.rb +10 -51
  49. data/testing/rspec/spec/unit/linters/test_with_no_name_linter_unit_spec.rb +11 -38
  50. data/testing/rspec/spec/unit/linters/test_with_no_verification_step_linter_unit_spec.rb +16 -54
  51. data/testing/rspec/spec/unit/linters/test_with_setup_step_after_action_step_linter_unit_spec.rb +124 -0
  52. data/testing/rspec/spec/unit/linters/test_with_setup_step_after_verification_step_linter_unit_spec.rb +125 -0
  53. data/testing/rspec/spec/unit/linters/test_with_setup_step_as_final_step_linter_unit_spec.rb +98 -0
  54. data/testing/rspec/spec/unit/linters/test_with_too_many_steps_linter_unit_spec.rb +9 -49
  55. metadata +27 -2
@@ -0,0 +1,226 @@
1
+ require_relative '../../../../../environments/rspec_env'
2
+
3
+
4
+ RSpec.describe CukeLinter::TestShouldUseBackgroundLinter do
5
+
6
+ let(:model_file_path) { 'some_file_path' }
7
+
8
+ it_should_behave_like 'a linter at the unit level'
9
+
10
+
11
+ it 'has a name' do
12
+ expect(subject.name).to eq('TestShouldUseBackgroundLinter')
13
+ end
14
+
15
+ describe 'linting' do
16
+
17
+ ['scenario', 'outline'].each do |model_type|
18
+
19
+ context "with a #{model_type} that shares a first step with all other tests in the feature" do
20
+
21
+ let(:test_model) do
22
+ step_text = 'the step'
23
+ feature_model = CukeLinter::ModelFactory.generate_feature_model(parent_file_path: model_file_path,
24
+ source_text: "Feature:
25
+ Scenario:
26
+ * #{step_text}
27
+ Scenario Outline:
28
+ * #{step_text}
29
+ Examples:
30
+ | param |
31
+ | value |")
32
+
33
+ model = CukeLinter::ModelFactory.send("generate_#{model_type}_model")
34
+ model.steps = [CukeModeler::Step.new("* #{step_text}")]
35
+
36
+ model.parent_model = feature_model
37
+ feature_model.tests << model
38
+
39
+ model
40
+ end
41
+
42
+ it_should_behave_like 'a linter linting a bad model'
43
+
44
+
45
+ it 'records a problem' do
46
+ result = subject.lint(test_model)
47
+
48
+ expect(result[:problem]).to eq('Test shares steps with all other tests in feature. Use a background.')
49
+ end
50
+
51
+ end
52
+
53
+ context "with a #{model_type} that does not share a first step with all other tests in the feature" do
54
+
55
+ context 'because the steps are different' do
56
+
57
+ let(:test_model) do
58
+ step_text = 'the step'
59
+ feature_model = CukeLinter::ModelFactory.generate_feature_model(source_text: "Feature:
60
+ Scenario:
61
+ * #{step_text}
62
+ Scenario Outline:
63
+ * #{step_text}
64
+ Examples:
65
+ | param |
66
+ | value |")
67
+
68
+ model = CukeLinter::ModelFactory.send("generate_#{model_type}_model")
69
+ model.steps = [CukeModeler::Step.new("* #{step_text} plus extra")]
70
+
71
+ model.parent_model = feature_model
72
+ feature_model.tests << model
73
+
74
+ model
75
+ end
76
+
77
+ it_should_behave_like 'a linter linting a good model'
78
+
79
+ end
80
+
81
+ context 'because it has no steps' do
82
+
83
+ context 'because its steps are empty' do
84
+
85
+ let(:test_model) do
86
+ step_text = 'the step'
87
+ feature_model = CukeLinter::ModelFactory.generate_feature_model(source_text: "Feature:
88
+ Scenario:
89
+ * #{step_text}
90
+ Scenario Outline:
91
+ * #{step_text}
92
+ Examples:
93
+ | param |
94
+ | value |")
95
+
96
+ model = CukeLinter::ModelFactory.send("generate_#{model_type}_model")
97
+ model.steps = []
98
+
99
+ model.parent_model = feature_model
100
+ feature_model.tests << model
101
+
102
+ model
103
+ end
104
+
105
+ it_should_behave_like 'a linter linting a good model'
106
+
107
+ end
108
+
109
+ context 'because its steps are nil' do
110
+
111
+ let(:test_model) do
112
+ step_text = 'the step'
113
+ feature_model = CukeLinter::ModelFactory.generate_feature_model(source_text: "Feature:
114
+ Scenario:
115
+ * #{step_text}
116
+ Scenario Outline:
117
+ * #{step_text}
118
+ Examples:
119
+ | param |
120
+ | value |")
121
+
122
+ model = CukeLinter::ModelFactory.send("generate_#{model_type}_model")
123
+ model.steps = nil
124
+
125
+ model.parent_model = feature_model
126
+ feature_model.tests << model
127
+
128
+ model
129
+ end
130
+
131
+ it_should_behave_like 'a linter linting a good model'
132
+
133
+ end
134
+
135
+ end
136
+
137
+ context 'because another test has no steps' do
138
+
139
+ context 'because its steps are empty' do
140
+
141
+ let(:test_model) do
142
+ step_text = 'the step'
143
+ feature_model = CukeLinter::ModelFactory.generate_feature_model(source_text: "Feature:
144
+ Scenario:
145
+ * #{step_text}
146
+ Scenario Outline:
147
+ * #{step_text}
148
+ Examples:
149
+ | param |
150
+ | value |")
151
+
152
+ model = CukeLinter::ModelFactory.send("generate_#{model_type}_model")
153
+ model.steps = [CukeModeler::Step.new("* #{step_text}")]
154
+
155
+ model.parent_model = feature_model
156
+ feature_model.tests.first.steps = []
157
+ feature_model.tests << model
158
+
159
+ model
160
+ end
161
+
162
+ it_should_behave_like 'a linter linting a good model'
163
+
164
+ end
165
+
166
+ context 'because its steps are nil' do
167
+
168
+ let(:test_model) do
169
+ step_text = 'the step'
170
+ feature_model = CukeLinter::ModelFactory.generate_feature_model(source_text: "Feature:
171
+ Scenario:
172
+ * #{step_text}
173
+ Scenario Outline:
174
+ * #{step_text}
175
+ Examples:
176
+ | param |
177
+ | value |")
178
+
179
+ model = CukeLinter::ModelFactory.send("generate_#{model_type}_model")
180
+ model.steps = [CukeModeler::Step.new("* #{step_text}")]
181
+
182
+ model.parent_model = feature_model
183
+ feature_model.tests.first.steps = nil
184
+ feature_model.tests << model
185
+
186
+ model
187
+ end
188
+
189
+ it_should_behave_like 'a linter linting a good model'
190
+
191
+ end
192
+
193
+ end
194
+
195
+ context 'because there are not other tests in the feature' do
196
+
197
+ let(:test_model) do
198
+ step_text = 'the step'
199
+ feature_model = CukeLinter::ModelFactory.generate_feature_model(source_text: 'Feature:')
200
+
201
+ model = CukeLinter::ModelFactory.send("generate_#{model_type}_model")
202
+ model.steps = [CukeModeler::Step.new("* #{step_text}")]
203
+
204
+ model.parent_model = feature_model
205
+ feature_model.tests << model
206
+
207
+ model
208
+ end
209
+
210
+ it_should_behave_like 'a linter linting a good model'
211
+
212
+ end
213
+
214
+ end
215
+
216
+ end
217
+
218
+ context 'a non-test model' do
219
+
220
+ let(:test_model) { CukeModeler::Model.new }
221
+
222
+ it_should_behave_like 'a linter linting a good model'
223
+
224
+ end
225
+ end
226
+ end
@@ -0,0 +1,98 @@
1
+ require_relative '../../../../../environments/rspec_env'
2
+
3
+
4
+ RSpec.describe CukeLinter::TestWithActionStepAsFinalStepLinter do
5
+
6
+ let(:model_file_path) { 'some_file_path' }
7
+
8
+ it_should_behave_like 'a linter at the unit level'
9
+
10
+
11
+ it 'has a name' do
12
+ expect(subject.name).to eq('TestWithActionStepAsFinalStepLinter')
13
+ end
14
+
15
+ describe 'linting' do
16
+
17
+ ['scenario', 'outline'].each do |model_type|
18
+
19
+ context "with a #{model_type} that has an action step as its final step" do
20
+
21
+ let(:test_model) do
22
+ model = CukeLinter::ModelFactory.send("generate_#{model_type}_model", parent_file_path: model_file_path)
23
+ model.steps = [CukeModeler::Step.new('Given a step'),
24
+ CukeModeler::Step.new('When a step')]
25
+
26
+ model
27
+ end
28
+
29
+ it_should_behave_like 'a linter linting a bad model'
30
+
31
+
32
+ it 'records a problem' do
33
+ result = subject.lint(test_model)
34
+
35
+ expect(result[:problem]).to eq("Test has 'When' as the final step.")
36
+ end
37
+
38
+ end
39
+
40
+ context "with a #{model_type} that does not have an action step as its final step" do
41
+
42
+ context 'because it has no steps' do
43
+
44
+ context 'because its steps are empty' do
45
+
46
+ let(:test_model) do
47
+ model = CukeLinter::ModelFactory.send("generate_#{model_type}_model")
48
+ model.steps = []
49
+
50
+ model
51
+ end
52
+
53
+ it_should_behave_like 'a linter linting a good model'
54
+
55
+ end
56
+
57
+ context 'because its steps are nil' do
58
+
59
+ let(:test_model) do
60
+ model = CukeLinter::ModelFactory.send("generate_#{model_type}_model")
61
+ model.steps = nil
62
+
63
+ model
64
+ end
65
+
66
+ it_should_behave_like 'a linter linting a good model'
67
+
68
+ end
69
+
70
+ end
71
+
72
+ context 'because its final step is not an action step' do
73
+
74
+ let(:test_model) do
75
+ model = CukeLinter::ModelFactory.send("generate_#{model_type}_model")
76
+ model.steps = [CukeModeler::Step.new('Then a step')]
77
+
78
+ model
79
+ end
80
+
81
+ it_should_behave_like 'a linter linting a good model'
82
+
83
+ end
84
+
85
+ end
86
+
87
+ end
88
+
89
+
90
+ context 'a non-test model' do
91
+
92
+ let(:test_model) { CukeModeler::Model.new }
93
+
94
+ it_should_behave_like 'a linter linting a good model'
95
+
96
+ end
97
+ end
98
+ end
@@ -3,16 +3,7 @@ require_relative '../../../../../environments/rspec_env'
3
3
 
4
4
  RSpec.describe CukeLinter::TestWithNoActionStepLinter do
5
5
 
6
- let(:good_data) do
7
- CukeLinter::ModelFactory.generate_scenario_model(source_text: 'Scenario:
8
- When an action step')
9
- end
10
-
11
- let(:bad_data) do
12
- CukeLinter::ModelFactory.generate_scenario_model(source_text: 'Scenario:
13
- * no action step')
14
- end
15
-
6
+ let(:model_file_path) { 'some_file_path' }
16
7
 
17
8
  it_should_behave_like 'a linter at the unit level'
18
9
 
@@ -32,7 +23,7 @@ RSpec.describe CukeLinter::TestWithNoActionStepLinter do
32
23
  context 'because its steps are empty' do
33
24
 
34
25
  let(:test_model) do
35
- model = CukeLinter::ModelFactory.send("generate_#{model_type}_model", parent_file_path: 'path_to_file')
26
+ model = CukeLinter::ModelFactory.send("generate_#{model_type}_model", parent_file_path: model_file_path)
36
27
  model.steps = []
37
28
 
38
29
  model
@@ -44,22 +35,14 @@ RSpec.describe CukeLinter::TestWithNoActionStepLinter do
44
35
  expect(result[:problem]).to eq("Test does not have a 'When' step.")
45
36
  end
46
37
 
47
- it 'records the location of the problem' do
48
- test_model.source_line = 1
49
- result = subject.lint(test_model)
50
- expect(result[:location]).to eq('path_to_file:1')
51
-
52
- test_model.source_line = 3
53
- result = subject.lint(test_model)
54
- expect(result[:location]).to eq('path_to_file:3')
55
- end
38
+ it_should_behave_like 'a linter linting a bad model'
56
39
 
57
40
  end
58
41
 
59
42
  context 'because its steps are nil' do
60
43
 
61
44
  let(:test_model) do
62
- model = CukeLinter::ModelFactory.send("generate_#{model_type}_model", parent_file_path: 'path_to_file')
45
+ model = CukeLinter::ModelFactory.send("generate_#{model_type}_model", parent_file_path: model_file_path)
63
46
  model.steps = nil
64
47
 
65
48
  model
@@ -71,15 +54,7 @@ RSpec.describe CukeLinter::TestWithNoActionStepLinter do
71
54
  expect(result[:problem]).to eq("Test does not have a 'When' step.")
72
55
  end
73
56
 
74
- it 'records the location of the problem' do
75
- test_model.source_line = 1
76
- result = subject.lint(test_model)
77
- expect(result[:location]).to eq('path_to_file:1')
78
-
79
- test_model.source_line = 3
80
- result = subject.lint(test_model)
81
- expect(result[:location]).to eq('path_to_file:3')
82
- end
57
+ it_should_behave_like 'a linter linting a bad model'
83
58
 
84
59
  end
85
60
 
@@ -88,7 +63,7 @@ RSpec.describe CukeLinter::TestWithNoActionStepLinter do
88
63
  context 'because none of its steps is an action step' do
89
64
 
90
65
  let(:test_model) do
91
- model = CukeLinter::ModelFactory.send("generate_#{model_type}_model", parent_file_path: 'path_to_file')
66
+ model = CukeLinter::ModelFactory.send("generate_#{model_type}_model", parent_file_path: model_file_path)
92
67
  model.steps = [CukeModeler::Step.new('* not an action step')]
93
68
 
94
69
  model
@@ -100,15 +75,7 @@ RSpec.describe CukeLinter::TestWithNoActionStepLinter do
100
75
  expect(result[:problem]).to eq("Test does not have a 'When' step.")
101
76
  end
102
77
 
103
- it 'records the location of the problem' do
104
- test_model.source_line = 1
105
- result = subject.lint(test_model)
106
- expect(result[:location]).to eq('path_to_file:1')
107
-
108
- test_model.source_line = 3
109
- result = subject.lint(test_model)
110
- expect(result[:location]).to eq('path_to_file:3')
111
- end
78
+ it_should_behave_like 'a linter linting a bad model'
112
79
 
113
80
  end
114
81
 
@@ -128,9 +95,7 @@ RSpec.describe CukeLinter::TestWithNoActionStepLinter do
128
95
  model
129
96
  end
130
97
 
131
- it 'does not record a problem' do
132
- expect(subject.lint(test_model)).to eq(nil)
133
- end
98
+ it_should_behave_like 'a linter linting a good model'
134
99
 
135
100
  end
136
101
 
@@ -143,9 +108,7 @@ RSpec.describe CukeLinter::TestWithNoActionStepLinter do
143
108
  model
144
109
  end
145
110
 
146
- it 'does not record a problem' do
147
- expect(subject.lint(test_model)).to eq(nil)
148
- end
111
+ it_should_behave_like 'a linter linting a good model'
149
112
 
150
113
  end
151
114
 
@@ -206,11 +169,7 @@ RSpec.describe CukeLinter::TestWithNoActionStepLinter do
206
169
 
207
170
  let(:test_model) { CukeModeler::Model.new }
208
171
 
209
- it 'returns no result' do
210
- result = subject.lint(test_model)
211
-
212
- expect(result).to eq(nil)
213
- end
172
+ it_should_behave_like 'a linter linting a good model'
214
173
 
215
174
  end
216
175
  end