api_mini_tester 0.1.7 → 0.1.8

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