cuke_slicer 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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