mirror of
https://github.com/ditkrg/active_model_serializers.git
synced 2026-01-23 06:16:50 +00:00
120 lines
3.9 KiB
Ruby
120 lines
3.9 KiB
Ruby
require_relative './benchmarking_support'
|
|
require_relative './app'
|
|
|
|
# https://github.com/ruby-bench/ruby-bench-suite/blob/8ad567f7e43a044ae48c36833218423bb1e2bd9d/rails/benchmarks/actionpack_router.rb
|
|
class ApiAssertion
|
|
include Benchmark::ActiveModelSerializers::TestMethods
|
|
BadRevisionError = Class.new(StandardError)
|
|
|
|
def valid?
|
|
caching = get_caching
|
|
caching[:body].delete('meta')
|
|
non_caching = get_non_caching
|
|
non_caching[:body].delete('meta')
|
|
assert_responses(caching, non_caching)
|
|
rescue BadRevisionError => e
|
|
msg = { error: e.message }
|
|
STDERR.puts msg
|
|
STDOUT.puts msg
|
|
exit 1
|
|
end
|
|
|
|
def get_status(on_off = 'on'.freeze)
|
|
get("/status/#{on_off}")
|
|
end
|
|
|
|
def clear
|
|
get('/clear')
|
|
end
|
|
|
|
def get_caching(on_off = 'on'.freeze)
|
|
get("/caching/#{on_off}")
|
|
end
|
|
|
|
def get_fragment_caching(on_off = 'on'.freeze)
|
|
get("/fragment_caching/#{on_off}")
|
|
end
|
|
|
|
def get_non_caching(on_off = 'on'.freeze)
|
|
get("/non_caching/#{on_off}")
|
|
end
|
|
|
|
def debug(msg = '')
|
|
if block_given? && ENV['DEBUG'] =~ /\Atrue|on|0\z/i
|
|
STDERR.puts yield
|
|
else
|
|
STDERR.puts msg
|
|
end
|
|
end
|
|
|
|
private
|
|
|
|
def assert_responses(caching, non_caching)
|
|
assert_equal(caching[:code], 200, "Caching response failed: #{caching}")
|
|
assert_equal(caching[:body], expected, "Caching response format failed: \n+ #{caching[:body]}\n- #{expected}")
|
|
assert_equal(caching[:content_type], 'application/json; charset=utf-8', "Caching response content type failed: \n+ #{caching[:content_type]}\n- application/json")
|
|
assert_equal(non_caching[:code], 200, "Non caching response failed: #{non_caching}")
|
|
assert_equal(non_caching[:body], expected, "Non Caching response format failed: \n+ #{non_caching[:body]}\n- #{expected}")
|
|
assert_equal(non_caching[:content_type], 'application/json; charset=utf-8', "Non caching response content type failed: \n+ #{non_caching[:content_type]}\n- application/json")
|
|
end
|
|
|
|
def get(url)
|
|
response = request(:get, url)
|
|
{ code: response.status, body: JSON.load(response.body), content_type: response.content_type }
|
|
end
|
|
|
|
def expected
|
|
@expected ||=
|
|
{
|
|
'primary_resource' => {
|
|
'id' => 1337,
|
|
'title' => 'New PrimaryResource',
|
|
'body' => 'Body',
|
|
'virtual_attribute' => {
|
|
'id' => 999,
|
|
'name' => 'Free-Range Virtual Attribute'
|
|
},
|
|
'has_one_relationship' => {
|
|
'id' => 42,
|
|
'first_name' => 'Joao',
|
|
'last_name' => 'Moura'
|
|
},
|
|
'has_many_relationships' => [
|
|
{
|
|
'id' => 1,
|
|
'body' => 'ZOMG A HAS MANY RELATIONSHIP'
|
|
}
|
|
]
|
|
}
|
|
}
|
|
end
|
|
|
|
def assert_equal(expected, actual, message)
|
|
return true if expected == actual
|
|
if ENV['FAIL_ASSERTION'] =~ /\Atrue|on|0\z/i # rubocop:disable Style/GuardClause
|
|
fail BadRevisionError, message
|
|
else
|
|
STDERR.puts message unless ENV['SUMMARIZE']
|
|
end
|
|
end
|
|
end
|
|
assertion = ApiAssertion.new
|
|
assertion.valid?
|
|
assertion.debug { assertion.get_status }
|
|
|
|
time = 10
|
|
{
|
|
'caching on: caching serializers: gc off' => { disable_gc: true, send: [:get_caching, 'on'] },
|
|
'caching on: fragment caching serializers: gc off' => { disable_gc: true, send: [:get_fragment_caching, 'on'] },
|
|
'caching on: non-caching serializers: gc off' => { disable_gc: true, send: [:get_non_caching, 'on'] },
|
|
'caching off: caching serializers: gc off' => { disable_gc: true, send: [:get_caching, 'off'] },
|
|
'caching off: fragment caching serializers: gc off' => { disable_gc: true, send: [:get_fragment_caching, 'off'] },
|
|
'caching off: non-caching serializers: gc off' => { disable_gc: true, send: [:get_non_caching, 'off'] }
|
|
}.each do |label, options|
|
|
assertion.clear
|
|
Benchmark.ams(label, time: time, disable_gc: options[:disable_gc]) do
|
|
assertion.send(*options[:send])
|
|
end
|
|
assertion.debug { assertion.get_status(options[:send][-1]) }
|
|
end
|