Skip to content

Commit 50b784e

Browse files
committed
more tests.
1 parent 27527bb commit 50b784e

File tree

5 files changed

+76
-28
lines changed

5 files changed

+76
-28
lines changed

lib/graphql/stitching/client.rb

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -88,15 +88,6 @@ def write_cached_plan(request, plan)
8888
@on_cache_write.call(request, JSON.generate(plan.as_json)) if @on_cache_write
8989
end
9090

91-
def build_graphql_error(request, err)
92-
case err
93-
when GraphQL::ParseError, GraphQL::ExecutionError
94-
err.to_h
95-
else
96-
{ "message" => "An unexpected error occured." }
97-
end
98-
end
99-
10091
private
10192

10293
def load_plan(request)

lib/graphql/stitching/composer.rb

Lines changed: 21 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,10 @@ module Stitching
1111
# representing various graph locations and merges them into one
1212
# combined Supergraph that is validated for integrity.
1313
class Composer
14-
include Formatter
14+
# @api private
15+
class DefaultFormatter
16+
extend Formatter
17+
end
1518

1619
# @api private
1720
NO_DEFAULT_VALUE = begin
@@ -55,7 +58,7 @@ def initialize(
5558
@mutation_name = mutation_name
5659
@subscription_name = subscription_name
5760
@root_entrypoints = root_entrypoints || {}
58-
@formatter = formatter || self
61+
@formatter = formatter || DefaultFormatter
5962

6063
@field_map = {}
6164
@resolver_map = {}
@@ -217,7 +220,7 @@ def build_directive(directive_name, directives_by_location)
217220

218221
Class.new(GraphQL::Schema::Directive) do
219222
graphql_name(directive_name)
220-
description(builder.merge_member_descriptions(directive_name, directives_by_location))
223+
description(builder.merge_descriptions(directive_name, directives_by_location))
221224
repeatable(directives_by_location.values.any?(&:repeatable?))
222225
locations(*directives_by_location.values.flat_map(&:locations).tap(&:uniq!))
223226
builder.build_merged_arguments(directive_name, directives_by_location, self, directive_name: directive_name)
@@ -234,7 +237,7 @@ def build_scalar_type(type_name, types_by_location)
234237

235238
Class.new(GraphQL::Stitching::Supergraph::ScalarType) do
236239
graphql_name(type_name)
237-
description(builder.merge_member_descriptions(type_name, types_by_location))
240+
description(builder.merge_descriptions(type_name, types_by_location))
238241
builder.build_merged_directives(type_name, types_by_location, self)
239242
end
240243
end
@@ -261,14 +264,14 @@ def build_enum_type(type_name, types_by_location, enum_usage)
261264

262265
Class.new(GraphQL::Stitching::Supergraph::EnumType) do
263266
graphql_name(type_name)
264-
description(builder.merge_member_descriptions(type_name, types_by_location))
267+
description(builder.merge_descriptions(type_name, types_by_location))
265268
builder.build_merged_directives(type_name, types_by_location, self)
266269

267270
enum_values_by_name_location.each do |value_name, enum_values_by_location|
268271
enum_value = value(value_name,
269272
value: value_name,
270-
description: builder.merge_member_descriptions(type_name, enum_values_by_location, enum_value: value_name),
271-
deprecation_reason: builder.merge_member_deprecations(type_name, enum_values_by_location, enum_value: value_name),
273+
description: builder.merge_descriptions(type_name, enum_values_by_location, enum_value: value_name),
274+
deprecation_reason: builder.merge_deprecations(type_name, enum_values_by_location, enum_value: value_name),
272275
)
273276

274277
builder.build_merged_directives(type_name, enum_values_by_location, enum_value, enum_value: value_name)
@@ -283,7 +286,7 @@ def build_object_type(type_name, types_by_location)
283286

284287
Class.new(GraphQL::Stitching::Supergraph::ObjectType) do
285288
graphql_name(type_name)
286-
description(builder.merge_member_descriptions(type_name, types_by_location))
289+
description(builder.merge_descriptions(type_name, types_by_location))
287290

288291
interface_names = types_by_location.values.flat_map { _1.interfaces.map(&:graphql_name) }
289292
interface_names.tap(&:uniq!).each do |interface_name|
@@ -303,7 +306,7 @@ def build_interface_type(type_name, types_by_location)
303306
Module.new do
304307
include GraphQL::Stitching::Supergraph::InterfaceType
305308
graphql_name(type_name)
306-
description(builder.merge_member_descriptions(type_name, types_by_location))
309+
description(builder.merge_descriptions(type_name, types_by_location))
307310

308311
interface_names = types_by_location.values.flat_map { _1.interfaces.map(&:graphql_name) }
309312
interface_names.tap(&:uniq!).each do |interface_name|
@@ -322,7 +325,7 @@ def build_union_type(type_name, types_by_location)
322325

323326
Class.new(GraphQL::Stitching::Supergraph::UnionType) do
324327
graphql_name(type_name)
325-
description(builder.merge_member_descriptions(type_name, types_by_location))
328+
description(builder.merge_descriptions(type_name, types_by_location))
326329

327330
possible_names = types_by_location.values.flat_map { _1.possible_types.map(&:graphql_name) }.tap(&:uniq!)
328331
possible_types(*possible_names.map { builder.build_type_binding(_1) })
@@ -337,7 +340,7 @@ def build_input_object_type(type_name, types_by_location)
337340

338341
Class.new(GraphQL::Stitching::Supergraph::InputObjectType) do
339342
graphql_name(type_name)
340-
description(builder.merge_member_descriptions(type_name, types_by_location))
343+
description(builder.merge_descriptions(type_name, types_by_location))
341344
builder.build_merged_arguments(type_name, types_by_location, self)
342345
builder.build_merged_directives(type_name, types_by_location, self)
343346
end
@@ -370,8 +373,8 @@ def build_merged_fields(type_name, types_by_location, owner)
370373
type = merge_value_types(type_name, value_types, field_name: field_name)
371374
schema_field = owner.field(
372375
field_name,
373-
description: merge_member_descriptions(type_name, fields_by_location, field_name: field_name),
374-
deprecation_reason: merge_member_deprecations(type_name, fields_by_location, field_name: field_name),
376+
description: merge_descriptions(type_name, fields_by_location, field_name: field_name),
377+
deprecation_reason: merge_deprecations(type_name, fields_by_location, field_name: field_name),
375378
type: Util.unwrap_non_null(type),
376379
null: !type.non_null?,
377380
connection: false,
@@ -423,8 +426,8 @@ def build_merged_arguments(type_name, members_by_location, owner, field_name: ni
423426
type = merge_value_types(type_name, value_types, argument_name: argument_name, field_name: field_name)
424427
schema_argument = owner.argument(
425428
argument_name,
426-
description: merge_member_descriptions(type_name, arguments_by_location, argument_name: argument_name, field_name: field_name),
427-
deprecation_reason: merge_member_deprecations(type_name, arguments_by_location, argument_name: argument_name, field_name: field_name),
429+
description: merge_descriptions(type_name, arguments_by_location, argument_name: argument_name, field_name: field_name),
430+
deprecation_reason: merge_deprecations(type_name, arguments_by_location, argument_name: argument_name, field_name: field_name),
428431
type: Util.unwrap_non_null(type),
429432
required: type.non_null?,
430433
camelize: false,
@@ -469,7 +472,7 @@ def build_merged_directives(type_name, members_by_location, owner, field_name: n
469472

470473
if (profiles = kwarg_values_by_name_location["profiles"])
471474
@visibility_profiles.merge(profiles.each_value.reduce(&:|))
472-
kwarg_formatter = self
475+
kwarg_formatter = DefaultFormatter
473476
end
474477
end
475478

@@ -523,7 +526,7 @@ def merge_value_types(type_name, subgraph_types, field_name: nil, argument_name:
523526

524527
# @!scope class
525528
# @!visibility private
526-
def merge_member_descriptions(type_name, members_by_location, field_name: nil, argument_name: nil, enum_value: nil)
529+
def merge_descriptions(type_name, members_by_location, field_name: nil, argument_name: nil, enum_value: nil)
527530
strings_by_location = members_by_location.each_with_object({}) { |(l, m), memo| memo[l] = m.description }
528531
@formatter.merge_descriptions(strings_by_location, Formatter::Info.new(
529532
type_name: type_name,
@@ -535,7 +538,7 @@ def merge_member_descriptions(type_name, members_by_location, field_name: nil, a
535538

536539
# @!scope class
537540
# @!visibility private
538-
def merge_member_deprecations(type_name, members_by_location, field_name: nil, argument_name: nil, enum_value: nil)
541+
def merge_deprecations(type_name, members_by_location, field_name: nil, argument_name: nil, enum_value: nil)
539542
strings_by_location = members_by_location.each_with_object({}) { |(l, m), memo| memo[l] = m.deprecation_reason }
540543
@formatter.merge_deprecations(strings_by_location, Formatter::Info.new(
541544
type_name: type_name,

lib/graphql/stitching/formatter.rb

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,15 @@ def merge_kwargs(values_by_location, info)
4949
merge_values(values_by_location, info)
5050
end
5151
end
52+
53+
def build_graphql_error(request, err)
54+
case err
55+
when GraphQL::ParseError, GraphQL::ExecutionError
56+
err.to_h
57+
else
58+
{ "message" => "An unexpected error occured." }
59+
end
60+
end
5261
end
5362
end
5463
end

test/graphql/stitching/client_test.rb

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -377,4 +377,50 @@ def test_errors_for_composer_options_given_with_precomposed_supergraph
377377
)
378378
end
379379
end
380+
381+
class MyClient < GraphQL::Stitching::Client
382+
def merge_descriptions(values_by_location, _info)
383+
values_by_location.values.join("/")
384+
end
385+
end
386+
387+
def test_from_definition_builds_with_invocation_class
388+
alpha = %|
389+
type T { id:ID! a:String }
390+
type Query { a(id:ID!):T @stitch(key: "id") }
391+
|
392+
bravo = %|
393+
type T { id:ID! b:String }
394+
type Query { b(id:ID!):T @stitch(key: "id") }
395+
|
396+
397+
sdl = compose_definitions({ "alpha" => alpha, "bravo" => bravo }).to_definition
398+
client = MyClient.from_definition(sdl, executables: {
399+
"alpha" => Proc.new {},
400+
"bravo" => Proc.new {},
401+
})
402+
assert client.is_a?(MyClient)
403+
end
404+
405+
def test_custom_client_acts_as_composition_formatter
406+
alpha = %|
407+
"""
408+
a
409+
"""
410+
type Query { a:Boolean }
411+
|
412+
bravo = %|
413+
"""
414+
b
415+
"""
416+
type Query { b:Boolean }
417+
|
418+
419+
client = MyClient.new(locations: {
420+
"alpha" => { schema: GraphQL::Schema.from_definition(alpha) },
421+
"bravo" => { schema: GraphQL::Schema.from_definition(bravo) },
422+
})
423+
424+
assert_equal "a/b", client.supergraph.schema.query.description
425+
end
380426
end

test/test_helper.rb

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
# ignore warnings from auto-generated GraphQL lib code.
88
Warning.ignore(/.*mismatched indentations.*/)
99
Warning.ignore(/.*lib\/graphql\/language\/nodes.rb:.*/)
10-
Warning.ignore(/Using `[^`]+` is deprecated and will be removed.*/)
1110
end
1211

1312
require 'bundler/setup'

0 commit comments

Comments
 (0)