api_mini_tester 0.1.7 → 0.1.8

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 752743d6f653d70a0cacccd9d6f77e63f73543d8
4
- data.tar.gz: 667f63a850caf1c8a506a326a83ce1b3056d5be3
3
+ metadata.gz: ef4e57833b153a87f182b19386eff11bece566d1
4
+ data.tar.gz: 5917cd74ed03cc1f52fa505f245de80fecdb5fed
5
5
  SHA512:
6
- metadata.gz: 37872554d04c837db0469377e812dcce573f4e5420d9fb948e042736420349d777f4af4fdc9e3e00d0e17bfb3a395c6dc132d1dabcdfd684ab30305b30002c8b
7
- data.tar.gz: 88aebe243a2e179c5ae3f5a456ae86adc3043bae6567929fff38d8d15092b74f8fd375139fa6781b7f064010f46aefd65e9b0f25528b290477f7c8c7f8337a97
6
+ metadata.gz: fb624ba3f8e97ecb8d56cceab4b2bddab5fa7cf2a9ce4a454ffc7c1b17e4f908c726b28e7b0a9593fb1c0db1df92aa813c57f51c4f21423937dd2b3311d99cf4
7
+ data.tar.gz: b565f8d8cfcf2bb5dbe3d987e5a3b189ac6b8719750eba2e2ac5b59d4c592c593d88b62f0590b13923e31f13f82a86198727aac16bc7ce57a4288e9ca57b2499
@@ -3,14 +3,15 @@ require_relative 'test_step'
3
3
  module ApiMiniTester
4
4
  class TestScenario
5
5
 
6
- attr_reader :base_uri, :scenario, :data, :results, :name
6
+ attr_reader :base_uri, :scenario, :data, :results, :name, :defaults
7
7
 
8
- def initialize(base_uri, scenario, data)
8
+ def initialize(base_uri, scenario, data, defaults)
9
9
  @base_uri = base_uri
10
10
  @scenario = scenario
11
11
  @data = data
12
12
  @name = scenario['name']
13
- @results = {name: scenario['name'], desc: scenario['desc'], steps: []}
13
+ @defaults = defaults
14
+ @results = {name: @name, desc: scenario['desc'], steps: []}
14
15
  end
15
16
 
16
17
  def valid?
@@ -18,6 +19,7 @@ module ApiMiniTester
18
19
  return false unless scenario['steps'].is_a?(Array) || scenario['steps'].empty?
19
20
  return false if name.nil? || name.empty?
20
21
  return false if base_uri.nil? || base_uri.empty?
22
+
21
23
  true
22
24
  end
23
25
 
@@ -34,7 +36,7 @@ module ApiMiniTester
34
36
  def run_scenario
35
37
  @context = []
36
38
  scenario['steps'].each do |step|
37
- step = TestStep.new(base_uri, step, @context, data)
39
+ step = TestStep.new(base_uri, step, @context, data, defaults)
38
40
  step_result, context = step.run_step
39
41
  @results[:steps] << step_result
40
42
  @context << context
@@ -3,24 +3,36 @@ require 'liquid'
3
3
  require 'hash_parser'
4
4
  require 'uri'
5
5
  require 'json'
6
+ require 'distribution'
6
7
  require_relative 'test_faker_filter'
7
8
 
8
-
9
9
  module ApiMiniTester
10
10
  class TestStep
11
11
 
12
12
  include HTTParty
13
13
 
14
14
  SUPPORTED_METHODS = %i[ get post put delete ].freeze
15
+ SUPPORTED_RANDOM_DISTRIBUTION = %w[ static norm uniform ].freeze
16
+
17
+ attr_accessor :name, :input, :output
18
+ attr_reader :results, :sleeps, :method, :uri
15
19
 
16
- attr_accessor :uri, :method, :name, :input, :output
17
- attr_reader :results
20
+ def initialize(base_uri, step, context = nil, data = nil, defaults = nil)
21
+ step = step.deep_merge!(defaults) do |key, this_val, other_val|
22
+ if this_val.nil?
23
+ other_val
24
+ elsif this_val.is_a?(Array)
25
+ (this_val + other_val)
26
+ else
27
+ this_val
28
+ end
29
+ end if defaults
18
30
 
19
- def initialize(base_uri, step, context = nil, data = nil)
20
31
  Liquid::Template.register_filter(::TestFakerFilter)
21
32
  @context = context
22
33
  uri_template = Liquid::Template.parse([base_uri, step['uri']].join("/"), error_mode: :strict)
23
34
  @name = step['name']
35
+ @sleeps = step['sleep']
24
36
 
25
37
  @uri = uri_template.render(
26
38
  {'context' => context, 'data' => data},
@@ -40,9 +52,11 @@ module ApiMiniTester
40
52
 
41
53
  def valid?
42
54
  return false if uri.nil? || uri.empty?
55
+
43
56
  return false unless URI.parse(uri) rescue false
44
57
  return false unless SUPPORTED_METHODS.include? method
45
58
  return false if @name.nil? || @name.empty?
59
+
46
60
  true
47
61
  end
48
62
 
@@ -51,6 +65,7 @@ module ApiMiniTester
51
65
  end
52
66
 
53
67
  def headers
68
+ @input['header'] = {} unless @input['header']
54
69
  @input['header']['Content-type'] = content_type if content_type == 'application/json'
55
70
  @input['header']
56
71
  end
@@ -92,6 +107,10 @@ module ApiMiniTester
92
107
  end
93
108
 
94
109
  def run_step
110
+ if sleeps
111
+ step_sleep(sleeps['before']) if sleeps['before']
112
+ end
113
+
95
114
  @timing = Time.now
96
115
  case method
97
116
  when :get
@@ -105,6 +124,10 @@ module ApiMiniTester
105
124
  end
106
125
  @timing = Time.now - @timing
107
126
 
127
+ if sleeps
128
+ step_sleep(sleeps['after']) if sleeps['after']
129
+ end
130
+
108
131
  add_result :url, { result: true, desc: "Url: #{uri}" }
109
132
  add_result :method, { result: true, desc: "Method: #{method}" }
110
133
 
@@ -126,6 +149,23 @@ module ApiMiniTester
126
149
  @results[section] << result
127
150
  end
128
151
 
152
+ def step_sleep(params)
153
+ params['distribution'] = 'static' unless SUPPORTED_RANDOM_DISTRIBUTION.include?(params['distribution'])
154
+
155
+ t = begin
156
+ case params['distribution']
157
+ when 'static'
158
+ params['value']
159
+ when 'norm'
160
+ Distribution::Normal.rng(params['mean'], params['sigma'], srand).call
161
+ when 'uniform'
162
+ Random.new.rand(params['max'] - params['min']) + params['min']
163
+ end
164
+ end
165
+ puts "Sleeping for #{t} seconds"
166
+ sleep(t.to_f.abs) if t
167
+ end
168
+
129
169
  def assert_timing(runtime, limit = nil)
130
170
  limit ||= Float::INFINITY
131
171
  add_result :timing, { result: (runtime < limit),
@@ -143,6 +183,7 @@ module ApiMiniTester
143
183
 
144
184
  def assert_headers(response, output)
145
185
  return if output.nil?
186
+
146
187
  output.each do |k, v|
147
188
  add_result :headers, { result: (v == response[k]),
148
189
  name: "Header value: #{k} == #{v}",
@@ -189,6 +230,7 @@ module ApiMiniTester
189
230
 
190
231
  def hash_diff(a, b, path = nil, section = :body)
191
232
  return nil if a.nil? || b.nil?
233
+
192
234
  a.each_key do |k, v|
193
235
  current_path = [path, k].join('.')
194
236
  if b[k].nil?
@@ -208,3 +250,27 @@ module ApiMiniTester
208
250
  end
209
251
  end
210
252
  end
253
+
254
+ class Hash
255
+ def deep_merge(other_hash, &block)
256
+ dup.deep_merge!(other_hash, &block)
257
+ end
258
+
259
+ def deep_merge!(other_hash, &block)
260
+ other_hash.each_pair do |current_key, other_value|
261
+ this_value = self[current_key]
262
+
263
+ self[current_key] = begin
264
+ if this_value.is_a?(Hash) && other_value.is_a?(Hash)
265
+ this_value.deep_merge(other_value, &block)
266
+ elsif block_given? && key?(current_key)
267
+ block.call(current_key, this_value, other_value) # rubocop:disable Performance/RedundantBlockCall
268
+ else
269
+ other_value
270
+ end
271
+ end
272
+ end
273
+
274
+ self
275
+ end
276
+ end
@@ -5,7 +5,7 @@ require_relative 'test_formatter'
5
5
  module ApiMiniTester
6
6
  class TestSuite
7
7
 
8
- attr_reader :base_uri, :scenarios, :data, :results
8
+ attr_reader :base_uri, :scenarios, :data, :results, :defaults
9
9
 
10
10
  def initialize(suite_def)
11
11
  if suite_def.is_a?(String)
@@ -19,6 +19,7 @@ module ApiMiniTester
19
19
  def valid?
20
20
  return false if base_uri.nil? || base_uri.empty?
21
21
  return false if scenarios.nil? || scenarios.empty?
22
+
22
23
  true
23
24
  end
24
25
 
@@ -26,12 +27,13 @@ module ApiMiniTester
26
27
  @base_uri = @test['settings']['baseurl']
27
28
  @scenarios = @test['tests']
28
29
  @data = @test['data']
30
+ @defaults = @test['defaults']
29
31
  @results = {name: @test['name'], desc: @test['desc'], scenarios: []}
30
32
  end
31
33
 
32
34
  def run_scenarios
33
35
  scenarios.each do |scenario|
34
- runner = TestScenario.new(base_uri, scenario, data)
36
+ runner = TestScenario.new(base_uri, scenario, data, defaults)
35
37
  runner.run_scenario
36
38
  @results[:scenarios] << runner.results
37
39
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: api_mini_tester
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.7
4
+ version: 0.1.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jindrich Skupa (@eMan)
@@ -56,20 +56,20 @@ dependencies:
56
56
  requirements:
57
57
  - - "~>"
58
58
  - !ruby/object:Gem::Version
59
- version: 0.0.1
59
+ version: 0.0.3
60
60
  - - ">="
61
61
  - !ruby/object:Gem::Version
62
- version: 0.0.1
62
+ version: 0.0.3
63
63
  type: :runtime
64
64
  prerelease: false
65
65
  version_requirements: !ruby/object:Gem::Requirement
66
66
  requirements:
67
67
  - - "~>"
68
68
  - !ruby/object:Gem::Version
69
- version: 0.0.1
69
+ version: 0.0.3
70
70
  - - ">="
71
71
  - !ruby/object:Gem::Version
72
- version: 0.0.1
72
+ version: 0.0.3
73
73
  - !ruby/object:Gem::Dependency
74
74
  name: hash_parser
75
75
  requirement: !ruby/object:Gem::Requirement
@@ -130,6 +130,26 @@ dependencies:
130
130
  - - ">="
131
131
  - !ruby/object:Gem::Version
132
132
  version: 4.0.0
133
+ - !ruby/object:Gem::Dependency
134
+ name: distribution
135
+ requirement: !ruby/object:Gem::Requirement
136
+ requirements:
137
+ - - "~>"
138
+ - !ruby/object:Gem::Version
139
+ version: '0.7'
140
+ - - ">="
141
+ - !ruby/object:Gem::Version
142
+ version: 0.7.3
143
+ type: :runtime
144
+ prerelease: false
145
+ version_requirements: !ruby/object:Gem::Requirement
146
+ requirements:
147
+ - - "~>"
148
+ - !ruby/object:Gem::Version
149
+ version: '0.7'
150
+ - - ">="
151
+ - !ruby/object:Gem::Version
152
+ version: 0.7.3
133
153
  - !ruby/object:Gem::Dependency
134
154
  name: minitest
135
155
  requirement: !ruby/object:Gem::Requirement