Look for namespace and other options to configure serializers

By default not all serializer options are considered (for instance
the :root option, or the :each_serializer option). This potentially
results in an incomplete configuration of the serializers used.

Added 2 specs to test this when used as a single endpoint and when
used within a namespace. At the moment it is fixed by plucking
the correct settings in the .build_options_from_endpoint,
but I could imagine that this is not exactly the right spot.
This commit is contained in:
J.W. Koelewijn 2015-01-14 16:35:11 +01:00
parent 5bba714457
commit 906d772202
2 changed files with 26 additions and 3 deletions

View file

@ -51,7 +51,7 @@ module Grape
end
def build_options_from_endpoint(endpoint)
[endpoint.default_serializer_options || {}, endpoint.namespace_options, endpoint.route_options].reduce(:merge)
[endpoint.default_serializer_options || {}, endpoint.namespace_options, endpoint.route_options, endpoint.options, endpoint.options.fetch(:route_options)].reduce(:merge)
end
# array root is the innermost namespace name ('space') if there is one,

View file

@ -32,13 +32,32 @@ describe Grape::Formatter::ActiveModelSerializers do
end
end
describe 'serializer options from namespace' do
let(:app){ Class.new(Grape::API) }
before do
app.format :json
app.formatter :json, Grape::Formatter::ActiveModelSerializers
app.namespace('space') do |ns|
ns.get('/', root: false) do
{ user: { first_name: 'JR', last_name: 'HE' } }
end
end
end
it 'should read serializer options like "root"' do
expect(described_class.build_options_from_endpoint(app.endpoints.first)).to include :root
end
end
describe '.fetch_serializer' do
let(:user) { User.new(first_name: 'John') }
if Grape::Util.const_defined?('InheritableSetting')
let(:endpoint) { Grape::Endpoint.new(Grape::Util::InheritableSetting.new, path: '/', method: 'foo') }
let(:endpoint) { Grape::Endpoint.new(Grape::Util::InheritableSetting.new, path: '/', method: 'foo', root: false) }
else
let(:endpoint) { Grape::Endpoint.new({}, path: '/', method: 'foo') }
let(:endpoint) { Grape::Endpoint.new({}, path: '/', method: 'foo', root: false) }
end
let(:env) { { 'api.endpoint' => endpoint } }
@ -65,5 +84,9 @@ describe Grape::Formatter::ActiveModelSerializers do
expect(subject.instance_variable_get('@only')).to eq([:only])
expect(subject.instance_variable_get('@except')).to eq([:except])
end
it 'should read serializer options like "root"' do
expect(described_class.build_options_from_endpoint(endpoint).keys).to include :root
end
end
end