diff --git a/lib/graph_ql/root_element_resolver.rb b/lib/graph_ql/root_element_resolver.rb index 4191f8eee..cb963ac1f 100644 --- a/lib/graph_ql/root_element_resolver.rb +++ b/lib/graph_ql/root_element_resolver.rb @@ -7,11 +7,18 @@ module GraphQL end def call(object, arguments, context) - if target_model.respond_to?(:public_for_api) - target_model.public_for_api.find_by(id: arguments["id"]) - else - target_model.find_by(id: arguments["id"]) - end + public_elements.find_by(id: arguments['id']) end + + private + + def public_elements + if target_model.respond_to?(:public_for_api) + target_model.public_for_api + else + target_model + end + end + end end diff --git a/spec/lib/graph_ql/root_collection_resolver_spec.rb b/spec/lib/graph_ql/root_collection_resolver_spec.rb index 87f0319ff..edfc6d393 100644 --- a/spec/lib/graph_ql/root_collection_resolver_spec.rb +++ b/spec/lib/graph_ql/root_collection_resolver_spec.rb @@ -1,19 +1,20 @@ require 'rails_helper' describe GraphQL::RootCollectionResolver do + let(:geozones_resolver) { GraphQL::RootCollectionResolver.new(Geozone) } let(:comments_resolver) { GraphQL::RootCollectionResolver.new(Comment) } describe '#call' do - it 'resolves collections' do - comment_1 = create(:comment) - comment_2 = create(:comment) + it 'returns the whole colleciton for unscoped models' do + geozone_1 = create(:geozone) + geozone_2 = create(:geozone) - result = comments_resolver.call(nil, nil, nil) + result = geozones_resolver.call(nil, nil, nil) - expect(result).to match_array([comment_1, comment_2]) + expect(result).to match_array([geozone_1, geozone_2]) end - it 'blocks collection forbidden elements' do + it 'blocks forbidden elements for scoped models' do proposal = create(:proposal, :hidden) comment_1 = create(:comment) comment_2 = create(:comment, commentable: proposal) diff --git a/spec/lib/graph_ql/root_element_resolver_spec.rb b/spec/lib/graph_ql/root_element_resolver_spec.rb index 7ca64a7e8..b86fab36e 100644 --- a/spec/lib/graph_ql/root_element_resolver_spec.rb +++ b/spec/lib/graph_ql/root_element_resolver_spec.rb @@ -2,13 +2,14 @@ require 'rails_helper' describe GraphQL::RootElementResolver do let(:comment_resolver) { GraphQL::RootElementResolver.new(Comment) } + let(:geozone_resolver) { GraphQL::RootElementResolver.new(Geozone) } describe '#call' do + it 'resolves simple elements' do comment = create(:comment) - arguments = { 'id' => comment.id } - result = comment_resolver.call(nil, arguments, nil) + result = comment_resolver.call(nil, {'id' => comment.id}, nil) expect(result).to eq(comment) end @@ -16,20 +17,28 @@ describe GraphQL::RootElementResolver do it 'returns nil when requested element is forbidden' do proposal = create(:proposal, :hidden) comment = create(:comment, commentable: proposal) - arguments = { 'id' => comment.id } - result = comment_resolver.call(nil, arguments, nil) + result = comment_resolver.call(nil, {'id' => comment.id}, nil) expect(result).to be_nil end it 'returns nil when requested element does not exist' do - arguments = { 'id' => 1 } - - result = comment_resolver.call(nil, arguments, nil) + result = comment_resolver.call(nil, {'id' => 1}, nil) expect(result).to be_nil end + + it 'uses the public_for_api scope when available' do + geozone = create(:geozone) + comment = create(:comment, commentable: create(:proposal, :hidden)) + + geozone_result = geozone_resolver.call(nil, {'id' => geozone.id}, nil) + comment_result = comment_resolver.call(nil, {'id' => comment.id}, nil) + + expect(geozone_result).to eq(geozone) + expect(comment_result).to be_nil + end end end