Skip to content

Commit 2a20b68

Browse files
committed
Merge branch 'fix-connections' into field-extensions-1.9
2 parents 63df47b + aa55640 commit 2a20b68

File tree

8 files changed

+82
-23
lines changed

8 files changed

+82
-23
lines changed

lib/graphql/schema/field.rb

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -388,9 +388,6 @@ def resolve_field(obj, args, ctx)
388388
if @resolve_proc
389389
# Might be nil, still want to call the func in that case
390390
@resolve_proc.call(inner_obj, args, ctx)
391-
elsif @resolver_class
392-
singleton_inst = @resolver_class.new(object: inner_obj, context: query_ctx)
393-
public_send_field(singleton_inst, args, ctx)
394391
else
395392
public_send_field(after_obj, args, ctx)
396393
end
@@ -463,6 +460,13 @@ def public_send_field(obj, graphql_args, field_ctx)
463460

464461
query_ctx = field_ctx.query.context
465462
with_extensions(obj, ruby_kwargs, query_ctx) do |extended_obj, extended_args|
463+
if @resolver_class
464+
if extended_obj.is_a?(GraphQL::Schema::Object)
465+
extended_obj = extended_obj.object
466+
end
467+
extended_obj = @resolver_class.new(object: extended_obj, context: query_ctx)
468+
end
469+
466470
if extended_args.any?
467471
extended_obj.public_send(@method_sym, **extended_args)
468472
else

lib/graphql/schema/relay_classic_mutation.rb

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -25,20 +25,14 @@ class RelayClassicMutation < GraphQL::Schema::Mutation
2525
# Relay classic default:
2626
null(true)
2727

28-
# Override {GraphQL::Schema::Mutation#resolve_mutation} to
28+
# Override {GraphQL::Schema::Resolver#resolve_with_support} to
2929
# delete `client_mutation_id` from the kwargs.
30-
def resolve_mutation(**kwargs)
30+
def resolve_with_support(**kwargs)
3131
# This is handled by Relay::Mutation::Resolve, a bit hacky, but here we are.
3232
kwargs.delete(:client_mutation_id)
33-
if kwargs.any?
34-
resolve(**kwargs)
35-
else
36-
resolve
37-
end
33+
super
3834
end
3935

40-
resolve_method(:resolve_mutation)
41-
4236
class << self
4337
# The base class for generated input object types
4438
# @param new_class [Class] The base class to use for generating input object definitions

lib/graphql/schema/resolver.rb

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,6 @@ def resolve_with_support(**args)
7474
else
7575
authorized?
7676
end
77-
authorized?(loaded_args)
7877
context.schema.after_lazy(authorized_val) do |(authorized_result, early_return)|
7978
# If the `authorized?` returned two values, `false, early_return`,
8079
# then use the early return value instead of continuing
@@ -325,8 +324,7 @@ def type_expr
325324
# @see {GraphQL::Schema::Argument#initialize} for the signature
326325
def argument(name, type, *rest, loads: nil, **kwargs, &block)
327326
if loads
328-
arg_keyword = name.to_s.sub(/_id$/, "").to_sym
329-
kwargs[:as] = arg_keyword
327+
arg_keyword = kwargs[:as] ||= name.to_s.sub(/_id$/, "").to_sym
330328
own_arguments_loads_as_type[arg_keyword] = loads
331329
end
332330
arg_defn = super(name, type, *rest, **kwargs, &block)

spec/graphql/schema/relay_classic_mutation_spec.rb

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,12 @@
7070
assert_equal "August Greene", res["data"]["renameEnsemble"]["ensemble"]["name"]
7171
end
7272

73+
it "uses the `as:` name when loading" do
74+
band_query_str = query_str.sub("renameEnsemble", "renameEnsembleAsBand")
75+
res = Jazz::Schema.execute(band_query_str, variables: { id: "Ensemble/Robert Glasper Experiment", newName: "August Greene"})
76+
assert_equal "August Greene", res["data"]["renameEnsembleAsBand"]["ensemble"]["name"]
77+
end
78+
7379
it "returns an error instead when the ID resolves to nil" do
7480
res = Jazz::Schema.execute(query_str, variables: {
7581
id: "Ensemble/Nonexistant Name",

spec/graphql/schema/resolver_spec.rb

Lines changed: 30 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -194,26 +194,26 @@ def resolve(int:)
194194

195195
class PrepResolver10 < BaseResolver
196196
argument :int1, Integer, required: true
197-
argument :int2, Integer, required: true
197+
argument :int2, Integer, required: true, as: :integer_2
198198
type Integer, null: true
199-
def authorized?(int1:, int2:)
200-
if int1 + int2 > context[:max_int]
199+
def authorized?(int1:, integer_2:)
200+
if int1 + integer_2 > context[:max_int]
201201
raise GraphQL::ExecutionError, "Inputs too big"
202-
elsif context[:min_int] && (int1 + int2 < context[:min_int])
202+
elsif context[:min_int] && (int1 + integer_2 < context[:min_int])
203203
false
204204
else
205205
true
206206
end
207207
end
208208

209-
def resolve(int1:, int2:)
210-
int1 + int2
209+
def resolve(int1:, integer_2:)
210+
int1 + integer_2
211211
end
212212
end
213213

214214
class PrepResolver11 < PrepResolver10
215-
def authorized?(int1:, int2:)
216-
LazyBlock.new { super(int1: int1 * 2, int2: int2) }
215+
def authorized?(int1:, integer_2:)
216+
LazyBlock.new { super(int1: int1 * 2, integer_2: integer_2) }
217217
end
218218
end
219219

@@ -242,6 +242,17 @@ def authorized?(int1:, int2:)
242242
end
243243
end
244244

245+
class PrepResolver14 < GraphQL::Schema::RelayClassicMutation
246+
field :number, Integer, null: false
247+
248+
def authorized?
249+
true
250+
end
251+
252+
def resolve
253+
{ number: 1 }
254+
end
255+
end
245256

246257
class Query < GraphQL::Schema::Object
247258
class CustomField < GraphQL::Schema::Field
@@ -278,6 +289,7 @@ def resolve_field(*args)
278289
field :prep_resolver_11, resolver: PrepResolver11
279290
field :prep_resolver_12, resolver: PrepResolver12
280291
field :prep_resolver_13, resolver: PrepResolver13
292+
field :prep_resolver_14, resolver: PrepResolver14
281293
end
282294

283295
class Schema < GraphQL::Schema
@@ -442,6 +454,11 @@ def add_error_assertions(field_name, description)
442454
assert_equal 11, res["data"]["prepResolver10"]
443455
end
444456

457+
it "uses the argument name provided in `as:`" do
458+
res = exec_query("{ prepResolver10(int1: 5, int2: 6) }", context: { max_int: 90 })
459+
assert_equal 11, res["data"]["prepResolver10"]
460+
end
461+
445462
it "can return a lazy object" do
446463
# This is too big because it's modified in the overridden authorized? hook:
447464
res = exec_query("{ prepResolver11(int1: 3, int2: 5) }", context: { max_int: 9 })
@@ -478,6 +495,11 @@ def add_error_assertions(field_name, description)
478495
res = exec_query(str, context: { max_int: 100, min_int: 20 })
479496
assert_equal({ "prepResolver10" => nil, "prepResolver11" => nil }, res["data"])
480497
end
498+
499+
it "works with no arguments for RelayClassicMutation" do
500+
res = exec_query("{ prepResolver14(input: {}) { number } }")
501+
assert_equal 1, res["data"]["prepResolver14"]["number"]
502+
end
481503
end
482504
end
483505

spec/integration/rails/graphql/relay/connection_resolve_spec.rb

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,22 @@
5353
end
5454
end
5555

56+
describe "when a resolver is used" do
57+
it "returns the items with the correct parent" do
58+
resolver_query_str = <<-GRAPHQL
59+
{
60+
rebels {
61+
shipsByResolver {
62+
parentClassName
63+
}
64+
}
65+
}
66+
GRAPHQL
67+
result = star_wars_query(resolver_query_str)
68+
assert_equal "StarWars::FactionRecord", result["data"]["rebels"]["shipsByResolver"]["parentClassName"]
69+
end
70+
end
71+
5672
describe "when nil is returned" do
5773
it "becomes null" do
5874
result = star_wars_query(query_string, { "name" => "null" })

spec/support/jazz.rb

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -488,6 +488,14 @@ def resolve(ensemble:, new_name:)
488488
end
489489
end
490490

491+
class RenameEnsembleAsBand < RenameEnsemble
492+
argument :ensemble_id, ID, required: true, loads: Ensemble, as: :band
493+
494+
def resolve(band:, new_name:)
495+
super(ensemble: band, new_name: new_name)
496+
end
497+
end
498+
491499
class Mutation < BaseObject
492500
field :add_ensemble, Ensemble, null: false do
493501
argument :input, EnsembleInput, required: true
@@ -496,6 +504,7 @@ class Mutation < BaseObject
496504
field :add_instrument, mutation: AddInstrument
497505
field :add_sitar, mutation: AddSitar
498506
field :rename_ensemble, mutation: RenameEnsemble
507+
field :rename_ensemble_as_band, mutation: RenameEnsembleAsBand
499508

500509
def add_ensemble(input:)
501510
ens = Models::Ensemble.new(input.name)

spec/support/star_wars/schema.rb

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,14 @@ def parent_class_name
108108
end
109109
end
110110

111+
class ShipsByResolver < GraphQL::Schema::Resolver
112+
type ShipConnectionWithParentType, null: false
113+
114+
def resolve
115+
object.ships.map { |ship_id| StarWars::DATA["Ship"][ship_id] }
116+
end
117+
end
118+
111119
class Faction < GraphQL::Schema::Object
112120
implements GraphQL::Relay::Node.interface
113121

@@ -117,6 +125,8 @@ class Faction < GraphQL::Schema::Object
117125
argument :name_includes, String, required: false
118126
end
119127

128+
field :shipsByResolver, resolver: ShipsByResolver, connection: true
129+
120130
def ships(name_includes: nil)
121131
all_ships = object.ships.map {|ship_id| StarWars::DATA["Ship"][ship_id] }
122132
if name_includes

0 commit comments

Comments
 (0)