Improved code coverage for GraphQL resolvers specs

This commit is contained in:
Alberto Miedes Garcés
2017-01-09 10:14:31 +01:00
parent e1b3d468e5
commit 60786f17c2
3 changed files with 35 additions and 18 deletions

View File

@@ -7,11 +7,18 @@ module GraphQL
end end
def call(object, arguments, context) def call(object, arguments, context)
public_elements.find_by(id: arguments['id'])
end
private
def public_elements
if target_model.respond_to?(:public_for_api) if target_model.respond_to?(:public_for_api)
target_model.public_for_api.find_by(id: arguments["id"]) target_model.public_for_api
else else
target_model.find_by(id: arguments["id"]) target_model
end end
end end
end end
end end

View File

@@ -1,19 +1,20 @@
require 'rails_helper' require 'rails_helper'
describe GraphQL::RootCollectionResolver do describe GraphQL::RootCollectionResolver do
let(:geozones_resolver) { GraphQL::RootCollectionResolver.new(Geozone) }
let(:comments_resolver) { GraphQL::RootCollectionResolver.new(Comment) } let(:comments_resolver) { GraphQL::RootCollectionResolver.new(Comment) }
describe '#call' do describe '#call' do
it 'resolves collections' do it 'returns the whole colleciton for unscoped models' do
comment_1 = create(:comment) geozone_1 = create(:geozone)
comment_2 = create(:comment) 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 end
it 'blocks collection forbidden elements' do it 'blocks forbidden elements for scoped models' do
proposal = create(:proposal, :hidden) proposal = create(:proposal, :hidden)
comment_1 = create(:comment) comment_1 = create(:comment)
comment_2 = create(:comment, commentable: proposal) comment_2 = create(:comment, commentable: proposal)

View File

@@ -2,13 +2,14 @@ require 'rails_helper'
describe GraphQL::RootElementResolver do describe GraphQL::RootElementResolver do
let(:comment_resolver) { GraphQL::RootElementResolver.new(Comment) } let(:comment_resolver) { GraphQL::RootElementResolver.new(Comment) }
let(:geozone_resolver) { GraphQL::RootElementResolver.new(Geozone) }
describe '#call' do describe '#call' do
it 'resolves simple elements' do it 'resolves simple elements' do
comment = create(:comment) 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) expect(result).to eq(comment)
end end
@@ -16,20 +17,28 @@ describe GraphQL::RootElementResolver do
it 'returns nil when requested element is forbidden' do it 'returns nil when requested element is forbidden' do
proposal = create(:proposal, :hidden) proposal = create(:proposal, :hidden)
comment = create(:comment, commentable: proposal) 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 expect(result).to be_nil
end end
it 'returns nil when requested element does not exist' do it 'returns nil when requested element does not exist' do
arguments = { 'id' => 1 } result = comment_resolver.call(nil, {'id' => 1}, nil)
result = comment_resolver.call(nil, arguments, nil)
expect(result).to be_nil expect(result).to be_nil
end 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
end end