spectre-core 1.8.3 → 1.11.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.
data/lib/spectre/http.rb CHANGED
@@ -62,8 +62,7 @@ module Spectre
62
62
  end
63
63
 
64
64
  def body body_content
65
- raise 'Body value must be a string' if not body_content.is_a? String
66
- @__req['body'] = body_content
65
+ @__req['body'] = body_content.to_s
67
66
  end
68
67
 
69
68
  def ensure_success!
@@ -102,6 +101,7 @@ module Spectre
102
101
  end
103
102
 
104
103
  def [] key
104
+ return nil if not @headers.has_key?(key.downcase)
105
105
  @headers[key.downcase].first
106
106
  end
107
107
 
@@ -166,6 +166,7 @@ module Spectre
166
166
  @@response = nil
167
167
  @@request = nil
168
168
  @@modules = []
169
+ @@secure_keys = []
169
170
 
170
171
  def https name, &block
171
172
  http(name, secure: true, &block)
@@ -209,7 +210,8 @@ module Spectre
209
210
  return str unless str or str.empty?
210
211
 
211
212
  begin
212
- json = JSON.parse str
213
+ json = JSON.parse(str)
214
+ json.obfuscate!(@@secure_keys) if not @@debug
213
215
 
214
216
  if pretty
215
217
  str = JSON.pretty_generate(json)
@@ -223,6 +225,19 @@ module Spectre
223
225
  str
224
226
  end
225
227
 
228
+ def is_secure? key
229
+ @@secure_keys.any? { |x| key.to_s.downcase.include? x.downcase }
230
+ end
231
+
232
+ def header_to_s headers
233
+ s = ''
234
+ headers.each_header.each do |header, value|
235
+ value = '*****' if is_secure?(header) and not @@debug
236
+ s += "#{header.to_s.ljust(30, '.')}: #{value.to_s}\n"
237
+ end
238
+ s
239
+ end
240
+
226
241
  def invoke req
227
242
  @@request = nil
228
243
 
@@ -275,28 +290,28 @@ module Spectre
275
290
 
276
291
  req_id = SecureRandom.uuid()[0..5]
277
292
 
293
+ # Run HTTP modules
294
+
295
+ @@modules.each do |mod|
296
+ mod.on_req(net_http, net_req, req) if mod.respond_to? :on_req
297
+ end
298
+
278
299
  # Log request
279
300
 
280
- req_log = "[>] #{req_id} #{req['method']} #{uri}"
281
- req['headers'].each do |header|
282
- req_log += "\n#{header[0].to_s.ljust(30, '.')}: #{header[1].to_s}"
283
- end if req['headers']
284
- req_log += "\n" + try_format_json(req['body'], pretty: true) if req['body'] != nil and not req['body'].empty?
301
+ req_log = "[>] #{req_id} #{req['method']} #{uri}\n"
302
+ req_log += header_to_s(net_req)
303
+ req_log += try_format_json(req['body'], pretty: true) if req['body'] != nil and not req['body'].empty?
285
304
 
286
305
  @@logger.info req_log
287
306
 
288
307
  # Request
289
308
 
290
309
  start_time = Time.now
291
-
292
- @@modules.each do |mod|
293
- mod.on_req(net_http, net_req, req) if mod.respond_to? :on_req
294
- end
295
-
296
310
  net_res = net_http.request(net_req)
297
-
298
311
  end_time = Time.now
299
312
 
313
+ # Run HTTP modules
314
+
300
315
  @@modules.each do |mod|
301
316
  mod.on_res(net_http, net_res, req) if mod.respond_to? :on_res
302
317
  end
@@ -304,9 +319,7 @@ module Spectre
304
319
  # Log response
305
320
 
306
321
  res_log = "[<] #{req_id} #{net_res.code} #{net_res.message} (#{end_time - start_time}s)\n"
307
- net_res.each_header do |header, value|
308
- res_log += "#{header.to_s.ljust(30, '.')}: #{value}\n"
309
- end
322
+ res_log += header_to_s(net_res)
310
323
  res_log += try_format_json(net_res.body, pretty: true) if net_res.body != nil and !net_res.body.empty?
311
324
 
312
325
  @@logger.info(res_log)
@@ -328,6 +341,8 @@ module Spectre
328
341
 
329
342
  Spectre.register do |config|
330
343
  @@logger = ::Logger.new config['log_file'], progname: 'spectre/http'
344
+ @@secure_keys = config['secure_keys'] || []
345
+ @@debug = config['debug']
331
346
 
332
347
  if config.key? 'http'
333
348
  @@http_cfg = {}
data/lib/spectre/mixin.rb CHANGED
@@ -1,4 +1,5 @@
1
1
  require 'ostruct'
2
+ require 'spectre/logger'
2
3
 
3
4
  module Spectre
4
5
  module Mixin
@@ -11,12 +12,16 @@ module Spectre
11
12
 
12
13
  def run desc, with: []
13
14
  raise "no mixin with desc '#{desc}' defined" unless @@mixins.key? desc
14
- Logger.log_debug "running mixin '#{desc}'"
15
+ Spectre::Logger.log_debug "running mixin '#{desc}'"
15
16
 
16
- if with.is_a? Array
17
- @@mixins[desc].call *with
17
+ params = with || {}
18
+
19
+ if params.is_a? Array
20
+ @@mixins[desc].call *params
21
+ elsif params.is_a? Hash
22
+ @@mixins[desc].call OpenStruct.new(params)
18
23
  else
19
- @@mixins[desc].call with
24
+ @@mixins[desc].call params
20
25
  end
21
26
  end
22
27
 
@@ -24,18 +29,6 @@ module Spectre
24
29
  alias_method :step, :run
25
30
  end
26
31
 
27
- Spectre.register do |config|
28
- if not config.key? 'mixin_patterns'
29
- return
30
- end
31
-
32
- config['mixin_patterns'].each do |pattern|
33
- Dir.glob(pattern).each do|f|
34
- require_relative File.join(Dir.pwd, f)
35
- end
36
- end
37
- end
38
-
39
32
  Spectre.delegate :mixin, :run, :also, :step, to: Mixin
40
33
  end
41
34
  end
@@ -97,6 +97,7 @@ module Spectre::Reporter
97
97
  str += " line.....: #{line}\n"
98
98
  str += " type.....: #{error.class}\n"
99
99
  str += " message..: #{error.message}\n"
100
+ str += " backtrace: \n #{error.backtrace.join("\n ")}\n" if @config['debug']
100
101
  str
101
102
  end
102
103
  end
@@ -57,6 +57,7 @@ module Spectre::Reporter
57
57
 
58
58
  if run_info.log.count > 0 or run_info.properties.count > 0 or run_info.data
59
59
  xml_str += '<system-out>'
60
+ xml_str += '<![CDATA['
60
61
 
61
62
  if run_info.properties.count > 0
62
63
  run_info.properties.each do |key, val|
@@ -75,6 +76,7 @@ module Spectre::Reporter
75
76
  xml_str += messages.join("\n")
76
77
  end
77
78
 
79
+ xml_str += ']]>'
78
80
  xml_str += '</system-out>'
79
81
  end
80
82
 
data/lib/spectre.rb CHANGED
@@ -1,8 +1,8 @@
1
1
  module Spectre
2
2
  module Version
3
3
  MAJOR = 1
4
- MINOR = 8
5
- TINY = 3
4
+ MINOR = 11
5
+ TINY = 0
6
6
  end
7
7
 
8
8
  VERSION = [Version::MAJOR, Version::MINOR, Version::TINY].compact * '.'
@@ -31,20 +31,20 @@ module Spectre
31
31
  # https://www.dan-manges.com/blog/ruby-dsls-instance-eval-with-delegation
32
32
  class DslClass
33
33
  def _evaluate &block
34
- @__bound_self__ = eval 'self', block.binding
34
+ @__bound_self__ = eval('self', block.binding)
35
35
  instance_eval(&block)
36
36
  end
37
37
 
38
38
  def _execute args, &block
39
- @__bound_self__ = eval 'self', block.binding
39
+ @__bound_self__ = eval('self', block.binding)
40
40
  instance_exec(args, &block)
41
41
  end
42
42
 
43
43
  def method_missing method, *args, **kwargs, &block
44
44
  if @__bound_self__.respond_to? method
45
- @__bound_self__.send method, *args, **kwargs, &block
45
+ @__bound_self__.send(method, *args, **kwargs, &block)
46
46
  else
47
- Delegator.redirect method, *args, **kwargs, &block
47
+ Delegator.redirect(method, *args, **kwargs, &block)
48
48
  end
49
49
  end
50
50
  end
@@ -151,7 +151,7 @@ module Spectre
151
151
 
152
152
  begin
153
153
  specs.each do |spec|
154
- if spec.data.length > 0
154
+ if spec.data.any?
155
155
  spec.data.each do |data|
156
156
  Logger.log_spec(spec, data) do
157
157
  runs << run_spec(spec, data)
@@ -208,7 +208,7 @@ module Spectre
208
208
  end
209
209
 
210
210
  def run_spec spec, data=nil
211
- run_info = RunInfo.new spec, data
211
+ run_info = RunInfo.new(spec, data)
212
212
 
213
213
  @@current = run_info
214
214
 
@@ -216,16 +216,16 @@ module Spectre
216
216
 
217
217
  begin
218
218
  if spec.context.__before_blocks.count > 0
219
- before_ctx = SpecContext.new spec.subject, 'before'
219
+ before_ctx = SpecContext.new(spec.subject, 'before')
220
220
 
221
221
  Logger.log_context before_ctx do
222
222
  spec.context.__before_blocks.each do |block|
223
- block.call data
223
+ block.call(data)
224
224
  end
225
225
  end
226
226
  end
227
227
 
228
- spec.block.call data
228
+ spec.block.call(data)
229
229
 
230
230
  rescue ExpectationFailure => e
231
231
  run_info.failure = e
@@ -240,7 +240,7 @@ module Spectre
240
240
 
241
241
  ensure
242
242
  if spec.context.__after_blocks.count > 0
243
- after_ctx = SpecContext.new spec.subject, 'after'
243
+ after_ctx = SpecContext.new(spec.subject, 'after')
244
244
 
245
245
  Logger.log_context after_ctx do
246
246
  begin
@@ -306,7 +306,11 @@ module Spectre
306
306
  .first
307
307
  end
308
308
 
309
- @__subject.add_spec(desc, tags, with, block, self, spec_file)
309
+ raise "`with' has to be an Array" unless with.is_a? Array
310
+
311
+ data = with.map { |x| x.is_a?(Hash) ? OpenStruct.new(x) : x }
312
+
313
+ @__subject.add_spec(desc, tags, data, block, self, spec_file)
310
314
  end
311
315
 
312
316
  def before &block
metadata CHANGED
@@ -1,85 +1,43 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: spectre-core
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.8.3
4
+ version: 1.11.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Christian Neubauer
8
- autorequire:
8
+ autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2021-05-19 00:00:00.000000000 Z
11
+ date: 2021-09-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: ectoplasm
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - "~>"
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: 1.1.0
20
- type: :runtime
21
- prerelease: false
22
- version_requirements: !ruby/object:Gem::Requirement
23
- requirements:
24
- - - "~>"
25
- - !ruby/object:Gem::Version
26
- version: 1.1.0
27
- - !ruby/object:Gem::Dependency
28
- name: openssl
29
- requirement: !ruby/object:Gem::Requirement
30
- requirements:
31
- - - "~>"
32
- - !ruby/object:Gem::Version
33
- version: 2.2.0
19
+ version: 1.2.0
34
20
  type: :runtime
35
21
  prerelease: false
36
22
  version_requirements: !ruby/object:Gem::Requirement
37
23
  requirements:
38
- - - "~>"
24
+ - - ">="
39
25
  - !ruby/object:Gem::Version
40
- version: 2.2.0
26
+ version: 1.2.0
41
27
  - !ruby/object:Gem::Dependency
42
- name: net-ssh
28
+ name: jsonpath
43
29
  requirement: !ruby/object:Gem::Requirement
44
30
  requirements:
45
- - - "~>"
46
- - !ruby/object:Gem::Version
47
- version: 6.1.0
48
- type: :runtime
49
- prerelease: false
50
- version_requirements: !ruby/object:Gem::Requirement
51
- requirements:
52
- - - "~>"
31
+ - - ">="
53
32
  - !ruby/object:Gem::Version
54
- version: 6.1.0
55
- - !ruby/object:Gem::Dependency
56
- name: net-sftp
57
- requirement: !ruby/object:Gem::Requirement
58
- requirements:
59
- - - "~>"
60
- - !ruby/object:Gem::Version
61
- version: 3.0.0
62
- type: :runtime
63
- prerelease: false
64
- version_requirements: !ruby/object:Gem::Requirement
65
- requirements:
66
- - - "~>"
67
- - !ruby/object:Gem::Version
68
- version: 3.0.0
69
- - !ruby/object:Gem::Dependency
70
- name: mysql2
71
- requirement: !ruby/object:Gem::Requirement
72
- requirements:
73
- - - "~>"
74
- - !ruby/object:Gem::Version
75
- version: 0.5.3
33
+ version: 1.1.0
76
34
  type: :runtime
77
35
  prerelease: false
78
36
  version_requirements: !ruby/object:Gem::Requirement
79
37
  requirements:
80
- - - "~>"
38
+ - - ">="
81
39
  - !ruby/object:Gem::Version
82
- version: 0.5.3
40
+ version: 1.1.0
83
41
  description: A DSL and command line tool to describe and run automated tests
84
42
  email:
85
43
  - me@christianneubauer.de
@@ -93,10 +51,8 @@ files:
93
51
  - lib/spectre/assertion.rb
94
52
  - lib/spectre/bag.rb
95
53
  - lib/spectre/curl.rb
96
- - lib/spectre/database/postgres.rb
97
54
  - lib/spectre/diagnostic.rb
98
55
  - lib/spectre/environment.rb
99
- - lib/spectre/ftp.rb
100
56
  - lib/spectre/helpers.rb
101
57
  - lib/spectre/http.rb
102
58
  - lib/spectre/http/basic_auth.rb
@@ -105,20 +61,18 @@ files:
105
61
  - lib/spectre/logger/console.rb
106
62
  - lib/spectre/logger/file.rb
107
63
  - lib/spectre/mixin.rb
108
- - lib/spectre/mysql.rb
109
64
  - lib/spectre/reporter/console.rb
110
65
  - lib/spectre/reporter/junit.rb
111
66
  - lib/spectre/resources.rb
112
- - lib/spectre/ssh.rb
113
- homepage: https://bitbucket.org/cneubaur/spectre-core
67
+ homepage: https://github.com/cneubauer/spectre-core
114
68
  licenses:
115
69
  - MIT
116
70
  metadata:
117
71
  allowed_push_host: https://rubygems.org/
118
- homepage_uri: https://bitbucket.org/cneubaur/spectre-core
119
- source_code_uri: https://bitbucket.org/cneubaur/spectre-core
120
- changelog_uri: https://bitbucket.org/cneubaur/spectre-core/src/master/CHANGELOG.md
121
- post_install_message:
72
+ homepage_uri: https://github.com/cneubauer/spectre-core
73
+ source_code_uri: https://github.com/cneubauer/spectre-core
74
+ changelog_uri: https://github.com/cneubauer/spectre-core/blob/master/CHANGELOG.md
75
+ post_install_message:
122
76
  rdoc_options: []
123
77
  require_paths:
124
78
  - lib
@@ -133,8 +87,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
133
87
  - !ruby/object:Gem::Version
134
88
  version: '0'
135
89
  requirements: []
136
- rubygems_version: 3.2.3
137
- signing_key:
90
+ rubygems_version: 3.0.8
91
+ signing_key:
138
92
  specification_version: 4
139
93
  summary: Describe and run automated tests
140
94
  test_files: []
@@ -1,78 +0,0 @@
1
- require 'pg'
2
-
3
-
4
- class PG::Result
5
- alias :count :ntuples
6
- end
7
-
8
-
9
- module Spectre
10
- module Database
11
- module Postgres
12
- @@modules = []
13
-
14
- class SQLStatement
15
- attr_accessor :query, :params
16
-
17
- def initialize
18
- @query = nil
19
- @params = []
20
- end
21
-
22
- def statement query
23
- @query = query
24
- end
25
-
26
- def param val
27
- @params << val
28
- end
29
- end
30
-
31
-
32
- class << self
33
- def postgres name, &block
34
- raise "postgres '#{name}' not configured" unless @@db_cfg.key? name
35
-
36
- statement = SQLStatement.new
37
- statement.instance_eval &block
38
-
39
- cfg = @@db_cfg[name]
40
-
41
- begin
42
- con = PG.connect({
43
- host: cfg['host'],
44
- port: cfg['port'],
45
- dbname: cfg['database'],
46
- user: cfg['username'],
47
- password: cfg['username'],
48
- })
49
-
50
- if statement.params
51
- @@result = con.exec_params(statement.query, statement.params)
52
- else
53
- @@result = con.exec(statement.query)
54
- end
55
-
56
- ensure
57
- con.close if con
58
- end
59
- end
60
-
61
-
62
- def result
63
- @@result
64
- end
65
- end
66
-
67
- Spectre.register do |config|
68
- @@db_cfg = {}
69
-
70
- config['postgres'].each do |name, cfg|
71
- @@db_cfg[name] = cfg
72
- end
73
- end
74
-
75
- Spectre.delegate :postgres, :result, to: self
76
- end
77
- end
78
- end