class JsonapiSpecHelpers::PayloadSanitizer

Public Class Methods

new(payload) click to toggle source
# File lib/jsonapi_spec_helpers/payload_sanitizer.rb, line 3
def initialize(payload)
  @payload = payload
  @included = []
end

Public Instance Methods

add_include(incl) click to toggle source
# File lib/jsonapi_spec_helpers/payload_sanitizer.rb, line 34
def add_include(incl)
  @included.push(incl) if @included.index(incl).nil?
end
data() click to toggle source
# File lib/jsonapi_spec_helpers/payload_sanitizer.rb, line 45
def data
  @data ||= {}.tap do |d|
    d[:id]         = resource[:id] if resource[:id]
    d[:type]       = resource[:type]
    d[:attributes] = resource[:attributes]
  end
end
included() click to toggle source
# File lib/jsonapi_spec_helpers/payload_sanitizer.rb, line 30
def included
  @included
end
resource() click to toggle source
# File lib/jsonapi_spec_helpers/payload_sanitizer.rb, line 8
def resource
  @resource ||= sane_resource(@payload)
end
resource_identifier() click to toggle source
# File lib/jsonapi_spec_helpers/payload_sanitizer.rb, line 38
def resource_identifier
  {}.tap do |ri|
    ri[:id]   = resource[:id] if resource[:id]
    ri[:type] = resource[:type]
  end
end
sanitize() click to toggle source
# File lib/jsonapi_spec_helpers/payload_sanitizer.rb, line 12
def sanitize
  resource[:relationships].each_pair do |key, relationship_payload|
    set_default_relationship_payload(key, relationship_payload)

    if relationship_payload.is_a?(Array)
      relationship_payload.each do |p|
        process_relationship(key, p)
      end
    else
      process_relationship(key, relationship_payload)
    end
  end

  payload = { data: data }
  payload[:included] = @included
  payload
end

Private Instance Methods

process_relationship(name, relationship_payload) click to toggle source
# File lib/jsonapi_spec_helpers/payload_sanitizer.rb, line 64
def process_relationship(name, relationship_payload)
  sanitizer = self.class.new(relationship_payload)

  if data[:relationships][name][:data].is_a?(Array)
    data[:relationships][name][:data] << sanitizer.resource_identifier
  else
    data[:relationships][name] = { data: sanitizer.resource_identifier }
  end

  sanitized = sanitizer.sanitize
  add_include(sanitized[:data])
  sanitized[:included].each do |incl|
    add_include(incl)
  end
end
sane_resource(payload) click to toggle source
# File lib/jsonapi_spec_helpers/payload_sanitizer.rb, line 80
def sane_resource(payload)
  id, type = payload.delete(:id), payload.delete(:type)
  relationships = payload.delete(:relationships) || {}
  raise 'jsonapi payloads must specify a "type"' if type.nil?

  {
    id: id,
    type: type,
    attributes: payload,
    relationships: relationships
  }
end
set_default_relationship_payload(key, payload) click to toggle source
# File lib/jsonapi_spec_helpers/payload_sanitizer.rb, line 55
def set_default_relationship_payload(key, payload)
  data[:relationships] ||= {}
  if payload.is_a?(Array)
    data[:relationships][key] ||= { data: [] }
  else
    data[:relationships][key] ||= { data: nil }
  end
end