cuke_linter 0.6.0 → 0.7.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 +15 -1
- data/cuke_linter.gemspec +1 -0
- data/lib/cuke_linter.rb +24 -3
- data/lib/cuke_linter/linters/element_with_too_many_tags_linter.rb +41 -0
- data/lib/cuke_linter/linters/feature_without_name_linter.rb +20 -0
- data/lib/cuke_linter/linters/test_with_no_action_step_linter.rb +23 -0
- data/lib/cuke_linter/linters/test_with_no_name_linter.rb +20 -0
- data/lib/cuke_linter/linters/test_with_no_verification_step_linter.rb +23 -0
- data/lib/cuke_linter/linters/test_with_too_many_steps_linter.rb +1 -1
- data/lib/cuke_linter/version.rb +1 -1
- data/testing/cucumber/features/command_line.feature +6 -4
- data/testing/cucumber/features/configuration/configuring_linters.feature +36 -0
- data/testing/cucumber/features/linters/{background_does_more_than_setup_linter.feature → background_does_more_than_setup.feature} +2 -2
- data/testing/cucumber/features/linters/custom_linters.feature +3 -3
- data/testing/cucumber/features/linters/default_linters.feature +5 -1
- data/testing/cucumber/features/linters/element_with_too_many_tags.feature +70 -0
- data/testing/cucumber/features/linters/example_without_name.feature +6 -1
- data/testing/cucumber/features/linters/feature_without_description.feature +1 -1
- data/testing/cucumber/features/linters/feature_without_name.feature +18 -0
- data/testing/cucumber/features/linters/feature_without_scenarios.feature +1 -1
- data/testing/cucumber/features/linters/outline_with_single_example_row.feature +1 -1
- data/testing/cucumber/features/linters/{single_test_background_linter.feature → single_test_background.feature} +1 -1
- data/testing/cucumber/features/linters/step_too_long.feature +3 -3
- data/testing/cucumber/features/linters/step_with_end_period.feature +1 -1
- data/testing/cucumber/features/linters/test_with_no_action_step.feature +30 -0
- data/testing/cucumber/features/linters/test_with_no_name.feature +23 -0
- data/testing/cucumber/features/linters/test_with_no_verification_step.feature +31 -0
- data/testing/cucumber/features/linters/test_with_too_many_steps.feature +6 -6
- data/testing/cucumber/step_definitions/setup_steps.rb +24 -0
- data/testing/cucumber/step_definitions/verification_steps.rb +5 -1
- data/testing/model_factory.rb +1 -0
- data/testing/rspec/spec/integration/cli_integration_spec.rb +16 -11
- data/testing/rspec/spec/integration/cuke_linter_integration_spec.rb +37 -0
- data/testing/rspec/spec/integration/linters/element_with_too_many_tags_linter_integration_spec.rb +8 -0
- data/testing/rspec/spec/integration/linters/feature_without_name_linter_integration_spec.rb +8 -0
- data/testing/rspec/spec/integration/linters/test_with_no_action_step_integration_spec.rb +8 -0
- data/testing/rspec/spec/integration/linters/test_with_no_name_integration_spec.rb +8 -0
- data/testing/rspec/spec/integration/linters/test_with_no_verification_step_integration_spec.rb +8 -0
- data/testing/rspec/spec/unit/linters/element_with_too_many_tags_linter_unit_spec.rb +333 -0
- data/testing/rspec/spec/unit/linters/feature_without_name_linter_unit_spec.rb +112 -0
- data/testing/rspec/spec/unit/linters/step_with_too_many_characters_linter_unit_spec.rb +53 -52
- data/testing/rspec/spec/unit/linters/test_with_no_action_step_linter_unit_spec.rb +217 -0
- data/testing/rspec/spec/unit/linters/test_with_no_name_linter_unit_spec.rb +115 -0
- data/testing/rspec/spec/unit/linters/test_with_no_verification_step_linter_unit_spec.rb +217 -0
- data/testing/rspec/spec/unit/linters/test_with_too_many_steps_linter_unit_spec.rb +2 -2
- metadata +24 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 58a53b185027cee980dfa4801a9e2cb3ca7efdbd2cc0db2119a04636e494ef87
|
4
|
+
data.tar.gz: f71c950b3132a8141e401f2ec385c0f3ed895385ca8309be636960a34d51c2ec
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 16060efd013a6f783514efedd830db6a9ce431f786a630ed5a521c99863202ad500a72aaae8c08870d38ef22cc4b7edcba21a2f36e01512e79b7d6f6bad8b597
|
7
|
+
data.tar.gz: cdb8c1250a9e5bf5b6406ed05c74c4cdf97b46d3927e6bb0b4640ef966961afab29eb712667e8110aa92c610336c3a0edb9c134805c0e2beb2eb5c60a7c600b7
|
data/CHANGELOG.md
CHANGED
@@ -8,6 +8,19 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
8
8
|
|
9
9
|
Nothing yet...
|
10
10
|
|
11
|
+
|
12
|
+
## [0.7.0] - 2019-07-12
|
13
|
+
|
14
|
+
### Added
|
15
|
+
- Linters can now be configured en masse instead of having to configure the same property for all of them individually.
|
16
|
+
|
17
|
+
- New linters
|
18
|
+
- ElementWithTooManyTagsLinter
|
19
|
+
- FeatureWithoutNameLinter
|
20
|
+
- TestWithNoActionStepLinter
|
21
|
+
- TestWithNoNameLinter
|
22
|
+
- TestWithNoVerificationStepLinter
|
23
|
+
|
11
24
|
## [0.6.0] - 2019-06-25
|
12
25
|
|
13
26
|
### Added
|
@@ -65,7 +78,8 @@ Nothing yet...
|
|
65
78
|
- Custom linters, formatters, and command line usability
|
66
79
|
|
67
80
|
|
68
|
-
[Unreleased]: https://github.com/enkessler/cuke_linter/compare/v0.
|
81
|
+
[Unreleased]: https://github.com/enkessler/cuke_linter/compare/v0.7.0...HEAD
|
82
|
+
[0.6.0]: https://github.com/enkessler/cuke_linter/compare/v0.6.0...v0.7.0
|
69
83
|
[0.6.0]: https://github.com/enkessler/cuke_linter/compare/v0.5.0...v0.6.0
|
70
84
|
[0.5.0]: https://github.com/enkessler/cuke_linter/compare/v0.4.0...v0.5.0
|
71
85
|
[0.4.0]: https://github.com/enkessler/cuke_linter/compare/v0.3.1...v0.4.0
|
data/cuke_linter.gemspec
CHANGED
@@ -14,6 +14,7 @@ Gem::Specification.new do |spec|
|
|
14
14
|
spec.license = "MIT"
|
15
15
|
|
16
16
|
|
17
|
+
# TODO: don't just include everything in the gem
|
17
18
|
# Specify which files should be added to the gem when it is released.
|
18
19
|
# The `git ls-files -z` loads the files in the RubyGem that have been added into git.
|
19
20
|
spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do
|
data/lib/cuke_linter.rb
CHANGED
@@ -5,13 +5,18 @@ require "cuke_linter/version"
|
|
5
5
|
require 'cuke_linter/formatters/pretty_formatter'
|
6
6
|
require 'cuke_linter/linters/linter'
|
7
7
|
require 'cuke_linter/linters/background_does_more_than_setup_linter'
|
8
|
+
require 'cuke_linter/linters/element_with_too_many_tags_linter'
|
8
9
|
require 'cuke_linter/linters/example_without_name_linter'
|
10
|
+
require 'cuke_linter/linters/feature_without_name_linter'
|
9
11
|
require 'cuke_linter/linters/feature_without_description_linter'
|
10
12
|
require 'cuke_linter/linters/feature_without_scenarios_linter'
|
11
13
|
require 'cuke_linter/linters/outline_with_single_example_row_linter'
|
12
14
|
require 'cuke_linter/linters/single_test_background_linter'
|
13
15
|
require 'cuke_linter/linters/step_with_end_period_linter'
|
14
16
|
require 'cuke_linter/linters/step_with_too_many_characters_linter'
|
17
|
+
require 'cuke_linter/linters/test_with_no_action_step_linter'
|
18
|
+
require 'cuke_linter/linters/test_with_no_name_linter'
|
19
|
+
require 'cuke_linter/linters/test_with_no_verification_step_linter'
|
15
20
|
require 'cuke_linter/linters/test_with_too_many_steps_linter'
|
16
21
|
|
17
22
|
|
@@ -20,12 +25,17 @@ require 'cuke_linter/linters/test_with_too_many_steps_linter'
|
|
20
25
|
module CukeLinter
|
21
26
|
|
22
27
|
@original_linters = { 'BackgroundDoesMoreThanSetupLinter' => BackgroundDoesMoreThanSetupLinter.new,
|
28
|
+
'ElementWithTooManyTagsLinter' => ElementWithTooManyTagsLinter.new,
|
23
29
|
'ExampleWithoutNameLinter' => ExampleWithoutNameLinter.new,
|
24
30
|
'FeatureWithoutDescriptionLinter' => FeatureWithoutDescriptionLinter.new,
|
31
|
+
'FeatureWithoutNameLinter' => FeatureWithoutNameLinter.new,
|
25
32
|
'FeatureWithoutScenariosLinter' => FeatureWithoutScenariosLinter.new,
|
26
33
|
'OutlineWithSingleExampleRowLinter' => OutlineWithSingleExampleRowLinter.new,
|
27
34
|
'SingleTestBackgroundLinter' => SingleTestBackgroundLinter.new,
|
28
35
|
'StepWithEndPeriodLinter' => StepWithEndPeriodLinter.new,
|
36
|
+
'TestWithNoActionStepLinter' => TestWithNoActionStepLinter.new,
|
37
|
+
'TestWithNoNameLinter' => TestWithNoNameLinter.new,
|
38
|
+
'TestWithNoVerificationStepLinter' => TestWithNoVerificationStepLinter.new,
|
29
39
|
'StepWithTooManyCharactersLinter' => StepWithTooManyCharactersLinter.new,
|
30
40
|
'TestWithTooManyStepsLinter' => TestWithTooManyStepsLinter.new }
|
31
41
|
|
@@ -41,11 +51,22 @@ module CukeLinter
|
|
41
51
|
|
42
52
|
config = config || YAML.load_file(config_file_path)
|
43
53
|
|
44
|
-
config
|
45
|
-
|
54
|
+
common_config = config['AllLinters'] || {}
|
55
|
+
to_delete = []
|
46
56
|
|
47
|
-
|
57
|
+
registered_linters.each_pair do |name, linter|
|
58
|
+
linter_config = config[name] || {}
|
59
|
+
final_config = common_config.merge(linter_config)
|
60
|
+
|
61
|
+
disabled = (final_config.key?('Enabled') && !final_config['Enabled'])
|
62
|
+
|
63
|
+
# Just save it for afterwards because modifying a collection while iterating through it is not a good idea
|
64
|
+
to_delete << name if disabled
|
65
|
+
|
66
|
+
linter.configure(final_config) if linter.respond_to?(:configure)
|
48
67
|
end
|
68
|
+
|
69
|
+
to_delete.each { |linter_name| unregister_linter(linter_name) }
|
49
70
|
end
|
50
71
|
|
51
72
|
# Returns the registered linters to their default state
|
@@ -0,0 +1,41 @@
|
|
1
|
+
module CukeLinter
|
2
|
+
|
3
|
+
# A linter that detects taggable Gherkin elements that have too many tags
|
4
|
+
|
5
|
+
class ElementWithTooManyTagsLinter < Linter
|
6
|
+
|
7
|
+
# Changes the linting settings on the linter using the provided configuration
|
8
|
+
def configure(options)
|
9
|
+
@tag_threshold = options['TagCountThreshold']
|
10
|
+
@tag_inheritance = options['CountInheritedTags']
|
11
|
+
end
|
12
|
+
|
13
|
+
# The rule used to determine if a model has a problem
|
14
|
+
def rule(model)
|
15
|
+
return false unless model.is_a?(CukeModeler::Feature) ||
|
16
|
+
model.is_a?(CukeModeler::Scenario) ||
|
17
|
+
model.is_a?(CukeModeler::Outline) ||
|
18
|
+
model.is_a?(CukeModeler::Example)
|
19
|
+
|
20
|
+
|
21
|
+
@linted_model_class = model.class
|
22
|
+
@linted_tag_threshold = @tag_threshold || 5
|
23
|
+
|
24
|
+
if @tag_inheritance
|
25
|
+
@linted_tag_count = model.all_tags.count
|
26
|
+
else
|
27
|
+
@linted_tag_count = model.tags.nil? ? 0 : model.tags.count
|
28
|
+
end
|
29
|
+
|
30
|
+
@linted_tag_count > @linted_tag_threshold
|
31
|
+
end
|
32
|
+
|
33
|
+
# The message used to describe the problem that has been found
|
34
|
+
def message
|
35
|
+
class_name = @linted_model_class.name.split('::').last
|
36
|
+
|
37
|
+
"#{class_name} has too many tags. #{@linted_tag_count} tags found (max #{@linted_tag_threshold})."
|
38
|
+
end
|
39
|
+
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module CukeLinter
|
2
|
+
|
3
|
+
# A linter that detects features that don't have a name
|
4
|
+
|
5
|
+
class FeatureWithoutNameLinter < Linter
|
6
|
+
|
7
|
+
# The rule used to determine if a model has a problem
|
8
|
+
def rule(model)
|
9
|
+
return false unless model.is_a?(CukeModeler::Feature)
|
10
|
+
|
11
|
+
model.name.nil? || model.name.empty?
|
12
|
+
end
|
13
|
+
|
14
|
+
# The message used to describe the problem that has been found
|
15
|
+
def message
|
16
|
+
'Feature does not have a name.'
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module CukeLinter
|
2
|
+
|
3
|
+
# A linter that detects scenarios and outlines that do not have an action (i.e. 'When') step
|
4
|
+
|
5
|
+
class TestWithNoActionStepLinter < Linter
|
6
|
+
|
7
|
+
# The rule used to determine if a model has a problem
|
8
|
+
def rule(model)
|
9
|
+
return false unless model.is_a?(CukeModeler::Scenario) || model.is_a?(CukeModeler::Outline)
|
10
|
+
|
11
|
+
model_steps = model.steps || []
|
12
|
+
background_steps = model.parent_model.has_background? ? model.parent_model.background.steps || [] : []
|
13
|
+
all_steps = model_steps + background_steps
|
14
|
+
all_steps.none? { |step| step.keyword == 'When' }
|
15
|
+
end
|
16
|
+
|
17
|
+
# The message used to describe the problem that has been found
|
18
|
+
def message
|
19
|
+
"Test does not have a 'When' step."
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module CukeLinter
|
2
|
+
|
3
|
+
# A linter that detects scenarios and outlines that do not have a name
|
4
|
+
|
5
|
+
class TestWithNoNameLinter < Linter
|
6
|
+
|
7
|
+
# The rule used to determine if a model has a problem
|
8
|
+
def rule(model)
|
9
|
+
return false unless model.is_a?(CukeModeler::Scenario) || model.is_a?(CukeModeler::Outline)
|
10
|
+
|
11
|
+
model.name.nil? || model.name.empty?
|
12
|
+
end
|
13
|
+
|
14
|
+
# The message used to describe the problem that has been found
|
15
|
+
def message
|
16
|
+
'Test does not have a name.'
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module CukeLinter
|
2
|
+
|
3
|
+
# A linter that detects scenarios and outlines that do not have a verification (i.e. 'Then') step
|
4
|
+
|
5
|
+
class TestWithNoVerificationStepLinter < Linter
|
6
|
+
|
7
|
+
# The rule used to determine if a model has a problem
|
8
|
+
def rule(model)
|
9
|
+
return false unless model.is_a?(CukeModeler::Scenario) || model.is_a?(CukeModeler::Outline)
|
10
|
+
|
11
|
+
model_steps = model.steps || []
|
12
|
+
background_steps = model.parent_model.has_background? ? model.parent_model.background.steps || [] : []
|
13
|
+
all_steps = model_steps + background_steps
|
14
|
+
all_steps.none? { |step| step.keyword == 'Then' }
|
15
|
+
end
|
16
|
+
|
17
|
+
# The message used to describe the problem that has been found
|
18
|
+
def message
|
19
|
+
"Test does not have a 'Then' step."
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
23
|
+
end
|
@@ -21,7 +21,7 @@ module CukeLinter
|
|
21
21
|
|
22
22
|
# The message used to describe the problem that has been found
|
23
23
|
def message
|
24
|
-
"Test has too many steps. #{@linted_step_count} steps found (max #{@linted_step_threshold})"
|
24
|
+
"Test has too many steps. #{@linted_step_count} steps found (max #{@linted_step_threshold})."
|
25
25
|
end
|
26
26
|
|
27
27
|
end
|
data/lib/cuke_linter/version.rb
CHANGED
@@ -59,15 +59,17 @@ Feature: Using cuke_linter on the command line
|
|
59
59
|
Scenario: Specifying directories and files to lint
|
60
60
|
Given the following feature file "some.feature":
|
61
61
|
"""
|
62
|
-
Feature:
|
62
|
+
Feature: Some feature
|
63
63
|
Scenario: A scenario
|
64
|
-
|
64
|
+
When a step
|
65
|
+
Then a step
|
65
66
|
"""
|
66
67
|
And the following feature file "a_directory/with_a.feature":
|
67
68
|
"""
|
68
|
-
Feature:
|
69
|
+
Feature: Some feature
|
69
70
|
Scenario: A scenario
|
70
|
-
|
71
|
+
When a step
|
72
|
+
Then a step
|
71
73
|
"""
|
72
74
|
When the following command is executed:
|
73
75
|
"""
|
@@ -17,3 +17,39 @@ Feature: Configuration of linters
|
|
17
17
|
When the configuration file is used
|
18
18
|
And the feature is linted
|
19
19
|
Then no error is reported
|
20
|
+
|
21
|
+
Scenario: Setting a common configuration for all linters
|
22
|
+
|
23
|
+
Note: Any property could be set for all linters, but disabling them (and then re-enabling a select few) is one of the few things that you are likely to want to do to all linters.
|
24
|
+
|
25
|
+
Given a linter registered as "AlwaysFindsAProblem"
|
26
|
+
And the following configuration file:
|
27
|
+
"""
|
28
|
+
AllLinters:
|
29
|
+
Enabled: false
|
30
|
+
"""
|
31
|
+
And the following feature:
|
32
|
+
"""
|
33
|
+
Feature: Something in which a problem could exist
|
34
|
+
"""
|
35
|
+
When the configuration file is used
|
36
|
+
And the feature is linted
|
37
|
+
Then no error is reported
|
38
|
+
|
39
|
+
Scenario: Overriding a common configuration
|
40
|
+
Given a linter registered as "AlwaysFindsAProblem"
|
41
|
+
And the following configuration file:
|
42
|
+
"""
|
43
|
+
AllLinters:
|
44
|
+
Enabled: false
|
45
|
+
|
46
|
+
AlwaysFindsAProblem:
|
47
|
+
Enabled: true
|
48
|
+
"""
|
49
|
+
And the following feature:
|
50
|
+
"""
|
51
|
+
Feature: Something in which a problem could exist
|
52
|
+
"""
|
53
|
+
When the configuration file is used
|
54
|
+
And the feature is linted
|
55
|
+
Then an error is reported
|
@@ -16,7 +16,7 @@ Feature: Background does more than setup linter
|
|
16
16
|
When some action
|
17
17
|
"""
|
18
18
|
When it is linted
|
19
|
-
Then an error is reported
|
19
|
+
Then an error is reported:
|
20
20
|
| linter | problem | location |
|
21
21
|
| BackgroundDoesMoreThanSetupLinter | Background has non-setup steps | <path_to_file>:3 |
|
22
22
|
|
@@ -31,7 +31,7 @@ Feature: Background does more than setup linter
|
|
31
31
|
Then some verification
|
32
32
|
"""
|
33
33
|
When it is linted
|
34
|
-
Then an error is reported
|
34
|
+
Then an error is reported:
|
35
35
|
| linter | problem | location |
|
36
36
|
| BackgroundDoesMoreThanSetupLinter | Background has non-setup steps | <path_to_file>:3 |
|
37
37
|
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Feature: Custom linters
|
2
2
|
|
3
|
-
In addition to the linters provided by
|
3
|
+
In addition to the linters provided by CukeLinter, custom linters can be used. A linter is essentially any object that provides a few needed methods. In order to simplify the creation of custom linters, a base linter class is available that provides these needed methods.
|
4
4
|
|
5
5
|
|
6
6
|
Scenario: Creating a custom linter object
|
@@ -19,7 +19,7 @@ Feature: Custom linters
|
|
19
19
|
"""
|
20
20
|
And a model to lint
|
21
21
|
When the model is linted
|
22
|
-
Then an error is reported
|
22
|
+
Then an error is reported:
|
23
23
|
| linter | problem | location |
|
24
24
|
| MyCustomLinter | My custom message | <path_to_file>:<model_line_number> |
|
25
25
|
|
@@ -49,6 +49,6 @@ Feature: Custom linters
|
|
49
49
|
"""
|
50
50
|
And a model to lint
|
51
51
|
When the model is linted
|
52
|
-
Then an error is reported
|
52
|
+
Then an error is reported:
|
53
53
|
| linter | problem | location |
|
54
54
|
| MyCustomLinter | My custom message | <path_to_file>:<model_line_number> |
|
@@ -9,17 +9,21 @@ Feature: Default Linters
|
|
9
9
|
Given no other linters have been registered or unregistered
|
10
10
|
Then the following linters are registered by default
|
11
11
|
| BackgroundDoesMoreThanSetupLinter |
|
12
|
+
| ElementWithTooManyTagsLinter |
|
12
13
|
| ExampleWithoutNameLinter |
|
13
14
|
| FeatureWithoutDescriptionLinter |
|
15
|
+
| FeatureWithoutNameLinter |
|
14
16
|
| FeatureWithoutScenariosLinter |
|
15
17
|
| OutlineWithSingleExampleRowLinter |
|
16
18
|
| SingleTestBackgroundLinter |
|
17
19
|
| StepWithEndPeriodLinter |
|
18
20
|
| StepWithTooManyCharactersLinter |
|
21
|
+
| TestWithNoActionStepLinter |
|
22
|
+
| TestWithNoNameLinter |
|
23
|
+
| TestWithNoVerificationStepLinter |
|
19
24
|
| TestWithTooManyStepsLinter |
|
20
25
|
|
21
26
|
|
22
|
-
|
23
27
|
Scenario: Registering new linters
|
24
28
|
Given no linters are currently registered
|
25
29
|
When the following code is used:
|
@@ -0,0 +1,70 @@
|
|
1
|
+
Feature: Element with too many tags linter
|
2
|
+
|
3
|
+
As a reader of documentation
|
4
|
+
I want taggable elements to not have an overabundance of tags
|
5
|
+
So that I can concentrate on the content of the scenario
|
6
|
+
|
7
|
+
|
8
|
+
Scenario: Linting
|
9
|
+
|
10
|
+
Note: Also works on outlines, features, and examples
|
11
|
+
Note: Tags inherited from other elements are not counted by default (see configuration options below)
|
12
|
+
|
13
|
+
Given a linter for elements with too many tags
|
14
|
+
And the following feature:
|
15
|
+
"""
|
16
|
+
@this_tag_not_counted
|
17
|
+
Feature:
|
18
|
+
|
19
|
+
@tag_1 @tag_2 @tag_3 @tag_4 @tag_5 @tag_one_too_many
|
20
|
+
Scenario:
|
21
|
+
* a step
|
22
|
+
"""
|
23
|
+
When it is linted
|
24
|
+
Then an error is reported:
|
25
|
+
| linter | problem | location |
|
26
|
+
| ElementWithTooManyTagsLinter | Scenario has too many tags. 6 tags found (max 5). | <path_to_file>:5 |
|
27
|
+
|
28
|
+
|
29
|
+
Scenario: Configuration of tag count threshold
|
30
|
+
Given a linter for elements with too many tags has been registered
|
31
|
+
And the following configuration file:
|
32
|
+
"""
|
33
|
+
ElementWithTooManyTagsLinter:
|
34
|
+
TagCountThreshold: 3
|
35
|
+
"""
|
36
|
+
And the following feature:
|
37
|
+
"""
|
38
|
+
Feature:
|
39
|
+
|
40
|
+
@tag_1 @tag_2 @tag_3 @tag_one_too_many
|
41
|
+
Scenario:
|
42
|
+
* a step
|
43
|
+
"""
|
44
|
+
When the configuration file is loaded
|
45
|
+
And it is linted
|
46
|
+
Then an error is reported:
|
47
|
+
| linter | problem | location |
|
48
|
+
| ElementWithTooManyTagsLinter | Scenario has too many tags. 4 tags found (max 3). | <path_to_file>:4 |
|
49
|
+
|
50
|
+
Scenario: Configuration of indirect tag count
|
51
|
+
Given a linter for elements with too many tags has been registered
|
52
|
+
And the following configuration file:
|
53
|
+
"""
|
54
|
+
ElementWithTooManyTagsLinter:
|
55
|
+
CountInheritedTags: true
|
56
|
+
"""
|
57
|
+
And the following feature:
|
58
|
+
"""
|
59
|
+
@this_tag_is_also_counted
|
60
|
+
Feature:
|
61
|
+
|
62
|
+
@tag_1 @tag_2 @tag_3 @tag_4 @tag_one_too_many
|
63
|
+
Scenario:
|
64
|
+
* a step
|
65
|
+
"""
|
66
|
+
When the configuration file is loaded
|
67
|
+
And it is linted
|
68
|
+
Then an error is reported:
|
69
|
+
| linter | problem | location |
|
70
|
+
| ElementWithTooManyTagsLinter | Scenario has too many tags. 6 tags found (max 5). | <path_to_file>:5 |
|