class Workarea::Api::DocumentationTest

Constants

IGNORED_HEADERS

Public Class Methods

build_index(engine) click to toggle source
# File lib/workarea/api/documentation_test.rb, line 76
def build_index(engine)
  results = { 'resources' => [] }
  root = docs_root.join(engine)

  FileUtils.mkdir_p(root)
  begin
    FileUtils.rm(root.join('index.json'))
  rescue
    nil
  end

  Dir.glob(root.join('**/*.json')) do |file|
    example = JSON.parse(File.read(file))

    existing_resource = results['resources'].detect do |resource|
      resource['name'] == example['resource']
    end

    index_example = {
      'description' => example['description'],
      'link' => file.to_s.gsub("#{docs_root}/", ''),
      'groups' => 'all',
      'route' => example['route'],
      'method' => example['http_method']
    }

    if existing_resource.present?
      existing_resource['examples'] << index_example
    else
      results['resources'] << {
        'name' => example['resource'],
        'examples' => [index_example]
      }
    end
  end

  results['resources'].sort_by! { |r| r['name'] }
  results['resources'].each { |r| r['examples'].sort_by! { |e| e['description'] } }

  File.open(root.join('index.json'), 'w') do |file|
    file.write(JSON.pretty_generate(results))
  end
end
docs_dir() click to toggle source
# File lib/workarea/api/documentation_test.rb, line 68
def docs_dir
  docs_root.join(engine, resource.systemize)
end
docs_root() click to toggle source
# File lib/workarea/api/documentation_test.rb, line 56
def docs_root
  @docs_root ||= if running_in_gem?
    Workarea::Api.root.join('doc', 'api')
  else
    Rails.root.join('doc', 'api')
  end
end
engine() click to toggle source
# File lib/workarea/api/documentation_test.rb, line 72
def engine
  name.split('::')[-2].downcase
end
resource(val = nil) click to toggle source
# File lib/workarea/api/documentation_test.rb, line 52
def resource(val = nil)
  @resource = val || @resource
end
running_in_gem?() click to toggle source
# File lib/workarea/api/documentation_test.rb, line 64
def running_in_gem?
  Rails.root.to_s.include?('test/dummy')
end

Public Instance Methods

method_missing(method_name, *args, &block) click to toggle source
Calls superclass method
# File lib/workarea/api/documentation_test.rb, line 128
def method_missing(method_name, *args, &block)
  if @example.respond_to?("#{method_name}=")
    @example.send("#{method_name}=", *args)
  else
    super
  end
end
parameter(name, description) click to toggle source
# File lib/workarea/api/documentation_test.rb, line 124
def parameter(name, description)
  @example.parameters << { name: name, description: description }
end
record_request() { || ... } click to toggle source
# File lib/workarea/api/documentation_test.rb, line 140
def record_request
  yield

  @example.http_method = request.method.upcase if @example.http_method.blank?
  headers = env_to_headers(request.env)
  request_body = read_request_body

  doc_request = Request.new
  doc_request.request_method = request.method
  doc_request.request_path = request.fullpath
  doc_request.request_body = request_body.empty? ? nil : request_body.force_encoding('UTF-8')
  doc_request.request_headers = headers
  doc_request.request_query_parameters = request.query_parameters
  doc_request.request_content_type = headers['Content-Type']
  doc_request.response_status = response.status
  doc_request.response_status_text = response.message
  doc_request.response_body = formatted_response_body
  doc_request.response_headers = filtered_response_headers
  doc_request.response_content_type = response.content_type

  curl = Curl.new(request.method, request.fullpath, request_body, headers)
  doc_request.curl = curl.output("https://#{Workarea.config.host}")

  @example.requests << doc_request
end
respond_to?(method_name, include_private = false) click to toggle source
Calls superclass method
# File lib/workarea/api/documentation_test.rb, line 136
def respond_to?(method_name, include_private = false)
  @example.respond_to?("#{method_name}=") || super
end

Private Instance Methods

env_to_headers(env) click to toggle source
# File lib/workarea/api/documentation_test.rb, line 204
def env_to_headers(env)
  headers = {}
  env.each do |key, value|
    if key =~ /^(HTTP_|CONTENT_TYPE)/
      header = key.gsub(/^HTTP_/, '').split('_').map { |s| s.titleize }.join('-')

      if value.present? && !IGNORED_HEADERS.include?(header)
        headers[header] = value
      end
    end
  end
  headers
end
filtered_response_headers() click to toggle source
# File lib/workarea/api/documentation_test.rb, line 200
def filtered_response_headers
  response.headers.except(*Workarea.config.suppress_api_response_headers)
end
formatted_response_body() click to toggle source
# File lib/workarea/api/documentation_test.rb, line 188
def formatted_response_body
  return nil if response.body.empty?

  if response.body.encoding == Encoding::ASCII_8BIT
    '[binary data]'
  elsif response.content_type =~ %r{application/json}
    JSON.pretty_generate(JSON.parse(response.body))
  else
    response.body
  end
end
read_request_body() click to toggle source
# File lib/workarea/api/documentation_test.rb, line 182
def read_request_body
  input = request.env['rack.input']
  input.rewind
  input.read
end
save_example() click to toggle source
# File lib/workarea/api/documentation_test.rb, line 173
def save_example
  if passed? && ENV['GENERATE_API_DOCS']
    FileUtils.mkdir_p(self.class.docs_dir)
    File.open(self.class.docs_dir.join(@example.file_name), 'w') do |file|
      file.write(JSON.pretty_generate(JSON.parse(@example.to_json)))
    end
  end
end
setup_example() click to toggle source
# File lib/workarea/api/documentation_test.rb, line 168
def setup_example
  @example = Example.new
  @example.resource = self.class.resource
end