webspicy 0.13.0 → 0.14.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/examples/restful/Gemfile.lock +1 -1
- data/examples/restful/webspicy/todo/postFile.yml +2 -0
- data/lib/webspicy/configuration.rb +35 -2
- data/lib/webspicy/formaldoc.fio +3 -0
- data/lib/webspicy/resource/service/test_case.rb +4 -0
- data/lib/webspicy/scope.rb +3 -3
- data/lib/webspicy/version.rb +1 -1
- data/spec/unit/test_configuration.rb +73 -1
- metadata +4 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 5b78ed1d162fe75c83bd7bffa819b61ec7153dab
|
4
|
+
data.tar.gz: c5a6ba9ee1d76e1e861d1952fd135664a5e1b408
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 31da61f468c86496d77f1eb659e17e4b02ec4de80ba14e6a6220a26cde324c9b0113099c4457f45a05be378ccd2acbaba172268fe60000172704c992623a8554
|
7
|
+
data.tar.gz: a347f32c634c884cfdb29ee92e5a4b0d6ca5134b9f9ec95ac8ee604e244ac3f332fc71b846e47c9a3744febcf63fcc631c0f7a0cf1cc452f880f25370c2a3406
|
@@ -14,6 +14,7 @@ module Webspicy
|
|
14
14
|
@run_counterexamples = default_run_counterexamples
|
15
15
|
@file_filter = default_file_filter
|
16
16
|
@service_filter = default_service_filter
|
17
|
+
@test_case_filter = default_test_case_filter
|
17
18
|
@client = HttpClient
|
18
19
|
Path.require_tree(folder/'support') if (folder/'support').exists?
|
19
20
|
yield(self) if block_given?
|
@@ -152,7 +153,10 @@ module Webspicy
|
|
152
153
|
# set. In that case, a file filter is set that matches the file name to the
|
153
154
|
# variable value, through a regular expression.
|
154
155
|
def default_file_filter
|
155
|
-
|
156
|
+
return nil unless res = ENV['RESOURCE']
|
157
|
+
negated = res =~ /^!/
|
158
|
+
rx = Regexp.compile(negated ? "#{res[1..-1]}" : res)
|
159
|
+
negated ? ->(f){ !(f.to_s =~ rx) } : rx
|
156
160
|
end
|
157
161
|
private :default_file_filter
|
158
162
|
|
@@ -171,7 +175,7 @@ module Webspicy
|
|
171
175
|
end
|
172
176
|
attr_reader :service_filter
|
173
177
|
|
174
|
-
# Returns the default service
|
178
|
+
# Returns the default service filter.
|
175
179
|
#
|
176
180
|
# By default no filter is set unless a METHOD environment variable is set.
|
177
181
|
# In that case, a service filter is returned that filters the services whose
|
@@ -181,6 +185,35 @@ module Webspicy
|
|
181
185
|
end
|
182
186
|
private :default_service_filter
|
183
187
|
|
188
|
+
# Installs a test case filter.
|
189
|
+
#
|
190
|
+
# A test case filter can be added to restrict the scope attention only to
|
191
|
+
# the test cases that match the service installed. Supported values are:
|
192
|
+
#
|
193
|
+
# - Proc: each test case is passed in turn. Only test cases for which a
|
194
|
+
# truthy value is returned will be considered by the scope.
|
195
|
+
# - ===: any instance responding to `===` can be used as a matcher, following
|
196
|
+
# Ruby conventions. The match is done on a Service instance.
|
197
|
+
def test_case_filter=(tag_filter)
|
198
|
+
@test_case_filter = test_case_filter
|
199
|
+
end
|
200
|
+
attr_reader :test_case_filter
|
201
|
+
|
202
|
+
# Returns the default test case filter.
|
203
|
+
#
|
204
|
+
# By default no filter is set unless a TAG environment variable is set.
|
205
|
+
# In that case, a test case filter is returned that filters the test cases
|
206
|
+
# whose tags map the specified value.
|
207
|
+
def default_test_case_filter
|
208
|
+
return nil unless tags = ENV['TAG']
|
209
|
+
no, yes = tags.split(/\s*,\s*/).partition{|t| t =~ /^!/ }
|
210
|
+
no, yes = no.map{|t| t[1..-1 ]}, yes
|
211
|
+
->(tc){
|
212
|
+
(yes.empty? || !(yes & tc.tags).empty?) \
|
213
|
+
&& \
|
214
|
+
(no.empty? || (no & tc.tags).empty?)
|
215
|
+
}
|
216
|
+
end
|
184
217
|
|
185
218
|
# Installs a client class to use to invoke web services for real.
|
186
219
|
#
|
data/lib/webspicy/formaldoc.fio
CHANGED
@@ -1,6 +1,8 @@
|
|
1
1
|
Method =
|
2
2
|
String( s | s =~ /^(GET|POST|POST_FORM|PUT|DELETE|PATCH|OPTIONS)$/ )
|
3
3
|
|
4
|
+
Tag = String( s | s.length > 0 )
|
5
|
+
|
4
6
|
Schema =
|
5
7
|
.Finitio::System <fio> String
|
6
8
|
\( s | ::Webspicy.schema(s) )
|
@@ -53,6 +55,7 @@ TestCase =
|
|
53
55
|
headers :? .Hash
|
54
56
|
}
|
55
57
|
assert :? [String]
|
58
|
+
tags :? [Tag]
|
56
59
|
}
|
57
60
|
|
58
61
|
Params = .Array|.Hash
|
data/lib/webspicy/scope.rb
CHANGED
@@ -47,20 +47,20 @@ module Webspicy
|
|
47
47
|
end
|
48
48
|
|
49
49
|
def each_example(service)
|
50
|
-
service.examples.each{|e|
|
50
|
+
service.examples.select(&to_filter_proc(config.test_case_filter)).each{|e|
|
51
51
|
yield(expand_example(service, e), false)
|
52
52
|
}
|
53
53
|
end
|
54
54
|
|
55
55
|
def each_counterexamples(service, &bl)
|
56
|
-
service.counterexamples.each{|e|
|
56
|
+
service.counterexamples.select(&to_filter_proc(config.test_case_filter)).each{|e|
|
57
57
|
yield(expand_example(service, e), true)
|
58
58
|
} if config.run_counterexamples?
|
59
59
|
end
|
60
60
|
|
61
61
|
def each_generated_counterexamples(service, &bl)
|
62
62
|
Webspicy.with_scope(self) do
|
63
|
-
service.generated_counterexamples.each{|e|
|
63
|
+
service.generated_counterexamples.select(&to_filter_proc(config.test_case_filter)).each{|e|
|
64
64
|
yield(expand_example(service, e), true)
|
65
65
|
}
|
66
66
|
end if config.run_counterexamples?
|
data/lib/webspicy/version.rb
CHANGED
@@ -111,9 +111,19 @@ module Webspicy
|
|
111
111
|
ENV['RESOURCE'] = 'getTodo.yml'
|
112
112
|
config = Configuration.new
|
113
113
|
expect(config.file_filter).to be_a(Regexp)
|
114
|
+
expect(config.file_filter).to match("foo/bar/getTodo.yml")
|
115
|
+
expect(config.file_filter).not_to match("foo/bar/getTodos.yml")
|
114
116
|
end
|
115
117
|
|
116
|
-
it '
|
118
|
+
it 'allows expressing a no match' do
|
119
|
+
ENV['RESOURCE'] = '!getTodo.yml'
|
120
|
+
config = Configuration.new
|
121
|
+
expect(config.file_filter).to be_a(Proc)
|
122
|
+
expect(config.file_filter.call("foo/bar/getTodos.yml")).to eq(true)
|
123
|
+
expect(config.file_filter.call("foo/bar/getTodo.yml")).to eq(false)
|
124
|
+
end
|
125
|
+
|
126
|
+
it 'ignores the environment if set explicitly' do
|
117
127
|
ENV['RESOURCE'] = 'getTodo.yml'
|
118
128
|
config = Configuration.new do |c|
|
119
129
|
c.file_filter = nil
|
@@ -144,6 +154,68 @@ module Webspicy
|
|
144
154
|
end
|
145
155
|
end
|
146
156
|
|
157
|
+
describe 'test_case_filter' do
|
158
|
+
|
159
|
+
let(:tc){ OpenStruct.new(tags: ["foo", "bar"]) }
|
160
|
+
|
161
|
+
subject {
|
162
|
+
Configuration.new.test_case_filter
|
163
|
+
}
|
164
|
+
|
165
|
+
it 'is nil by default' do
|
166
|
+
expect(subject).to be_nil
|
167
|
+
end
|
168
|
+
|
169
|
+
it 'allows setting a single tag' do
|
170
|
+
ENV['TAG'] = 'foo'
|
171
|
+
expect(subject).to be_a(Proc)
|
172
|
+
expect(subject.call(tc)).to eql(true)
|
173
|
+
end
|
174
|
+
|
175
|
+
it 'allows no matching a single tag' do
|
176
|
+
ENV['TAG'] = 'baz'
|
177
|
+
expect(subject).to be_a(Proc)
|
178
|
+
expect(subject.call(tc)).to eql(false)
|
179
|
+
end
|
180
|
+
|
181
|
+
it 'allows setting multiple tags' do
|
182
|
+
ENV['TAG'] = 'foo,baz'
|
183
|
+
expect(subject).to be_a(Proc)
|
184
|
+
expect(subject.call(tc)).to eql(true)
|
185
|
+
end
|
186
|
+
|
187
|
+
it 'allows no matching any of multiple tags' do
|
188
|
+
ENV['TAG'] = 'foi,baz'
|
189
|
+
expect(subject).to be_a(Proc)
|
190
|
+
expect(subject.call(tc)).to eql(false)
|
191
|
+
end
|
192
|
+
|
193
|
+
it 'allows setting a single negative tag' do
|
194
|
+
ENV['TAG'] = '!foo'
|
195
|
+
expect(subject).to be_a(Proc)
|
196
|
+
expect(subject.call(tc)).to eql(false)
|
197
|
+
end
|
198
|
+
|
199
|
+
it 'allows not matching a single negative tag' do
|
200
|
+
ENV['TAG'] = '!baz'
|
201
|
+
expect(subject).to be_a(Proc)
|
202
|
+
expect(subject.call(tc)).to eql(true)
|
203
|
+
end
|
204
|
+
|
205
|
+
it 'allows mixing positive & negative tags and have a match' do
|
206
|
+
ENV['TAG'] = 'foo,!baz'
|
207
|
+
expect(subject).to be_a(Proc)
|
208
|
+
expect(subject.call(tc)).to eql(true)
|
209
|
+
end
|
210
|
+
|
211
|
+
it 'allows mixing positive & negative tags and have no match' do
|
212
|
+
ENV['TAG'] = 'foo,!bar'
|
213
|
+
expect(subject).to be_a(Proc)
|
214
|
+
expect(subject.call(tc)).to eql(false)
|
215
|
+
end
|
216
|
+
|
217
|
+
end
|
218
|
+
|
147
219
|
describe 'before/after/listeners' do
|
148
220
|
|
149
221
|
let(:before_eacher) { ->(){} }
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: webspicy
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.14.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Bernard Lambeau
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
11
|
+
date: 2020-02-03 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|
@@ -259,7 +259,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
259
259
|
- !ruby/object:Gem::Version
|
260
260
|
version: '0'
|
261
261
|
requirements: []
|
262
|
-
|
262
|
+
rubyforge_project:
|
263
|
+
rubygems_version: 2.6.11
|
263
264
|
signing_key:
|
264
265
|
specification_version: 4
|
265
266
|
summary: Webspicy helps testing web services as software operation black boxes!
|