webspicy 0.20.3 → 0.20.4
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/bin/webspicy +1 -2
- data/lib/webspicy/configuration.rb +15 -0
- data/lib/webspicy/configuration/scope.rb +1 -0
- data/lib/webspicy/specification/post/missing_condition_impl.rb +2 -2
- data/lib/webspicy/specification/post/unexpected_condition_impl.rb +2 -2
- data/lib/webspicy/support/colorize.rb +6 -0
- data/lib/webspicy/tester.rb +14 -18
- data/lib/webspicy/tester/reporter.rb +5 -0
- data/lib/webspicy/tester/reporter/documentation.rb +24 -8
- data/lib/webspicy/tester/reporter/error_count.rb +11 -7
- data/lib/webspicy/tester/reporter/file_progress.rb +2 -2
- data/lib/webspicy/tester/reporter/file_summary.rb +2 -2
- data/lib/webspicy/tester/reporter/progress.rb +4 -4
- data/lib/webspicy/tester/reporter/summary.rb +8 -7
- data/lib/webspicy/tester/result/errcondition_met.rb +1 -3
- data/lib/webspicy/tester/result/postcondition_met.rb +1 -3
- data/lib/webspicy/version.rb +1 -1
- data/spec/blackbox/commandline.yml +24 -0
- data/spec/blackbox/fixtures/passing/config.rb +9 -0
- data/spec/blackbox/fixtures/passing/formaldef/get.yml +30 -0
- data/tasks/test.rake +2 -1
- metadata +15 -12
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9afe697a47ba4391d2e059f1bf3707c04f97f9d6fd50557104a59c6602dbd75c
|
4
|
+
data.tar.gz: 66ec4036f8e76dad7af0f8b0cf83ea139a67a7b1020aa0a304c26fdc9402d593
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 79feb96443a47523b38f16e4cf7e7edfcd675f5a71c6b33aa452ad452aeacd5e64de1ce1ffa9ff3f5bf9cf428d59dc183e8f1455e1ce26126f2eddf9a14795fb
|
7
|
+
data.tar.gz: 2761eb20d67f4c697dedf7c27496cfd36ceed4f988f1f54f17809358e570102f1e40c29c47e46f614671504dcf1c877ce2fe6ccb7a72b510994a9da95bb74de1
|
data/bin/webspicy
CHANGED
@@ -33,12 +33,15 @@ module Webspicy
|
|
33
33
|
@service_filter = default_service_filter
|
34
34
|
@test_case_filter = default_test_case_filter
|
35
35
|
@colors = {
|
36
|
+
:section => :magenta,
|
36
37
|
:highlight => :cyan,
|
37
38
|
:error => :red,
|
38
39
|
:success => :green
|
39
40
|
}
|
41
|
+
@colorize = true
|
40
42
|
@scope_factory = ->(config){ Scope.new(config) }
|
41
43
|
@client = Web::HttpClient
|
44
|
+
@reporter = default_reporter
|
42
45
|
Path.require_tree(@folder/'support') if (@folder/'support').exists?
|
43
46
|
@world = Support::World.new(folder/'world', self)
|
44
47
|
yield(self) if block_given?
|
@@ -47,6 +50,8 @@ module Webspicy
|
|
47
50
|
protected :folder=
|
48
51
|
|
49
52
|
attr_accessor :colors
|
53
|
+
attr_accessor :colorize
|
54
|
+
|
50
55
|
attr_reader :world
|
51
56
|
|
52
57
|
def self.dress(arg, &bl)
|
@@ -434,6 +439,16 @@ module Webspicy
|
|
434
439
|
end
|
435
440
|
private :default_rspec_options
|
436
441
|
|
442
|
+
# Returns the default reporter to use.
|
443
|
+
def default_reporter
|
444
|
+
@reporter = Tester::Reporter::Composite.new
|
445
|
+
@reporter << Tester::Reporter::Documentation.new
|
446
|
+
@reporter << Tester::Reporter::Exceptions.new
|
447
|
+
@reporter << Tester::Reporter::Summary.new
|
448
|
+
@reporter << Tester::Reporter::ErrorCount.new
|
449
|
+
end
|
450
|
+
attr_accessor :reporter
|
451
|
+
|
437
452
|
# Returns the Data system to use for parsing schemas
|
438
453
|
#
|
439
454
|
# The data system associated with a configuration is build when the
|
@@ -23,6 +23,7 @@ module Webspicy
|
|
23
23
|
folder = config.folder
|
24
24
|
world = config.folder/"world"
|
25
25
|
fs = folder.glob("**/*.yml").reject{|f| f.to_s.start_with?(world.to_s) }
|
26
|
+
fs = fs.sort
|
26
27
|
fs = fs.select(&to_filter_proc(config.file_filter)) if apply_filter
|
27
28
|
fs.each do |file|
|
28
29
|
yield file, folder
|
@@ -4,9 +4,9 @@ module Webspicy
|
|
4
4
|
class UnexpectedConditionImpl
|
5
5
|
include Post
|
6
6
|
|
7
|
-
def check
|
7
|
+
def check!
|
8
8
|
msg = matching_description.gsub(/\( \)/, "<x>")
|
9
|
-
|
9
|
+
fail!("#{msg} (is instrumented)")
|
10
10
|
end
|
11
11
|
|
12
12
|
end # class UnexpectedConditionImpl
|
@@ -3,11 +3,17 @@ module Webspicy
|
|
3
3
|
module Colorize
|
4
4
|
|
5
5
|
def colorize(str, kind, config = nil)
|
6
|
+
return str if config && !config.colorize
|
6
7
|
color = (config || self.config).colors[kind]
|
7
8
|
ColorizedString[str].colorize(color)
|
8
9
|
end
|
9
10
|
module_function :colorize
|
10
11
|
|
12
|
+
def colorize_section(str, cfg = nil)
|
13
|
+
colorize(str, :section, cfg)
|
14
|
+
end
|
15
|
+
module_function :colorize_section
|
16
|
+
|
11
17
|
def colorize_highlight(str, cfg = nil)
|
12
18
|
colorize(str, :highlight, cfg)
|
13
19
|
end
|
data/lib/webspicy/tester.rb
CHANGED
@@ -15,7 +15,7 @@ module Webspicy
|
|
15
15
|
@test_case = nil
|
16
16
|
@invocation = nil
|
17
17
|
@invocation_error = nil
|
18
|
-
@reporter =
|
18
|
+
@reporter = @config.reporter
|
19
19
|
end
|
20
20
|
attr_reader :config, :scope, :hooks, :client
|
21
21
|
attr_reader :specification, :spec_file
|
@@ -31,15 +31,6 @@ module Webspicy
|
|
31
31
|
config.failfast
|
32
32
|
end
|
33
33
|
|
34
|
-
def default_reporter
|
35
|
-
@reporter = Reporter::Composite.new
|
36
|
-
#@reporter << Reporter::Progress.new
|
37
|
-
@reporter << Reporter::Documentation.new
|
38
|
-
@reporter << Reporter::Exceptions.new
|
39
|
-
@reporter << Reporter::Summary.new
|
40
|
-
@reporter << Reporter::ErrorCount.new
|
41
|
-
end
|
42
|
-
|
43
34
|
def call
|
44
35
|
reporter.init(self)
|
45
36
|
begin
|
@@ -50,6 +41,11 @@ module Webspicy
|
|
50
41
|
reporter.find(Reporter::ErrorCount).report
|
51
42
|
end
|
52
43
|
|
44
|
+
def call!
|
45
|
+
res = call
|
46
|
+
abort("KO") unless res == 0
|
47
|
+
end
|
48
|
+
|
53
49
|
def find_and_call(method, url, mutation)
|
54
50
|
unless tc = scope.find_test_case(method, url)
|
55
51
|
raise Error, "No such service `#{method} #{url}`"
|
@@ -73,19 +69,15 @@ module Webspicy
|
|
73
69
|
@scope = scope
|
74
70
|
@hooks = Support::Hooks.for(scope.config)
|
75
71
|
@client = scope.get_client
|
76
|
-
reporter.before_all
|
77
|
-
@hooks.fire_before_all(self)
|
78
|
-
reporter.before_all_done
|
79
|
-
reporter.before_scope
|
80
72
|
run_scope
|
81
|
-
reporter.scope_done
|
82
|
-
reporter.after_all
|
83
|
-
@hooks.fire_after_all(self)
|
84
|
-
reporter.after_all_done
|
85
73
|
end
|
86
74
|
end
|
87
75
|
|
88
76
|
def run_scope
|
77
|
+
reporter.before_all
|
78
|
+
hooks.fire_before_all(self)
|
79
|
+
reporter.before_all_done
|
80
|
+
reporter.before_scope
|
89
81
|
scope.each_specification_file do |spec_file|
|
90
82
|
@specification = load_specification(spec_file)
|
91
83
|
if @specification
|
@@ -97,6 +89,10 @@ module Webspicy
|
|
97
89
|
raise FailFast
|
98
90
|
end
|
99
91
|
end
|
92
|
+
reporter.scope_done
|
93
|
+
reporter.after_all
|
94
|
+
hooks.fire_after_all(self)
|
95
|
+
reporter.after_all_done
|
100
96
|
end
|
101
97
|
|
102
98
|
def load_specification(spec_file)
|
@@ -4,40 +4,56 @@ module Webspicy
|
|
4
4
|
class Documentation < Reporter
|
5
5
|
|
6
6
|
module Helpers
|
7
|
+
INDENT = " ".freeze
|
8
|
+
|
9
|
+
def spec_file_line(spec_file)
|
10
|
+
relative_path = Path(spec_file).relative_to(config.folder)
|
11
|
+
colorize_section(">> #{relative_path}", config)
|
12
|
+
end
|
13
|
+
|
7
14
|
def spec_file_error_line(spec_file, ex)
|
8
|
-
str =
|
9
|
-
str +=
|
15
|
+
str = ""
|
16
|
+
str += colorize_error(INDENT + "X #{ex.message}", config)
|
10
17
|
if ex.root_cause && ex.root_cause != ex
|
11
|
-
str += "\n
|
18
|
+
str += "\n"
|
19
|
+
str += INDENT + colorize_error("#{ex.root_cause.message}", config)
|
12
20
|
end
|
13
21
|
str
|
14
22
|
end
|
15
23
|
|
16
24
|
def service_line(service, test_case)
|
17
|
-
str = service
|
18
|
-
str = colorize_highlight(str)
|
25
|
+
str = "#{service}, #{test_case}"
|
26
|
+
str = colorize_highlight(str, config)
|
19
27
|
end
|
20
28
|
|
21
29
|
def check_success_line(check)
|
22
|
-
|
30
|
+
INDENT + colorize_success("v " + check.behavior, config)
|
23
31
|
end
|
24
32
|
|
25
33
|
def check_failure_line(check, ex)
|
26
|
-
|
34
|
+
INDENT + colorize_error("F " + ex.message, config)
|
27
35
|
end
|
28
36
|
|
29
37
|
def check_error_line(check, ex)
|
30
|
-
|
38
|
+
INDENT + colorize_error("E " + ex.message, config)
|
31
39
|
end
|
32
40
|
end
|
33
41
|
include Helpers
|
34
42
|
|
35
43
|
def spec_file_error(e)
|
44
|
+
io.puts spec_file_line(spec_file)
|
45
|
+
io.puts
|
36
46
|
io.puts spec_file_error_line(spec_file, e)
|
37
47
|
io.puts
|
38
48
|
io.flush
|
39
49
|
end
|
40
50
|
|
51
|
+
def before_service
|
52
|
+
io.puts spec_file_line(spec_file)
|
53
|
+
io.puts
|
54
|
+
io.flush
|
55
|
+
end
|
56
|
+
|
41
57
|
def before_test_case
|
42
58
|
io.puts service_line(service, test_case)
|
43
59
|
io.flush
|
@@ -5,18 +5,22 @@ module Webspicy
|
|
5
5
|
|
6
6
|
def initialize(*args, &bl)
|
7
7
|
super
|
8
|
-
@
|
8
|
+
@errors = Hash.new{|h,k| 0 }
|
9
9
|
end
|
10
|
+
attr_reader :errors
|
10
11
|
|
11
|
-
|
12
|
-
|
12
|
+
[
|
13
|
+
:spec_file_error,
|
14
|
+
:check_error,
|
15
|
+
:check_failure
|
16
|
+
].each do |meth|
|
17
|
+
define_method(meth) do |*args, &bl|
|
18
|
+
@errors[meth] += 1
|
19
|
+
end
|
13
20
|
end
|
14
|
-
alias :spec_file_error :on_error
|
15
|
-
alias :check_failure :on_error
|
16
|
-
alias :check_error :on_error
|
17
21
|
|
18
22
|
def report
|
19
|
-
@
|
23
|
+
@errors.values.inject(0){|memo,x| memo+x }
|
20
24
|
end
|
21
25
|
|
22
26
|
end # class ErrorCount
|
@@ -4,12 +4,12 @@ module Webspicy
|
|
4
4
|
class FileProgress < Reporter
|
5
5
|
|
6
6
|
def spec_file_error(e)
|
7
|
-
io.print colorize_error("X")
|
7
|
+
io.print colorize_error("X", config)
|
8
8
|
io.flush
|
9
9
|
end
|
10
10
|
|
11
11
|
def spec_file_done
|
12
|
-
io.print colorize_success(".")
|
12
|
+
io.print colorize_success(".", config)
|
13
13
|
io.flush
|
14
14
|
end
|
15
15
|
|
@@ -22,9 +22,9 @@ module Webspicy
|
|
22
22
|
msg = "#{plural('spec file', spec_files_count)}, "\
|
23
23
|
"#{plural('error', errors_count)}"
|
24
24
|
if success?
|
25
|
-
msg = colorize_success(msg)
|
25
|
+
msg = colorize_success(msg, config)
|
26
26
|
else
|
27
|
-
msg = colorize_error(msg)
|
27
|
+
msg = colorize_error(msg, config)
|
28
28
|
end
|
29
29
|
io.puts(msg)
|
30
30
|
io.puts
|
@@ -4,16 +4,16 @@ module Webspicy
|
|
4
4
|
class Progress < Reporter
|
5
5
|
|
6
6
|
def spec_file_error(e)
|
7
|
-
io.print colorize_error("X")
|
7
|
+
io.print colorize_error("X", config)
|
8
8
|
end
|
9
9
|
|
10
10
|
def after_each_done
|
11
11
|
if result.success?
|
12
|
-
io.print colorize_success(".")
|
12
|
+
io.print colorize_success(".", config)
|
13
13
|
elsif result.failure?
|
14
|
-
io.print colorize_error("F")
|
14
|
+
io.print colorize_error("F", config)
|
15
15
|
elsif result.error?
|
16
|
-
io.print colorize_error("E")
|
16
|
+
io.print colorize_error("E", config)
|
17
17
|
end
|
18
18
|
io.flush
|
19
19
|
end
|
@@ -9,18 +9,21 @@ module Webspicy
|
|
9
9
|
@examples_count = 0
|
10
10
|
@counterexamples_count = 0
|
11
11
|
@assertions_count = 0
|
12
|
+
#
|
13
|
+
@spec_file_errors_count = 0
|
12
14
|
@errors_count = 0
|
13
15
|
@failures_count = 0
|
14
16
|
end
|
15
17
|
attr_reader :spec_files_count, :examples_count, :counterexamples_count
|
16
|
-
attr_reader :assertions_count
|
18
|
+
attr_reader :assertions_count
|
19
|
+
attr_reader :spec_file_errors_count, :errors_count, :failures_count
|
17
20
|
|
18
21
|
def before_spec_file
|
19
22
|
@spec_files_count += 1
|
20
23
|
end
|
21
24
|
|
22
25
|
def spec_file_error(e)
|
23
|
-
@
|
26
|
+
@spec_file_errors_count += 1
|
24
27
|
end
|
25
28
|
|
26
29
|
def after_each_done
|
@@ -42,19 +45,17 @@ module Webspicy
|
|
42
45
|
"#{plural('error', errors_count)}, "\
|
43
46
|
"#{plural('failure', failures_count)}"
|
44
47
|
if success?
|
45
|
-
msg = colorize_success(msg)
|
48
|
+
msg = colorize_success(msg, config)
|
46
49
|
else
|
47
|
-
msg = colorize_error(msg)
|
50
|
+
msg = colorize_error(msg, config)
|
48
51
|
end
|
49
52
|
io.puts(msg)
|
50
53
|
io.puts
|
51
54
|
io.flush
|
52
55
|
end
|
53
56
|
|
54
|
-
private
|
55
|
-
|
56
57
|
def success?
|
57
|
-
@errors_count == 0 && @failures_count == 0
|
58
|
+
@spec_file_errors_count == 0 && @errors_count == 0 && @failures_count == 0
|
58
59
|
end
|
59
60
|
|
60
61
|
end # class Summary
|
data/lib/webspicy/version.rb
CHANGED
@@ -0,0 +1,24 @@
|
|
1
|
+
---
|
2
|
+
command:
|
3
|
+
webspicy {options} {args}
|
4
|
+
|
5
|
+
examples:
|
6
|
+
|
7
|
+
- description: |-
|
8
|
+
when called on a passing path
|
9
|
+
args:
|
10
|
+
- ./fixtures/passing/config.rb
|
11
|
+
assert:
|
12
|
+
exit_code:
|
13
|
+
0
|
14
|
+
stdout: |-
|
15
|
+
GET /, when requested
|
16
|
+
v It has a 200 response status
|
17
|
+
v It has a `Content-Type: application/json` response header
|
18
|
+
v Its output meets the expected data schema
|
19
|
+
v Assert notEmpty
|
20
|
+
v Assert pathFD('', :hello => "World" )
|
21
|
+
|
22
|
+
|
23
|
+
1 spec file, 1 example, 0 counterexample
|
24
|
+
5 assertions, 0 error, 0 failure
|
@@ -0,0 +1,30 @@
|
|
1
|
+
---
|
2
|
+
url: |-
|
3
|
+
/
|
4
|
+
|
5
|
+
method: |-
|
6
|
+
GET
|
7
|
+
|
8
|
+
description: |-
|
9
|
+
Returns hello world
|
10
|
+
|
11
|
+
input_schema: |-
|
12
|
+
{ }
|
13
|
+
|
14
|
+
output_schema: |-
|
15
|
+
{ hello: String }
|
16
|
+
|
17
|
+
error_schema: |-
|
18
|
+
.
|
19
|
+
|
20
|
+
examples:
|
21
|
+
|
22
|
+
- description: |-
|
23
|
+
when requested
|
24
|
+
params: {}
|
25
|
+
expected:
|
26
|
+
content_type: application/json
|
27
|
+
status: 200
|
28
|
+
assert:
|
29
|
+
- notEmpty
|
30
|
+
- pathFD('', :hello => "World" )
|
data/tasks/test.rake
CHANGED
@@ -18,7 +18,8 @@ namespace :test do
|
|
18
18
|
desc "Runs the integration tests on the #{file.basename} example"
|
19
19
|
task(test_name) do
|
20
20
|
Bundler.with_original_env do
|
21
|
-
system("cd #{file} && bundle exec rake")
|
21
|
+
x = system("cd #{file} && bundle exec rake")
|
22
|
+
abort("Example test suite failed: #{file}") unless x
|
22
23
|
end
|
23
24
|
end
|
24
25
|
tests << test_name
|
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.20.
|
4
|
+
version: 0.20.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Bernard Lambeau
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-03-
|
11
|
+
date: 2021-03-13 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|
@@ -126,22 +126,22 @@ dependencies:
|
|
126
126
|
name: rack-robustness
|
127
127
|
requirement: !ruby/object:Gem::Requirement
|
128
128
|
requirements:
|
129
|
-
- - ">="
|
130
|
-
- !ruby/object:Gem::Version
|
131
|
-
version: 1.1.0
|
132
129
|
- - "~>"
|
133
130
|
- !ruby/object:Gem::Version
|
134
131
|
version: '1.1'
|
132
|
+
- - ">="
|
133
|
+
- !ruby/object:Gem::Version
|
134
|
+
version: 1.1.0
|
135
135
|
type: :runtime
|
136
136
|
prerelease: false
|
137
137
|
version_requirements: !ruby/object:Gem::Requirement
|
138
138
|
requirements:
|
139
|
-
- - ">="
|
140
|
-
- !ruby/object:Gem::Version
|
141
|
-
version: 1.1.0
|
142
139
|
- - "~>"
|
143
140
|
- !ruby/object:Gem::Version
|
144
141
|
version: '1.1'
|
142
|
+
- - ">="
|
143
|
+
- !ruby/object:Gem::Version
|
144
|
+
version: 1.1.0
|
145
145
|
- !ruby/object:Gem::Dependency
|
146
146
|
name: mustermann
|
147
147
|
requirement: !ruby/object:Gem::Requirement
|
@@ -284,6 +284,9 @@ files:
|
|
284
284
|
- lib/webspicy/web/mocker/config.ru
|
285
285
|
- lib/webspicy/web/openapi.rb
|
286
286
|
- lib/webspicy/web/openapi/generator.rb
|
287
|
+
- spec/blackbox/commandline.yml
|
288
|
+
- spec/blackbox/fixtures/passing/config.rb
|
289
|
+
- spec/blackbox/fixtures/passing/formaldef/get.yml
|
287
290
|
- spec/spec_helper.rb
|
288
291
|
- spec/unit/configuration/config.rb
|
289
292
|
- spec/unit/configuration/scope/test_each_service.rb
|
@@ -317,7 +320,7 @@ homepage: http://github.com/enspirit/webspicy
|
|
317
320
|
licenses:
|
318
321
|
- MIT
|
319
322
|
metadata: {}
|
320
|
-
post_install_message:
|
323
|
+
post_install_message:
|
321
324
|
rdoc_options: []
|
322
325
|
require_paths:
|
323
326
|
- lib
|
@@ -332,8 +335,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
332
335
|
- !ruby/object:Gem::Version
|
333
336
|
version: '0'
|
334
337
|
requirements: []
|
335
|
-
rubygems_version: 3.
|
336
|
-
signing_key:
|
338
|
+
rubygems_version: 3.1.4
|
339
|
+
signing_key:
|
337
340
|
specification_version: 4
|
338
341
|
summary: Webspicy helps testing web services as software operation black boxes!
|
339
342
|
test_files: []
|