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 +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
|