spectre-core 1.12.2 → 1.12.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/exe/spectre +40 -11
- data/lib/spectre/assertion.rb +2 -2
- data/lib/spectre/curl.rb +5 -2
- data/lib/spectre/logger/file.rb +1 -1
- data/lib/spectre/reporter/console.rb +2 -2
- data/lib/spectre/reporter/junit.rb +6 -4
- data/lib/spectre.rb +1 -1
- metadata +4 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c90860f8fafa6a00e51d72bfe917ea12b6ccf5d040d0696ab2701d0222375930
|
4
|
+
data.tar.gz: 40b26f956b3b9f363b2e87eb913542f1c57ef6cf9981035fcd54b42b765f5d42
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 93f9d8f9cd6266c53e6f91aab1d80faf3d1ae07550bf97a489e25e2597e57d8fea05b2c26637513bd80fd5824bad145f5121d25bd5a53c3c02302895a7cf9f33
|
7
|
+
data.tar.gz: 32f36474db3f486a6f36ea02ec0c2291e300be67f5f6eb13ce40e73ae0af19db56cd7a34b22ec3c18cae07f3de14f4f90ccbda03f61eed3a3a1a0ff51dfb789e
|
data/exe/spectre
CHANGED
@@ -72,9 +72,10 @@ DEFAULT_CONFIG = {
|
|
72
72
|
|
73
73
|
|
74
74
|
cmd_options = {}
|
75
|
+
property_overrides = {}
|
75
76
|
|
76
77
|
opt_parser = OptionParser.new do |opts|
|
77
|
-
|
78
|
+
opts.banner = %{Spectre #{Spectre::VERSION}
|
78
79
|
|
79
80
|
Usage: spectre [command] [options]
|
80
81
|
|
@@ -83,6 +84,7 @@ Commands:
|
|
83
84
|
run Run specs (default)
|
84
85
|
show Print current environment settings
|
85
86
|
dump Dumps the given environment in YAML format to console
|
87
|
+
cleanup Will remove all generated files (e.g. logs and reports)
|
86
88
|
init Initializes a new spectre project
|
87
89
|
|
88
90
|
Specific options:}
|
@@ -132,17 +134,24 @@ Specific options:}
|
|
132
134
|
end
|
133
135
|
|
134
136
|
opts.on('-p KEY=VAL', '--property KEY=VAL', "Override config option. Use `spectre show` to get list of available options") do |option|
|
135
|
-
key, val = option.split
|
136
|
-
val = val.split
|
137
|
-
val = ['true', '1'].include? val if [true, false].include?
|
137
|
+
key, val = option.split('=')
|
138
|
+
val = val.split(',') if DEFAULT_CONFIG[key].is_a? Array
|
139
|
+
val = ['true', '1'].include? val if [true, false].include?(DEFAULT_CONFIG[key])
|
138
140
|
val = val.to_i if DEFAULT_CONFIG[key].is_a? Integer
|
139
|
-
cmd_options[key] = val
|
140
141
|
|
141
|
-
|
142
|
-
|
143
|
-
|
142
|
+
opt_path = key.split('.')
|
143
|
+
|
144
|
+
curr_opt = property_overrides
|
145
|
+
|
146
|
+
opt_path.each_with_index do |part, i|
|
147
|
+
if i == opt_path.count-1
|
148
|
+
curr_opt[part] = val
|
149
|
+
break
|
150
|
+
end
|
151
|
+
|
152
|
+
curr_opt[part] = {} unless curr_opt.key?(part)
|
153
|
+
curr_opt = curr_opt[part]
|
144
154
|
end
|
145
|
-
curr_opt = val
|
146
155
|
end
|
147
156
|
|
148
157
|
opts.separator "\nCommon options:"
|
@@ -187,7 +196,6 @@ end
|
|
187
196
|
|
188
197
|
cfg.deep_merge! cmd_options
|
189
198
|
|
190
|
-
|
191
199
|
###########################################
|
192
200
|
# Load Environment
|
193
201
|
###########################################
|
@@ -224,7 +232,10 @@ cfg['env_partial_patterns'].each do |pattern|
|
|
224
232
|
end
|
225
233
|
|
226
234
|
env = envs[cfg['environment']]
|
227
|
-
cfg.
|
235
|
+
cfg.deep_merge! env if env
|
236
|
+
|
237
|
+
# Merge property overrides after environment load to give it higher priority
|
238
|
+
cfg.deep_merge! property_overrides
|
228
239
|
|
229
240
|
|
230
241
|
String.colored! if cfg['colored']
|
@@ -392,6 +403,24 @@ if 'dump' == action
|
|
392
403
|
end
|
393
404
|
|
394
405
|
|
406
|
+
###########################################
|
407
|
+
# Cleanup
|
408
|
+
###########################################
|
409
|
+
|
410
|
+
|
411
|
+
if 'cleanup' == action
|
412
|
+
log_file_pattern = cfg['log_file'].gsub('<date>', '*')
|
413
|
+
|
414
|
+
Dir.glob(log_file_pattern).each do |log_file|
|
415
|
+
File.delete(log_file)
|
416
|
+
end
|
417
|
+
|
418
|
+
Dir.glob(File.join cfg['out_path'], '/*').each do |out_file|
|
419
|
+
File.delete(out_file)
|
420
|
+
end
|
421
|
+
end
|
422
|
+
|
423
|
+
|
395
424
|
###########################################
|
396
425
|
# Init
|
397
426
|
###########################################
|
data/lib/spectre/assertion.rb
CHANGED
@@ -52,7 +52,7 @@ module Spectre
|
|
52
52
|
end
|
53
53
|
|
54
54
|
def should_not_be_empty
|
55
|
-
raise AssertionFailure.new('The
|
55
|
+
raise AssertionFailure.new('The value does not exist', 'nil')
|
56
56
|
end
|
57
57
|
end
|
58
58
|
|
@@ -247,7 +247,7 @@ module Spectre
|
|
247
247
|
raise AssertionFailure.new(e.message, e.expected, e.actual, desc), cause: nil
|
248
248
|
rescue Exception => e
|
249
249
|
Logger.log_status(desc, Logger::Status::ERROR)
|
250
|
-
raise AssertionFailure.new("An unexpected error
|
250
|
+
raise AssertionFailure.new("An unexpected error occurred during expectation: #{e.message}", nil, nil, desc), cause: e
|
251
251
|
end
|
252
252
|
end
|
253
253
|
|
data/lib/spectre/curl.rb
CHANGED
@@ -301,7 +301,10 @@ module Spectre::Curl
|
|
301
301
|
|
302
302
|
req_log = "[>] #{req_id} #{req['method']} #{uri}\n"
|
303
303
|
req_log += header_to_s(req['headers'])
|
304
|
-
|
304
|
+
|
305
|
+
if req[:body] != nil and not req[:body].empty?
|
306
|
+
req_log += try_format_json(req['body'], pretty: true)
|
307
|
+
end
|
305
308
|
|
306
309
|
@@logger.info(req_log)
|
307
310
|
|
@@ -329,7 +332,7 @@ module Spectre::Curl
|
|
329
332
|
|
330
333
|
exit_code = wait_thr.value.exitstatus
|
331
334
|
|
332
|
-
raise Exception.new "An error
|
335
|
+
raise Exception.new "An error occurred while executing curl:\n#{debug_log.lines.map { |x| not x.empty? }}" unless exit_code == 0
|
333
336
|
|
334
337
|
# Parse protocol, version, status code and status message from response
|
335
338
|
match = /^(?<protocol>[A-Za-z0-9]+)\/(?<version>\d+\.?\d*) (?<code>\d+) (?<message>.*)/.match result
|
data/lib/spectre/logger/file.rb
CHANGED
@@ -79,7 +79,7 @@ module Spectre
|
|
79
79
|
|
80
80
|
def log_error spec, exception
|
81
81
|
file, line = exception.backtrace[0].match(/(.*\.rb):(\d+)/).captures
|
82
|
-
@file_log.error "An unexpected error
|
82
|
+
@file_log.error "An unexpected error occurred at '#{file}:#{line}' while running spec '#{spec.name}': [#{exception.class}] #{exception.message}\n#{exception.backtrace.join "\n"}"
|
83
83
|
end
|
84
84
|
|
85
85
|
def log_skipped spec
|
@@ -21,7 +21,6 @@ module Spectre::Reporter
|
|
21
21
|
if run_info.failure
|
22
22
|
report_str += " Expected #{run_info.failure.expectation}"
|
23
23
|
report_str += " with #{run_info.data}" if run_info.data
|
24
|
-
report_str += " during #{spec.context.__desc}" if spec.context.__desc
|
25
24
|
|
26
25
|
report_str += " but it failed"
|
27
26
|
|
@@ -40,7 +39,7 @@ module Spectre::Reporter
|
|
40
39
|
failures += 1
|
41
40
|
|
42
41
|
else
|
43
|
-
report_str += " but an unexpected error
|
42
|
+
report_str += " but an unexpected error occurred during run\n"
|
44
43
|
report_str += format_exception(run_info.error)
|
45
44
|
errors += 1
|
46
45
|
end
|
@@ -68,6 +67,7 @@ module Spectre::Reporter
|
|
68
67
|
|
69
68
|
def format_title run_info
|
70
69
|
title = run_info.spec.subject.desc
|
70
|
+
title += " #{run_info.spec.context.__desc}" if run_info.spec.context.__desc
|
71
71
|
title += ' ' + run_info.spec.desc
|
72
72
|
title += " (#{'%.3f' % run_info.duration}s)"
|
73
73
|
title += " [#{run_info.spec.name}]"
|
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'CGI'
|
2
|
+
|
1
3
|
# https://llg.cubic.org/docs/junit/
|
2
4
|
# Azure mappings: https://docs.microsoft.com/en-us/azure/devops/pipelines/tasks/test/publish-test-results?view=azure-devops&tabs=junit%2Cyaml
|
3
5
|
|
@@ -22,11 +24,11 @@ module Spectre::Reporter
|
|
22
24
|
errors = run_infos.select { |x| x.error != nil }
|
23
25
|
skipped = run_infos.select { |x| x.skipped? }
|
24
26
|
|
25
|
-
xml_str += '<testsuite package="' + subject.desc + '" id="' + suite_id.to_s + '" name="' + subject.desc + '" timestamp="' + datetime + '" tests="' + run_infos.count.to_s + '" failures="' + failures.count.to_s + '" errors="' + errors.count.to_s + '" skipped="' + skipped.count.to_s + '">'
|
27
|
+
xml_str += '<testsuite package="' + CGI::escapeHTML(subject.desc) + '" id="' + CGI::escapeHTML(suite_id.to_s) + '" name="' + CGI::escapeHTML(subject.desc) + '" timestamp="' + datetime + '" tests="' + run_infos.count.to_s + '" failures="' + failures.count.to_s + '" errors="' + errors.count.to_s + '" skipped="' + skipped.count.to_s + '">'
|
26
28
|
suite_id += 1
|
27
29
|
|
28
30
|
run_infos.each do |run_info|
|
29
|
-
xml_str += '<testcase classname="' + run_info.spec.file.to_s + '" name="' + run_info.spec.desc + '" timestamp="' + run_info.started.to_s + '" time="' + ('%.3f' % run_info.duration) + '">'
|
31
|
+
xml_str += '<testcase classname="' + CGI::escapeHTML(run_info.spec.file.to_s) + '" name="' + CGI::escapeHTML(run_info.spec.desc) + '" timestamp="' + run_info.started.to_s + '" time="' + ('%.3f' % run_info.duration) + '">'
|
30
32
|
|
31
33
|
if run_info.failure and !run_info.failure.cause
|
32
34
|
failure_message = "Expected #{run_info.failure.expectation}"
|
@@ -38,7 +40,7 @@ module Spectre::Reporter
|
|
38
40
|
failure_message += " but it failed"
|
39
41
|
end
|
40
42
|
|
41
|
-
xml_str += '<failure message="' + failure_message.gsub('"', '`') + '"></failure>'
|
43
|
+
xml_str += '<failure message="' + CGI::escapeHTML(failure_message.gsub('"', '`')) + '"></failure>'
|
42
44
|
end
|
43
45
|
|
44
46
|
|
@@ -49,7 +51,7 @@ module Spectre::Reporter
|
|
49
51
|
failure_message = error.message
|
50
52
|
text = error.backtrace.join "\n"
|
51
53
|
|
52
|
-
xml_str += '<error message="' + failure_message.gsub('"', '`') + '" type="' + type + '">'
|
54
|
+
xml_str += '<error message="' + CGI::escapeHTML(failure_message.gsub('"', '`')) + '" type="' + type + '">'
|
53
55
|
xml_str += '<![CDATA[' + text + ']]>'
|
54
56
|
xml_str += '</error>'
|
55
57
|
end
|
data/lib/spectre.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: spectre-core
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.12.
|
4
|
+
version: 1.12.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Christian Neubauer
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2022-03-01 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: ectoplasm
|
@@ -16,14 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 1.2.
|
19
|
+
version: 1.2.1
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: 1.2.
|
26
|
+
version: 1.2.1
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: jsonpath
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|