api_sim 3.1.0 → 3.2.0
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/README.md +8 -0
- data/lib/api_sim/app_builder.rb +3 -2
- data/lib/api_sim/built_app.rb +24 -12
- data/lib/api_sim/matchers/base_matcher.rb +1 -0
- data/lib/api_sim/matchers/static_request_matcher.rb +10 -9
- data/lib/api_sim/matchers.rb +2 -1
- data/lib/api_sim/version.rb +1 -1
- data/lib/api_sim/views/responses/form.html.erb +5 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 39744282ba52dd613a6cd9481717892a39482f3b
|
4
|
+
data.tar.gz: 67e3e2d58c0e5e2110521924ddc5c99114a5ce83
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a88815795d88e7c6f6adc25dfff2b2e7f79c1eda450079d212e7f7fddab4adb20ffc29e2a5b9aa50aee4bbc81c14f67c9ebf92ca1d842740c3ff8394c9dc0348
|
7
|
+
data.tar.gz: 738f62d178070ebebe67302d4762aae8c40c34eb8c74834520a3654e2b9bc3139f67edda7c9ad5a9902f56bff186f25a7674f540875eb89450f3e693bed29a40
|
data/README.md
CHANGED
@@ -52,6 +52,14 @@ cd examples/basic && bundle check || bundle install && bundle exec rackup -I../.
|
|
52
52
|
|
53
53
|
After which the simulators should be running on port 9292.
|
54
54
|
|
55
|
+
## API
|
56
|
+
|
57
|
+
The API that these simulators generate can get pretty smart. To help you, the user,
|
58
|
+
distinguish between failures and "smarts", we've made up an HTTP status code: 498.
|
59
|
+
This code means "we received a request that did not match an expected schema". If you
|
60
|
+
provide the simulators with a request schema for an endpoint, all requests must match
|
61
|
+
that schema. If they do not, they'll receive our fictional status code.
|
62
|
+
|
55
63
|
## Development
|
56
64
|
|
57
65
|
After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
|
data/lib/api_sim/app_builder.rb
CHANGED
@@ -12,7 +12,7 @@ module ApiSim
|
|
12
12
|
end
|
13
13
|
end
|
14
14
|
|
15
|
-
def configure_endpoint(http_method, route, response_body, response_code=200, headers={}, schema_string='')
|
15
|
+
def configure_endpoint(http_method, route, response_body, response_code=200, headers={}, schema_string='', request_schema: nil)
|
16
16
|
endpoint_configurations.push(
|
17
17
|
Matchers::StaticRequestMatcher.new(
|
18
18
|
http_method: http_method,
|
@@ -21,7 +21,8 @@ module ApiSim
|
|
21
21
|
headers: headers,
|
22
22
|
default: true,
|
23
23
|
response_body: response_body,
|
24
|
-
schema: schema_string
|
24
|
+
schema: schema_string,
|
25
|
+
request_schema: request_schema
|
25
26
|
)
|
26
27
|
)
|
27
28
|
end
|
data/lib/api_sim/built_app.rb
CHANGED
@@ -41,7 +41,6 @@ module ApiSim
|
|
41
41
|
return erb :'responses/form.html', layout: :'layout.html'
|
42
42
|
end
|
43
43
|
end
|
44
|
-
|
45
44
|
new_config = create_matcher_override(mimicked_request)
|
46
45
|
|
47
46
|
self.class.endpoints.unshift(new_config)
|
@@ -69,11 +68,10 @@ module ApiSim
|
|
69
68
|
''
|
70
69
|
end
|
71
70
|
|
72
|
-
|
73
71
|
get '/requests/*' do
|
74
72
|
endpoint_name = parse_endpoint_from_request(request) || halt(404)
|
75
|
-
http_method
|
76
|
-
endpoint
|
73
|
+
http_method = params.fetch('method', 'GET')
|
74
|
+
endpoint = find_matching_endpoint(endpoint_name, http_method)
|
77
75
|
|
78
76
|
halt(404) unless endpoint
|
79
77
|
endpoint.requests.to_json
|
@@ -82,6 +80,7 @@ module ApiSim
|
|
82
80
|
%i(get post put patch delete options).each do |http_method|
|
83
81
|
public_send(http_method, '/*') do
|
84
82
|
endpoint = matcher(request)
|
83
|
+
halt(498) unless schema_validates?(endpoint)
|
85
84
|
endpoint.record_request(request)
|
86
85
|
endpoint.response(request)
|
87
86
|
end
|
@@ -95,12 +94,12 @@ module ApiSim
|
|
95
94
|
end
|
96
95
|
|
97
96
|
case matching_endpoints.size
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
97
|
+
when 0
|
98
|
+
nil
|
99
|
+
when 1
|
100
|
+
matching_endpoints.first
|
101
|
+
else
|
102
|
+
matching_endpoints.find { |endpoint| endpoint.http_method =~ /#{http_method}/i }
|
104
103
|
end
|
105
104
|
end
|
106
105
|
|
@@ -121,7 +120,8 @@ module ApiSim
|
|
121
120
|
headers: parsed_body.fetch('headers', old_config[1]),
|
122
121
|
response_body: parsed_body.fetch('body', old_config[2]),
|
123
122
|
matcher: parsed_body.fetch('match', ''),
|
124
|
-
schema: parsed_body.fetch('schema', '')
|
123
|
+
schema: parsed_body.fetch('schema', ''),
|
124
|
+
request_schema: parsed_body.fetch('request-schema', nil)
|
125
125
|
)
|
126
126
|
end
|
127
127
|
|
@@ -172,8 +172,20 @@ module ApiSim
|
|
172
172
|
end
|
173
173
|
|
174
174
|
def parse_endpoint_from_request(request)
|
175
|
-
path_matcher
|
175
|
+
path_matcher = request.path.match(/\/requests\/([\w\/_-]*)/)
|
176
176
|
path_matcher.size == 2 ? path_matcher[1] : nil
|
177
177
|
end
|
178
|
+
|
179
|
+
def schema_validates?(endpoint)
|
180
|
+
if blank?(endpoint.request_schema) || request.env['CONTENT_TYPE'] != 'application/json'
|
181
|
+
true
|
182
|
+
else
|
183
|
+
JSON::Validator.validate_json(JSON.parse(endpoint.request_schema), parsed_body.to_json)
|
184
|
+
end
|
185
|
+
end
|
186
|
+
|
187
|
+
def blank?(item)
|
188
|
+
item.nil? || item.empty?
|
189
|
+
end
|
178
190
|
end
|
179
191
|
end
|
@@ -6,15 +6,16 @@ module ApiSim
|
|
6
6
|
class StaticRequestMatcher < BaseMatcher
|
7
7
|
attr_reader :http_method, :route, :headers, :response_code, :matcher, :response_body, :default, :schema
|
8
8
|
|
9
|
-
def initialize(
|
10
|
-
@default = default
|
11
|
-
@matcher = matcher
|
12
|
-
@headers = headers
|
13
|
-
@response_body = response_body
|
14
|
-
@response_code = response_code
|
15
|
-
@route = route
|
16
|
-
@http_method = http_method
|
17
|
-
@schema = schema
|
9
|
+
def initialize(**args)
|
10
|
+
@default = args.fetch(:default, false)
|
11
|
+
@matcher = args.fetch(:matcher, ALWAYS_TRUE_MATCHER)
|
12
|
+
@headers = args.fetch(:headers, {})
|
13
|
+
@response_body = args.fetch(:response_body, '')
|
14
|
+
@response_code = args.fetch(:response_code, 200)
|
15
|
+
@route = args.fetch(:route)
|
16
|
+
@http_method = args.fetch(:http_method)
|
17
|
+
@schema = args.fetch(:schema, nil)
|
18
|
+
@request_schema = args.fetch(:request_schema, nil)
|
18
19
|
end
|
19
20
|
|
20
21
|
def matches?(request)
|
data/lib/api_sim/matchers.rb
CHANGED
@@ -18,7 +18,7 @@ module ApiSim
|
|
18
18
|
response_code: overrides.fetch(:response_code),
|
19
19
|
headers: overrides.fetch(:headers),
|
20
20
|
response_body: overrides.fetch(:response_body),
|
21
|
-
body_matches: overrides.fetch('matcher', old_matcher.matcher)
|
21
|
+
body_matches: overrides.fetch('matcher', old_matcher.matcher),
|
22
22
|
)
|
23
23
|
else
|
24
24
|
Matchers::StaticRequestMatcher.new(
|
@@ -28,6 +28,7 @@ module ApiSim
|
|
28
28
|
headers: overrides.fetch(:headers),
|
29
29
|
response_body: overrides.fetch(:response_body),
|
30
30
|
schema: overrides.fetch(:schema),
|
31
|
+
request_schema: overrides.fetch(:request_schema)
|
31
32
|
)
|
32
33
|
end
|
33
34
|
end
|
data/lib/api_sim/version.rb
CHANGED
@@ -32,7 +32,11 @@
|
|
32
32
|
|
33
33
|
<div class="form-group">
|
34
34
|
<label for="schema">Response schema</label>
|
35
|
-
<textarea type="text" class="form-control" id="schema" name="schema" data-prettify rows="25"><%= h (params[
|
35
|
+
<textarea type="text" class="form-control" id="schema" name="schema" data-prettify rows="25"><%= h (params[:schema] || config.schema) %></textarea>
|
36
|
+
</div>
|
37
|
+
<div class="form-group">
|
38
|
+
<label for="request-schema">Request schema</label>
|
39
|
+
<textarea class="form-control" id="request-schema" name="request-schema" data-prettify rows="12"><%= h (params[:request_schema] || config.request_schema) %></textarea>
|
36
40
|
</div>
|
37
41
|
</div>
|
38
42
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: api_sim
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.
|
4
|
+
version: 3.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- TJ Taylor
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-10-06 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: sinatra
|