graphql 1.7.6 → 1.8.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/generators/graphql/function_generator.rb +1 -1
- data/lib/generators/graphql/install_generator.rb +14 -8
- data/lib/generators/graphql/loader_generator.rb +1 -1
- data/lib/generators/graphql/mutation_generator.rb +6 -1
- data/lib/generators/graphql/templates/function.erb +2 -2
- data/lib/generators/graphql/templates/loader.erb +2 -2
- data/lib/generators/graphql/templates/schema.erb +1 -1
- data/lib/graphql/argument.rb +25 -19
- data/lib/graphql/backtrace/tracer.rb +16 -22
- data/lib/graphql/backtrace.rb +1 -1
- data/lib/graphql/backwards_compatibility.rb +2 -3
- data/lib/graphql/base_type.rb +31 -31
- data/lib/graphql/compatibility/query_parser_specification/parse_error_specification.rb +14 -0
- data/lib/graphql/compatibility/query_parser_specification.rb +117 -0
- data/lib/graphql/define/assign_object_field.rb +5 -12
- data/lib/graphql/deprecated_dsl.rb +42 -0
- data/lib/graphql/directive.rb +1 -0
- data/lib/graphql/enum_type.rb +3 -1
- data/lib/graphql/execution/execute.rb +21 -13
- data/lib/graphql/execution/instrumentation.rb +82 -0
- data/lib/graphql/execution/lazy/lazy_method_map.rb +1 -1
- data/lib/graphql/execution/lazy/resolve.rb +1 -3
- data/lib/graphql/execution/multiplex.rb +12 -29
- data/lib/graphql/execution.rb +1 -0
- data/lib/graphql/field.rb +21 -4
- data/lib/graphql/function.rb +14 -0
- data/lib/graphql/input_object_type.rb +3 -1
- data/lib/graphql/interface_type.rb +5 -3
- data/lib/graphql/internal_representation/node.rb +26 -14
- data/lib/graphql/internal_representation/visit.rb +3 -6
- data/lib/graphql/introspection/base_object.rb +16 -0
- data/lib/graphql/introspection/directive_location_enum.rb +11 -7
- data/lib/graphql/introspection/directive_type.rb +23 -16
- data/lib/graphql/introspection/dynamic_fields.rb +11 -0
- data/lib/graphql/introspection/entry_points.rb +29 -0
- data/lib/graphql/introspection/enum_value_type.rb +16 -11
- data/lib/graphql/introspection/field_type.rb +21 -12
- data/lib/graphql/introspection/input_value_type.rb +26 -23
- data/lib/graphql/introspection/schema_field.rb +7 -2
- data/lib/graphql/introspection/schema_type.rb +36 -22
- data/lib/graphql/introspection/type_by_name_field.rb +10 -2
- data/lib/graphql/introspection/type_kind_enum.rb +10 -6
- data/lib/graphql/introspection/type_type.rb +85 -23
- data/lib/graphql/introspection/typename_field.rb +1 -0
- data/lib/graphql/introspection.rb +3 -10
- data/lib/graphql/language/block_string.rb +47 -0
- data/lib/graphql/language/document_from_schema_definition.rb +280 -0
- data/lib/graphql/language/generation.rb +3 -182
- data/lib/graphql/language/lexer.rb +144 -69
- data/lib/graphql/language/lexer.rl +15 -4
- data/lib/graphql/language/nodes.rb +141 -78
- data/lib/graphql/language/parser.rb +677 -630
- data/lib/graphql/language/parser.y +18 -12
- data/lib/graphql/language/printer.rb +361 -0
- data/lib/graphql/language/token.rb +10 -3
- data/lib/graphql/language.rb +3 -0
- data/lib/graphql/non_null_type.rb +1 -1
- data/lib/graphql/object_type.rb +1 -6
- data/lib/graphql/query/arguments.rb +63 -32
- data/lib/graphql/query/context.rb +32 -2
- data/lib/graphql/query/literal_input.rb +4 -1
- data/lib/graphql/query/null_context.rb +1 -1
- data/lib/graphql/query/result.rb +1 -1
- data/lib/graphql/query/variables.rb +21 -3
- data/lib/graphql/query.rb +19 -6
- data/lib/graphql/railtie.rb +109 -0
- data/lib/graphql/relay/connection_resolve.rb +3 -0
- data/lib/graphql/relay/connection_type.rb +5 -3
- data/lib/graphql/relay/edge_type.rb +2 -1
- data/lib/graphql/relay/global_id_resolve.rb +5 -1
- data/lib/graphql/relay/mongo_relation_connection.rb +40 -0
- data/lib/graphql/relay/mutation/instrumentation.rb +1 -1
- data/lib/graphql/relay/mutation/resolve.rb +5 -1
- data/lib/graphql/relay/relation_connection.rb +14 -19
- data/lib/graphql/relay/type_extensions.rb +30 -0
- data/lib/graphql/relay.rb +2 -0
- data/lib/graphql/scalar_type.rb +14 -2
- data/lib/graphql/schema/argument.rb +92 -0
- data/lib/graphql/schema/build_from_definition.rb +64 -18
- data/lib/graphql/schema/enum.rb +85 -0
- data/lib/graphql/schema/enum_value.rb +74 -0
- data/lib/graphql/schema/field.rb +372 -0
- data/lib/graphql/schema/finder.rb +153 -0
- data/lib/graphql/schema/input_object.rb +87 -0
- data/lib/graphql/schema/interface.rb +105 -0
- data/lib/graphql/schema/introspection_system.rb +93 -0
- data/lib/graphql/schema/late_bound_type.rb +32 -0
- data/lib/graphql/schema/list.rb +32 -0
- data/lib/graphql/schema/loader.rb +2 -2
- data/lib/graphql/schema/member/accepts_definition.rb +152 -0
- data/lib/graphql/schema/member/base_dsl_methods.rb +100 -0
- data/lib/graphql/schema/member/build_type.rb +137 -0
- data/lib/graphql/schema/member/cached_graphql_definition.rb +26 -0
- data/lib/graphql/schema/member/graphql_type_names.rb +21 -0
- data/lib/graphql/schema/member/has_arguments.rb +50 -0
- data/lib/graphql/schema/member/has_fields.rb +130 -0
- data/lib/graphql/schema/member/instrumentation.rb +115 -0
- data/lib/graphql/schema/member/type_system_helpers.rb +34 -0
- data/lib/graphql/schema/member.rb +28 -0
- data/lib/graphql/schema/middleware_chain.rb +5 -1
- data/lib/graphql/schema/mutation.rb +138 -0
- data/lib/graphql/schema/non_null.rb +38 -0
- data/lib/graphql/schema/object.rb +81 -0
- data/lib/graphql/schema/printer.rb +33 -266
- data/lib/graphql/schema/relay_classic_mutation.rb +87 -0
- data/lib/graphql/schema/rescue_middleware.rb +8 -7
- data/lib/graphql/schema/resolver.rb +122 -0
- data/lib/graphql/schema/scalar.rb +35 -0
- data/lib/graphql/schema/traversal.rb +102 -22
- data/lib/graphql/schema/union.rb +36 -0
- data/lib/graphql/schema/validation.rb +3 -2
- data/lib/graphql/schema.rb +381 -12
- data/lib/graphql/static_validation/definition_dependencies.rb +1 -1
- data/lib/graphql/static_validation/literal_validator.rb +16 -4
- data/lib/graphql/static_validation/rules/fields_are_defined_on_type.rb +6 -6
- data/lib/graphql/static_validation/rules/fields_have_appropriate_selections.rb +5 -1
- data/lib/graphql/static_validation/rules/fields_will_merge.rb +15 -8
- data/lib/graphql/static_validation/rules/variables_are_used_and_defined.rb +11 -1
- data/lib/graphql/static_validation/validation_context.rb +1 -1
- data/lib/graphql/subscriptions/action_cable_subscriptions.rb +7 -5
- data/lib/graphql/subscriptions/instrumentation.rb +5 -1
- data/lib/graphql/subscriptions/serialize.rb +2 -0
- data/lib/graphql/subscriptions.rb +90 -16
- data/lib/graphql/tracing/data_dog_tracing.rb +49 -0
- data/lib/graphql/tracing/new_relic_tracing.rb +26 -0
- data/lib/graphql/tracing/platform_tracing.rb +20 -7
- data/lib/graphql/tracing/scout_tracing.rb +2 -2
- data/lib/graphql/tracing.rb +1 -0
- data/lib/graphql/unresolved_type_error.rb +3 -2
- data/lib/graphql/upgrader/member.rb +894 -0
- data/lib/graphql/upgrader/schema.rb +37 -0
- data/lib/graphql/version.rb +1 -1
- data/lib/graphql.rb +5 -25
- data/readme.md +2 -2
- data/spec/dummy/app/channels/graphql_channel.rb +23 -2
- data/spec/dummy/log/development.log +239 -0
- data/spec/dummy/log/test.log +410 -0
- data/spec/dummy/test/system/action_cable_subscription_test.rb +4 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/-x/-xYZjAnuuzgR79fcznLTQtSdh6AARxu8FcQ_J6p7L3U.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/13/13HiV12xyoQvT-1L39ZzLwMZxjyaGMiENmfw7f-QTIc.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/3W/3Wtf5pCWdqq0AB-iB0Y9uUNrTkruRxIEf1XFn_BETU0.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/5i/5iguGafb4hOn8262Kn8Q37ogNN9MxxQKGKNzHAzUcvI.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/8m/8mj2T6yy847Mc2Z7k3Xzh8O91hhVJt3NrPe8ASNDlIA.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/DT/DTQyMpr4ABZYQetsdRJ5A7S4jf1r3ie4FGOR7GZBNSs.cache +3 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Dq/DqJ5_yJPrP5iLlOQyTQsjAVI5FE5LCVDkED0f7GgsSo.cache +3 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/F8/F8MUNRzORGFgr329fNM0xLaoWCXdv3BIalT7dsvLfjs.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/KB/KB07ZaKNC5uXJ7TjLi-WqnY6g7dq8wWp_8N3HNjBNxg.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Rw/RwDuCV-XpnCtjNkvhpJfBuxXMk0b5AD3L9eR6M-wcy0.cache +3 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/UL/ULdjhhb0bRuqmaG7XSZlFYzGYCXTDnqZuJBTWRlzqgw.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Up/UpPNgh0yYoUsyMDh5zWqe_U6qJIyTC6-dxMMAs1vvlM.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Wg/Wguh-szFGTI1gaL6npYwPekMXflugRei7F_mOyRucXg.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/X-/X-khLYMA9mqFRPg3zAi86mREDxpKl4bdKYp3uF6WHos.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/bi/BIkdhfxsezxM4q-HZ4oCNTq97WEJTigcq0tpX2cDvbY.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/ff/FfxmA4CMHQZT7exx0G7NS1Wpcnny0vzp-Jhc2H36bp8.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/gE/gEiiG4GZNy_djEjK2pHm_NgA-gyhLZhdQvo0Yt96GqE.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/gn/gnA9ZSqpjccNL2m8pe_jBvY6SinXlCzXDWyop83Od8s.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/lO/lOAan3cMwCE_Hli6gsDML88xFNfn0nxPmvrSkW7eEOw.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/m1/M1pv8MJEPLXGLvS8QxVh3DSO9cI4mRt5FHFWdrvUj6o.cache +2 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/m7/m77qH7ZqH0_0SmwJbiKGDd-aLau1Dav847DC6ge46zY.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/sj/sjRjnjRB37lH2vrgtkdJ8Cz84__IJ978IuKTM7HcztI.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/um/um1JrirR4hJhK-1rE-HywlyCi5ibgxHVrReiujZBWJM.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/v4/v4fwVytD7ITcE0_GDbslZEYud8a5Okm85fV1o7SDl6g.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/v_/v_0PAQt0iipQjFP5zjgkkk9Stnpf4VzvnMv67d1Keuw.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/wd/wdT9U4MKxe1PyqNjVuCKMpCl3dxGCIRJIlwUTfh2DQU.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/xI/xIaxut_fEIhKBDqljTNwYaADK9kj3gG0ESrfHs-5_og.cache +3 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/y0/y0SJOqIx2fn1SKqOkAihsQow0trRJrSIyAswufVuoA8.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/zg/zgpzeaX-KZErHyGJ1aBH3ZusweNXMneVZule88XsIJI.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/zy/zYFltDy-8VC-uKq2BVEiJJyYXNFvVzAKuMlR3ZIYZsk.cache +0 -0
- data/spec/dummy/tmp/screenshots/failures_test_it_handles_subscriptions.png +0 -0
- data/spec/fixtures/upgrader/account.original.rb +19 -0
- data/spec/fixtures/upgrader/account.transformed.rb +20 -0
- data/spec/fixtures/upgrader/blame_range.original.rb +43 -0
- data/spec/fixtures/upgrader/blame_range.transformed.rb +30 -0
- data/spec/fixtures/upgrader/date_time.original.rb +24 -0
- data/spec/fixtures/upgrader/date_time.transformed.rb +23 -0
- data/spec/fixtures/upgrader/delete_project.original.rb +28 -0
- data/spec/fixtures/upgrader/delete_project.transformed.rb +27 -0
- data/spec/fixtures/upgrader/gist_order_field.original.rb +14 -0
- data/spec/fixtures/upgrader/gist_order_field.transformed.rb +13 -0
- data/spec/fixtures/upgrader/increment_count.original.rb +59 -0
- data/spec/fixtures/upgrader/increment_count.transformed.rb +50 -0
- data/spec/fixtures/upgrader/photo.original.rb +10 -0
- data/spec/fixtures/upgrader/photo.transformed.rb +12 -0
- data/spec/fixtures/upgrader/release_order.original.rb +15 -0
- data/spec/fixtures/upgrader/release_order.transformed.rb +14 -0
- data/spec/fixtures/upgrader/starrable.original.rb +49 -0
- data/spec/fixtures/upgrader/starrable.transformed.rb +46 -0
- data/spec/fixtures/upgrader/subscribable.original.rb +55 -0
- data/spec/fixtures/upgrader/subscribable.transformed.rb +51 -0
- data/spec/fixtures/upgrader/type_x.original.rb +65 -0
- data/spec/fixtures/upgrader/type_x.transformed.rb +56 -0
- data/spec/generators/graphql/function_generator_spec.rb +26 -0
- data/spec/generators/graphql/install_generator_spec.rb +1 -1
- data/spec/generators/graphql/loader_generator_spec.rb +24 -0
- 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/argument_spec.rb +21 -0
- data/spec/graphql/backtrace_spec.rb +10 -0
- data/spec/graphql/base_type_spec.rb +42 -0
- data/spec/graphql/boolean_type_spec.rb +3 -3
- data/spec/graphql/directive_spec.rb +3 -1
- data/spec/graphql/enum_type_spec.rb +18 -5
- data/spec/graphql/execution/execute_spec.rb +4 -4
- data/spec/graphql/execution/instrumentation_spec.rb +165 -0
- data/spec/graphql/execution/multiplex_spec.rb +2 -2
- data/spec/graphql/execution_error_spec.rb +18 -0
- 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 +15 -2
- data/spec/graphql/int_type_spec.rb +2 -2
- data/spec/graphql/interface_type_spec.rb +12 -0
- data/spec/graphql/internal_representation/rewrite_spec.rb +2 -2
- data/spec/graphql/introspection/schema_type_spec.rb +2 -0
- data/spec/graphql/language/block_string_spec.rb +70 -0
- data/spec/graphql/language/document_from_schema_definition_spec.rb +770 -0
- data/spec/graphql/language/generation_spec.rb +21 -186
- data/spec/graphql/language/lexer_spec.rb +21 -1
- data/spec/graphql/language/nodes_spec.rb +21 -12
- data/spec/graphql/language/parser_spec.rb +1 -1
- data/spec/graphql/language/printer_spec.rb +203 -0
- data/spec/graphql/object_type_spec.rb +22 -0
- data/spec/graphql/query/arguments_spec.rb +25 -15
- data/spec/graphql/query/context_spec.rb +18 -0
- data/spec/graphql/query/executor_spec.rb +2 -1
- data/spec/graphql/query/serial_execution/value_resolution_spec.rb +2 -8
- data/spec/graphql/query/variables_spec.rb +42 -1
- data/spec/graphql/query_spec.rb +31 -5
- data/spec/graphql/rake_task_spec.rb +3 -1
- 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/mongo_relation_connection_spec.rb +474 -0
- data/spec/graphql/relay/mutation_spec.rb +9 -7
- data/spec/graphql/relay/range_add_spec.rb +5 -1
- data/spec/graphql/relay/relation_connection_spec.rb +65 -1
- data/spec/graphql/schema/argument_spec.rb +87 -0
- data/spec/graphql/schema/build_from_definition_spec.rb +89 -5
- data/spec/graphql/schema/enum_spec.rb +74 -0
- data/spec/graphql/schema/field_spec.rb +225 -0
- data/spec/graphql/schema/finder_spec.rb +135 -0
- data/spec/graphql/schema/input_object_spec.rb +111 -0
- data/spec/graphql/schema/instrumentation_spec.rb +40 -0
- data/spec/graphql/schema/interface_spec.rb +185 -0
- data/spec/graphql/schema/introspection_system_spec.rb +39 -0
- data/spec/graphql/schema/member/accepts_definition_spec.rb +111 -0
- data/spec/graphql/schema/member/build_type_spec.rb +17 -0
- data/spec/graphql/schema/member/has_fields_spec.rb +129 -0
- data/spec/graphql/schema/member/type_system_helpers_spec.rb +63 -0
- data/spec/graphql/schema/mutation_spec.rb +148 -0
- data/spec/graphql/schema/object_spec.rb +175 -0
- data/spec/graphql/schema/printer_spec.rb +111 -15
- data/spec/graphql/schema/relay_classic_mutation_spec.rb +38 -0
- data/spec/graphql/schema/rescue_middleware_spec.rb +11 -0
- data/spec/graphql/schema/resolver_spec.rb +131 -0
- data/spec/graphql/schema/scalar_spec.rb +95 -0
- data/spec/graphql/schema/traversal_spec.rb +31 -0
- data/spec/graphql/schema/union_spec.rb +65 -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 +55 -12
- data/spec/graphql/static_validation/rules/fields_have_appropriate_selections_spec.rb +10 -2
- 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 +273 -184
- data/spec/graphql/tracing/active_support_notifications_tracing_spec.rb +1 -1
- data/spec/graphql/tracing/new_relic_tracing_spec.rb +47 -0
- data/spec/graphql/tracing/platform_tracing_spec.rb +60 -1
- data/spec/graphql/union_type_spec.rb +1 -1
- data/spec/graphql/upgrader/member_spec.rb +516 -0
- data/spec/graphql/upgrader/schema_spec.rb +82 -0
- data/spec/spec_helper.rb +8 -0
- data/spec/support/dummy/schema.rb +53 -24
- data/spec/support/jazz.rb +544 -0
- data/spec/support/lazy_helpers.rb +21 -23
- data/spec/support/new_relic.rb +24 -0
- data/spec/support/star_trek/data.rb +109 -0
- data/spec/support/star_trek/schema.rb +388 -0
- data/spec/support/star_wars/data.rb +6 -7
- data/spec/support/star_wars/schema.rb +127 -171
- metadata +233 -11
- data/lib/graphql/introspection/arguments_field.rb +0 -7
- data/lib/graphql/introspection/enum_values_field.rb +0 -18
- data/lib/graphql/introspection/fields_field.rb +0 -13
- data/lib/graphql/introspection/input_fields_field.rb +0 -12
- data/lib/graphql/introspection/interfaces_field.rb +0 -11
- data/lib/graphql/introspection/of_type_field.rb +0 -6
- data/lib/graphql/introspection/possible_types_field.rb +0 -11
@@ -103,14 +103,16 @@ describe GraphQL::Relay::Mutation do
|
|
103
103
|
end
|
104
104
|
|
105
105
|
it "applies the description to the derived field" do
|
106
|
-
|
106
|
+
field = GraphQL::Schema::Field.from_options(name: "x", **StarWars::IntroduceShipMutation.field_options)
|
107
|
+
assert_equal "Add a ship to this faction", field.description
|
107
108
|
end
|
108
109
|
|
109
110
|
it "inserts itself into the derived objects' metadata" do
|
110
|
-
|
111
|
-
assert_equal StarWars::IntroduceShipMutation,
|
111
|
+
field = GraphQL::Schema::Field.from_options(name: "x", **StarWars::IntroduceShipMutation.field_options)
|
112
|
+
assert_equal StarWars::IntroduceShipMutation, field.mutation
|
113
|
+
assert_equal StarWars::IntroduceShipMutation, field.to_graphql.mutation
|
114
|
+
assert_equal StarWars::IntroduceShipMutation, StarWars::IntroduceShipMutation.payload_type.mutation
|
112
115
|
assert_equal StarWars::IntroduceShipMutation, StarWars::IntroduceShipMutation.input_type.mutation
|
113
|
-
assert_equal StarWars::IntroduceShipMutation, StarWars::IntroduceShipMutation.result_class.mutation
|
114
116
|
end
|
115
117
|
|
116
118
|
describe "return_field ... property:" do
|
@@ -193,17 +195,17 @@ describe GraphQL::Relay::Mutation do
|
|
193
195
|
end
|
194
196
|
|
195
197
|
it "doesn't get a mutation in the metadata" do
|
196
|
-
|
198
|
+
assert_nil custom_return_type.mutation
|
197
199
|
end
|
198
200
|
|
199
201
|
it "supports input fields with nil default value" do
|
200
202
|
assert input.arguments['nullDefault'].default_value?
|
201
|
-
|
203
|
+
assert_nil input.arguments['nullDefault'].default_value
|
202
204
|
end
|
203
205
|
|
204
206
|
it "supports input fields with no default value" do
|
205
207
|
assert !input.arguments['noDefault'].default_value?
|
206
|
-
|
208
|
+
assert_nil input.arguments['noDefault'].default_value
|
207
209
|
end
|
208
210
|
|
209
211
|
it "supports input fields with non-nil default value" do
|
@@ -70,7 +70,11 @@ describe GraphQL::Relay::RangeAdd do
|
|
70
70
|
field :add_item, add_item.field
|
71
71
|
end
|
72
72
|
|
73
|
-
GraphQL::Schema
|
73
|
+
Class.new(GraphQL::Schema) do
|
74
|
+
self.query(query)
|
75
|
+
self.mutation(mutation)
|
76
|
+
self.cursor_encoder(PassThroughEncoder)
|
77
|
+
end
|
74
78
|
}
|
75
79
|
|
76
80
|
|
@@ -74,6 +74,35 @@ describe GraphQL::Relay::RelationConnection do
|
|
74
74
|
)
|
75
75
|
end
|
76
76
|
|
77
|
+
it "makes one sql query for items and another for count" do
|
78
|
+
query_str = <<-GRAPHQL
|
79
|
+
{
|
80
|
+
empire {
|
81
|
+
bases(first: 2) {
|
82
|
+
totalCount
|
83
|
+
edges {
|
84
|
+
cursor
|
85
|
+
node {
|
86
|
+
name
|
87
|
+
}
|
88
|
+
}
|
89
|
+
}
|
90
|
+
}
|
91
|
+
}
|
92
|
+
GRAPHQL
|
93
|
+
io = StringIO.new
|
94
|
+
begin
|
95
|
+
prev_logger = ActiveRecord::Base.logger
|
96
|
+
ActiveRecord::Base.logger = Logger.new(io)
|
97
|
+
result = star_wars_query(query_str, "first" => 2)
|
98
|
+
ensure
|
99
|
+
ActiveRecord::Base.logger = prev_logger
|
100
|
+
end
|
101
|
+
assert_equal 2, io.string.scan("\n").count, "Two log entries"
|
102
|
+
assert_equal 3, result["data"]["empire"]["bases"]["totalCount"]
|
103
|
+
assert_equal 2, result["data"]["empire"]["bases"]["edges"].size
|
104
|
+
end
|
105
|
+
|
77
106
|
it "provides bidirectional_pagination" do
|
78
107
|
result = star_wars_query(query_string, "first" => 1)
|
79
108
|
last_cursor = get_last_cursor(result)
|
@@ -88,6 +117,13 @@ describe GraphQL::Relay::RelationConnection do
|
|
88
117
|
assert_equal true, get_page_info(result)["hasNextPage"]
|
89
118
|
assert_equal true, get_page_info(result)["hasPreviousPage"]
|
90
119
|
|
120
|
+
last_cursor = get_last_cursor(result)
|
121
|
+
result = with_bidirectional_pagination {
|
122
|
+
star_wars_query(query_string, "last" => 1, "before" => last_cursor)
|
123
|
+
}
|
124
|
+
assert_equal true, get_page_info(result)["hasNextPage"]
|
125
|
+
assert_equal false, get_page_info(result)["hasPreviousPage"]
|
126
|
+
|
91
127
|
result = star_wars_query(query_string, "first" => 100)
|
92
128
|
last_cursor = get_last_cursor(result)
|
93
129
|
|
@@ -100,7 +136,6 @@ describe GraphQL::Relay::RelationConnection do
|
|
100
136
|
}
|
101
137
|
assert_equal true, get_page_info(result)["hasNextPage"]
|
102
138
|
assert_equal true, get_page_info(result)["hasPreviousPage"]
|
103
|
-
|
104
139
|
end
|
105
140
|
|
106
141
|
it 'slices the result' do
|
@@ -564,6 +599,35 @@ describe GraphQL::Relay::RelationConnection do
|
|
564
599
|
result = star_wars_query(query_string, "last" => 1, "nameIncludes" => "ea", "before" => before)
|
565
600
|
assert_equal(["Death Star"], get_names(result))
|
566
601
|
end
|
602
|
+
|
603
|
+
it "makes one sql query for items and another for count" do
|
604
|
+
query_str = <<-GRAPHQL
|
605
|
+
{
|
606
|
+
empire {
|
607
|
+
basesAsSequelDataset(first: 2) {
|
608
|
+
totalCount
|
609
|
+
edges {
|
610
|
+
cursor
|
611
|
+
node {
|
612
|
+
name
|
613
|
+
}
|
614
|
+
}
|
615
|
+
}
|
616
|
+
}
|
617
|
+
}
|
618
|
+
GRAPHQL
|
619
|
+
result = nil
|
620
|
+
io = StringIO.new
|
621
|
+
begin
|
622
|
+
StarWars::DB.loggers << Logger.new(io)
|
623
|
+
result = star_wars_query(query_str, "first" => 2)
|
624
|
+
ensure
|
625
|
+
StarWars::DB.loggers.pop
|
626
|
+
end
|
627
|
+
assert_equal 2, io.string.scan("SELECT").count
|
628
|
+
assert_equal 3, result["data"]["empire"]["basesAsSequelDataset"]["totalCount"]
|
629
|
+
assert_equal 2, result["data"]["empire"]["basesAsSequelDataset"]["edges"].size
|
630
|
+
end
|
567
631
|
end
|
568
632
|
end
|
569
633
|
|
@@ -0,0 +1,87 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
require "spec_helper"
|
3
|
+
|
4
|
+
describe GraphQL::Schema::Argument do
|
5
|
+
module SchemaArgumentTest
|
6
|
+
class Query < GraphQL::Schema::Object
|
7
|
+
field :field, String, null: false do
|
8
|
+
argument :arg, String, description: "test", required: false
|
9
|
+
|
10
|
+
argument :arg_with_block, String, required: false do
|
11
|
+
description "test"
|
12
|
+
end
|
13
|
+
|
14
|
+
argument :aliased_arg, String, required: false, as: :renamed
|
15
|
+
argument :prepared_arg, Int, required: false, prepare: :multiply
|
16
|
+
end
|
17
|
+
|
18
|
+
def field(**args)
|
19
|
+
args.inspect
|
20
|
+
end
|
21
|
+
|
22
|
+
def multiply(val)
|
23
|
+
context[:multiply_by] * val
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
class Schema < GraphQL::Schema
|
28
|
+
query(Query)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
|
33
|
+
|
34
|
+
describe "#name" do
|
35
|
+
it "reflects camelization" do
|
36
|
+
assert_equal "argWithBlock", SchemaArgumentTest::Query.fields["field"].arguments["argWithBlock"].name
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
describe "#type" do
|
41
|
+
let(:argument) { SchemaArgumentTest::Query.fields["field"].arguments["arg"] }
|
42
|
+
it "returns the type" do
|
43
|
+
assert_equal GraphQL::STRING_TYPE, argument.type
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
describe "graphql definition" do
|
48
|
+
it "calls block" do
|
49
|
+
assert_equal "test", SchemaArgumentTest::Query.fields["field"].arguments["argWithBlock"].description
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
describe "#description" do
|
54
|
+
it "sets description" do
|
55
|
+
SchemaArgumentTest::Query.fields["field"].arguments["arg"].description "new description"
|
56
|
+
assert_equal "new description", SchemaArgumentTest::Query.fields["field"].arguments["arg"].description
|
57
|
+
end
|
58
|
+
|
59
|
+
it "returns description" do
|
60
|
+
assert_equal "test", SchemaArgumentTest::Query.fields["field"].arguments["argWithBlock"].description
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
describe "as:" do
|
65
|
+
it "uses that Symbol for Ruby kwargs" do
|
66
|
+
query_str = <<-GRAPHQL
|
67
|
+
{ field(aliasedArg: "x") }
|
68
|
+
GRAPHQL
|
69
|
+
|
70
|
+
res = SchemaArgumentTest::Schema.execute(query_str)
|
71
|
+
# Make sure it's getting the renamed symbol:
|
72
|
+
assert_equal '{:renamed=>"x"}', res["data"]["field"]
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
describe "prepare:" do
|
77
|
+
it "calls the method on the field's owner" do
|
78
|
+
query_str = <<-GRAPHQL
|
79
|
+
{ field(preparedArg: 5) }
|
80
|
+
GRAPHQL
|
81
|
+
|
82
|
+
res = SchemaArgumentTest::Schema.execute(query_str, context: {multiply_by: 3})
|
83
|
+
# Make sure it's getting the renamed symbol:
|
84
|
+
assert_equal '{:prepared_arg=>15}', res["data"]["field"]
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
@@ -30,6 +30,20 @@ type HelloScalars {
|
|
30
30
|
build_schema_and_compare_output(schema.chop)
|
31
31
|
end
|
32
32
|
|
33
|
+
it 'can build a schema with default input object values' do
|
34
|
+
schema = <<-SCHEMA
|
35
|
+
input InputObject {
|
36
|
+
a: Int
|
37
|
+
}
|
38
|
+
|
39
|
+
type Query {
|
40
|
+
a(input: InputObject = {a: 1}): String
|
41
|
+
}
|
42
|
+
SCHEMA
|
43
|
+
|
44
|
+
build_schema_and_compare_output(schema.chop)
|
45
|
+
end
|
46
|
+
|
33
47
|
it 'can build a schema with directives' do
|
34
48
|
schema = <<-SCHEMA
|
35
49
|
schema {
|
@@ -118,11 +132,12 @@ type Hello {
|
|
118
132
|
|
119
133
|
it 'supports adding directives while maintaining built-in directives' do
|
120
134
|
schema = <<-SCHEMA
|
121
|
-
schema {
|
135
|
+
schema @custom(thing: true) {
|
122
136
|
query: Hello
|
123
137
|
}
|
124
138
|
|
125
139
|
directive @foo(arg: Int) on FIELD
|
140
|
+
directive @custom(thing: Boolean) on SCHEMA
|
126
141
|
|
127
142
|
type Hello {
|
128
143
|
str: String
|
@@ -294,7 +309,7 @@ schema {
|
|
294
309
|
}
|
295
310
|
|
296
311
|
type Hello {
|
297
|
-
str(
|
312
|
+
str(bool: Boolean, int: Int): String
|
298
313
|
}
|
299
314
|
SCHEMA
|
300
315
|
|
@@ -491,7 +506,7 @@ type HelloScalars {
|
|
491
506
|
}
|
492
507
|
|
493
508
|
type Mutation {
|
494
|
-
addHelloScalars(
|
509
|
+
addHelloScalars(bool: Boolean, int: Int, str: String): HelloScalars
|
495
510
|
}
|
496
511
|
SCHEMA
|
497
512
|
|
@@ -506,7 +521,7 @@ enum Color {
|
|
506
521
|
}
|
507
522
|
|
508
523
|
type Mutation {
|
509
|
-
hello(
|
524
|
+
hello(color: Color = RED, int: Int, nullDefault: Int = null, str: String): String
|
510
525
|
}
|
511
526
|
|
512
527
|
type Query {
|
@@ -531,7 +546,7 @@ type HelloScalars {
|
|
531
546
|
}
|
532
547
|
|
533
548
|
type Subscription {
|
534
|
-
subscribeHelloScalars(
|
549
|
+
subscribeHelloScalars(bool: Boolean, int: Int, str: String): HelloScalars
|
535
550
|
}
|
536
551
|
SCHEMA
|
537
552
|
|
@@ -589,6 +604,75 @@ type Query {
|
|
589
604
|
|
590
605
|
build_schema_and_compare_output(schema.chop)
|
591
606
|
end
|
607
|
+
|
608
|
+
it 'supports empty types' do
|
609
|
+
schema = <<-SCHEMA
|
610
|
+
type Query {
|
611
|
+
}
|
612
|
+
SCHEMA
|
613
|
+
|
614
|
+
build_schema_and_compare_output(schema.chop)
|
615
|
+
end
|
616
|
+
|
617
|
+
it "tracks original AST node" do
|
618
|
+
schema_definition = <<-GRAPHQL
|
619
|
+
schema @custom(thing: true) {
|
620
|
+
query: Query
|
621
|
+
}
|
622
|
+
|
623
|
+
enum Enum {
|
624
|
+
VALUE
|
625
|
+
}
|
626
|
+
|
627
|
+
type Query {
|
628
|
+
field(argument: String): String
|
629
|
+
deprecatedField(argument: String): String @deprecated(reason: "Test")
|
630
|
+
}
|
631
|
+
|
632
|
+
interface Interface {
|
633
|
+
field(argument: String): String
|
634
|
+
}
|
635
|
+
|
636
|
+
union Union = Query
|
637
|
+
|
638
|
+
scalar Scalar
|
639
|
+
|
640
|
+
input Input {
|
641
|
+
argument: String
|
642
|
+
}
|
643
|
+
|
644
|
+
directive @Directive (
|
645
|
+
# Argument
|
646
|
+
argument: String
|
647
|
+
) on SCHEMA
|
648
|
+
|
649
|
+
type Type implements Interface {
|
650
|
+
field(argument: String): String
|
651
|
+
}
|
652
|
+
GRAPHQL
|
653
|
+
|
654
|
+
schema = GraphQL::Schema.from_definition(schema_definition)
|
655
|
+
|
656
|
+
assert_equal [1, 1], schema.ast_node.position
|
657
|
+
assert_equal [1, 8], schema.ast_node.directives.first.position
|
658
|
+
assert_equal [5, 1], schema.types["Enum"].ast_node.position
|
659
|
+
assert_equal [6, 3], schema.types["Enum"].values["VALUE"].ast_node.position
|
660
|
+
assert_equal [9, 1], schema.types["Query"].ast_node.position
|
661
|
+
assert_equal [10, 3], schema.types["Query"].fields["field"].ast_node.position
|
662
|
+
assert_equal [10, 9], schema.types["Query"].fields["field"].arguments["argument"].ast_node.position
|
663
|
+
assert_equal [11, 45], schema.types["Query"].fields["deprecatedField"].ast_node.directives[0].position
|
664
|
+
assert_equal [11, 57], schema.types["Query"].fields["deprecatedField"].ast_node.directives[0].arguments[0].position
|
665
|
+
assert_equal [14, 1], schema.types["Interface"].ast_node.position
|
666
|
+
assert_equal [15, 3], schema.types["Interface"].fields["field"].ast_node.position
|
667
|
+
assert_equal [15, 9], schema.types["Interface"].fields["field"].arguments["argument"].ast_node.position
|
668
|
+
assert_equal [18, 1], schema.types["Union"].ast_node.position
|
669
|
+
assert_equal [20, 1], schema.types["Scalar"].ast_node.position
|
670
|
+
assert_equal [22, 1], schema.types["Input"].ast_node.position
|
671
|
+
assert_equal [23, 3], schema.types["Input"].arguments["argument"].ast_node.position
|
672
|
+
assert_equal [26, 1], schema.directives["Directive"].ast_node.position
|
673
|
+
assert_equal [28, 3], schema.directives["Directive"].arguments["argument"].ast_node.position
|
674
|
+
assert_equal [31, 22], schema.types["Type"].ast_node.interfaces[0].position
|
675
|
+
end
|
592
676
|
end
|
593
677
|
|
594
678
|
describe 'Failures' do
|
@@ -0,0 +1,74 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
require "spec_helper"
|
3
|
+
|
4
|
+
describe GraphQL::Schema::Enum do
|
5
|
+
let(:enum) { Jazz::Family }
|
6
|
+
describe "type info" do
|
7
|
+
it "tells about the definition" do
|
8
|
+
assert_equal "Family", enum.graphql_name
|
9
|
+
assert_equal 29, enum.description.length
|
10
|
+
assert_equal 6, enum.values.size
|
11
|
+
end
|
12
|
+
|
13
|
+
it "inherits values and description" do
|
14
|
+
new_enum = Class.new(enum) do
|
15
|
+
value :Nonsense
|
16
|
+
value :PERCUSSION, "new description"
|
17
|
+
end
|
18
|
+
|
19
|
+
# Description was inherited
|
20
|
+
assert_equal 29, new_enum.description.length
|
21
|
+
# values were inherited without modifying the parent
|
22
|
+
assert_equal 6, enum.values.size
|
23
|
+
assert_equal 7, new_enum.values.size
|
24
|
+
perc_value = new_enum.values["PERCUSSION"]
|
25
|
+
assert_equal "new description", perc_value.description
|
26
|
+
end
|
27
|
+
|
28
|
+
it "accepts a block" do
|
29
|
+
assert_equal "Neither here nor there, really", enum.values["KEYS"].description
|
30
|
+
end
|
31
|
+
|
32
|
+
it "is the #owner of its values" do
|
33
|
+
value = enum.values["STRING"]
|
34
|
+
assert_equal enum, value.owner
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
it "uses a custom enum value class" do
|
39
|
+
enum_type = enum.to_graphql
|
40
|
+
value = enum_type.values["STRING"]
|
41
|
+
assert_equal 1, value.metadata[:custom_setting]
|
42
|
+
end
|
43
|
+
|
44
|
+
describe ".to_graphql" do
|
45
|
+
it "creates an EnumType" do
|
46
|
+
enum_type = enum.to_graphql
|
47
|
+
assert_equal "Family", enum_type.name
|
48
|
+
assert_equal "Groups of musical instruments", enum_type.description
|
49
|
+
|
50
|
+
string_val = enum_type.values["STRING"]
|
51
|
+
didg_val = enum_type.values["DIDGERIDOO"]
|
52
|
+
assert_equal "STRING", string_val.name
|
53
|
+
assert_equal :str, string_val.value
|
54
|
+
assert_equal "DIDGERIDOO", didg_val.name
|
55
|
+
assert_equal "Merged into BRASS", didg_val.deprecation_reason
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
describe "in queries" do
|
60
|
+
it "works as return values" do
|
61
|
+
query_str = "{ instruments { family } }"
|
62
|
+
expected_families = ["STRING", "WOODWIND", "BRASS", "KEYS", "KEYS", "PERCUSSION"]
|
63
|
+
result = Jazz::Schema.execute(query_str)
|
64
|
+
assert_equal expected_families, result["data"]["instruments"].map { |i| i["family"] }
|
65
|
+
end
|
66
|
+
|
67
|
+
it "works as input" do
|
68
|
+
query_str = "query($family: Family!) { instruments(family: $family) { name } }"
|
69
|
+
expected_names = ["Piano", "Organ"]
|
70
|
+
result = Jazz::Schema.execute(query_str, variables: { family: "KEYS" })
|
71
|
+
assert_equal expected_names, result["data"]["instruments"].map { |i| i["name"] }
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
@@ -0,0 +1,225 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
require "spec_helper"
|
3
|
+
|
4
|
+
describe GraphQL::Schema::Field do
|
5
|
+
describe "graphql definition" do
|
6
|
+
let(:object_class) { Jazz::Query }
|
7
|
+
let(:field) { object_class.fields["inspectInput"] }
|
8
|
+
|
9
|
+
it "uses the argument class" do
|
10
|
+
arg_defn = field.graphql_definition.arguments.values.first
|
11
|
+
assert_equal :ok, arg_defn.metadata[:custom]
|
12
|
+
end
|
13
|
+
|
14
|
+
it "attaches itself to its graphql_definition as type_class" do
|
15
|
+
assert_equal field, field.graphql_definition.metadata[:type_class]
|
16
|
+
end
|
17
|
+
|
18
|
+
it "camelizes the field name, unless camelize: false" do
|
19
|
+
assert_equal 'inspectInput', field.graphql_definition.name
|
20
|
+
assert_equal 'inspectInput', field.name
|
21
|
+
|
22
|
+
underscored_field = GraphQL::Schema::Field.from_options(:underscored_field, String, null: false, camelize: false, owner: nil) do
|
23
|
+
argument :underscored_arg, String, required: true, camelize: false
|
24
|
+
end
|
25
|
+
|
26
|
+
assert_equal 'underscored_field', underscored_field.to_graphql.name
|
27
|
+
arg_name, arg_defn = underscored_field.to_graphql.arguments.first
|
28
|
+
assert_equal 'underscored_arg', arg_name
|
29
|
+
assert_equal 'underscored_arg', arg_defn.name
|
30
|
+
end
|
31
|
+
|
32
|
+
it "exposes the method override" do
|
33
|
+
object = Class.new(Jazz::BaseObject) do
|
34
|
+
field :t, String, method: :tt, null: true
|
35
|
+
end
|
36
|
+
assert_equal :tt, object.fields["t"].method_sym
|
37
|
+
assert_equal "tt", object.fields["t"].method_str
|
38
|
+
end
|
39
|
+
|
40
|
+
it "accepts a block for definition" do
|
41
|
+
object = Class.new(Jazz::BaseObject) do
|
42
|
+
graphql_name "JustAName"
|
43
|
+
|
44
|
+
field :test, String, null: true do
|
45
|
+
argument :test, String, required: true
|
46
|
+
description "A Description."
|
47
|
+
end
|
48
|
+
end.to_graphql
|
49
|
+
|
50
|
+
assert_equal "test", object.fields["test"].arguments["test"].name
|
51
|
+
assert_equal "A Description.", object.fields["test"].description
|
52
|
+
end
|
53
|
+
|
54
|
+
it "accepts anonymous classes as type" do
|
55
|
+
type = Class.new(GraphQL::Schema::Object) do
|
56
|
+
graphql_name 'MyType'
|
57
|
+
end
|
58
|
+
field = GraphQL::Schema::Field.from_options(:my_field, type, owner: nil, null: true)
|
59
|
+
assert_equal type.to_graphql, field.to_graphql.type
|
60
|
+
end
|
61
|
+
|
62
|
+
describe "extras" do
|
63
|
+
it "can get errors, which adds path" do
|
64
|
+
query_str = <<-GRAPHQL
|
65
|
+
query {
|
66
|
+
find(id: "Musician/Herbie Hancock") {
|
67
|
+
... on Musician {
|
68
|
+
addError
|
69
|
+
}
|
70
|
+
}
|
71
|
+
}
|
72
|
+
GRAPHQL
|
73
|
+
|
74
|
+
res = Jazz::Schema.execute(query_str)
|
75
|
+
err = res["errors"].first
|
76
|
+
assert_equal "this has a path", err["message"]
|
77
|
+
assert_equal ["find", "addError"], err["path"]
|
78
|
+
assert_equal [{"line"=>4, "column"=>15}], err["locations"]
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
it "is the #owner of its arguments" do
|
83
|
+
field = Jazz::Query.fields["find"]
|
84
|
+
argument = field.arguments["id"]
|
85
|
+
assert_equal field, argument.owner
|
86
|
+
end
|
87
|
+
|
88
|
+
it "has a reference to the object that owns it with #owner" do
|
89
|
+
assert_equal Jazz::Query, field.owner
|
90
|
+
end
|
91
|
+
|
92
|
+
describe "type" do
|
93
|
+
it "tells the return type" do
|
94
|
+
assert_equal "[String!]!", field.type.graphql_definition.to_s
|
95
|
+
end
|
96
|
+
|
97
|
+
it "returns the type class" do
|
98
|
+
field = Jazz::Query.fields["nowPlaying"]
|
99
|
+
assert_equal Jazz::PerformingAct, field.type.of_type
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
describe "complexity" do
|
104
|
+
it "accepts a keyword argument" do
|
105
|
+
object = Class.new(Jazz::BaseObject) do
|
106
|
+
graphql_name "complexityKeyword"
|
107
|
+
|
108
|
+
field :complexityTest, String, null: true, complexity: 25
|
109
|
+
end.to_graphql
|
110
|
+
|
111
|
+
assert_equal 25, object.fields["complexityTest"].complexity
|
112
|
+
end
|
113
|
+
|
114
|
+
it "accepts a proc in the definition block" do
|
115
|
+
object = Class.new(Jazz::BaseObject) do
|
116
|
+
graphql_name "complexityKeyword"
|
117
|
+
|
118
|
+
field :complexityTest, String, null: true do
|
119
|
+
complexity ->(_ctx, _args, _child_complexity) { 52 }
|
120
|
+
end
|
121
|
+
end.to_graphql
|
122
|
+
|
123
|
+
assert_equal 52, object.fields["complexityTest"].complexity.call(nil, nil, nil)
|
124
|
+
end
|
125
|
+
|
126
|
+
it "accepts an integer in the definition block" do
|
127
|
+
object = Class.new(Jazz::BaseObject) do
|
128
|
+
graphql_name "complexityKeyword"
|
129
|
+
|
130
|
+
field :complexityTest, String, null: true do
|
131
|
+
complexity 38
|
132
|
+
end
|
133
|
+
end.to_graphql
|
134
|
+
|
135
|
+
assert_equal 38, object.fields["complexityTest"].complexity
|
136
|
+
end
|
137
|
+
|
138
|
+
it 'fails if the complexity is not numeric and not a proc' do
|
139
|
+
err = assert_raises(RuntimeError) do
|
140
|
+
Class.new(Jazz::BaseObject) do
|
141
|
+
graphql_name "complexityKeyword"
|
142
|
+
|
143
|
+
field :complexityTest, String, null: true do
|
144
|
+
complexity 'One hundred and eighty'
|
145
|
+
end
|
146
|
+
end.to_graphql
|
147
|
+
end
|
148
|
+
|
149
|
+
assert_match /^Invalid complexity:/, err.message
|
150
|
+
end
|
151
|
+
|
152
|
+
it 'fails if the proc does not accept 3 parameters' do
|
153
|
+
err = assert_raises(RuntimeError) do
|
154
|
+
Class.new(Jazz::BaseObject) do
|
155
|
+
graphql_name "complexityKeyword"
|
156
|
+
|
157
|
+
field :complexityTest, String, null: true do
|
158
|
+
complexity ->(one, two) { 52 }
|
159
|
+
end
|
160
|
+
end.to_graphql
|
161
|
+
end
|
162
|
+
|
163
|
+
assert_match /^A complexity proc should always accept 3 parameters/, err.message
|
164
|
+
end
|
165
|
+
end
|
166
|
+
end
|
167
|
+
|
168
|
+
describe "build type errors" do
|
169
|
+
it "includes the full name" do
|
170
|
+
thing = Class.new(GraphQL::Schema::Object) do
|
171
|
+
graphql_name "Thing"
|
172
|
+
# `Set` is a class but not a GraphQL type
|
173
|
+
field :stuff, Set, null: false
|
174
|
+
end
|
175
|
+
|
176
|
+
err = assert_raises ArgumentError do
|
177
|
+
thing.fields["stuff"].type
|
178
|
+
end
|
179
|
+
|
180
|
+
assert_includes err.message, "Thing.stuff"
|
181
|
+
assert_includes err.message, "Unexpected class/module"
|
182
|
+
end
|
183
|
+
|
184
|
+
it "makes a suggestion when the type is false" do
|
185
|
+
thing = Class.new(GraphQL::Schema::Object) do
|
186
|
+
graphql_name "Thing"
|
187
|
+
# False might come from an invalid `!`
|
188
|
+
field :stuff, false, null: false
|
189
|
+
end
|
190
|
+
|
191
|
+
err = assert_raises ArgumentError do
|
192
|
+
thing.fields["stuff"].type
|
193
|
+
end
|
194
|
+
|
195
|
+
assert_includes err.message, "Thing.stuff"
|
196
|
+
assert_includes err.message, "Received `false` instead of a type, maybe a `!` should be replaced with `null: true` (for fields) or `required: true` (for arguments)"
|
197
|
+
end
|
198
|
+
|
199
|
+
it "makes a suggestion when the type is a GraphQL::Field" do
|
200
|
+
err = assert_raises ArgumentError do
|
201
|
+
Class.new(GraphQL::Schema::Object) do
|
202
|
+
graphql_name "Thing"
|
203
|
+
# Previously, field was a valid second argument
|
204
|
+
field :stuff, GraphQL::Relay::Node.field, null: false
|
205
|
+
end
|
206
|
+
end
|
207
|
+
|
208
|
+
assert_includes err.message, "use the `field:` keyword for this instead"
|
209
|
+
end
|
210
|
+
end
|
211
|
+
|
212
|
+
describe "mutation" do
|
213
|
+
it "passes when not including extra arguments" do
|
214
|
+
mutation_class = Class.new(GraphQL::Schema::Mutation) do
|
215
|
+
graphql_name "Thing"
|
216
|
+
field :stuff, String, null: false
|
217
|
+
end
|
218
|
+
|
219
|
+
obj = Class.new(GraphQL::Schema::Object) do
|
220
|
+
field(:my_field, mutation: mutation_class, null: true)
|
221
|
+
end
|
222
|
+
assert_equal obj.fields["myField"].mutation, mutation_class
|
223
|
+
end
|
224
|
+
end
|
225
|
+
end
|