cuke_slicer 1.0.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.
- data/.gitignore +22 -0
- data/.simplecov +7 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +53 -0
- data/Rakefile +49 -0
- data/cuke_slicer.gemspec +28 -0
- data/features/step_definitions/action_steps.rb +106 -0
- data/features/step_definitions/setup_steps.rb +79 -0
- data/features/step_definitions/verification_steps.rb +47 -0
- data/features/support/env.rb +18 -0
- data/features/tag_logic.feature +45 -0
- data/features/test_case_extraction.feature +78 -0
- data/features/test_case_filtering.feature +130 -0
- data/features/validation.feature +56 -0
- data/lib/cuke_slicer.rb +10 -0
- data/lib/cuke_slicer/slicer.rb +249 -0
- data/lib/cuke_slicer/version.rb +4 -0
- data/spec/cuke_slicer_spec.rb +13 -0
- data/spec/slicer_integration_spec.rb +171 -0
- data/spec/slicer_unit_spec.rb +37 -0
- data/spec/spec_helper.rb +22 -0
- metadata +182 -0
@@ -0,0 +1,171 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
|
4
|
+
describe 'Slicer, Integration' do
|
5
|
+
|
6
|
+
let!(:clazz) { CukeSlicer::Slicer }
|
7
|
+
let(:slicer) { clazz.new }
|
8
|
+
let(:test_file) { "#{@default_file_directory}/a_test.feature" }
|
9
|
+
|
10
|
+
before(:each) do
|
11
|
+
file_text = "Feature: Test feature
|
12
|
+
|
13
|
+
@tag
|
14
|
+
Scenario: Test scenario
|
15
|
+
* some step"
|
16
|
+
|
17
|
+
File.open(test_file, 'w') { |file| file.write(file_text) }
|
18
|
+
end
|
19
|
+
|
20
|
+
|
21
|
+
describe 'slicing' do
|
22
|
+
|
23
|
+
it 'slicing returns a collection of test cases' do
|
24
|
+
slice_output = slicer.slice(test_file)
|
25
|
+
|
26
|
+
expect(slice_output).to be_an(Array)
|
27
|
+
expect(slice_output).to_not be_empty
|
28
|
+
|
29
|
+
slice_output.each do |test_case|
|
30
|
+
# Test cases come in 'file_path:line_number' format
|
31
|
+
expect(test_case).to match(/^.+:\d+$/)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
it 'can slice without being provided filters' do
|
36
|
+
expect { slicer.slice(test_file) }.to_not raise_error
|
37
|
+
end
|
38
|
+
|
39
|
+
it 'uses the custom filter, if provided' do
|
40
|
+
expect { |test_block| slicer.slice(@default_file_directory, &test_block) }.to yield_control
|
41
|
+
expect { slicer.slice(@default_file_directory) }.to_not raise_error
|
42
|
+
end
|
43
|
+
|
44
|
+
it 'can slice an empty feature file' do
|
45
|
+
File.open(test_file, 'w') { |file| file.write('') }
|
46
|
+
|
47
|
+
expect { slicer.slice(test_file) }.to_not raise_error
|
48
|
+
end
|
49
|
+
|
50
|
+
it 'can slice a feature that has no tests' do
|
51
|
+
File.open(test_file, 'w') { |file| file.write('Feature: Empty feature') }
|
52
|
+
|
53
|
+
expect { slicer.slice(test_file) }.to_not raise_error
|
54
|
+
end
|
55
|
+
|
56
|
+
it 'can slice a directory that contains non-feature files' do
|
57
|
+
File.open("#{@default_file_directory}/not_a_feature.file", 'w') { |file| file.write('foobar') }
|
58
|
+
|
59
|
+
expect { slicer.slice(@default_file_directory) }.to_not raise_error
|
60
|
+
end
|
61
|
+
|
62
|
+
|
63
|
+
describe 'target validation' do
|
64
|
+
|
65
|
+
it 'complains if told to slice a non-existent location' do
|
66
|
+
expect { slicer.slice('does/not/exist') }.to raise_error(ArgumentError, /does not exist/)
|
67
|
+
expect { slicer.slice(nil) }.to raise_error(ArgumentError, /does not exist/)
|
68
|
+
end
|
69
|
+
|
70
|
+
it 'complains if told to slice an incorrectly formatted feature file' do
|
71
|
+
File.open(test_file, 'w') { |file| file.write('foobar') }
|
72
|
+
|
73
|
+
expect { slicer.slice(test_file) }.to raise_error(ArgumentError, /syntax.*lexing problem.*#{test_file}/i)
|
74
|
+
end
|
75
|
+
|
76
|
+
end
|
77
|
+
|
78
|
+
end
|
79
|
+
|
80
|
+
|
81
|
+
describe 'filtering' do
|
82
|
+
|
83
|
+
it 'treats an empty filter set as if the filter were not provided' do
|
84
|
+
filters = clazz.known_filters
|
85
|
+
|
86
|
+
filters.each do |filter|
|
87
|
+
not_provided = slicer.slice(test_file)
|
88
|
+
|
89
|
+
case
|
90
|
+
when filter.to_s =~ /path/
|
91
|
+
nothing_provided = slicer.slice(test_file, filter => [])
|
92
|
+
when filter.to_s =~ /tag/
|
93
|
+
nothing_provided = slicer.slice(test_file, filter => [])
|
94
|
+
else
|
95
|
+
raise(ArgumentError, "Unknown filter '#{filter}'")
|
96
|
+
end
|
97
|
+
|
98
|
+
expect(nothing_provided).to eq(not_provided)
|
99
|
+
expect(nothing_provided).to_not be_empty
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
it 'can combine any and all filters' do
|
104
|
+
filters = clazz.known_filters
|
105
|
+
|
106
|
+
applied_filters = {excluded_tags: '@a',
|
107
|
+
included_tags: /./,
|
108
|
+
excluded_paths: 'a',
|
109
|
+
included_paths: /./}
|
110
|
+
|
111
|
+
block_filter = eval("Proc.new { |test_case| false}")
|
112
|
+
|
113
|
+
# A reminder to update this test if new filters are added in the future
|
114
|
+
expect(applied_filters.keys).to match_array(filters)
|
115
|
+
|
116
|
+
|
117
|
+
expect { @slice_output = slicer.slice(@default_file_directory, applied_filters, &block_filter) }.to_not raise_error
|
118
|
+
expect(@slice_output).to be_an(Array)
|
119
|
+
expect(@slice_output).to_not be_empty
|
120
|
+
end
|
121
|
+
|
122
|
+
|
123
|
+
describe 'filter validation' do
|
124
|
+
|
125
|
+
it 'will only accept string, regular expression, or collections thereof as path filters' do
|
126
|
+
path_filter_types = clazz.known_filters.select { |filter| filter.to_s =~ /path/ }
|
127
|
+
|
128
|
+
path_filter_types.each do |filter|
|
129
|
+
expect { slicer.slice(@default_file_directory, filter => '@some_value') }.to_not raise_error
|
130
|
+
expect { slicer.slice(@default_file_directory, filter => /some_pattern/) }.to_not raise_error
|
131
|
+
expect { slicer.slice(@default_file_directory, filter => ['@some_value', /some_pattern/]) }.to_not raise_error
|
132
|
+
expect { slicer.slice(@default_file_directory, filter => :something_else) }.to raise_error(ArgumentError, /must be a/i)
|
133
|
+
expect { slicer.slice(@default_file_directory, filter => [:something_else]) }.to raise_error(ArgumentError, /must be a/i)
|
134
|
+
end
|
135
|
+
end
|
136
|
+
|
137
|
+
it 'will only accept strings, regular expressions, arrays, or collections thereof as tag filters' do
|
138
|
+
tag_filter_types = clazz.known_filters.select { |filter| filter.to_s =~ /tag/ }
|
139
|
+
|
140
|
+
tag_filter_types.each do |filter|
|
141
|
+
expect { slicer.slice(@default_file_directory, filter => '@some_value') }.to_not raise_error
|
142
|
+
expect { slicer.slice(@default_file_directory, filter => /some_pattern/) }.to_not raise_error
|
143
|
+
expect { slicer.slice(@default_file_directory, filter => ['@some_value', /some_pattern/]) }.to_not raise_error
|
144
|
+
expect { slicer.slice(@default_file_directory, filter => ['@some_value', [/nested_pattern/]]) }.to_not raise_error
|
145
|
+
expect { slicer.slice(@default_file_directory, filter => ['@some_value', [/nested_pattern/, :bad_value]]) }.to raise_error(ArgumentError, /must be a/i)
|
146
|
+
expect { slicer.slice(@default_file_directory, filter => :something_else) }.to raise_error(ArgumentError, /must be a/i)
|
147
|
+
expect { slicer.slice(@default_file_directory, filter => [:something_else]) }.to raise_error(ArgumentError, /must be a/i)
|
148
|
+
end
|
149
|
+
end
|
150
|
+
|
151
|
+
it 'will only accept a single level of tag filter nesting' do
|
152
|
+
tag_filter_types = clazz.known_filters.select { |filter| filter.to_s =~ /tag/ }
|
153
|
+
|
154
|
+
tag_filter_types.each do |filter|
|
155
|
+
expect { slicer.slice(@default_file_directory, filter => ['@some_value', [/nested_pattern/]]) }.to_not raise_error
|
156
|
+
expect { slicer.slice(@default_file_directory, filter => ['@some_value', [/nested_pattern/, ['way_too_nested']]]) }.to raise_error(ArgumentError, /cannot.* nested/i)
|
157
|
+
end
|
158
|
+
end
|
159
|
+
|
160
|
+
it 'complains if given an unknown filter' do
|
161
|
+
unknown_filter_type = :unknown_filter
|
162
|
+
options = {unknown_filter_type => 'foo'}
|
163
|
+
|
164
|
+
expect { slicer.slice(@default_file_directory, options) }.to raise_error(ArgumentError, /unknown filter.*#{unknown_filter_type}/i)
|
165
|
+
end
|
166
|
+
|
167
|
+
end
|
168
|
+
|
169
|
+
end
|
170
|
+
|
171
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
|
4
|
+
describe 'Slicer, Unit' do
|
5
|
+
|
6
|
+
let!(:clazz) { CukeSlicer::Slicer }
|
7
|
+
let(:slicer) { clazz.new }
|
8
|
+
|
9
|
+
|
10
|
+
it 'is defined' do
|
11
|
+
expect(CukeSlicer.const_defined?(:Slicer)).to be true
|
12
|
+
end
|
13
|
+
|
14
|
+
it 'can slice individual test cases out of a larger group' do
|
15
|
+
expect(slicer).to respond_to(:slice)
|
16
|
+
end
|
17
|
+
|
18
|
+
it 'needs something to slice up and can optionally have applicable filters' do
|
19
|
+
expect(slicer.method(:slice).arity).to eq(-2)
|
20
|
+
end
|
21
|
+
|
22
|
+
it 'knows what slice filters are available for use' do
|
23
|
+
expect(clazz).to respond_to(:known_filters)
|
24
|
+
end
|
25
|
+
|
26
|
+
it 'tracks its filters as an array of symbols' do
|
27
|
+
filters = clazz.known_filters
|
28
|
+
|
29
|
+
expect(filters).to be_an(Array)
|
30
|
+
expect(filters).to_not be_empty
|
31
|
+
|
32
|
+
filters.each do |filter|
|
33
|
+
expect(filter).to be_a(Symbol)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'simplecov'
|
2
|
+
SimpleCov.command_name('cuke_slicer-rspec_tests')
|
3
|
+
|
4
|
+
|
5
|
+
require 'cuke_slicer'
|
6
|
+
|
7
|
+
|
8
|
+
RSpec.configure do |config|
|
9
|
+
config.before(:all) do
|
10
|
+
spec_directory = File.dirname(__FILE__)
|
11
|
+
@default_file_directory = "#{spec_directory}/temp_files"
|
12
|
+
end
|
13
|
+
|
14
|
+
config.before(:each) do
|
15
|
+
FileUtils.mkpath(@default_file_directory)
|
16
|
+
end
|
17
|
+
|
18
|
+
config.after(:each) do
|
19
|
+
FileUtils.remove_dir(@default_file_directory, true)
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
metadata
ADDED
@@ -0,0 +1,182 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: cuke_slicer
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.0
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Eric Kessler
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2015-04-01 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: cuke_modeler
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ! '>='
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '0'
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: bundler
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - ~>
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: '1.6'
|
38
|
+
type: :development
|
39
|
+
prerelease: false
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ~>
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '1.6'
|
46
|
+
- !ruby/object:Gem::Dependency
|
47
|
+
name: rake
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
49
|
+
none: false
|
50
|
+
requirements:
|
51
|
+
- - ! '>='
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '0'
|
54
|
+
type: :development
|
55
|
+
prerelease: false
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ! '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
- !ruby/object:Gem::Dependency
|
63
|
+
name: rspec
|
64
|
+
requirement: !ruby/object:Gem::Requirement
|
65
|
+
none: false
|
66
|
+
requirements:
|
67
|
+
- - ~>
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: '3.0'
|
70
|
+
type: :development
|
71
|
+
prerelease: false
|
72
|
+
version_requirements: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - ~>
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: '3.0'
|
78
|
+
- !ruby/object:Gem::Dependency
|
79
|
+
name: cucumber
|
80
|
+
requirement: !ruby/object:Gem::Requirement
|
81
|
+
none: false
|
82
|
+
requirements:
|
83
|
+
- - ! '>='
|
84
|
+
- !ruby/object:Gem::Version
|
85
|
+
version: '0'
|
86
|
+
type: :development
|
87
|
+
prerelease: false
|
88
|
+
version_requirements: !ruby/object:Gem::Requirement
|
89
|
+
none: false
|
90
|
+
requirements:
|
91
|
+
- - ! '>='
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
version: '0'
|
94
|
+
- !ruby/object:Gem::Dependency
|
95
|
+
name: simplecov
|
96
|
+
requirement: !ruby/object:Gem::Requirement
|
97
|
+
none: false
|
98
|
+
requirements:
|
99
|
+
- - ! '>='
|
100
|
+
- !ruby/object:Gem::Version
|
101
|
+
version: '0'
|
102
|
+
type: :development
|
103
|
+
prerelease: false
|
104
|
+
version_requirements: !ruby/object:Gem::Requirement
|
105
|
+
none: false
|
106
|
+
requirements:
|
107
|
+
- - ! '>='
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: '0'
|
110
|
+
description: A gem for extracting test cases from a Cucumber test suite.
|
111
|
+
email:
|
112
|
+
- morrow748@gmail.com
|
113
|
+
executables: []
|
114
|
+
extensions: []
|
115
|
+
extra_rdoc_files: []
|
116
|
+
files:
|
117
|
+
- .gitignore
|
118
|
+
- .simplecov
|
119
|
+
- Gemfile
|
120
|
+
- LICENSE.txt
|
121
|
+
- README.md
|
122
|
+
- Rakefile
|
123
|
+
- cuke_slicer.gemspec
|
124
|
+
- features/step_definitions/action_steps.rb
|
125
|
+
- features/step_definitions/setup_steps.rb
|
126
|
+
- features/step_definitions/verification_steps.rb
|
127
|
+
- features/support/env.rb
|
128
|
+
- features/tag_logic.feature
|
129
|
+
- features/test_case_extraction.feature
|
130
|
+
- features/test_case_filtering.feature
|
131
|
+
- features/validation.feature
|
132
|
+
- lib/cuke_slicer.rb
|
133
|
+
- lib/cuke_slicer/slicer.rb
|
134
|
+
- lib/cuke_slicer/version.rb
|
135
|
+
- spec/cuke_slicer_spec.rb
|
136
|
+
- spec/slicer_integration_spec.rb
|
137
|
+
- spec/slicer_unit_spec.rb
|
138
|
+
- spec/spec_helper.rb
|
139
|
+
homepage: ''
|
140
|
+
licenses:
|
141
|
+
- MIT
|
142
|
+
post_install_message:
|
143
|
+
rdoc_options: []
|
144
|
+
require_paths:
|
145
|
+
- lib
|
146
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
147
|
+
none: false
|
148
|
+
requirements:
|
149
|
+
- - ! '>='
|
150
|
+
- !ruby/object:Gem::Version
|
151
|
+
version: '0'
|
152
|
+
segments:
|
153
|
+
- 0
|
154
|
+
hash: -1021242189
|
155
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
156
|
+
none: false
|
157
|
+
requirements:
|
158
|
+
- - ! '>='
|
159
|
+
- !ruby/object:Gem::Version
|
160
|
+
version: '0'
|
161
|
+
segments:
|
162
|
+
- 0
|
163
|
+
hash: -1021242189
|
164
|
+
requirements: []
|
165
|
+
rubyforge_project:
|
166
|
+
rubygems_version: 1.8.24
|
167
|
+
signing_key:
|
168
|
+
specification_version: 3
|
169
|
+
summary: A gem for extracting test cases from a Cucumber test suite.
|
170
|
+
test_files:
|
171
|
+
- features/step_definitions/action_steps.rb
|
172
|
+
- features/step_definitions/setup_steps.rb
|
173
|
+
- features/step_definitions/verification_steps.rb
|
174
|
+
- features/support/env.rb
|
175
|
+
- features/tag_logic.feature
|
176
|
+
- features/test_case_extraction.feature
|
177
|
+
- features/test_case_filtering.feature
|
178
|
+
- features/validation.feature
|
179
|
+
- spec/cuke_slicer_spec.rb
|
180
|
+
- spec/slicer_integration_spec.rb
|
181
|
+
- spec/slicer_unit_spec.rb
|
182
|
+
- spec/spec_helper.rb
|