graphql 1.8.7 → 1.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/generators/graphql/install_generator.rb +2 -1
- data/lib/generators/graphql/scalar_generator.rb +20 -0
- data/lib/generators/graphql/templates/base_scalar.erb +4 -0
- data/lib/generators/graphql/templates/scalar.erb +13 -0
- data/lib/graphql/analysis/ast/analyzer.rb +62 -0
- data/lib/graphql/analysis/ast/field_usage.rb +28 -0
- data/lib/graphql/analysis/ast/max_query_complexity.rb +23 -0
- data/lib/graphql/analysis/ast/max_query_depth.rb +18 -0
- data/lib/graphql/analysis/ast/query_complexity.rb +114 -0
- data/lib/graphql/analysis/ast/query_depth.rb +66 -0
- data/lib/graphql/analysis/ast/visitor.rb +255 -0
- data/lib/graphql/analysis/ast.rb +82 -0
- data/lib/graphql/analysis.rb +1 -0
- data/lib/graphql/argument.rb +5 -0
- data/lib/graphql/authorization.rb +1 -0
- data/lib/graphql/backwards_compatibility.rb +1 -1
- data/lib/graphql/base_type.rb +1 -1
- data/lib/graphql/compatibility/execution_specification/specification_schema.rb +1 -2
- data/lib/graphql/compatibility/schema_parser_specification.rb +2 -6
- data/lib/graphql/dig.rb +19 -0
- data/lib/graphql/directive/include_directive.rb +1 -7
- data/lib/graphql/directive/skip_directive.rb +1 -8
- data/lib/graphql/directive.rb +13 -1
- data/lib/graphql/enum_type.rb +8 -0
- data/lib/graphql/execution/execute.rb +36 -17
- data/lib/graphql/execution/instrumentation.rb +2 -0
- data/lib/graphql/execution/interpreter/execution_errors.rb +29 -0
- data/lib/graphql/execution/interpreter/hash_response.rb +46 -0
- data/lib/graphql/execution/interpreter/resolve.rb +58 -0
- data/lib/graphql/execution/interpreter/runtime.rb +597 -0
- data/lib/graphql/execution/interpreter.rb +99 -0
- data/lib/graphql/execution/lazy.rb +8 -1
- data/lib/graphql/execution/lookahead.rb +351 -0
- data/lib/graphql/execution/multiplex.rb +37 -29
- data/lib/graphql/execution.rb +2 -0
- data/lib/graphql/execution_error.rb +1 -1
- data/lib/graphql/field.rb +1 -7
- data/lib/graphql/integer_encoding_error.rb +12 -0
- data/lib/graphql/internal_representation/rewrite.rb +127 -142
- data/lib/graphql/introspection/dynamic_fields.rb +8 -2
- data/lib/graphql/introspection/entry_points.rb +11 -6
- data/lib/graphql/introspection/enum_value_type.rb +4 -0
- data/lib/graphql/introspection/schema_type.rb +7 -2
- data/lib/graphql/introspection/type_type.rb +9 -5
- data/lib/graphql/invalid_null_error.rb +1 -1
- data/lib/graphql/language/block_string.rb +37 -0
- data/lib/graphql/language/document_from_schema_definition.rb +10 -7
- data/lib/graphql/language/lexer.rb +55 -36
- data/lib/graphql/language/lexer.rl +8 -3
- data/lib/graphql/language/nodes.rb +440 -362
- data/lib/graphql/language/parser.rb +56 -56
- data/lib/graphql/language/parser.y +12 -12
- data/lib/graphql/language/printer.rb +2 -2
- data/lib/graphql/language/visitor.rb +158 -15
- data/lib/graphql/language.rb +0 -1
- data/lib/graphql/literal_validation_error.rb +6 -0
- data/lib/graphql/query/arguments.rb +3 -2
- data/lib/graphql/query/arguments_cache.rb +1 -1
- data/lib/graphql/query/context.rb +14 -5
- data/lib/graphql/query/executor.rb +1 -1
- data/lib/graphql/query/result.rb +1 -1
- data/lib/graphql/query/validation_pipeline.rb +35 -11
- data/lib/graphql/query/variable_validation_error.rb +10 -1
- data/lib/graphql/query.rb +16 -2
- data/lib/graphql/relay/base_connection.rb +2 -0
- data/lib/graphql/relay/connection_instrumentation.rb +3 -1
- data/lib/graphql/relay/connection_resolve.rb +1 -1
- data/lib/graphql/relay/node.rb +2 -28
- data/lib/graphql/relay/relation_connection.rb +1 -1
- data/lib/graphql/schema/argument.rb +13 -5
- data/lib/graphql/schema/base_64_encoder.rb +4 -4
- data/lib/graphql/schema/build_from_definition.rb +2 -4
- data/lib/graphql/schema/default_type_error.rb +1 -1
- data/lib/graphql/schema/directive/feature.rb +66 -0
- data/lib/graphql/schema/directive/include.rb +25 -0
- data/lib/graphql/schema/directive/skip.rb +25 -0
- data/lib/graphql/schema/directive/transform.rb +48 -0
- data/lib/graphql/schema/directive.rb +103 -0
- data/lib/graphql/schema/enum_value.rb +3 -2
- data/lib/graphql/schema/field/connection_extension.rb +50 -0
- data/lib/graphql/schema/field/scope_extension.rb +18 -0
- data/lib/graphql/schema/field.rb +273 -64
- data/lib/graphql/schema/field_extension.rb +69 -0
- data/lib/graphql/schema/input_object.rb +16 -8
- data/lib/graphql/schema/interface.rb +1 -0
- data/lib/graphql/schema/loader.rb +22 -16
- data/lib/graphql/schema/member/base_dsl_methods.rb +8 -2
- data/lib/graphql/schema/member/build_type.rb +33 -1
- data/lib/graphql/schema/member/has_arguments.rb +6 -2
- data/lib/graphql/schema/member/has_fields.rb +18 -70
- data/lib/graphql/schema/member/has_path.rb +25 -0
- data/lib/graphql/schema/member/instrumentation.rb +10 -7
- data/lib/graphql/schema/member.rb +2 -0
- data/lib/graphql/schema/mutation.rb +6 -48
- data/lib/graphql/schema/non_null.rb +5 -1
- data/lib/graphql/schema/object.rb +18 -4
- data/lib/graphql/schema/printer.rb +1 -1
- data/lib/graphql/schema/relay_classic_mutation.rb +42 -9
- data/lib/graphql/schema/resolver/has_payload_type.rb +65 -0
- data/lib/graphql/schema/resolver.rb +45 -20
- data/lib/graphql/schema/subscription.rb +97 -0
- data/lib/graphql/schema/traversal.rb +11 -7
- data/lib/graphql/schema.rb +186 -38
- data/lib/graphql/static_validation/all_rules.rb +3 -2
- data/lib/graphql/static_validation/base_visitor.rb +199 -0
- data/lib/graphql/static_validation/default_visitor.rb +15 -0
- data/lib/graphql/static_validation/definition_dependencies.rb +62 -68
- data/lib/graphql/static_validation/{message.rb → error.rb} +11 -11
- data/lib/graphql/static_validation/interpreter_visitor.rb +14 -0
- data/lib/graphql/static_validation/literal_validator.rb +54 -11
- data/lib/graphql/static_validation/no_validate_visitor.rb +10 -0
- data/lib/graphql/static_validation/rules/argument_literals_are_compatible.rb +87 -16
- data/lib/graphql/static_validation/rules/argument_literals_are_compatible_error.rb +31 -0
- data/lib/graphql/static_validation/rules/argument_names_are_unique.rb +11 -11
- data/lib/graphql/static_validation/rules/argument_names_are_unique_error.rb +30 -0
- data/lib/graphql/static_validation/rules/arguments_are_defined.rb +52 -8
- data/lib/graphql/static_validation/rules/arguments_are_defined_error.rb +35 -0
- data/lib/graphql/static_validation/rules/directives_are_defined.rb +12 -15
- data/lib/graphql/static_validation/rules/directives_are_defined_error.rb +29 -0
- data/lib/graphql/static_validation/rules/directives_are_in_valid_locations.rb +19 -14
- data/lib/graphql/static_validation/rules/directives_are_in_valid_locations_error.rb +31 -0
- data/lib/graphql/static_validation/rules/fields_are_defined_on_type.rb +17 -19
- data/lib/graphql/static_validation/rules/fields_are_defined_on_type_error.rb +32 -0
- data/lib/graphql/static_validation/rules/fields_have_appropriate_selections.rb +30 -14
- data/lib/graphql/static_validation/rules/fields_have_appropriate_selections_error.rb +31 -0
- data/lib/graphql/static_validation/rules/fields_will_merge.rb +356 -29
- data/lib/graphql/static_validation/rules/fields_will_merge_error.rb +32 -0
- data/lib/graphql/static_validation/rules/fragment_names_are_unique.rb +20 -13
- data/lib/graphql/static_validation/rules/fragment_names_are_unique_error.rb +29 -0
- data/lib/graphql/static_validation/rules/fragment_spreads_are_possible.rb +37 -29
- data/lib/graphql/static_validation/rules/fragment_spreads_are_possible_error.rb +35 -0
- data/lib/graphql/static_validation/rules/fragment_types_exist.rb +25 -17
- data/lib/graphql/static_validation/rules/fragment_types_exist_error.rb +29 -0
- data/lib/graphql/static_validation/rules/fragments_are_finite.rb +12 -10
- data/lib/graphql/static_validation/rules/fragments_are_finite_error.rb +29 -0
- data/lib/graphql/static_validation/rules/fragments_are_named.rb +7 -11
- data/lib/graphql/static_validation/rules/fragments_are_named_error.rb +26 -0
- data/lib/graphql/static_validation/rules/fragments_are_on_composite_types.rb +16 -16
- data/lib/graphql/static_validation/rules/fragments_are_on_composite_types_error.rb +30 -0
- data/lib/graphql/static_validation/rules/fragments_are_used.rb +21 -14
- data/lib/graphql/static_validation/rules/fragments_are_used_error.rb +29 -0
- data/lib/graphql/static_validation/rules/mutation_root_exists.rb +10 -14
- data/lib/graphql/static_validation/rules/mutation_root_exists_error.rb +26 -0
- data/lib/graphql/static_validation/rules/no_definitions_are_present.rb +30 -30
- data/lib/graphql/static_validation/rules/no_definitions_are_present_error.rb +25 -0
- data/lib/graphql/static_validation/rules/operation_names_are_valid.rb +25 -17
- data/lib/graphql/static_validation/rules/operation_names_are_valid_error.rb +28 -0
- data/lib/graphql/static_validation/rules/required_arguments_are_present.rb +17 -18
- data/lib/graphql/static_validation/rules/required_arguments_are_present_error.rb +35 -0
- data/lib/graphql/static_validation/rules/required_input_object_attributes_are_present.rb +47 -0
- data/lib/graphql/static_validation/rules/required_input_object_attributes_are_present_error.rb +35 -0
- data/lib/graphql/static_validation/rules/subscription_root_exists.rb +10 -14
- data/lib/graphql/static_validation/rules/subscription_root_exists_error.rb +26 -0
- data/lib/graphql/static_validation/rules/unique_directives_per_location.rb +28 -17
- data/lib/graphql/static_validation/rules/unique_directives_per_location_error.rb +29 -0
- data/lib/graphql/static_validation/rules/variable_default_values_are_correctly_typed.rb +35 -27
- data/lib/graphql/static_validation/rules/variable_default_values_are_correctly_typed_error.rb +39 -0
- data/lib/graphql/static_validation/rules/variable_names_are_unique.rb +15 -14
- data/lib/graphql/static_validation/rules/variable_names_are_unique_error.rb +29 -0
- data/lib/graphql/static_validation/rules/variable_usages_are_allowed.rb +41 -30
- data/lib/graphql/static_validation/rules/variable_usages_are_allowed_error.rb +38 -0
- data/lib/graphql/static_validation/rules/variables_are_input_types.rb +18 -14
- data/lib/graphql/static_validation/rules/variables_are_input_types_error.rb +32 -0
- data/lib/graphql/static_validation/rules/variables_are_used_and_defined.rb +73 -65
- data/lib/graphql/static_validation/rules/variables_are_used_and_defined_error.rb +37 -0
- data/lib/graphql/static_validation/validation_context.rb +8 -51
- data/lib/graphql/static_validation/validator.rb +23 -15
- data/lib/graphql/static_validation.rb +5 -3
- data/lib/graphql/subscriptions/action_cable_subscriptions.rb +21 -2
- data/lib/graphql/subscriptions/event.rb +28 -5
- data/lib/graphql/subscriptions/subscription_root.rb +66 -0
- data/lib/graphql/subscriptions.rb +16 -2
- data/lib/graphql/tracing/active_support_notifications_tracing.rb +0 -1
- data/lib/graphql/tracing/appsignal_tracing.rb +1 -1
- data/lib/graphql/tracing/data_dog_tracing.rb +1 -1
- data/lib/graphql/tracing/new_relic_tracing.rb +3 -3
- data/lib/graphql/tracing/platform_tracing.rb +17 -1
- data/lib/graphql/tracing/prometheus_tracing.rb +1 -1
- data/lib/graphql/tracing/scout_tracing.rb +1 -1
- data/lib/graphql/tracing/skylight_tracing.rb +3 -3
- data/lib/graphql/tracing.rb +8 -8
- data/lib/graphql/types/float.rb +1 -1
- data/lib/graphql/types/int.rb +11 -2
- data/lib/graphql/types/iso_8601_date_time.rb +15 -1
- data/lib/graphql/types/relay/base_connection.rb +15 -1
- data/lib/graphql/types/relay/node.rb +0 -1
- data/lib/graphql/types/relay/node_field.rb +43 -0
- data/lib/graphql/types/relay/nodes_field.rb +45 -0
- data/lib/graphql/types/relay.rb +2 -0
- data/lib/graphql/unauthorized_error.rb +4 -0
- data/lib/graphql/unauthorized_field_error.rb +23 -0
- data/lib/graphql/upgrader/member.rb +5 -0
- data/lib/graphql/version.rb +1 -1
- data/lib/graphql.rb +6 -1
- data/readme.md +7 -7
- data/spec/dummy/Gemfile +1 -1
- data/spec/dummy/Gemfile.lock +157 -0
- data/spec/dummy/app/channels/graphql_channel.rb +22 -11
- data/spec/dummy/config/locales/en.yml +1 -1
- data/spec/dummy/log/test.log +199 -0
- data/spec/dummy/test/test_helper.rb +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/4w/4wzXRZrAkwKdgYaSE0pid5eB-fer8vSfSku_NPg4rMA.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/7I/7IHVBiJT06QSpgLpLoJIxboQ0B-D_tMTxsvoezBTV3Q.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/8w/8wY_SKagj8wHuwGNAAf6JnQ8joMbC6cEYpHrTAI8Urc.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/AK/AKzz1u6bGb4auXcrObA_g5LL-oV0ejNGa448AgAi_WQ.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/ET/ETW4uxvaYpruL8y6_ZptUH82ZowMaHIqvg5WexBFdEM.cache +3 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/F1/F1TWpjjyA56k9Z90n5B3xRn7DUdGjX73QCkYC6k07JQ.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/F8/F8MUNRzORGFgr329fNM0xLaoWCXdv3BIalT7dsvLfjs.cache +2 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/KB/KB07ZaKNC5uXJ7TjLi-WqnY6g7dq8wWp_8N3HNjBNxg.cache +2 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Ms/MsKSimH_UCB-H1tLvDABDHuvGciuoW6kVqQWDrXU5FQ.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Mt/Mtci-Kim50aPOmeClD4AIicKn1d1WJ0n454IjSd94sk.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/QH/QHt3Tc1Y6M66Oo_pDuMyWrQNs4Pp3SMeZR5K1wJj2Ts.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/XU/XU4k1OXnfMils5SrirorPvDSyDSqiOWLZNtmAH1HH8k.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/ZI/ZIof7mZxWWCnraIFOCuV6a8QRWzKJXJnx2Xd7C0ZyX0.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/cG/cGc_puuPS5pZKgUcy1Y_i1L6jl5UtsiIrMH59rTzR6c.cache +3 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/df/dfro_B6bx3KP1Go-7jEOqqZ2j4hVRseXIc3es9PKQno.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/jO/jO1DfbqnG0mTULsjJJANc3fefrG2zt7DIMmcptMT628.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/pE/pE7gO6pQ-z187Swb4hT554wmqsq-cNzgPWLrCz-LQQQ.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/r9/r9iU1l58a6rxkZSW5RSC52_tD-_UQuHxoMVnkfJ7Mhs.cache +1 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/xi/xitPPFfPIyDMpaznV0sBBcw8eSCV8PJcLLWin78sCgE.cache +0 -0
- data/spec/dummy/tmp/screenshots/failures_test_it_handles_subscriptions.png +0 -0
- data/spec/graphql/analysis/analyze_query_spec.rb +1 -1
- data/spec/graphql/analysis/ast/field_usage_spec.rb +51 -0
- data/spec/graphql/analysis/ast/max_query_complexity_spec.rb +120 -0
- data/spec/graphql/analysis/ast/max_query_depth_spec.rb +114 -0
- data/spec/graphql/analysis/ast/query_complexity_spec.rb +299 -0
- data/spec/graphql/analysis/ast/query_depth_spec.rb +108 -0
- data/spec/graphql/analysis/ast_spec.rb +269 -0
- data/spec/graphql/authorization_spec.rb +120 -23
- data/spec/graphql/base_type_spec.rb +6 -4
- data/spec/graphql/enum_type_spec.rb +6 -1
- data/spec/graphql/execution/execute_spec.rb +9 -9
- data/spec/graphql/execution/instrumentation_spec.rb +19 -0
- data/spec/graphql/execution/interpreter_spec.rb +485 -0
- data/spec/graphql/execution/lazy_spec.rb +67 -1
- data/spec/graphql/execution/lookahead_spec.rb +363 -0
- data/spec/graphql/execution/multiplex_spec.rb +31 -3
- data/spec/graphql/execution/typecast_spec.rb +20 -20
- data/spec/graphql/execution_error_spec.rb +110 -96
- data/spec/graphql/field_spec.rb +1 -1
- data/spec/graphql/input_object_type_spec.rb +13 -352
- data/spec/graphql/int_type_spec.rb +19 -0
- data/spec/graphql/interface_type_spec.rb +4 -4
- data/spec/graphql/internal_representation/rewrite_spec.rb +2 -0
- data/spec/graphql/introspection/input_value_type_spec.rb +1 -1
- data/spec/graphql/introspection/type_type_spec.rb +1 -2
- data/spec/graphql/language/document_from_schema_definition_spec.rb +2 -2
- data/spec/graphql/language/lexer_spec.rb +72 -3
- data/spec/graphql/language/nodes_spec.rb +20 -0
- data/spec/graphql/language/printer_spec.rb +18 -6
- data/spec/graphql/language/visitor_spec.rb +320 -14
- data/spec/graphql/non_null_type_spec.rb +1 -1
- data/spec/graphql/object_type_spec.rb +32 -27
- data/spec/graphql/query/arguments_spec.rb +21 -0
- data/spec/graphql/query/context_spec.rb +28 -0
- data/spec/graphql/query/executor_spec.rb +40 -36
- data/spec/graphql/query_spec.rb +12 -6
- data/spec/graphql/schema/argument_spec.rb +35 -1
- data/spec/graphql/schema/build_from_definition_spec.rb +144 -29
- data/spec/graphql/schema/catchall_middleware_spec.rb +16 -15
- data/spec/graphql/schema/directive/feature_spec.rb +81 -0
- data/spec/graphql/schema/directive/transform_spec.rb +39 -0
- data/spec/graphql/schema/enum_spec.rb +12 -3
- data/spec/graphql/schema/enum_value_spec.rb +11 -0
- data/spec/graphql/schema/field_extension_spec.rb +115 -0
- data/spec/graphql/schema/field_spec.rb +47 -7
- data/spec/graphql/schema/input_object_spec.rb +95 -0
- data/spec/graphql/schema/instrumentation_spec.rb +3 -0
- data/spec/graphql/schema/interface_spec.rb +8 -2
- data/spec/graphql/schema/introspection_system_spec.rb +9 -1
- data/spec/graphql/schema/loader_spec.rb +5 -0
- data/spec/graphql/schema/member/accepts_definition_spec.rb +4 -0
- data/spec/graphql/schema/member/build_type_spec.rb +46 -0
- data/spec/graphql/schema/member/scoped_spec.rb +19 -3
- data/spec/graphql/schema/mutation_spec.rb +5 -3
- data/spec/graphql/schema/object_spec.rb +9 -1
- data/spec/graphql/schema/printer_spec.rb +255 -93
- data/spec/graphql/schema/relay_classic_mutation_spec.rb +133 -0
- data/spec/graphql/schema/resolver_spec.rb +173 -9
- data/spec/graphql/schema/scalar_spec.rb +6 -0
- data/spec/graphql/schema/subscription_spec.rb +416 -0
- data/spec/graphql/schema/traversal_spec.rb +10 -10
- data/spec/graphql/schema/type_expression_spec.rb +2 -2
- data/spec/graphql/schema/union_spec.rb +7 -0
- data/spec/graphql/schema/validation_spec.rb +1 -1
- data/spec/graphql/schema/warden_spec.rb +145 -88
- data/spec/graphql/static_validation/rules/argument_literals_are_compatible_spec.rb +213 -73
- data/spec/graphql/static_validation/rules/argument_names_are_unique_spec.rb +2 -2
- data/spec/graphql/static_validation/rules/arguments_are_defined_spec.rb +72 -29
- data/spec/graphql/static_validation/rules/directives_are_defined_spec.rb +4 -2
- data/spec/graphql/static_validation/rules/directives_are_in_valid_locations_spec.rb +4 -2
- data/spec/graphql/static_validation/rules/fields_are_defined_on_type_spec.rb +10 -5
- data/spec/graphql/static_validation/rules/fields_have_appropriate_selections_spec.rb +10 -5
- data/spec/graphql/static_validation/rules/fields_will_merge_spec.rb +131 -5
- data/spec/graphql/static_validation/rules/fragment_names_are_unique_spec.rb +2 -1
- data/spec/graphql/static_validation/rules/fragment_spreads_are_possible_spec.rb +6 -3
- data/spec/graphql/static_validation/rules/fragment_types_exist_spec.rb +4 -2
- data/spec/graphql/static_validation/rules/fragments_are_finite_spec.rb +4 -2
- data/spec/graphql/static_validation/rules/fragments_are_named_spec.rb +2 -1
- data/spec/graphql/static_validation/rules/fragments_are_on_composite_types_spec.rb +6 -3
- data/spec/graphql/static_validation/rules/fragments_are_used_spec.rb +22 -2
- data/spec/graphql/static_validation/rules/mutation_root_exists_spec.rb +2 -1
- data/spec/graphql/static_validation/rules/operation_names_are_valid_spec.rb +6 -3
- data/spec/graphql/static_validation/rules/required_arguments_are_present_spec.rb +13 -4
- data/spec/graphql/static_validation/rules/required_input_object_attributes_are_present_spec.rb +58 -0
- data/spec/graphql/static_validation/rules/subscription_root_exists_spec.rb +2 -1
- data/spec/graphql/static_validation/rules/unique_directives_per_location_spec.rb +14 -7
- data/spec/graphql/static_validation/rules/variable_default_values_are_correctly_typed_spec.rb +14 -7
- data/spec/graphql/static_validation/rules/variable_usages_are_allowed_spec.rb +8 -4
- data/spec/graphql/static_validation/rules/variables_are_input_types_spec.rb +8 -4
- data/spec/graphql/static_validation/rules/variables_are_used_and_defined_spec.rb +23 -3
- data/spec/graphql/static_validation/type_stack_spec.rb +10 -19
- data/spec/graphql/static_validation/validator_spec.rb +50 -2
- data/spec/graphql/subscriptions_spec.rb +27 -16
- data/spec/graphql/tracing/new_relic_tracing_spec.rb +16 -0
- data/spec/graphql/tracing/platform_tracing_spec.rb +59 -37
- data/spec/graphql/tracing/prometheus_tracing_spec.rb +3 -0
- data/spec/graphql/tracing/skylight_tracing_spec.rb +16 -0
- data/spec/graphql/types/iso_8601_date_time_spec.rb +29 -2
- data/spec/graphql/union_type_spec.rb +2 -2
- data/spec/graphql/upgrader/member_spec.rb +67 -0
- data/spec/{graphql → integration/mongoid/graphql}/relay/mongo_relation_connection_spec.rb +11 -22
- data/spec/integration/mongoid/spec_helper.rb +2 -0
- data/spec/{support → integration/mongoid}/star_trek/data.rb +0 -0
- data/spec/{support → integration/mongoid}/star_trek/schema.rb +56 -34
- data/spec/{support/star_wars → integration/rails}/data.rb +1 -0
- data/spec/{support → integration/rails/generators}/base_generator_test.rb +0 -0
- data/spec/{generators → integration/rails/generators}/graphql/enum_generator_spec.rb +0 -0
- data/spec/{generators → integration/rails/generators}/graphql/install_generator_spec.rb +1 -1
- data/spec/{generators → integration/rails/generators}/graphql/interface_generator_spec.rb +0 -0
- data/spec/{generators → integration/rails/generators}/graphql/loader_generator_spec.rb +0 -0
- data/spec/{generators → integration/rails/generators}/graphql/mutation_generator_spec.rb +0 -0
- data/spec/{generators → integration/rails/generators}/graphql/object_generator_spec.rb +0 -0
- data/spec/integration/rails/generators/graphql/scalar_generator_spec.rb +28 -0
- data/spec/{generators → integration/rails/generators}/graphql/union_generator_spec.rb +0 -0
- data/spec/integration/rails/graphql/input_object_type_spec.rb +364 -0
- data/spec/{graphql → integration/rails/graphql}/query/variables_spec.rb +7 -7
- data/spec/{graphql → integration/rails/graphql}/relay/array_connection_spec.rb +9 -9
- data/spec/{graphql → integration/rails/graphql}/relay/base_connection_spec.rb +11 -3
- data/spec/{graphql → integration/rails/graphql}/relay/connection_instrumentation_spec.rb +19 -22
- data/spec/{graphql → integration/rails/graphql}/relay/connection_resolve_spec.rb +16 -0
- data/spec/{graphql → integration/rails/graphql}/relay/connection_type_spec.rb +0 -0
- data/spec/{graphql → integration/rails/graphql}/relay/edge_spec.rb +0 -0
- data/spec/{graphql → integration/rails/graphql}/relay/mutation_spec.rb +48 -0
- data/spec/{graphql → integration/rails/graphql}/relay/node_spec.rb +0 -0
- data/spec/{graphql → integration/rails/graphql}/relay/page_info_spec.rb +22 -22
- data/spec/{graphql → integration/rails/graphql}/relay/range_add_spec.rb +4 -4
- data/spec/{graphql → integration/rails/graphql}/relay/relation_connection_spec.rb +56 -27
- data/spec/{graphql → integration/rails/graphql}/schema_spec.rb +15 -11
- data/spec/{graphql → integration/rails/graphql}/tracing/active_support_notifications_tracing_spec.rb +16 -9
- data/spec/integration/rails/spec_helper.rb +25 -0
- data/spec/integration/tmp/app/graphql/types/family_type.rb +9 -0
- data/spec/spec_helper.rb +23 -39
- data/spec/support/dummy/data.rb +20 -17
- data/spec/support/dummy/schema.rb +315 -305
- data/spec/support/error_bubbling_helpers.rb +23 -0
- data/spec/support/jazz.rb +213 -46
- data/spec/support/lazy_helpers.rb +69 -27
- data/spec/support/new_relic.rb +3 -0
- data/spec/support/skylight.rb +3 -0
- data/spec/support/star_wars/schema.rb +131 -81
- data/spec/support/static_validation_helpers.rb +9 -5
- metadata +418 -261
- data/lib/graphql/language/comments.rb +0 -45
- data/lib/graphql/static_validation/arguments_validator.rb +0 -50
- data/spec/graphql/schema/member/has_fields_spec.rb +0 -129
- data/spec/rails_dependency_sanity_spec.rb +0 -14
@@ -2,7 +2,7 @@
|
|
2
2
|
require "spec_helper"
|
3
3
|
|
4
4
|
describe GraphQL::ObjectType do
|
5
|
-
let(:type) { Dummy::
|
5
|
+
let(:type) { Dummy::Cheese.graphql_definition }
|
6
6
|
|
7
7
|
it "doesn't allow double non-null constraints" do
|
8
8
|
assert_raises(GraphQL::DoubleNonNullTypeError) {
|
@@ -45,10 +45,10 @@ describe GraphQL::ObjectType do
|
|
45
45
|
describe "interfaces" do
|
46
46
|
it "may have interfaces" do
|
47
47
|
assert_equal([
|
48
|
-
Dummy::
|
49
|
-
Dummy::
|
50
|
-
Dummy::
|
51
|
-
Dummy::
|
48
|
+
Dummy::Edible.graphql_definition,
|
49
|
+
Dummy::EdibleAsMilk.graphql_definition,
|
50
|
+
Dummy::AnimalProduct.graphql_definition,
|
51
|
+
Dummy::LocalProduct.graphql_definition
|
52
52
|
], type.interfaces)
|
53
53
|
end
|
54
54
|
|
@@ -85,7 +85,7 @@ describe GraphQL::ObjectType do
|
|
85
85
|
end
|
86
86
|
|
87
87
|
it "accepts fields definition" do
|
88
|
-
last_produced_dairy = GraphQL::Field.define(name: :last_produced_dairy, type: Dummy::
|
88
|
+
last_produced_dairy = GraphQL::Field.define(name: :last_produced_dairy, type: Dummy::DairyProduct)
|
89
89
|
cow_type = GraphQL::ObjectType.define(name: "Cow", fields: [last_produced_dairy])
|
90
90
|
assert_equal([last_produced_dairy], cow_type.fields)
|
91
91
|
end
|
@@ -94,54 +94,54 @@ describe GraphQL::ObjectType do
|
|
94
94
|
it "adds an interface" do
|
95
95
|
type = GraphQL::ObjectType.define do
|
96
96
|
name 'Hello'
|
97
|
-
implements Dummy::
|
98
|
-
implements Dummy::
|
97
|
+
implements Dummy::Edible
|
98
|
+
implements Dummy::AnimalProduct
|
99
99
|
|
100
100
|
field :hello, types.String
|
101
101
|
end
|
102
102
|
|
103
|
-
assert_equal([Dummy::
|
103
|
+
assert_equal([Dummy::Edible.graphql_definition, Dummy::AnimalProduct.graphql_definition], type.interfaces)
|
104
104
|
end
|
105
105
|
|
106
106
|
it "adds many interfaces" do
|
107
107
|
type = GraphQL::ObjectType.define do
|
108
108
|
name 'Hello'
|
109
|
-
implements Dummy::
|
109
|
+
implements Dummy::Edible, Dummy::AnimalProduct
|
110
110
|
|
111
111
|
field :hello, types.String
|
112
112
|
end
|
113
113
|
|
114
|
-
assert_equal([Dummy::
|
114
|
+
assert_equal([Dummy::Edible.graphql_definition, Dummy::AnimalProduct.graphql_definition], type.interfaces)
|
115
115
|
end
|
116
116
|
|
117
117
|
it "preserves existing interfaces and appends a new one" do
|
118
118
|
type = GraphQL::ObjectType.define do
|
119
119
|
name 'Hello'
|
120
|
-
interfaces [Dummy::
|
121
|
-
implements Dummy::
|
120
|
+
interfaces [Dummy::Edible]
|
121
|
+
implements Dummy::AnimalProduct
|
122
122
|
|
123
123
|
field :hello, types.String
|
124
124
|
end
|
125
125
|
|
126
|
-
assert_equal([Dummy::
|
126
|
+
assert_equal([Dummy::Edible.graphql_definition, Dummy::AnimalProduct.graphql_definition], type.interfaces)
|
127
127
|
end
|
128
128
|
|
129
129
|
it "can be used to inherit fields from the interface" do
|
130
130
|
type_1 = GraphQL::ObjectType.define do
|
131
131
|
name 'Hello'
|
132
|
-
implements Dummy::
|
133
|
-
implements Dummy::
|
132
|
+
implements Dummy::Edible
|
133
|
+
implements Dummy::AnimalProduct
|
134
134
|
end
|
135
135
|
|
136
136
|
type_2 = GraphQL::ObjectType.define do
|
137
137
|
name 'Hello'
|
138
|
-
implements Dummy::
|
139
|
-
implements Dummy::
|
138
|
+
implements Dummy::Edible
|
139
|
+
implements Dummy::AnimalProduct, inherit: true
|
140
140
|
end
|
141
141
|
|
142
142
|
type_3 = GraphQL::ObjectType.define do
|
143
143
|
name 'Hello'
|
144
|
-
implements Dummy::
|
144
|
+
implements Dummy::Edible, Dummy::AnimalProduct, inherit: true
|
145
145
|
end
|
146
146
|
|
147
147
|
assert_equal [], type_1.all_fields.map(&:name)
|
@@ -158,16 +158,18 @@ describe GraphQL::ObjectType do
|
|
158
158
|
end
|
159
159
|
|
160
160
|
it "exposes defined field property" do
|
161
|
-
field_without_prop = Dummy::
|
162
|
-
field_with_prop = Dummy::
|
161
|
+
field_without_prop = Dummy::Cheese.graphql_definition.get_field("flavor")
|
162
|
+
field_with_prop = Dummy::Cheese.graphql_definition.get_field("fatContent")
|
163
163
|
assert_equal(field_without_prop.property, nil)
|
164
|
-
|
164
|
+
# This used to lookup `:fat_content`, but not since migrating to class-based
|
165
|
+
assert_equal(field_with_prop.property, nil)
|
165
166
|
end
|
166
167
|
|
167
168
|
it "looks up from interfaces" do
|
168
|
-
field_from_self = Dummy::
|
169
|
-
field_from_iface = Dummy::
|
170
|
-
|
169
|
+
field_from_self = Dummy::Cheese.graphql_definition.get_field("fatContent")
|
170
|
+
field_from_iface = Dummy::Milk.graphql_definition.get_field("fatContent")
|
171
|
+
# This used to lookup `:fat_content`, but not since migrating to class-based
|
172
|
+
assert_equal(field_from_self.property, nil)
|
171
173
|
assert_equal(field_from_iface.property, nil)
|
172
174
|
end
|
173
175
|
end
|
@@ -175,6 +177,9 @@ describe GraphQL::ObjectType do
|
|
175
177
|
describe "#dup" do
|
176
178
|
it "copies fields and interfaces without altering the original" do
|
177
179
|
type.interfaces # load the internal cache
|
180
|
+
assert_equal 4, type.interfaces.size
|
181
|
+
assert_equal 9, type.fields.size
|
182
|
+
|
178
183
|
type_2 = type.dup
|
179
184
|
|
180
185
|
# IRL, use `+=`, not this
|
@@ -185,8 +190,8 @@ describe GraphQL::ObjectType do
|
|
185
190
|
|
186
191
|
assert_equal 4, type.interfaces.size
|
187
192
|
assert_equal 5, type_2.interfaces.size
|
188
|
-
assert_equal
|
189
|
-
assert_equal
|
193
|
+
assert_equal 9, type.fields.size
|
194
|
+
assert_equal 10, type_2.fields.size
|
190
195
|
end
|
191
196
|
end
|
192
197
|
end
|
@@ -121,6 +121,27 @@ describe GraphQL::Query::Arguments do
|
|
121
121
|
end
|
122
122
|
end
|
123
123
|
|
124
|
+
describe "#dig" do
|
125
|
+
it "returns the value at that key" do
|
126
|
+
assert_equal 1, arguments.dig("a")
|
127
|
+
assert_equal 1, arguments.dig(:a)
|
128
|
+
assert arguments.dig("inputObject").is_a?(GraphQL::Query::Arguments)
|
129
|
+
end
|
130
|
+
|
131
|
+
it "works with nested keys" do
|
132
|
+
assert_equal 3, arguments.dig("inputObject", "d")
|
133
|
+
assert_equal 3, arguments.dig(:inputObject, :d)
|
134
|
+
assert_equal 3, arguments.dig("inputObject", :d)
|
135
|
+
assert_equal 3, arguments.dig(:inputObject, "d")
|
136
|
+
end
|
137
|
+
|
138
|
+
it "returns nil for missing keys" do
|
139
|
+
assert_nil arguments.dig("z")
|
140
|
+
assert_nil arguments.dig(7)
|
141
|
+
end
|
142
|
+
end
|
143
|
+
|
144
|
+
|
124
145
|
describe "#key?" do
|
125
146
|
let(:arg_values) { [] }
|
126
147
|
let(:schema) {
|
@@ -217,6 +217,34 @@ TABLE
|
|
217
217
|
end
|
218
218
|
end
|
219
219
|
|
220
|
+
describe "read values" do
|
221
|
+
let(:context) { GraphQL::Query::Context.new(query: OpenStruct.new(schema: schema), values: {a: {b: 1}}, object: nil) }
|
222
|
+
|
223
|
+
it "allows you to read values of contexts using []" do
|
224
|
+
assert_equal({b: 1}, context[:a])
|
225
|
+
end
|
226
|
+
|
227
|
+
it "allows you to read values of contexts using dig" do
|
228
|
+
if RUBY_VERSION >= '2.3.0'
|
229
|
+
assert_equal(1, context.dig(:a, :b))
|
230
|
+
else
|
231
|
+
assert_raises NoMethodError do
|
232
|
+
context.dig(:a, :b)
|
233
|
+
end
|
234
|
+
end
|
235
|
+
end
|
236
|
+
end
|
237
|
+
|
238
|
+
describe "splatting" do
|
239
|
+
let(:context) { GraphQL::Query::Context.new(query: OpenStruct.new(schema: schema), values: {a: {b: 1}}, object: nil) }
|
240
|
+
|
241
|
+
let(:splat) { ->(**context) { context } }
|
242
|
+
|
243
|
+
it "runs successfully" do
|
244
|
+
assert_equal({a: { b: 1 }}, splat.call(context))
|
245
|
+
end
|
246
|
+
end
|
247
|
+
|
220
248
|
describe "accessing context after the fact" do
|
221
249
|
let(:query_string) { %|
|
222
250
|
{ pushContext }
|
@@ -110,7 +110,7 @@ describe GraphQL::Query::Executor do
|
|
110
110
|
DummyQueryType = GraphQL::ObjectType.define do
|
111
111
|
name "Query"
|
112
112
|
field :dairy do
|
113
|
-
type Dummy::
|
113
|
+
type Dummy::Dairy.graphql_definition
|
114
114
|
resolve ->(t, a, c) {
|
115
115
|
raise if resolved
|
116
116
|
resolved = true
|
@@ -119,7 +119,7 @@ describe GraphQL::Query::Executor do
|
|
119
119
|
end
|
120
120
|
end
|
121
121
|
|
122
|
-
GraphQL::Schema.define(query: DummyQueryType, mutation: Dummy::
|
122
|
+
GraphQL::Schema.define(query: DummyQueryType, mutation: Dummy::DairyAppMutation.graphql_definition, resolve_type: ->(a,b,c) { :pass }, id_from_object: :pass)
|
123
123
|
}
|
124
124
|
let(:variables) { nil }
|
125
125
|
let(:query_string) { %|
|
@@ -186,29 +186,31 @@ describe GraphQL::Query::Executor do
|
|
186
186
|
end
|
187
187
|
end
|
188
188
|
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
189
|
+
if TESTING_RESCUE_FROM
|
190
|
+
describe "if the schema has a rescue handler" do
|
191
|
+
before do
|
192
|
+
# HACK: reach to the underlying instance to perform a side-effect
|
193
|
+
schema.graphql_definition.rescue_from(RuntimeError) { "Error was handled!" }
|
194
|
+
end
|
194
195
|
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
196
|
+
after do
|
197
|
+
# remove the handler from the middleware:
|
198
|
+
schema.remove_handler(RuntimeError)
|
199
|
+
end
|
199
200
|
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
201
|
+
it "adds to the errors key" do
|
202
|
+
expected = {
|
203
|
+
"data" => {"error" => nil},
|
204
|
+
"errors"=>[
|
205
|
+
{
|
206
|
+
"message"=>"Error was handled!",
|
207
|
+
"locations" => [{"line"=>1, "column"=>17}],
|
208
|
+
"path"=>["error"]
|
209
|
+
}
|
210
|
+
]
|
211
|
+
}
|
212
|
+
assert_equal(expected, result)
|
213
|
+
end
|
212
214
|
end
|
213
215
|
end
|
214
216
|
end
|
@@ -255,10 +257,10 @@ describe GraphQL::Query::Executor do
|
|
255
257
|
{
|
256
258
|
"message" => "Variable input of type ReplaceValuesInput! was provided invalid value",
|
257
259
|
"locations" => [{ "line" => 1, "column" => 13 }],
|
258
|
-
"
|
259
|
-
|
260
|
-
{ "path" => [], "explanation" => "Expected value to not be null" }
|
261
|
-
|
260
|
+
"extensions" => {
|
261
|
+
"value" => nil,
|
262
|
+
"problems" => [{ "path" => [], "explanation" => "Expected value to not be null" }]
|
263
|
+
}
|
262
264
|
}
|
263
265
|
]
|
264
266
|
}
|
@@ -275,10 +277,10 @@ describe GraphQL::Query::Executor do
|
|
275
277
|
{
|
276
278
|
"message" => "Variable input of type ReplaceValuesInput! was provided invalid value",
|
277
279
|
"locations" => [{ "line" => 1, "column" => 13 }],
|
278
|
-
"
|
279
|
-
|
280
|
-
{ "path" => ["values"], "explanation" => "Expected value to not be null" }
|
281
|
-
|
280
|
+
"extensions" => {
|
281
|
+
"value" => {},
|
282
|
+
"problems" => [{ "path" => ["values"], "explanation" => "Expected value to not be null" }]
|
283
|
+
}
|
282
284
|
}
|
283
285
|
]
|
284
286
|
}
|
@@ -295,11 +297,13 @@ describe GraphQL::Query::Executor do
|
|
295
297
|
{
|
296
298
|
"message" => "Variable input of type [DairyProductInput] was provided invalid value",
|
297
299
|
"locations" => [{ "line" => 1, "column" => 10 }],
|
298
|
-
"
|
299
|
-
|
300
|
-
|
301
|
-
|
302
|
-
|
300
|
+
"extensions" => {
|
301
|
+
"value" => [{ "foo" => "bar" }],
|
302
|
+
"problems" => [
|
303
|
+
{ "path" => [0, "foo"], "explanation" => "Field is not defined on DairyProductInput" },
|
304
|
+
{ "path" => [0, "source"], "explanation" => "Expected value to not be null" }
|
305
|
+
]
|
306
|
+
}
|
303
307
|
}
|
304
308
|
]
|
305
309
|
}
|
data/spec/graphql/query_spec.rb
CHANGED
@@ -435,8 +435,10 @@ describe GraphQL::Query do
|
|
435
435
|
{
|
436
436
|
"message" => "Variable cheeseId of type Int! was provided invalid value",
|
437
437
|
"locations"=>[{ "line" => 2, "column" => 23 }],
|
438
|
-
"
|
439
|
-
|
438
|
+
"extensions" => {
|
439
|
+
"value" => "2",
|
440
|
+
"problems" => [{ "path" => [], "explanation" => 'Could not coerce value "2" to Int' }]
|
441
|
+
}
|
440
442
|
}
|
441
443
|
]
|
442
444
|
}
|
@@ -453,8 +455,10 @@ describe GraphQL::Query do
|
|
453
455
|
{
|
454
456
|
"message" => "Variable cheeseId of type Int! was provided invalid value",
|
455
457
|
"locations" => [{"line" => 2, "column" => 23}],
|
456
|
-
"
|
457
|
-
|
458
|
+
"extensions" => {
|
459
|
+
"value" => nil,
|
460
|
+
"problems" => [{ "path" => [], "explanation" => "Expected value to not be null" }]
|
461
|
+
}
|
458
462
|
}
|
459
463
|
]
|
460
464
|
}
|
@@ -471,8 +475,10 @@ describe GraphQL::Query do
|
|
471
475
|
{
|
472
476
|
"message" => "Variable cheeseId of type Int! was provided invalid value",
|
473
477
|
"locations" => [{"line" => 2, "column" => 23}],
|
474
|
-
"
|
475
|
-
|
478
|
+
"extensions" => {
|
479
|
+
"value" => nil,
|
480
|
+
"problems" => [{ "path" => [], "explanation" => "Expected value to not be null" }]
|
481
|
+
}
|
476
482
|
}
|
477
483
|
]
|
478
484
|
}
|
@@ -13,6 +13,15 @@ describe GraphQL::Schema::Argument do
|
|
13
13
|
|
14
14
|
argument :aliased_arg, String, required: false, as: :renamed
|
15
15
|
argument :prepared_arg, Int, required: false, prepare: :multiply
|
16
|
+
argument :prepared_by_proc_arg, Int, required: false, prepare: ->(val, context) { context[:multiply_by] * val }
|
17
|
+
|
18
|
+
class Multiply
|
19
|
+
def call(val, context)
|
20
|
+
context[:multiply_by] * val
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
argument :prepared_by_callable_arg, Int, required: false, prepare: Multiply.new
|
16
25
|
end
|
17
26
|
|
18
27
|
def field(**args)
|
@@ -26,10 +35,17 @@ describe GraphQL::Schema::Argument do
|
|
26
35
|
|
27
36
|
class Schema < GraphQL::Schema
|
28
37
|
query(Query)
|
38
|
+
if TESTING_INTERPRETER
|
39
|
+
use GraphQL::Execution::Interpreter
|
40
|
+
end
|
29
41
|
end
|
30
42
|
end
|
31
43
|
|
32
|
-
|
44
|
+
describe "#path" do
|
45
|
+
it "includes type, field and argument names" do
|
46
|
+
assert_equal "Query.field.argWithBlock", SchemaArgumentTest::Query.fields["field"].arguments["argWithBlock"].path
|
47
|
+
end
|
48
|
+
end
|
33
49
|
|
34
50
|
describe "#name" do
|
35
51
|
it "reflects camelization" do
|
@@ -89,5 +105,23 @@ describe GraphQL::Schema::Argument do
|
|
89
105
|
# Make sure it's getting the renamed symbol:
|
90
106
|
assert_equal '{:prepared_arg=>15}', res["data"]["field"]
|
91
107
|
end
|
108
|
+
it "calls the method on the provided Proc" do
|
109
|
+
query_str = <<-GRAPHQL
|
110
|
+
{ field(preparedByProcArg: 5) }
|
111
|
+
GRAPHQL
|
112
|
+
|
113
|
+
res = SchemaArgumentTest::Schema.execute(query_str, context: {multiply_by: 3})
|
114
|
+
# Make sure it's getting the renamed symbol:
|
115
|
+
assert_equal '{:prepared_by_proc_arg=>15}', res["data"]["field"]
|
116
|
+
end
|
117
|
+
it "calls the method on the provided callable object" do
|
118
|
+
query_str = <<-GRAPHQL
|
119
|
+
{ field(preparedByCallableArg: 5) }
|
120
|
+
GRAPHQL
|
121
|
+
|
122
|
+
res = SchemaArgumentTest::Schema.execute(query_str, context: {multiply_by: 3})
|
123
|
+
# Make sure it's getting the renamed symbol:
|
124
|
+
assert_equal '{:prepared_by_callable_arg=>15}', res["data"]["field"]
|
125
|
+
end
|
92
126
|
end
|
93
127
|
end
|
@@ -60,37 +60,114 @@ type Hello {
|
|
60
60
|
build_schema_and_compare_output(schema.chop)
|
61
61
|
end
|
62
62
|
|
63
|
-
it 'supports descriptions' do
|
63
|
+
it 'supports descriptions and definition_line' do
|
64
64
|
schema = <<-SCHEMA
|
65
65
|
schema {
|
66
66
|
query: Hello
|
67
67
|
}
|
68
68
|
|
69
|
-
|
69
|
+
"""
|
70
|
+
This is a directive
|
71
|
+
"""
|
70
72
|
directive @foo(
|
71
|
-
|
73
|
+
"""
|
74
|
+
It has an argument
|
75
|
+
"""
|
72
76
|
arg: Int
|
73
77
|
) on FIELD
|
74
78
|
|
75
|
-
|
79
|
+
"""
|
80
|
+
With an enum
|
81
|
+
"""
|
76
82
|
enum Color {
|
77
83
|
BLUE
|
78
84
|
|
79
|
-
|
85
|
+
"""
|
86
|
+
Not a creative color
|
87
|
+
"""
|
80
88
|
GREEN
|
81
89
|
RED
|
82
90
|
}
|
83
91
|
|
84
|
-
|
85
|
-
|
86
|
-
|
92
|
+
"""
|
93
|
+
What a great type
|
94
|
+
"""
|
95
|
+
type Hello implements I {
|
96
|
+
anEnum(s: S): Color
|
87
97
|
|
88
|
-
|
89
|
-
|
98
|
+
"""
|
99
|
+
And a field to boot
|
100
|
+
"""
|
101
|
+
str(i: Input): String
|
102
|
+
}
|
103
|
+
|
104
|
+
"""
|
105
|
+
An interface
|
106
|
+
"""
|
107
|
+
interface I {
|
108
|
+
str(i: Input): String
|
90
109
|
}
|
110
|
+
|
111
|
+
"""
|
112
|
+
And an Input
|
113
|
+
"""
|
114
|
+
input Input {
|
115
|
+
s: String
|
116
|
+
}
|
117
|
+
|
118
|
+
"""
|
119
|
+
A scalar
|
120
|
+
"""
|
121
|
+
scalar S
|
122
|
+
|
123
|
+
"""
|
124
|
+
And a union
|
125
|
+
"""
|
126
|
+
union U = Hello
|
91
127
|
SCHEMA
|
92
128
|
|
93
129
|
build_schema_and_compare_output(schema.chop)
|
130
|
+
|
131
|
+
built_schema = GraphQL::Schema.from_definition(schema)
|
132
|
+
# The schema's are the same since there's no description
|
133
|
+
assert_equal 1, built_schema.ast_node.line
|
134
|
+
assert_equal 1, built_schema.ast_node.definition_line
|
135
|
+
|
136
|
+
# These account for description:
|
137
|
+
assert_equal 5, built_schema.directives["foo"].ast_node.line, "The ast_node.line points to the description"
|
138
|
+
assert_equal 8, built_schema.directives["foo"].ast_node.definition_line, "The ast_node.definition_line points to the definition"
|
139
|
+
|
140
|
+
arg = built_schema.directives["foo"].arguments["arg"]
|
141
|
+
assert_equal 9, arg.ast_node.line
|
142
|
+
assert_equal 12, arg.ast_node.definition_line
|
143
|
+
|
144
|
+
enum_type = built_schema.types["Color"]
|
145
|
+
assert_equal 15, enum_type.ast_node.line, "The ast_node.line points to the description"
|
146
|
+
assert_equal 18, enum_type.ast_node.definition_line, "The ast_node.definition_line points to the definition"
|
147
|
+
|
148
|
+
enum_value = enum_type.values["GREEN"]
|
149
|
+
assert_equal 21, enum_value.ast_node.line
|
150
|
+
assert_equal 24, enum_value.ast_node.definition_line
|
151
|
+
|
152
|
+
obj_type = built_schema.types["Hello"]
|
153
|
+
assert_equal 28, obj_type.ast_node.line, "The ast_node.line points to the description"
|
154
|
+
assert_equal 31, obj_type.ast_node.definition_line, "The ast_node.definition_line points to the definition"
|
155
|
+
|
156
|
+
field = obj_type.fields["str"]
|
157
|
+
assert_equal 34, field.ast_node.line
|
158
|
+
assert_equal 37, field.ast_node.definition_line
|
159
|
+
|
160
|
+
assert_equal 40, built_schema.types["I"].ast_node.line
|
161
|
+
assert_equal 43, built_schema.types["I"].ast_node.definition_line
|
162
|
+
|
163
|
+
assert_equal 47, built_schema.types["Input"].ast_node.line
|
164
|
+
assert_equal 50, built_schema.types["Input"].ast_node.definition_line
|
165
|
+
|
166
|
+
assert_equal 54, built_schema.types["S"].ast_node.line
|
167
|
+
assert_equal 57, built_schema.types["S"].ast_node.definition_line
|
168
|
+
|
169
|
+
assert_equal 59, built_schema.types["U"].ast_node.line
|
170
|
+
assert_equal 62, built_schema.types["U"].ast_node.definition_line
|
94
171
|
end
|
95
172
|
|
96
173
|
it 'maintains built-in directives' do
|
@@ -233,64 +310,102 @@ type Organization {
|
|
233
310
|
email: String
|
234
311
|
}
|
235
312
|
|
236
|
-
|
313
|
+
"""
|
314
|
+
The connection type for Organization.
|
315
|
+
"""
|
237
316
|
type OrganizationConnection {
|
238
|
-
|
317
|
+
"""
|
318
|
+
A list of edges.
|
319
|
+
"""
|
239
320
|
edges: [OrganizationEdge]
|
240
321
|
|
241
|
-
|
322
|
+
"""
|
323
|
+
A list of nodes.
|
324
|
+
"""
|
242
325
|
nodes: [Organization]
|
243
326
|
|
244
|
-
|
327
|
+
"""
|
328
|
+
Information to aid in pagination.
|
329
|
+
"""
|
245
330
|
pageInfo: PageInfo!
|
246
331
|
|
247
|
-
|
332
|
+
"""
|
333
|
+
Identifies the total count of items in the connection.
|
334
|
+
"""
|
248
335
|
totalCount: Int!
|
249
336
|
}
|
250
337
|
|
251
|
-
|
338
|
+
"""
|
339
|
+
An edge in a connection.
|
340
|
+
"""
|
252
341
|
type OrganizationEdge {
|
253
|
-
|
342
|
+
"""
|
343
|
+
A cursor for use in pagination.
|
344
|
+
"""
|
254
345
|
cursor: String!
|
255
346
|
|
256
|
-
|
347
|
+
"""
|
348
|
+
The item at the end of the edge.
|
349
|
+
"""
|
257
350
|
node: Organization
|
258
351
|
}
|
259
352
|
|
260
|
-
|
353
|
+
"""
|
354
|
+
Information about pagination in a connection.
|
355
|
+
"""
|
261
356
|
type PageInfo {
|
262
|
-
|
357
|
+
"""
|
358
|
+
When paginating forwards, the cursor to continue.
|
359
|
+
"""
|
263
360
|
endCursor: String
|
264
361
|
|
265
|
-
|
362
|
+
"""
|
363
|
+
When paginating forwards, are there more items?
|
364
|
+
"""
|
266
365
|
hasNextPage: Boolean!
|
267
366
|
|
268
|
-
|
367
|
+
"""
|
368
|
+
When paginating backwards, are there more items?
|
369
|
+
"""
|
269
370
|
hasPreviousPage: Boolean!
|
270
371
|
|
271
|
-
|
372
|
+
"""
|
373
|
+
When paginating backwards, the cursor to continue.
|
374
|
+
"""
|
272
375
|
startCursor: String
|
273
376
|
}
|
274
377
|
|
275
378
|
type Type {
|
276
379
|
name: String
|
277
380
|
organization(
|
278
|
-
|
381
|
+
"""
|
382
|
+
The login of the organization to find.
|
383
|
+
"""
|
279
384
|
login: String!
|
280
385
|
): Organization
|
281
386
|
|
282
|
-
|
387
|
+
"""
|
388
|
+
A list of organizations the user belongs to.
|
389
|
+
"""
|
283
390
|
organizations(
|
284
|
-
|
391
|
+
"""
|
392
|
+
Returns the elements in the list that come after the specified cursor.
|
393
|
+
"""
|
285
394
|
after: String
|
286
395
|
|
287
|
-
|
396
|
+
"""
|
397
|
+
Returns the elements in the list that come before the specified cursor.
|
398
|
+
"""
|
288
399
|
before: String
|
289
400
|
|
290
|
-
|
401
|
+
"""
|
402
|
+
Returns the first _n_ elements from the list.
|
403
|
+
"""
|
291
404
|
first: Int
|
292
405
|
|
293
|
-
|
406
|
+
"""
|
407
|
+
Returns the last _n_ elements from the list.
|
408
|
+
"""
|
294
409
|
last: Int
|
295
410
|
): OrganizationConnection!
|
296
411
|
}
|