Class: Apib::MockServer
- Inherits:
-
Object
- Object
- Apib::MockServer
- Defined in:
- lib/apib/mock_server.rb,
lib/apib/mock_server/version.rb
Overview
Rack compatible mock server from an API Blueprint document.
Example:
require "apib/mock_server"
require "webmock"
base_url = "http://test.com"
blueprint = Rails.root.join("api-blueprints", "my.apib").read
app = Apib::MockServer.new(base_url, blueprint)
WebMock::StubRegistry.instance.register_request_stub(
WebMock::RequestStub.new(:any, /#{base_url}/)
).to_rack(app)
Constant Summary collapse
- VERSION =
"1.0.1"
Instance Method Summary collapse
- #call(env) ⇒ Object
- #headers(response) ⇒ Object
-
#initialize(base_url, blueprint) ⇒ MockServer
constructor
A new instance of MockServer.
- #match(request) ⇒ Object
- #responses(action) ⇒ Object
Constructor Details
#initialize(base_url, blueprint) ⇒ MockServer
Returns a new instance of MockServer.
20 21 22 23 24 25 26 27 |
# File 'lib/apib/mock_server.rb', line 20 def initialize(base_url, blueprint) @mocks = {} ast(blueprint).resource_groups.flat_map(&:resources).each do |resource| uri_template = Addressable::Template.new(base_url.to_s + resource.uri_template) @mocks[uri_template] = resource.actions.map { |a| [a.method, a] }.to_h end end |
Instance Method Details
#call(env) ⇒ Object
29 30 31 32 33 34 |
# File 'lib/apib/mock_server.rb', line 29 def call(env) request = Rack::Request.new(env) action = match(request) return [404, {}, []] unless action responses(action).first || [500, {}, []] end |
#headers(response) ⇒ Object
47 48 49 |
# File 'lib/apib/mock_server.rb', line 47 def headers(response) response.headers.collection.map { |h| [h[:name], h[:value]] }.to_h end |
#match(request) ⇒ Object
36 37 38 39 |
# File 'lib/apib/mock_server.rb', line 36 def match(request) template = @mocks.keys.find { |uri| uri.match(request.url) } @mocks[template][request.request_method] if template end |
#responses(action) ⇒ Object
41 42 43 44 45 |
# File 'lib/apib/mock_server.rb', line 41 def responses(action) action.examples.flat_map(&:responses).map do |response| [response.name.to_i, headers(response), [response.body]] end end |