graphql 1.7.14 → 1.8.0.pre1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/lib/generators/graphql/function_generator.rb +1 -1
- data/lib/generators/graphql/loader_generator.rb +1 -1
- data/lib/generators/graphql/mutation_generator.rb +1 -6
- data/lib/generators/graphql/templates/function.erb +2 -2
- data/lib/generators/graphql/templates/loader.erb +2 -2
- data/lib/graphql.rb +2 -0
- data/lib/graphql/argument.rb +0 -1
- data/lib/graphql/backwards_compatibility.rb +2 -3
- data/lib/graphql/base_type.rb +18 -16
- data/lib/graphql/compatibility/query_parser_specification.rb +0 -117
- data/lib/graphql/compatibility/query_parser_specification/parse_error_specification.rb +0 -14
- data/lib/graphql/define/assign_object_field.rb +5 -12
- data/lib/graphql/deprecated_dsl.rb +28 -0
- data/lib/graphql/directive.rb +0 -1
- data/lib/graphql/enum_type.rb +1 -3
- data/lib/graphql/execution.rb +0 -1
- data/lib/graphql/execution/multiplex.rb +29 -12
- data/lib/graphql/field.rb +5 -20
- data/lib/graphql/function.rb +12 -0
- data/lib/graphql/input_object_type.rb +1 -3
- data/lib/graphql/internal_representation/node.rb +14 -26
- data/lib/graphql/internal_representation/visit.rb +6 -3
- data/lib/graphql/introspection/arguments_field.rb +0 -1
- data/lib/graphql/introspection/enum_values_field.rb +0 -1
- data/lib/graphql/introspection/fields_field.rb +0 -1
- data/lib/graphql/introspection/input_fields_field.rb +0 -1
- data/lib/graphql/introspection/interfaces_field.rb +0 -1
- data/lib/graphql/introspection/of_type_field.rb +0 -1
- data/lib/graphql/introspection/possible_types_field.rb +0 -1
- data/lib/graphql/introspection/schema_field.rb +0 -1
- data/lib/graphql/introspection/type_by_name_field.rb +0 -1
- data/lib/graphql/introspection/typename_field.rb +0 -1
- data/lib/graphql/language.rb +0 -3
- data/lib/graphql/language/generation.rb +182 -3
- data/lib/graphql/language/lexer.rb +69 -144
- data/lib/graphql/language/lexer.rl +4 -15
- data/lib/graphql/language/nodes.rb +76 -136
- data/lib/graphql/language/parser.rb +621 -668
- data/lib/graphql/language/parser.y +11 -17
- data/lib/graphql/language/token.rb +3 -10
- data/lib/graphql/object_type.rb +6 -1
- data/lib/graphql/query.rb +13 -8
- data/lib/graphql/query/arguments.rb +33 -48
- data/lib/graphql/query/context.rb +1 -0
- data/lib/graphql/query/literal_input.rb +1 -4
- data/lib/graphql/relay/connection_resolve.rb +3 -0
- data/lib/graphql/relay/global_id_resolve.rb +5 -1
- data/lib/graphql/relay/relation_connection.rb +19 -14
- data/lib/graphql/schema.rb +219 -12
- data/lib/graphql/schema/argument.rb +33 -0
- data/lib/graphql/schema/build_from_definition.rb +18 -64
- data/lib/graphql/schema/enum.rb +76 -0
- data/lib/graphql/schema/field.rb +127 -0
- data/lib/graphql/schema/field/dynamic_resolve.rb +63 -0
- data/lib/graphql/schema/field/unwrapped_resolve.rb +20 -0
- data/lib/graphql/schema/input_object.rb +61 -0
- data/lib/graphql/schema/interface.rb +32 -0
- data/lib/graphql/schema/loader.rb +2 -2
- data/lib/graphql/schema/member.rb +97 -0
- data/lib/graphql/schema/member/build_type.rb +106 -0
- data/lib/graphql/schema/member/has_fields.rb +56 -0
- data/lib/graphql/schema/member/instrumentation.rb +113 -0
- data/lib/graphql/schema/member/list_type_proxy.rb +21 -0
- data/lib/graphql/schema/member/non_null_type_proxy.rb +21 -0
- data/lib/graphql/schema/object.rb +65 -0
- data/lib/graphql/schema/printer.rb +266 -33
- data/lib/graphql/schema/scalar.rb +25 -0
- data/lib/graphql/schema/traversal.rb +26 -17
- data/lib/graphql/schema/union.rb +48 -0
- data/lib/graphql/static_validation/rules/fields_have_appropriate_selections.rb +1 -5
- data/lib/graphql/static_validation/rules/fields_will_merge.rb +8 -15
- data/lib/graphql/static_validation/rules/variables_are_used_and_defined.rb +1 -11
- data/lib/graphql/subscriptions/action_cable_subscriptions.rb +5 -7
- data/lib/graphql/tracing.rb +0 -1
- data/lib/graphql/tracing/platform_tracing.rb +7 -20
- data/lib/graphql/tracing/scout_tracing.rb +2 -2
- data/lib/graphql/unresolved_type_error.rb +2 -3
- data/lib/graphql/version.rb +1 -1
- data/readme.md +1 -1
- data/spec/dummy/app/channels/graphql_channel.rb +1 -22
- data/spec/dummy/log/development.log +0 -239
- data/spec/dummy/log/test.log +0 -204
- data/spec/dummy/test/system/action_cable_subscription_test.rb +0 -4
- data/spec/dummy/tmp/screenshots/failures_test_it_handles_subscriptions.png +0 -0
- data/spec/generators/graphql/function_generator_spec.rb +0 -26
- data/spec/generators/graphql/loader_generator_spec.rb +0 -24
- data/spec/graphql/analysis/max_query_complexity_spec.rb +3 -3
- data/spec/graphql/analysis/max_query_depth_spec.rb +3 -3
- data/spec/graphql/backtrace_spec.rb +0 -10
- data/spec/graphql/base_type_spec.rb +5 -19
- data/spec/graphql/boolean_type_spec.rb +3 -3
- data/spec/graphql/directive_spec.rb +1 -3
- data/spec/graphql/enum_type_spec.rb +5 -18
- data/spec/graphql/execution/execute_spec.rb +1 -1
- data/spec/graphql/execution/multiplex_spec.rb +2 -2
- data/spec/graphql/float_type_spec.rb +2 -2
- data/spec/graphql/id_type_spec.rb +1 -1
- data/spec/graphql/input_object_type_spec.rb +2 -15
- data/spec/graphql/int_type_spec.rb +2 -2
- data/spec/graphql/internal_representation/rewrite_spec.rb +2 -2
- data/spec/graphql/introspection/schema_type_spec.rb +0 -1
- data/spec/graphql/language/generation_spec.rb +186 -21
- data/spec/graphql/language/lexer_spec.rb +1 -21
- data/spec/graphql/language/nodes_spec.rb +12 -21
- data/spec/graphql/language/parser_spec.rb +1 -1
- data/spec/graphql/query/arguments_spec.rb +15 -37
- data/spec/graphql/query/serial_execution/value_resolution_spec.rb +2 -2
- data/spec/graphql/query/variables_spec.rb +1 -1
- data/spec/graphql/query_spec.rb +5 -31
- data/spec/graphql/rake_task_spec.rb +1 -3
- data/spec/graphql/relay/base_connection_spec.rb +1 -1
- data/spec/graphql/relay/connection_instrumentation_spec.rb +2 -2
- data/spec/graphql/relay/connection_resolve_spec.rb +1 -1
- data/spec/graphql/relay/connection_type_spec.rb +1 -1
- data/spec/graphql/relay/mutation_spec.rb +3 -3
- data/spec/graphql/relay/relation_connection_spec.rb +1 -65
- data/spec/graphql/schema/build_from_definition_spec.rb +4 -86
- data/spec/graphql/schema/enum_spec.rb +60 -0
- data/spec/graphql/schema/field_spec.rb +14 -0
- data/spec/graphql/schema/input_object_spec.rb +43 -0
- data/spec/graphql/schema/interface_spec.rb +98 -0
- data/spec/graphql/schema/object_spec.rb +119 -0
- data/spec/graphql/schema/printer_spec.rb +15 -92
- data/spec/graphql/schema/scalar_spec.rb +40 -0
- data/spec/graphql/schema/union_spec.rb +35 -0
- data/spec/graphql/schema/validation_spec.rb +1 -1
- data/spec/graphql/schema/warden_spec.rb +11 -11
- data/spec/graphql/schema_spec.rb +25 -23
- data/spec/graphql/static_validation/rules/fields_have_appropriate_selections_spec.rb +2 -10
- data/spec/graphql/static_validation/rules/fields_will_merge_spec.rb +2 -2
- data/spec/graphql/string_type_spec.rb +3 -3
- data/spec/graphql/subscriptions_spec.rb +1 -1
- data/spec/graphql/tracing/platform_tracing_spec.rb +1 -60
- data/spec/support/dummy/schema.rb +25 -39
- data/spec/support/jazz.rb +334 -0
- data/spec/support/lazy_helpers.rb +21 -23
- data/spec/support/star_wars/data.rb +7 -6
- data/spec/support/star_wars/schema.rb +109 -142
- metadata +39 -33
- data/lib/graphql/execution/instrumentation.rb +0 -82
- data/lib/graphql/language/block_string.rb +0 -47
- data/lib/graphql/language/document_from_schema_definition.rb +0 -277
- data/lib/graphql/language/printer.rb +0 -351
- data/lib/graphql/tracing/data_dog_tracing.rb +0 -49
- data/spec/graphql/execution/instrumentation_spec.rb +0 -165
- data/spec/graphql/language/block_string_spec.rb +0 -70
- data/spec/graphql/language/document_from_schema_definition_spec.rb +0 -770
- data/spec/graphql/language/printer_spec.rb +0 -203
@@ -0,0 +1,40 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
require "spec_helper"
|
3
|
+
|
4
|
+
describe GraphQL::Schema::Scalar do
|
5
|
+
describe "in queries" do
|
6
|
+
it "becomes output" do
|
7
|
+
query_str = <<-GRAPHQL
|
8
|
+
{
|
9
|
+
find(id: "Musician/Herbie Hancock") {
|
10
|
+
... on Musician {
|
11
|
+
name
|
12
|
+
favoriteKey
|
13
|
+
}
|
14
|
+
}
|
15
|
+
}
|
16
|
+
GRAPHQL
|
17
|
+
|
18
|
+
res = Jazz::Schema.execute(query_str)
|
19
|
+
assert_equal "B♭", res["data"]["find"]["favoriteKey"]
|
20
|
+
end
|
21
|
+
|
22
|
+
it "can be input" do
|
23
|
+
query_str = <<-GRAPHQL
|
24
|
+
{
|
25
|
+
inspectKey(key: "F♯") {
|
26
|
+
root
|
27
|
+
isSharp
|
28
|
+
isFlat
|
29
|
+
}
|
30
|
+
}
|
31
|
+
GRAPHQL
|
32
|
+
|
33
|
+
res = Jazz::Schema.execute(query_str)
|
34
|
+
key_info = res["data"]["inspectKey"]
|
35
|
+
assert_equal "F", key_info["root"]
|
36
|
+
assert_equal true, key_info["isSharp"]
|
37
|
+
assert_equal false, key_info["isFlat"]
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
require "spec_helper"
|
3
|
+
|
4
|
+
describe GraphQL::Schema::Union do
|
5
|
+
let(:union) { Jazz::PerformingAct }
|
6
|
+
describe "type info" do
|
7
|
+
it "has some" do
|
8
|
+
assert_equal 2, union.possible_types.size
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
describe "in queries" do
|
13
|
+
it "works" do
|
14
|
+
query_str = <<-GRAPHQL
|
15
|
+
{
|
16
|
+
nowPlaying {
|
17
|
+
... on Musician {
|
18
|
+
name
|
19
|
+
instrument {
|
20
|
+
family
|
21
|
+
}
|
22
|
+
}
|
23
|
+
... on Ensemble {
|
24
|
+
name
|
25
|
+
}
|
26
|
+
}
|
27
|
+
}
|
28
|
+
GRAPHQL
|
29
|
+
|
30
|
+
res = Jazz::Schema.execute(query_str)
|
31
|
+
expected_data = { "name" => "Bela Fleck and the Flecktones" }
|
32
|
+
assert_equal expected_data, res["data"]["nowPlaying"]
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -333,7 +333,7 @@ describe GraphQL::Schema::Validation do
|
|
333
333
|
end
|
334
334
|
|
335
335
|
it "allows null default value for nullable argument" do
|
336
|
-
|
336
|
+
assert_equal nil, GraphQL::Schema::Validation.validate(null_default_value)
|
337
337
|
end
|
338
338
|
end
|
339
339
|
|
@@ -242,8 +242,8 @@ describe GraphQL::Schema::Warden do
|
|
242
242
|
GRAPHQL
|
243
243
|
res = MaskHelpers.query_with_mask(query_string, mask)
|
244
244
|
assert_equal "Query", res["data"]["__schema"]["queryType"]["name"]
|
245
|
-
|
246
|
-
|
245
|
+
assert_equal nil, res["data"]["__schema"]["mutationType"]
|
246
|
+
assert_equal nil, res["data"]["__schema"]["subscriptionType"]
|
247
247
|
type_names = res["data"]["__schema"]["types"].map { |t| t["name"] }
|
248
248
|
refute type_names.include?("Mutation")
|
249
249
|
refute type_names.include?("Subscription")
|
@@ -344,7 +344,7 @@ describe GraphQL::Schema::Warden do
|
|
344
344
|
res = MaskHelpers.run_query(query_string, only: whitelist)
|
345
345
|
|
346
346
|
# It's not visible by name
|
347
|
-
|
347
|
+
assert_equal nil, res["data"]["Phoneme"]
|
348
348
|
|
349
349
|
# It's not visible in `__schema`
|
350
350
|
all_type_names = type_names(res)
|
@@ -423,7 +423,7 @@ describe GraphQL::Schema::Warden do
|
|
423
423
|
|
424
424
|
res = MaskHelpers.query_with_mask(query_string, mask)
|
425
425
|
type = res["data"]["__type"]
|
426
|
-
|
426
|
+
assert_equal nil, type
|
427
427
|
end
|
428
428
|
end
|
429
429
|
end
|
@@ -543,7 +543,7 @@ describe GraphQL::Schema::Warden do
|
|
543
543
|
|
544
544
|
res = MaskHelpers.query_with_mask(query_string, mask)
|
545
545
|
|
546
|
-
|
546
|
+
assert_equal nil, res["data"]["WithinInput"], "The type isn't accessible by name"
|
547
547
|
|
548
548
|
languages_arg_names = res["data"]["Query"]["fields"].find { |f| f["name"] == "languages" }["args"].map { |a| a["name"] }
|
549
549
|
refute_includes languages_arg_names, "within", "Arguments that point to it are gone"
|
@@ -666,7 +666,7 @@ describe GraphQL::Schema::Warden do
|
|
666
666
|
it "is additive with query filters" do
|
667
667
|
query_except = ->(member, ctx) { member.metadata[:hidden_input_object_type] }
|
668
668
|
res = schema.execute(query_str, except: query_except)
|
669
|
-
|
669
|
+
assert_equal nil, res["data"]["input"]
|
670
670
|
enum_values = res["data"]["enum"]["enumValues"].map { |v| v["name"] }
|
671
671
|
refute_includes enum_values, "TRILL"
|
672
672
|
end
|
@@ -695,13 +695,13 @@ describe GraphQL::Schema::Warden do
|
|
695
695
|
only: [visible_enum_value, visible_abstract_type],
|
696
696
|
except: [hidden_input_object, hidden_type],
|
697
697
|
)
|
698
|
-
|
698
|
+
assert_equal nil, res["data"]["input"]
|
699
699
|
enum_values = res["data"]["enum"]["enumValues"].map { |v| v["name"] }
|
700
700
|
assert_equal 5, enum_values.length
|
701
701
|
refute_includes enum_values, "TRILL"
|
702
702
|
# These are also filtered out:
|
703
703
|
assert_equal 0, res["data"]["abstractType"]["interfaces"].length
|
704
|
-
|
704
|
+
assert_equal nil, res["data"]["type"]
|
705
705
|
end
|
706
706
|
end
|
707
707
|
|
@@ -712,7 +712,7 @@ describe GraphQL::Schema::Warden do
|
|
712
712
|
except: hidden_input_object,
|
713
713
|
}
|
714
714
|
res = MaskHelpers.run_query(query_str, context: { filters: filters })
|
715
|
-
|
715
|
+
assert_equal nil, res["data"]["input"]
|
716
716
|
enum_values = res["data"]["enum"]["enumValues"].map { |v| v["name"] }
|
717
717
|
assert_equal 5, enum_values.length
|
718
718
|
refute_includes enum_values, "TRILL"
|
@@ -727,13 +727,13 @@ describe GraphQL::Schema::Warden do
|
|
727
727
|
except: [hidden_input_object, hidden_type],
|
728
728
|
}
|
729
729
|
res = MaskHelpers.run_query(query_str, context: { filters: filters })
|
730
|
-
|
730
|
+
assert_equal nil, res["data"]["input"]
|
731
731
|
enum_values = res["data"]["enum"]["enumValues"].map { |v| v["name"] }
|
732
732
|
assert_equal 5, enum_values.length
|
733
733
|
refute_includes enum_values, "TRILL"
|
734
734
|
# These are also filtered out:
|
735
735
|
assert_equal 0, res["data"]["abstractType"]["interfaces"].length
|
736
|
-
|
736
|
+
assert_equal nil, res["data"]["type"]
|
737
737
|
end
|
738
738
|
end
|
739
739
|
end
|
data/spec/graphql/schema_spec.rb
CHANGED
@@ -23,19 +23,12 @@ describe GraphQL::Schema do
|
|
23
23
|
end
|
24
24
|
end
|
25
25
|
|
26
|
-
describe "#to_document" do
|
27
|
-
it "returns the AST for the schema IDL" do
|
28
|
-
expected = GraphQL::Language::DocumentFromSchemaDefinition.new(schema).document
|
29
|
-
assert expected.eql?(schema.to_document)
|
30
|
-
end
|
31
|
-
end
|
32
|
-
|
33
26
|
describe "#root_types" do
|
34
27
|
it "returns a list of the schema's root types" do
|
35
28
|
assert_equal(
|
36
29
|
[
|
37
30
|
Dummy::DairyAppQueryType,
|
38
|
-
Dummy::DairyAppMutationType,
|
31
|
+
Dummy::DairyAppMutationType.graphql_definition,
|
39
32
|
Dummy::SubscriptionType
|
40
33
|
],
|
41
34
|
schema.root_types
|
@@ -379,24 +372,25 @@ type Query {
|
|
379
372
|
assert_equal true, schema.lazy?(LazyObj.new)
|
380
373
|
assert_equal :dup, schema.lazy_method_name(LazyObjChild.new)
|
381
374
|
assert_equal true, schema.lazy?(LazyObjChild.new)
|
382
|
-
|
375
|
+
assert_equal nil, schema.lazy_method_name({})
|
383
376
|
assert_equal false, schema.lazy?({})
|
384
377
|
end
|
385
378
|
end
|
386
379
|
|
387
380
|
describe "#dup" do
|
388
381
|
it "copies internal state" do
|
389
|
-
|
390
|
-
|
382
|
+
schema_1 = schema.graphql_definition
|
383
|
+
schema_2 = schema_1.dup
|
384
|
+
refute schema_2.types.equal?(schema_1.types)
|
391
385
|
|
392
|
-
refute schema_2.instrumenters.equal?(
|
393
|
-
assert_equal schema_2.instrumenters,
|
386
|
+
refute schema_2.instrumenters.equal?(schema_1.instrumenters)
|
387
|
+
assert_equal schema_2.instrumenters, schema_1.instrumenters
|
394
388
|
|
395
|
-
refute schema_2.middleware.equal?(
|
396
|
-
assert_equal schema_2.middleware,
|
389
|
+
refute schema_2.middleware.equal?(schema_1.middleware)
|
390
|
+
assert_equal schema_2.middleware, schema_1.middleware
|
397
391
|
|
398
392
|
schema_2.middleware << ->(*args) { :noop }
|
399
|
-
refute_equal schema_2.middleware,
|
393
|
+
refute_equal schema_2.middleware, schema_1.middleware
|
400
394
|
end
|
401
395
|
end
|
402
396
|
|
@@ -425,13 +419,6 @@ type Query {
|
|
425
419
|
end
|
426
420
|
end
|
427
421
|
|
428
|
-
describe "#as_json" do
|
429
|
-
it "returns a hash" do
|
430
|
-
result = schema.execute(GraphQL::Introspection::INTROSPECTION_QUERY)
|
431
|
-
assert_equal result.as_json.class, Hash
|
432
|
-
end
|
433
|
-
end
|
434
|
-
|
435
422
|
describe "#get_field" do
|
436
423
|
it "returns fields by type or type name" do
|
437
424
|
field = schema.get_field("Cheese", "id")
|
@@ -440,4 +427,19 @@ type Query {
|
|
440
427
|
assert_equal field, field_2
|
441
428
|
end
|
442
429
|
end
|
430
|
+
|
431
|
+
describe "class-based schemas" do
|
432
|
+
it "delegates to the graphql definition" do
|
433
|
+
# Not delegated:
|
434
|
+
assert_equal Jazz::Query.graphql_definition, Jazz::Schema.query
|
435
|
+
assert Jazz::Schema.respond_to?(:query)
|
436
|
+
# Delegated
|
437
|
+
assert_equal [], Jazz::Schema.tracers
|
438
|
+
assert Jazz::Schema.respond_to?(:tracers)
|
439
|
+
end
|
440
|
+
|
441
|
+
it "works with plugins" do
|
442
|
+
assert_equal "xyz", Jazz::Schema.metadata[:plugin_key]
|
443
|
+
end
|
444
|
+
end
|
443
445
|
end
|
@@ -8,19 +8,18 @@ describe GraphQL::StaticValidation::FieldsHaveAppropriateSelections do
|
|
8
8
|
okCheese: cheese(id: 1) { fatContent, similarCheese(source: YAK) { source } }
|
9
9
|
missingFieldsCheese: cheese(id: 1)
|
10
10
|
illegalSelectionCheese: cheese(id: 1) { id { something, ... someFields } }
|
11
|
-
incorrectFragmentSpread: cheese(id: 1) { flavor { ... on String { __typename } } }
|
12
11
|
}
|
13
12
|
"}
|
14
13
|
|
15
14
|
it "adds errors for selections on scalars" do
|
16
|
-
assert_equal(
|
15
|
+
assert_equal(2, errors.length)
|
17
16
|
|
18
17
|
illegal_selection_error = {
|
19
18
|
"message"=>"Selections can't be made on scalars (field 'id' returns Int but has selections [something, someFields])",
|
20
19
|
"locations"=>[{"line"=>5, "column"=>47}],
|
21
20
|
"fields"=>["query getCheese", "illegalSelectionCheese", "id"],
|
22
21
|
}
|
23
|
-
assert_includes(errors, illegal_selection_error, "finds illegal selections on
|
22
|
+
assert_includes(errors, illegal_selection_error, "finds illegal selections on scalarss")
|
24
23
|
|
25
24
|
selection_required_error = {
|
26
25
|
"message"=>"Objects must have selections (field 'cheese' returns Cheese but has no selections)",
|
@@ -28,13 +27,6 @@ describe GraphQL::StaticValidation::FieldsHaveAppropriateSelections do
|
|
28
27
|
"fields"=>["query getCheese", "missingFieldsCheese"],
|
29
28
|
}
|
30
29
|
assert_includes(errors, selection_required_error, "finds objects without selections")
|
31
|
-
|
32
|
-
incorrect_fragment_error = {
|
33
|
-
"message"=>"Selections can't be made on scalars (field 'flavor' returns String but has inline fragments [String])",
|
34
|
-
"locations"=>[{"line"=>6, "column"=>48}],
|
35
|
-
"fields"=>["query getCheese", "incorrectFragmentSpread", "flavor"],
|
36
|
-
}
|
37
|
-
assert_includes(errors, incorrect_fragment_error, "finds scalar fields with selections")
|
38
30
|
end
|
39
31
|
|
40
32
|
describe "anonymous operations" do
|
@@ -515,7 +515,7 @@ describe GraphQL::StaticValidation::FieldsWillMerge do
|
|
515
515
|
scalar: String!
|
516
516
|
}
|
517
517
|
|
518
|
-
type NonNullStringBox1Impl implements SomeBox
|
518
|
+
type NonNullStringBox1Impl implements SomeBox, NonNullStringBox1 {
|
519
519
|
scalar: String!
|
520
520
|
unrelatedField: String
|
521
521
|
deepBox: SomeBox
|
@@ -525,7 +525,7 @@ describe GraphQL::StaticValidation::FieldsWillMerge do
|
|
525
525
|
scalar: String!
|
526
526
|
}
|
527
527
|
|
528
|
-
type NonNullStringBox2Impl implements SomeBox
|
528
|
+
type NonNullStringBox2Impl implements SomeBox, NonNullStringBox2 {
|
529
529
|
scalar: String!
|
530
530
|
unrelatedField: String
|
531
531
|
deepBox: SomeBox
|
@@ -72,9 +72,9 @@ describe GraphQL::STRING_TYPE do
|
|
72
72
|
end
|
73
73
|
|
74
74
|
it "doesn't accept other types" do
|
75
|
-
|
76
|
-
|
77
|
-
|
75
|
+
assert_equal nil, string_type.coerce_isolated_input(100)
|
76
|
+
assert_equal nil, string_type.coerce_isolated_input(true)
|
77
|
+
assert_equal nil, string_type.coerce_isolated_input(0.999)
|
78
78
|
end
|
79
79
|
end
|
80
80
|
end
|
@@ -242,7 +242,7 @@ describe GraphQL::Subscriptions do
|
|
242
242
|
schema.execute(query_str, context: { socket: "1" }, variables: { "id" => "8" }, root_value: root_object)
|
243
243
|
schema.subscriptions.trigger("payload", { "id" => "8"}, OpenStruct.new(str: nil, int: nil))
|
244
244
|
delivery = deliveries["1"].first
|
245
|
-
|
245
|
+
assert_equal nil, delivery.fetch("data")
|
246
246
|
assert_equal 1, delivery["errors"].length
|
247
247
|
end
|
248
248
|
|
@@ -41,72 +41,13 @@ describe GraphQL::Tracing::PlatformTracing do
|
|
41
41
|
schema.execute(" { cheese(id: 1) { flavor } }")
|
42
42
|
expected_trace = [
|
43
43
|
"em",
|
44
|
-
"am",
|
45
44
|
"l",
|
46
45
|
"p",
|
47
46
|
"v",
|
48
|
-
"aq",
|
49
|
-
"eq",
|
50
|
-
"Q.c", # notice that the flavor is skipped
|
51
|
-
"eql",
|
52
|
-
]
|
53
|
-
assert_equal expected_trace, CustomPlatformTracer::TRACE
|
54
|
-
end
|
55
|
-
end
|
56
|
-
|
57
|
-
describe "by default, scalar fields are not traced" do
|
58
|
-
let(:schema) {
|
59
|
-
Dummy::Schema.redefine {
|
60
|
-
use(CustomPlatformTracer)
|
61
|
-
}
|
62
|
-
}
|
63
|
-
|
64
|
-
before do
|
65
|
-
CustomPlatformTracer::TRACE.clear
|
66
|
-
end
|
67
|
-
|
68
|
-
it "only traces traceTrue, not traceFalse or traceNil" do
|
69
|
-
schema.execute(" { tracingScalar { traceNil traceFalse traceTrue } }")
|
70
|
-
expected_trace = [
|
71
|
-
"em",
|
72
47
|
"am",
|
73
|
-
"l",
|
74
|
-
"p",
|
75
|
-
"v",
|
76
48
|
"aq",
|
77
49
|
"eq",
|
78
|
-
"Q.
|
79
|
-
"T.t",
|
80
|
-
"eql",
|
81
|
-
]
|
82
|
-
assert_equal expected_trace, CustomPlatformTracer::TRACE
|
83
|
-
end
|
84
|
-
end
|
85
|
-
|
86
|
-
describe "when scalar fields are traced by default, they are unless specified" do
|
87
|
-
let(:schema) {
|
88
|
-
Dummy::Schema.redefine {
|
89
|
-
use(CustomPlatformTracer, trace_scalars: true)
|
90
|
-
}
|
91
|
-
}
|
92
|
-
|
93
|
-
before do
|
94
|
-
CustomPlatformTracer::TRACE.clear
|
95
|
-
end
|
96
|
-
|
97
|
-
it "traces traceTrue and traceNil but not traceFalse" do
|
98
|
-
schema.execute(" { tracingScalar { traceNil traceFalse traceTrue } }")
|
99
|
-
expected_trace = [
|
100
|
-
"em",
|
101
|
-
"am",
|
102
|
-
"l",
|
103
|
-
"p",
|
104
|
-
"v",
|
105
|
-
"aq",
|
106
|
-
"eq",
|
107
|
-
"Q.t",
|
108
|
-
"T.t",
|
109
|
-
"T.t",
|
50
|
+
"Q.c", # notice that the flavor is skipped
|
110
51
|
"eql",
|
111
52
|
]
|
112
53
|
assert_equal expected_trace, CustomPlatformTracer::TRACE
|
@@ -149,15 +149,6 @@ module Dummy
|
|
149
149
|
field :cheese, CheeseType
|
150
150
|
end
|
151
151
|
|
152
|
-
TracingScalarType = GraphQL::ObjectType.define do
|
153
|
-
name "TracingScalar"
|
154
|
-
description "An object which has traced scalars"
|
155
|
-
|
156
|
-
field :traceNil, types.Int
|
157
|
-
field :traceFalse, types.Int, trace: false
|
158
|
-
field :traceTrue, types.Int, trace: true
|
159
|
-
end
|
160
|
-
|
161
152
|
DairyProductUnion = GraphQL::UnionType.define do
|
162
153
|
name "DairyProduct"
|
163
154
|
description "Kinds of food made from milk"
|
@@ -381,16 +372,6 @@ module Dummy
|
|
381
372
|
resolve ->(t, a, c) { OpenStruct.new(cheese: nil) }
|
382
373
|
end
|
383
374
|
|
384
|
-
field :tracingScalar, TracingScalarType do
|
385
|
-
resolve ->(o, a, c) do
|
386
|
-
OpenStruct.new(
|
387
|
-
traceNil: 2,
|
388
|
-
traceFalse: 3,
|
389
|
-
tracetrue: 5,
|
390
|
-
)
|
391
|
-
end
|
392
|
-
end
|
393
|
-
|
394
375
|
field :deepNonNull, !DeepNonNullType do
|
395
376
|
resolve ->(o, a, c) { :deepNonNull }
|
396
377
|
end
|
@@ -403,26 +384,31 @@ module Dummy
|
|
403
384
|
input_field :values, !types[!types.Int]
|
404
385
|
end
|
405
386
|
|
406
|
-
|
407
|
-
name
|
387
|
+
PushValueField = GraphQL::Field.define do
|
388
|
+
name :pushValue
|
389
|
+
type !types[!types.Int]
|
390
|
+
description("Push a value onto a global array :D")
|
391
|
+
argument :value, !types.Int, as: :val
|
392
|
+
resolve ->(o, args, ctx) {
|
393
|
+
GLOBAL_VALUES << args.val
|
394
|
+
GLOBAL_VALUES
|
395
|
+
}
|
396
|
+
end
|
397
|
+
|
398
|
+
class DairyAppMutationType < GraphQL::Schema::Object
|
399
|
+
graphql_name "Mutation"
|
408
400
|
description "The root for mutations in this schema"
|
409
|
-
field
|
410
|
-
|
411
|
-
|
412
|
-
|
413
|
-
|
414
|
-
GLOBAL_VALUES
|
415
|
-
}
|
401
|
+
# Test the `field:` compatibility option
|
402
|
+
field :pushValue, field: PushValueField
|
403
|
+
|
404
|
+
field :replaceValues, [Integer], "Replace the global array with new values", null: false do
|
405
|
+
argument :input, ReplaceValuesInputType, required: true
|
416
406
|
end
|
417
407
|
|
418
|
-
|
419
|
-
|
420
|
-
|
421
|
-
|
422
|
-
GLOBAL_VALUES.clear
|
423
|
-
GLOBAL_VALUES.push(*args.input[:values])
|
424
|
-
GLOBAL_VALUES
|
425
|
-
}
|
408
|
+
def replace_values(input:)
|
409
|
+
GLOBAL_VALUES.clear
|
410
|
+
GLOBAL_VALUES.concat(input["values"])
|
411
|
+
GLOBAL_VALUES
|
426
412
|
end
|
427
413
|
end
|
428
414
|
|
@@ -433,7 +419,7 @@ module Dummy
|
|
433
419
|
end
|
434
420
|
end
|
435
421
|
|
436
|
-
Schema
|
422
|
+
class Schema < GraphQL::Schema
|
437
423
|
query DairyAppQueryType
|
438
424
|
mutation DairyAppMutationType
|
439
425
|
subscription SubscriptionType
|
@@ -442,8 +428,8 @@ module Dummy
|
|
442
428
|
|
443
429
|
rescue_from(NoSuchDairyError) { |err| err.message }
|
444
430
|
|
445
|
-
resolve_type
|
431
|
+
def self.resolve_type(type, obj, ctx)
|
446
432
|
Schema.types[obj.class.name.split("::").last]
|
447
|
-
|
433
|
+
end
|
448
434
|
end
|
449
435
|
end
|