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.
@@ -0,0 +1,4 @@
1
+ module CukeSlicer
2
+ # The current version for the gem.
3
+ VERSION = "1.0.0"
4
+ end
@@ -0,0 +1,13 @@
1
+ require 'spec_helper'
2
+
3
+
4
+ describe 'CukeSlicer, Unit' do
5
+
6
+ let(:nodule) { CukeSlicer }
7
+
8
+
9
+ it 'is defined' do
10
+ expect(Kernel.const_defined?(:CukeSlicer)).to be true
11
+ end
12
+
13
+ end
@@ -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
@@ -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