cuke_linter 0.12.1 → 0.13.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 +14 -1
- data/lib/cuke_linter.rb +4 -0
- data/lib/cuke_linter/linters/background_does_more_than_setup_linter.rb +17 -1
- data/lib/cuke_linter/linters/test_with_action_step_as_final_step_linter.rb +12 -1
- data/lib/cuke_linter/linters/test_with_no_action_step_linter.rb +12 -1
- data/lib/cuke_linter/linters/test_with_no_verification_step_linter.rb +12 -1
- data/lib/cuke_linter/linters/test_with_setup_step_after_action_step_linter.rb +18 -2
- data/lib/cuke_linter/linters/test_with_setup_step_after_verification_step_linter.rb +18 -2
- data/lib/cuke_linter/linters/test_with_setup_step_as_final_step_linter.rb +12 -1
- data/lib/cuke_linter/version.rb +1 -1
- data/testing/cucumber/features/linters/background_does_more_than_setup.feature +34 -0
- data/testing/cucumber/features/linters/test_with_action_as_final_step.feature +25 -3
- data/testing/cucumber/features/linters/test_with_no_action_step.feature +27 -1
- data/testing/cucumber/features/linters/test_with_no_verification_step.feature +28 -1
- data/testing/cucumber/features/linters/test_with_setup_step_after_action_step.feature +28 -1
- data/testing/cucumber/features/linters/test_with_setup_step_after_verification_step.feature +28 -1
- data/testing/cucumber/features/linters/test_with_setup_step_as_final_step.feature +25 -3
- data/testing/cucumber/step_definitions/setup_steps.rb +28 -0
- data/testing/rspec/spec/unit/cuke_linter_unit_spec.rb +12 -0
- data/testing/rspec/spec/unit/linters/background_does_more_than_setup_linter_unit_spec.rb +109 -0
- data/testing/rspec/spec/unit/linters/test_with_action_step_as_final_step_linter_unit_spec.rb +67 -0
- data/testing/rspec/spec/unit/linters/test_with_no_action_step_linter_unit_spec.rb +68 -0
- data/testing/rspec/spec/unit/linters/test_with_no_verification_step_linter_unit_spec.rb +67 -0
- data/testing/rspec/spec/unit/linters/test_with_setup_step_after_action_step_linter_unit_spec.rb +109 -0
- data/testing/rspec/spec/unit/linters/test_with_setup_step_after_verification_step_linter_unit_spec.rb +108 -0
- data/testing/rspec/spec/unit/linters/test_with_setup_step_as_final_step_linter_unit_spec.rb +66 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7669fb1b66c4e9c103aedb209961dbeca8b308f74bcc1159401fa21e1ffd5b05
|
4
|
+
data.tar.gz: 36ef3927bc68e7d52bde3c91f26ab0428d07b81c7163c0c31aaabf2847fa78db
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 449a18606c23f574ffba7b5a2d80f9cc7170839daf9187e52404d31ca93e3fb20396860476d827125b6a85968d98985ba83e2ad92d127066a69322edee40459b
|
7
|
+
data.tar.gz: 407d387c3ce3c6eb3648179837757caa688b5b6bdab42b7cc684d3480054fadc0d7aa4c4ef555d241c77919ecb6e8ae7438736ba6b449e56c6ee76cfbdac07e4
|
data/CHANGELOG.md
CHANGED
@@ -8,6 +8,18 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
8
8
|
|
9
9
|
Nothing yet...
|
10
10
|
|
11
|
+
## [0.13.0] - 2020-03-01
|
12
|
+
|
13
|
+
### Added
|
14
|
+
- Added the ability to configure relevant keywords for linters whose behavior is impacted by the dialect in which feature files are written.
|
15
|
+
- BackgroundDoesMoreThanSetupLinter
|
16
|
+
- TestWithActionStepAsFinalStepLinter
|
17
|
+
- TestWithNoActionStepLinter
|
18
|
+
- TestWithNoVerificationStepLinter
|
19
|
+
- TestWithSetupStepAfterActionStepLinter
|
20
|
+
- TestWithSetupStepAfterVerificationStepLinter
|
21
|
+
- TestWithSetupStepAsFinalStepLinter
|
22
|
+
|
11
23
|
|
12
24
|
## [0.12.1] - 2020-02-15
|
13
25
|
|
@@ -135,7 +147,8 @@ Nothing yet...
|
|
135
147
|
- Custom linters, formatters, and command line usability
|
136
148
|
|
137
149
|
|
138
|
-
[Unreleased]: https://github.com/enkessler/cuke_linter/compare/v0.
|
150
|
+
[Unreleased]: https://github.com/enkessler/cuke_linter/compare/v0.13.0...HEAD
|
151
|
+
[0.13.0]: https://github.com/enkessler/cuke_linter/compare/v0.12.1...v0.13.0
|
139
152
|
[0.12.1]: https://github.com/enkessler/cuke_linter/compare/v0.12.0...v0.12.1
|
140
153
|
[0.12.0]: https://github.com/enkessler/cuke_linter/compare/v0.11.1...v0.12.0
|
141
154
|
[0.11.1]: https://github.com/enkessler/cuke_linter/compare/v0.11.0...v0.11.1
|
data/lib/cuke_linter.rb
CHANGED
@@ -35,6 +35,10 @@ require 'cuke_linter/linters/test_with_too_many_steps_linter'
|
|
35
35
|
|
36
36
|
module CukeLinter
|
37
37
|
|
38
|
+
DEFAULT_GIVEN_KEYWORD = 'Given'.freeze
|
39
|
+
DEFAULT_WHEN_KEYWORD = 'When'.freeze
|
40
|
+
DEFAULT_THEN_KEYWORD = 'Then'.freeze
|
41
|
+
|
38
42
|
@original_linters = { 'BackgroundDoesMoreThanSetupLinter' => BackgroundDoesMoreThanSetupLinter.new,
|
39
43
|
'ElementWithCommonTagsLinter' => ElementWithCommonTagsLinter.new,
|
40
44
|
'ElementWithDuplicateTagsLinter' => ElementWithDuplicateTagsLinter.new,
|
@@ -4,11 +4,17 @@ module CukeLinter
|
|
4
4
|
|
5
5
|
class BackgroundDoesMoreThanSetupLinter < Linter
|
6
6
|
|
7
|
+
# Changes the linting settings on the linter using the provided configuration
|
8
|
+
def configure(options)
|
9
|
+
@when_keywords = options['When']
|
10
|
+
@then_keywords = options['Then']
|
11
|
+
end
|
12
|
+
|
7
13
|
# The rule used to determine if a model has a problem
|
8
14
|
def rule(model)
|
9
15
|
return false unless model.is_a?(CukeModeler::Background)
|
10
16
|
|
11
|
-
model.steps.collect(&:keyword).any? { |keyword| (keyword
|
17
|
+
model.steps.collect(&:keyword).any? { |keyword| when_keywords.include?(keyword) || then_keywords.include?(keyword) }
|
12
18
|
end
|
13
19
|
|
14
20
|
# The message used to describe the problem that has been found
|
@@ -16,5 +22,15 @@ module CukeLinter
|
|
16
22
|
'Background has non-setup steps'
|
17
23
|
end
|
18
24
|
|
25
|
+
private
|
26
|
+
|
27
|
+
def when_keywords
|
28
|
+
@when_keywords || [DEFAULT_WHEN_KEYWORD]
|
29
|
+
end
|
30
|
+
|
31
|
+
def then_keywords
|
32
|
+
@then_keywords || [DEFAULT_THEN_KEYWORD]
|
33
|
+
end
|
34
|
+
|
19
35
|
end
|
20
36
|
end
|
@@ -4,6 +4,11 @@ module CukeLinter
|
|
4
4
|
|
5
5
|
class TestWithActionStepAsFinalStepLinter < Linter
|
6
6
|
|
7
|
+
# Changes the linting settings on the linter using the provided configuration
|
8
|
+
def configure(options)
|
9
|
+
@when_keywords = options['When']
|
10
|
+
end
|
11
|
+
|
7
12
|
# The rule used to determine if a model has a problem
|
8
13
|
def rule(model)
|
9
14
|
return false unless model.is_a?(CukeModeler::Scenario) || model.is_a?(CukeModeler::Outline)
|
@@ -11,7 +16,7 @@ module CukeLinter
|
|
11
16
|
model_steps = model.steps || []
|
12
17
|
return false unless model_steps.last
|
13
18
|
|
14
|
-
model_steps.last.keyword
|
19
|
+
when_keywords.include?(model_steps.last.keyword)
|
15
20
|
end
|
16
21
|
|
17
22
|
# The message used to describe the problem that has been found
|
@@ -19,5 +24,11 @@ module CukeLinter
|
|
19
24
|
"Test has 'When' as the final step."
|
20
25
|
end
|
21
26
|
|
27
|
+
private
|
28
|
+
|
29
|
+
def when_keywords
|
30
|
+
@when_keywords || [DEFAULT_WHEN_KEYWORD]
|
31
|
+
end
|
32
|
+
|
22
33
|
end
|
23
34
|
end
|
@@ -4,6 +4,11 @@ module CukeLinter
|
|
4
4
|
|
5
5
|
class TestWithNoActionStepLinter < Linter
|
6
6
|
|
7
|
+
# Changes the linting settings on the linter using the provided configuration
|
8
|
+
def configure(options)
|
9
|
+
@when_keywords = options['When']
|
10
|
+
end
|
11
|
+
|
7
12
|
# The rule used to determine if a model has a problem
|
8
13
|
def rule(model)
|
9
14
|
return false unless model.is_a?(CukeModeler::Scenario) || model.is_a?(CukeModeler::Outline)
|
@@ -11,7 +16,7 @@ module CukeLinter
|
|
11
16
|
model_steps = model.steps || []
|
12
17
|
background_steps = model.parent_model.has_background? ? model.parent_model.background.steps || [] : []
|
13
18
|
all_steps = model_steps + background_steps
|
14
|
-
all_steps.none? { |step| step.keyword
|
19
|
+
all_steps.none? { |step| when_keywords.include?(step.keyword) }
|
15
20
|
end
|
16
21
|
|
17
22
|
# The message used to describe the problem that has been found
|
@@ -19,5 +24,11 @@ module CukeLinter
|
|
19
24
|
"Test does not have a 'When' step."
|
20
25
|
end
|
21
26
|
|
27
|
+
private
|
28
|
+
|
29
|
+
def when_keywords
|
30
|
+
@when_keywords || [DEFAULT_WHEN_KEYWORD]
|
31
|
+
end
|
32
|
+
|
22
33
|
end
|
23
34
|
end
|
@@ -4,6 +4,11 @@ module CukeLinter
|
|
4
4
|
|
5
5
|
class TestWithNoVerificationStepLinter < Linter
|
6
6
|
|
7
|
+
# Changes the linting settings on the linter using the provided configuration
|
8
|
+
def configure(options)
|
9
|
+
@then_keywords = options['Then']
|
10
|
+
end
|
11
|
+
|
7
12
|
# The rule used to determine if a model has a problem
|
8
13
|
def rule(model)
|
9
14
|
return false unless model.is_a?(CukeModeler::Scenario) || model.is_a?(CukeModeler::Outline)
|
@@ -11,7 +16,7 @@ module CukeLinter
|
|
11
16
|
model_steps = model.steps || []
|
12
17
|
background_steps = model.parent_model.has_background? ? model.parent_model.background.steps || [] : []
|
13
18
|
all_steps = model_steps + background_steps
|
14
|
-
all_steps.none? { |step| step.keyword
|
19
|
+
all_steps.none? { |step| then_keywords.include?(step.keyword) }
|
15
20
|
end
|
16
21
|
|
17
22
|
# The message used to describe the problem that has been found
|
@@ -19,5 +24,11 @@ module CukeLinter
|
|
19
24
|
"Test does not have a 'Then' step."
|
20
25
|
end
|
21
26
|
|
27
|
+
private
|
28
|
+
|
29
|
+
def then_keywords
|
30
|
+
@then_keywords || [DEFAULT_THEN_KEYWORD]
|
31
|
+
end
|
32
|
+
|
22
33
|
end
|
23
34
|
end
|
@@ -4,6 +4,12 @@ module CukeLinter
|
|
4
4
|
|
5
5
|
class TestWithSetupStepAfterActionStepLinter < Linter
|
6
6
|
|
7
|
+
# Changes the linting settings on the linter using the provided configuration
|
8
|
+
def configure(options)
|
9
|
+
@given_keywords = options['Given']
|
10
|
+
@when_keywords = options['When']
|
11
|
+
end
|
12
|
+
|
7
13
|
# The rule used to determine if a model has a problem
|
8
14
|
def rule(model)
|
9
15
|
return false unless model.is_a?(CukeModeler::Scenario) || model.is_a?(CukeModeler::Outline)
|
@@ -13,9 +19,9 @@ module CukeLinter
|
|
13
19
|
|
14
20
|
model_steps.each do |step|
|
15
21
|
if action_step_found
|
16
|
-
return true if step.keyword
|
22
|
+
return true if given_keywords.include?(step.keyword)
|
17
23
|
else
|
18
|
-
action_step_found = step.keyword
|
24
|
+
action_step_found = when_keywords.include?(step.keyword)
|
19
25
|
end
|
20
26
|
end
|
21
27
|
|
@@ -27,5 +33,15 @@ module CukeLinter
|
|
27
33
|
"Test has 'Given' step after 'When' step."
|
28
34
|
end
|
29
35
|
|
36
|
+
private
|
37
|
+
|
38
|
+
def given_keywords
|
39
|
+
@given_keywords || [DEFAULT_GIVEN_KEYWORD]
|
40
|
+
end
|
41
|
+
|
42
|
+
def when_keywords
|
43
|
+
@when_keywords || [DEFAULT_WHEN_KEYWORD]
|
44
|
+
end
|
45
|
+
|
30
46
|
end
|
31
47
|
end
|
@@ -4,6 +4,12 @@ module CukeLinter
|
|
4
4
|
|
5
5
|
class TestWithSetupStepAfterVerificationStepLinter < Linter
|
6
6
|
|
7
|
+
# Changes the linting settings on the linter using the provided configuration
|
8
|
+
def configure(options)
|
9
|
+
@given_keywords = options['Given']
|
10
|
+
@then_keywords = options['Then']
|
11
|
+
end
|
12
|
+
|
7
13
|
# The rule used to determine if a model has a problem
|
8
14
|
def rule(model)
|
9
15
|
return false unless model.is_a?(CukeModeler::Scenario) || model.is_a?(CukeModeler::Outline)
|
@@ -13,9 +19,9 @@ module CukeLinter
|
|
13
19
|
|
14
20
|
model_steps.each do |step|
|
15
21
|
if verification_step_found
|
16
|
-
return true if step.keyword
|
22
|
+
return true if given_keywords.include?(step.keyword)
|
17
23
|
else
|
18
|
-
verification_step_found = step.keyword
|
24
|
+
verification_step_found = then_keywords.include?(step.keyword)
|
19
25
|
end
|
20
26
|
end
|
21
27
|
|
@@ -27,5 +33,15 @@ module CukeLinter
|
|
27
33
|
"Test has 'Given' step after 'Then' step."
|
28
34
|
end
|
29
35
|
|
36
|
+
private
|
37
|
+
|
38
|
+
def given_keywords
|
39
|
+
@given_keywords || [DEFAULT_GIVEN_KEYWORD]
|
40
|
+
end
|
41
|
+
|
42
|
+
def then_keywords
|
43
|
+
@then_keywords || [DEFAULT_THEN_KEYWORD]
|
44
|
+
end
|
45
|
+
|
30
46
|
end
|
31
47
|
end
|
@@ -4,6 +4,11 @@ module CukeLinter
|
|
4
4
|
|
5
5
|
class TestWithSetupStepAsFinalStepLinter < Linter
|
6
6
|
|
7
|
+
# Changes the linting settings on the linter using the provided configuration
|
8
|
+
def configure(options)
|
9
|
+
@given_keywords = options['Given']
|
10
|
+
end
|
11
|
+
|
7
12
|
# The rule used to determine if a model has a problem
|
8
13
|
def rule(model)
|
9
14
|
return false unless model.is_a?(CukeModeler::Scenario) || model.is_a?(CukeModeler::Outline)
|
@@ -11,7 +16,7 @@ module CukeLinter
|
|
11
16
|
model_steps = model.steps || []
|
12
17
|
return false unless model_steps.last
|
13
18
|
|
14
|
-
model_steps.last.keyword
|
19
|
+
given_keywords.include?(model_steps.last.keyword)
|
15
20
|
end
|
16
21
|
|
17
22
|
# The message used to describe the problem that has been found
|
@@ -19,5 +24,11 @@ module CukeLinter
|
|
19
24
|
"Test has 'Given' as the final step."
|
20
25
|
end
|
21
26
|
|
27
|
+
private
|
28
|
+
|
29
|
+
def given_keywords
|
30
|
+
@given_keywords || [DEFAULT_GIVEN_KEYWORD]
|
31
|
+
end
|
32
|
+
|
22
33
|
end
|
23
34
|
end
|
data/lib/cuke_linter/version.rb
CHANGED
@@ -48,3 +48,37 @@ Feature: Background does more than setup linter
|
|
48
48
|
"""
|
49
49
|
When it is linted
|
50
50
|
Then no error is reported
|
51
|
+
|
52
|
+
Scenario Outline: Configuration of keywords for different dialect
|
53
|
+
Given a linter for backgrounds that do more than setup has been registered
|
54
|
+
And the following configuration file:
|
55
|
+
"""
|
56
|
+
BackgroundDoesMoreThanSetupLinter:
|
57
|
+
Given:
|
58
|
+
- Dado
|
59
|
+
When:
|
60
|
+
- Quando
|
61
|
+
Then:
|
62
|
+
- Então
|
63
|
+
- Entao
|
64
|
+
"""
|
65
|
+
And the following feature:
|
66
|
+
"""
|
67
|
+
# language:pt
|
68
|
+
Funcionalidade: Feature name
|
69
|
+
|
70
|
+
Contexto: A Background in pt dialect
|
71
|
+
Dado some setup in pt dialect
|
72
|
+
<step>
|
73
|
+
"""
|
74
|
+
When the configuration file is loaded
|
75
|
+
And it is linted
|
76
|
+
Then an error is reported:
|
77
|
+
| linter | problem | location |
|
78
|
+
| BackgroundDoesMoreThanSetupLinter | Background has non-setup steps | <path_to_file>:4 |
|
79
|
+
|
80
|
+
Examples:
|
81
|
+
| step |
|
82
|
+
| Quando this is an action in pt dialect |
|
83
|
+
| Então this is a validation in pt dialect |
|
84
|
+
| Entao this is also a validation in pt dialect |
|
@@ -22,7 +22,29 @@ Feature: Test with action step as final step linter
|
|
22
22
|
| linter | problem | location |
|
23
23
|
| TestWithActionStepAsFinalStepLinter | Test has 'When' as the final step. | <path_to_file>:3 |
|
24
24
|
|
25
|
-
|
26
|
-
|
25
|
+
Scenario: Configuration of keywords for different dialect
|
26
|
+
Given a linter for tests with an action step as the final step has been registered
|
27
|
+
And the following configuration file:
|
28
|
+
"""
|
29
|
+
TestWithActionStepAsFinalStepLinter:
|
30
|
+
Given:
|
31
|
+
- Dado
|
32
|
+
When:
|
33
|
+
- Quando
|
34
|
+
- '*'
|
35
|
+
Then:
|
36
|
+
- Então
|
37
|
+
"""
|
38
|
+
And the following feature:
|
39
|
+
"""
|
40
|
+
# language:pt
|
41
|
+
Funcionalidade: Feature name
|
27
42
|
|
28
|
-
|
43
|
+
Cenário: scenario name
|
44
|
+
Quando this is an action in pt dialect
|
45
|
+
"""
|
46
|
+
When the configuration file is loaded
|
47
|
+
And it is linted
|
48
|
+
Then an error is reported:
|
49
|
+
| linter | problem | location |
|
50
|
+
| TestWithActionStepAsFinalStepLinter | Test has 'When' as the final step. | <path_to_file>:4 |
|
@@ -23,8 +23,34 @@ Feature: Test with no action step linter
|
|
23
23
|
| linter | problem | location |
|
24
24
|
| TestWithNoActionStepLinter | Test does not have a 'When' step. | <path_to_file>:3 |
|
25
25
|
|
26
|
+
Scenario: Configuration of keywords for different dialect
|
27
|
+
Given a linter for tests with no action step has been registered
|
28
|
+
And the following configuration file:
|
29
|
+
"""
|
30
|
+
TestWithNoActionStepLinter:
|
31
|
+
Given:
|
32
|
+
- Dado
|
33
|
+
When:
|
34
|
+
- Quando
|
35
|
+
Then:
|
36
|
+
- Então
|
37
|
+
"""
|
38
|
+
And the following feature:
|
39
|
+
"""
|
40
|
+
# language:pt
|
41
|
+
Funcionalidade: Feature name
|
42
|
+
|
43
|
+
Cenário: scenario name
|
44
|
+
Dado some setup in pt dialect
|
45
|
+
Então this is an validation in pt dialect
|
46
|
+
"""
|
47
|
+
When the configuration file is loaded
|
48
|
+
And it is linted
|
49
|
+
Then an error is reported:
|
50
|
+
| linter | problem | location |
|
51
|
+
| TestWithNoActionStepLinter | Test does not have a 'When' step. | <path_to_file>:4 |
|
52
|
+
|
26
53
|
@wip
|
27
54
|
Scenario: Configuration
|
28
55
|
|
29
56
|
Ideas: Configure whether or not the linter triggers on tests with no steps at all?
|
30
|
-
Configure the keyword(s) that count as an action step?
|
@@ -24,8 +24,35 @@ Feature: Test with no verification step linter
|
|
24
24
|
| linter | problem | location |
|
25
25
|
| TestWithNoVerificationStepLinter | Test does not have a 'Then' step. | <path_to_file>:3 |
|
26
26
|
|
27
|
+
Scenario: Configuration of keywords for different dialect
|
28
|
+
Given a linter for tests with no verification step has been registered
|
29
|
+
And the following configuration file:
|
30
|
+
"""
|
31
|
+
TestWithNoVerificationStepLinter:
|
32
|
+
Given:
|
33
|
+
- Dado
|
34
|
+
When:
|
35
|
+
- Quando
|
36
|
+
Then:
|
37
|
+
- Então
|
38
|
+
"""
|
39
|
+
And the following feature:
|
40
|
+
"""
|
41
|
+
# language:pt
|
42
|
+
Funcionalidade: Feature name
|
43
|
+
|
44
|
+
Cenário: scenario name
|
45
|
+
Dado some setup in pt dialect
|
46
|
+
Quando this is an action in pt dialect
|
47
|
+
E this is and AND in pt dialect
|
48
|
+
"""
|
49
|
+
When the configuration file is loaded
|
50
|
+
And it is linted
|
51
|
+
Then an error is reported:
|
52
|
+
| linter | problem | location |
|
53
|
+
| TestWithNoVerificationStepLinter | Test does not have a 'Then' step. | <path_to_file>:4 |
|
54
|
+
|
27
55
|
@wip
|
28
56
|
Scenario: Configuration
|
29
57
|
|
30
58
|
Ideas: Configure whether or not the linter triggers on tests with no steps at all?
|
31
|
-
Configure the keyword(s) that count as a verification step?
|