spectre-core 1.8.3 → 1.11.0

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