JSONApi part1
This commit is contained in:
@@ -1,5 +1,6 @@
|
||||
FactoryGirl.define do
|
||||
factory :product_order do
|
||||
quantity 1
|
||||
association :order
|
||||
association :product
|
||||
end
|
||||
|
||||
@@ -0,0 +1,30 @@
|
||||
require 'spec_helper'
|
||||
|
||||
describe Users::OrderSerializer do
|
||||
let(:adapter){ ActiveModel::Serializer.config.adapter }
|
||||
it "does not perform extra queries" do
|
||||
l = create :list
|
||||
o1 = create :order, list: l
|
||||
create :product_order, order: o1
|
||||
create :product_order, order: o1
|
||||
o2 = create :order, list: l
|
||||
create :product_order, order: o2
|
||||
create :product_order, order: o2
|
||||
list = List.find(l.id)
|
||||
orders = list.orders.include_relation(:product_orders)
|
||||
#expect{ object_as_json orders }.not_to exceed_query_limit 0
|
||||
expect{ object_as_json orders }.not_to perform_any_queries
|
||||
result = object_as_json(orders)
|
||||
binding.pry
|
||||
#result[:included].size.should eq 4
|
||||
end
|
||||
|
||||
def object_as_json(obj)
|
||||
serializer = if obj.is_a?(Array)
|
||||
ActiveModel::Serializer::ArraySerializer.new(obj, serializer: described_class, add_included: true)
|
||||
else
|
||||
serializer = described_class.new(obj)
|
||||
end
|
||||
adapter.new(serializer, include: %w[product_orders]).as_json
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,88 @@
|
||||
$performed_queries = []
|
||||
CouchRest.class_eval do
|
||||
class << self
|
||||
alias_method :old_get, :get
|
||||
def get(uri, options={})
|
||||
$performed_queries << {url: uri, options: options} if is_query_uri?(uri)
|
||||
old_get(uri, options)
|
||||
end
|
||||
|
||||
def is_query_uri?(uri)
|
||||
return false if uri =~ /\/_design\/\w+$/ # request design doc
|
||||
return false if uri =~ /\/_uuids/
|
||||
true
|
||||
end
|
||||
end
|
||||
end
|
||||
# taken from: http://stackoverflow.com/questions/5490411/counting-the-number-of-queries-performed
|
||||
RSpec::Matchers.define :exceed_query_limit do |expected|
|
||||
|
||||
match do |block|
|
||||
query_count(&block) > expected
|
||||
end
|
||||
|
||||
failure_message_when_negated do |actual|
|
||||
extra_queries = $performed_queries[expected..-1].map{|q| q[:url]}.map do |q|
|
||||
if q =~ /5984\/\w+\/[0-9a-f]{32}$/
|
||||
info = q
|
||||
begin
|
||||
record = CouchRest.get(q)
|
||||
if record.is_a?(SimplyStored::Couch)
|
||||
info += " #{record.class.name}"
|
||||
end
|
||||
rescue
|
||||
end
|
||||
info
|
||||
else
|
||||
q
|
||||
end
|
||||
end
|
||||
"Expected to run maximum #{expected} queries, got #{@executed_queries}\nExtra queries:\n - #{extra_queries.join("\n - ")}"
|
||||
end
|
||||
|
||||
def query_count(&block)
|
||||
$performed_queries = []
|
||||
block.call
|
||||
@executed_queries = $performed_queries.size
|
||||
end
|
||||
|
||||
def supports_block_expectations?
|
||||
true
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
RSpec::Matchers.define :perform_any_queries do |expected|
|
||||
match do |block|
|
||||
query_count(&block) > 0
|
||||
end
|
||||
|
||||
failure_message_when_negated do |actual|
|
||||
extra_queries = $performed_queries.map{|q| q[:url]}.map do |q|
|
||||
if q =~ /5984\/\w+\/[0-9a-f]{32}$/
|
||||
info = q
|
||||
begin
|
||||
record = CouchRest.get(q)
|
||||
if record.is_a?(SimplyStored::Couch)
|
||||
info += " #{record.class.name}"
|
||||
end
|
||||
rescue
|
||||
end
|
||||
info
|
||||
else
|
||||
q
|
||||
end
|
||||
end
|
||||
"Expected to run no queries, got #{@executed_queries}\nExtra queries:\n - #{extra_queries.join("\n - ")}"
|
||||
end
|
||||
|
||||
def query_count(&block)
|
||||
$performed_queries = []
|
||||
block.call
|
||||
@executed_queries = $performed_queries.size
|
||||
end
|
||||
|
||||
def supports_block_expectations?
|
||||
true
|
||||
end
|
||||
end
|
||||
Reference in New Issue
Block a user