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 +4 -4
- data/lib/api_mini_tester/test_scenario.rb +6 -4
- data/lib/api_mini_tester/test_step.rb +70 -4
- data/lib/api_mini_tester/test_suite.rb +4 -2
- metadata +25 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ef4e57833b153a87f182b19386eff11bece566d1
|
4
|
+
data.tar.gz: 5917cd74ed03cc1f52fa505f245de80fecdb5fed
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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
|
-
@
|
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
|
-
|
17
|
-
|
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.
|
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.
|
59
|
+
version: 0.0.3
|
60
60
|
- - ">="
|
61
61
|
- !ruby/object:Gem::Version
|
62
|
-
version: 0.0.
|
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.
|
69
|
+
version: 0.0.3
|
70
70
|
- - ">="
|
71
71
|
- !ruby/object:Gem::Version
|
72
|
-
version: 0.0.
|
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
|