module Swagalicious::ExampleHelpers

Public Instance Methods

app() click to toggle source
# File lib/swagalicious/example_helpers.rb, line 22
def app
  @app ||= Rack::Builder.parse_file("config.ru").first
end
client() click to toggle source
# File lib/swagalicious/example_helpers.rb, line 26
def client
  @client ||= Faraday.new do |b|
    b.adapter Faraday::Adapter::Rack, app
  end
end
submit_request(metadata, mocked: false, mock_name: nil) click to toggle source
# File lib/swagalicious/example_helpers.rb, line 32
def submit_request(metadata, mocked: false, mock_name: nil)
  request = RequestFactory.new.build_request(metadata, self)

  response = if mocked
               file_name = File.basename(mock_name || URI.parse(request[:path]).path)

               MockResponse.new(file_name)
             else
               client.public_send(request[:verb]) do |req|
                 req.url request[:path].gsub("//", "/")
                 req.headers = request[:headers]
                 req.body    = request[:payload]
               end
             end

  body = response.body
  body = "{}" if body.empty?

  @body = Oj.load(body, symbol_keys: true)

  metadata[:paths] ||= []
  metadata[:paths] << request[:path]

  metadata[:response][:requestBody] ||= {}
  metadata[:response][:examples]    ||= {}

  mime_types = metadata[:response][:produces]  || ["application/json"]
  full_title = metadata[:swagger_example_name] || "#{metadata[:operation][:summary]}: #{metadata[:description]}"

  mime_types.each do |mime_type|
    if request[:payload]
      metadata[:response][:requestBody][:content]                                   ||= {}
      metadata[:response][:requestBody][:content][mime_type]                        ||= {}
      metadata[:response][:requestBody][:content][mime_type][:examples]             ||= {}
      metadata[:response][:requestBody][:content][mime_type][:examples][full_title] ||= {}

      metadata[:response][:requestBody][:content][mime_type][:examples][full_title][:value] = Oj.load(request[:payload]).dup
    end

    metadata[:response][:examples][mime_type] ||= {}
    metadata[:response][:examples][mime_type][full_title] = @body
  end

  # Validates response matches the proper schema
  Swagalicious::ResponseValidator.new.validate!(metadata, response)

  response
end