graphql 1.9.5 → 1.13.19

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.

Potentially problematic release.


This version of graphql might be problematic. Click here for more details.

Files changed (659) hide show
  1. checksums.yaml +5 -5
  2. data/lib/generators/graphql/core.rb +21 -9
  3. data/lib/generators/graphql/enum_generator.rb +4 -10
  4. data/lib/generators/graphql/field_extractor.rb +31 -0
  5. data/lib/generators/graphql/input_generator.rb +50 -0
  6. data/lib/generators/graphql/install/mutation_root_generator.rb +34 -0
  7. data/lib/generators/graphql/install/templates/base_mutation.erb +10 -0
  8. data/lib/generators/graphql/{templates → install/templates}/mutation_type.erb +2 -0
  9. data/lib/generators/graphql/install_generator.rb +48 -8
  10. data/lib/generators/graphql/interface_generator.rb +7 -7
  11. data/lib/generators/graphql/loader_generator.rb +1 -0
  12. data/lib/generators/graphql/mutation_create_generator.rb +22 -0
  13. data/lib/generators/graphql/mutation_delete_generator.rb +22 -0
  14. data/lib/generators/graphql/mutation_generator.rb +6 -30
  15. data/lib/generators/graphql/mutation_update_generator.rb +22 -0
  16. data/lib/generators/graphql/object_generator.rb +28 -12
  17. data/lib/generators/graphql/orm_mutations_base.rb +40 -0
  18. data/lib/generators/graphql/relay.rb +63 -0
  19. data/lib/generators/graphql/relay_generator.rb +21 -0
  20. data/lib/generators/graphql/scalar_generator.rb +4 -2
  21. data/lib/generators/graphql/templates/base_argument.erb +6 -0
  22. data/lib/generators/graphql/templates/base_connection.erb +8 -0
  23. data/lib/generators/graphql/templates/base_edge.erb +8 -0
  24. data/lib/generators/graphql/templates/base_enum.erb +2 -0
  25. data/lib/generators/graphql/templates/base_field.erb +7 -0
  26. data/lib/generators/graphql/templates/base_input_object.erb +3 -0
  27. data/lib/generators/graphql/templates/base_interface.erb +4 -0
  28. data/lib/generators/graphql/templates/base_object.erb +3 -0
  29. data/lib/generators/graphql/templates/base_scalar.erb +2 -0
  30. data/lib/generators/graphql/templates/base_union.erb +2 -0
  31. data/lib/generators/graphql/templates/enum.erb +7 -1
  32. data/lib/generators/graphql/templates/graphql_controller.erb +21 -12
  33. data/lib/generators/graphql/templates/input.erb +9 -0
  34. data/lib/generators/graphql/templates/interface.erb +6 -2
  35. data/lib/generators/graphql/templates/loader.erb +2 -0
  36. data/lib/generators/graphql/templates/mutation.erb +3 -1
  37. data/lib/generators/graphql/templates/mutation_create.erb +20 -0
  38. data/lib/generators/graphql/templates/mutation_delete.erb +20 -0
  39. data/lib/generators/graphql/templates/mutation_update.erb +21 -0
  40. data/lib/generators/graphql/templates/node_type.erb +9 -0
  41. data/lib/generators/graphql/templates/object.erb +7 -3
  42. data/lib/generators/graphql/templates/query_type.erb +3 -3
  43. data/lib/generators/graphql/templates/scalar.erb +5 -1
  44. data/lib/generators/graphql/templates/schema.erb +23 -28
  45. data/lib/generators/graphql/templates/union.erb +6 -2
  46. data/lib/generators/graphql/type_generator.rb +47 -10
  47. data/lib/generators/graphql/union_generator.rb +5 -5
  48. data/lib/graphql/analysis/analyze_query.rb +7 -0
  49. data/lib/graphql/analysis/ast/analyzer.rb +34 -12
  50. data/lib/graphql/analysis/ast/field_usage.rb +29 -2
  51. data/lib/graphql/analysis/ast/max_query_complexity.rb +3 -3
  52. data/lib/graphql/analysis/ast/max_query_depth.rb +7 -3
  53. data/lib/graphql/analysis/ast/query_complexity.rb +179 -64
  54. data/lib/graphql/analysis/ast/query_depth.rb +16 -26
  55. data/lib/graphql/analysis/ast/visitor.rb +46 -32
  56. data/lib/graphql/analysis/ast.rb +23 -14
  57. data/lib/graphql/analysis/query_depth.rb +4 -17
  58. data/lib/graphql/argument.rb +16 -38
  59. data/lib/graphql/backtrace/inspect_result.rb +0 -1
  60. data/lib/graphql/backtrace/legacy_tracer.rb +56 -0
  61. data/lib/graphql/backtrace/table.rb +44 -5
  62. data/lib/graphql/backtrace/traced_error.rb +0 -1
  63. data/lib/graphql/backtrace/tracer.rb +40 -9
  64. data/lib/graphql/backtrace.rb +28 -19
  65. data/lib/graphql/backwards_compatibility.rb +2 -1
  66. data/lib/graphql/base_type.rb +11 -5
  67. data/lib/graphql/boolean_type.rb +1 -1
  68. data/lib/graphql/coercion_error.rb +8 -0
  69. data/lib/graphql/compatibility/execution_specification/specification_schema.rb +2 -2
  70. data/lib/graphql/compatibility/execution_specification.rb +1 -0
  71. data/lib/graphql/compatibility/lazy_execution_specification/lazy_schema.rb +1 -1
  72. data/lib/graphql/compatibility/lazy_execution_specification.rb +2 -0
  73. data/lib/graphql/compatibility/query_parser_specification/parse_error_specification.rb +5 -9
  74. data/lib/graphql/compatibility/query_parser_specification.rb +2 -0
  75. data/lib/graphql/compatibility/schema_parser_specification.rb +2 -0
  76. data/lib/graphql/dataloader/null_dataloader.rb +22 -0
  77. data/lib/graphql/dataloader/request.rb +19 -0
  78. data/lib/graphql/dataloader/request_all.rb +19 -0
  79. data/lib/graphql/dataloader/source.rb +155 -0
  80. data/lib/graphql/dataloader.rb +308 -0
  81. data/lib/graphql/date_encoding_error.rb +16 -0
  82. data/lib/graphql/define/assign_enum_value.rb +1 -1
  83. data/lib/graphql/define/assign_global_id_field.rb +2 -2
  84. data/lib/graphql/define/assign_object_field.rb +3 -3
  85. data/lib/graphql/define/defined_object_proxy.rb +3 -0
  86. data/lib/graphql/define/instance_definable.rb +65 -110
  87. data/lib/graphql/define/type_definer.rb +5 -5
  88. data/lib/graphql/deprecated_dsl.rb +18 -5
  89. data/lib/graphql/deprecation.rb +9 -0
  90. data/lib/graphql/directive/deprecated_directive.rb +1 -12
  91. data/lib/graphql/directive/include_directive.rb +1 -1
  92. data/lib/graphql/directive/skip_directive.rb +1 -1
  93. data/lib/graphql/directive.rb +9 -6
  94. data/lib/graphql/enum_type.rb +14 -74
  95. data/lib/graphql/execution/directive_checks.rb +2 -2
  96. data/lib/graphql/execution/errors.rb +163 -0
  97. data/lib/graphql/execution/execute.rb +10 -3
  98. data/lib/graphql/execution/instrumentation.rb +1 -1
  99. data/lib/graphql/execution/interpreter/argument_value.rb +28 -0
  100. data/lib/graphql/execution/interpreter/arguments.rb +88 -0
  101. data/lib/graphql/execution/interpreter/arguments_cache.rb +105 -0
  102. data/lib/graphql/execution/interpreter/handles_raw_value.rb +18 -0
  103. data/lib/graphql/execution/interpreter/resolve.rb +37 -25
  104. data/lib/graphql/execution/interpreter/runtime.rb +737 -376
  105. data/lib/graphql/execution/interpreter.rb +42 -19
  106. data/lib/graphql/execution/lazy/lazy_method_map.rb +4 -0
  107. data/lib/graphql/execution/lazy.rb +5 -1
  108. data/lib/graphql/execution/lookahead.rb +39 -114
  109. data/lib/graphql/execution/multiplex.rb +58 -29
  110. data/lib/graphql/execution.rb +1 -0
  111. data/lib/graphql/execution_error.rb +3 -2
  112. data/lib/graphql/field.rb +15 -119
  113. data/lib/graphql/filter.rb +1 -1
  114. data/lib/graphql/float_type.rb +1 -1
  115. data/lib/graphql/function.rb +6 -31
  116. data/lib/graphql/id_type.rb +1 -1
  117. data/lib/graphql/input_object_type.rb +11 -26
  118. data/lib/graphql/int_type.rb +1 -1
  119. data/lib/graphql/integer_decoding_error.rb +17 -0
  120. data/lib/graphql/integer_encoding_error.rb +18 -2
  121. data/lib/graphql/interface_type.rb +10 -24
  122. data/lib/graphql/internal_representation/document.rb +2 -2
  123. data/lib/graphql/internal_representation/rewrite.rb +1 -1
  124. data/lib/graphql/internal_representation/scope.rb +2 -2
  125. data/lib/graphql/internal_representation/visit.rb +2 -2
  126. data/lib/graphql/introspection/base_object.rb +2 -5
  127. data/lib/graphql/introspection/directive_location_enum.rb +2 -2
  128. data/lib/graphql/introspection/directive_type.rb +12 -6
  129. data/lib/graphql/introspection/entry_points.rb +9 -8
  130. data/lib/graphql/introspection/enum_value_type.rb +2 -2
  131. data/lib/graphql/introspection/field_type.rb +9 -5
  132. data/lib/graphql/introspection/input_value_type.rb +41 -11
  133. data/lib/graphql/introspection/introspection_query.rb +6 -92
  134. data/lib/graphql/introspection/schema_type.rb +13 -12
  135. data/lib/graphql/introspection/type_type.rb +27 -17
  136. data/lib/graphql/introspection.rb +99 -0
  137. data/lib/graphql/invalid_null_error.rb +18 -0
  138. data/lib/graphql/language/block_string.rb +22 -7
  139. data/lib/graphql/language/cache.rb +37 -0
  140. data/lib/graphql/language/definition_slice.rb +21 -10
  141. data/lib/graphql/language/document_from_schema_definition.rb +126 -67
  142. data/lib/graphql/language/lexer.rb +180 -141
  143. data/lib/graphql/language/lexer.rl +75 -51
  144. data/lib/graphql/language/nodes.rb +92 -108
  145. data/lib/graphql/language/parser.rb +933 -897
  146. data/lib/graphql/language/parser.y +129 -103
  147. data/lib/graphql/language/printer.rb +11 -2
  148. data/lib/graphql/language/sanitized_printer.rb +222 -0
  149. data/lib/graphql/language/token.rb +1 -1
  150. data/lib/graphql/language/visitor.rb +11 -8
  151. data/lib/graphql/language.rb +3 -1
  152. data/lib/graphql/name_validator.rb +2 -7
  153. data/lib/graphql/non_null_type.rb +0 -10
  154. data/lib/graphql/object_type.rb +47 -58
  155. data/lib/graphql/pagination/active_record_relation_connection.rb +85 -0
  156. data/lib/graphql/pagination/array_connection.rb +77 -0
  157. data/lib/graphql/pagination/connection.rb +226 -0
  158. data/lib/graphql/pagination/connections.rb +160 -0
  159. data/lib/graphql/pagination/mongoid_relation_connection.rb +25 -0
  160. data/lib/graphql/pagination/relation_connection.rb +226 -0
  161. data/lib/graphql/pagination/sequel_dataset_connection.rb +28 -0
  162. data/lib/graphql/pagination.rb +6 -0
  163. data/lib/graphql/parse_error.rb +0 -1
  164. data/lib/graphql/query/arguments.rb +29 -19
  165. data/lib/graphql/query/arguments_cache.rb +1 -2
  166. data/lib/graphql/query/context.rb +81 -14
  167. data/lib/graphql/query/executor.rb +0 -1
  168. data/lib/graphql/query/fingerprint.rb +26 -0
  169. data/lib/graphql/query/input_validation_result.rb +32 -6
  170. data/lib/graphql/query/literal_input.rb +31 -10
  171. data/lib/graphql/query/null_context.rb +28 -8
  172. data/lib/graphql/query/serial_execution/field_resolution.rb +1 -1
  173. data/lib/graphql/query/serial_execution.rb +1 -0
  174. data/lib/graphql/query/validation_pipeline.rb +6 -4
  175. data/lib/graphql/query/variable_validation_error.rb +3 -3
  176. data/lib/graphql/query/variables.rb +51 -9
  177. data/lib/graphql/query.rb +97 -23
  178. data/lib/graphql/railtie.rb +9 -1
  179. data/lib/graphql/rake_task/validate.rb +3 -0
  180. data/lib/graphql/rake_task.rb +12 -9
  181. data/lib/graphql/relay/array_connection.rb +11 -13
  182. data/lib/graphql/relay/base_connection.rb +33 -16
  183. data/lib/graphql/relay/connection_instrumentation.rb +4 -4
  184. data/lib/graphql/relay/connection_type.rb +18 -4
  185. data/lib/graphql/relay/edge_type.rb +1 -0
  186. data/lib/graphql/relay/edges_instrumentation.rb +1 -2
  187. data/lib/graphql/relay/global_id_resolve.rb +1 -2
  188. data/lib/graphql/relay/mutation.rb +3 -87
  189. data/lib/graphql/relay/node.rb +5 -2
  190. data/lib/graphql/relay/page_info.rb +1 -1
  191. data/lib/graphql/relay/range_add.rb +27 -9
  192. data/lib/graphql/relay/relation_connection.rb +17 -15
  193. data/lib/graphql/relay/type_extensions.rb +2 -0
  194. data/lib/graphql/rubocop/graphql/base_cop.rb +36 -0
  195. data/lib/graphql/rubocop/graphql/default_null_true.rb +43 -0
  196. data/lib/graphql/rubocop/graphql/default_required_true.rb +43 -0
  197. data/lib/graphql/rubocop.rb +4 -0
  198. data/lib/graphql/scalar_type.rb +18 -62
  199. data/lib/graphql/schema/addition.rb +247 -0
  200. data/lib/graphql/schema/argument.rb +289 -11
  201. data/lib/graphql/schema/base_64_bp.rb +3 -2
  202. data/lib/graphql/schema/base_64_encoder.rb +2 -0
  203. data/lib/graphql/schema/build_from_definition/resolve_map/default_resolve.rb +1 -1
  204. data/lib/graphql/schema/build_from_definition/resolve_map.rb +13 -5
  205. data/lib/graphql/schema/build_from_definition.rb +323 -203
  206. data/lib/graphql/schema/built_in_types.rb +5 -5
  207. data/lib/graphql/schema/default_type_error.rb +2 -0
  208. data/lib/graphql/schema/directive/deprecated.rb +18 -0
  209. data/lib/graphql/schema/directive/feature.rb +2 -2
  210. data/lib/graphql/schema/directive/flagged.rb +57 -0
  211. data/lib/graphql/schema/directive/include.rb +2 -2
  212. data/lib/graphql/schema/directive/skip.rb +2 -2
  213. data/lib/graphql/schema/directive/transform.rb +14 -2
  214. data/lib/graphql/schema/directive.rb +136 -6
  215. data/lib/graphql/schema/enum.rb +121 -12
  216. data/lib/graphql/schema/enum_value.rb +23 -6
  217. data/lib/graphql/schema/field/connection_extension.rb +46 -20
  218. data/lib/graphql/schema/field/scope_extension.rb +1 -1
  219. data/lib/graphql/schema/field.rb +515 -191
  220. data/lib/graphql/schema/field_extension.rb +89 -2
  221. data/lib/graphql/schema/find_inherited_value.rb +36 -0
  222. data/lib/graphql/schema/finder.rb +16 -14
  223. data/lib/graphql/schema/input_object.rb +178 -34
  224. data/lib/graphql/schema/interface.rb +35 -25
  225. data/lib/graphql/schema/introspection_system.rb +111 -35
  226. data/lib/graphql/schema/late_bound_type.rb +3 -2
  227. data/lib/graphql/schema/list.rb +65 -1
  228. data/lib/graphql/schema/loader.rb +147 -97
  229. data/lib/graphql/schema/member/accepts_definition.rb +15 -3
  230. data/lib/graphql/schema/member/base_dsl_methods.rb +40 -45
  231. data/lib/graphql/schema/member/build_type.rb +19 -8
  232. data/lib/graphql/schema/member/cached_graphql_definition.rb +34 -2
  233. data/lib/graphql/schema/member/has_arguments.rb +212 -22
  234. data/lib/graphql/schema/member/has_ast_node.rb +20 -0
  235. data/lib/graphql/schema/member/has_deprecation_reason.rb +25 -0
  236. data/lib/graphql/schema/member/has_directives.rb +98 -0
  237. data/lib/graphql/schema/member/has_fields.rb +113 -28
  238. data/lib/graphql/schema/member/has_interfaces.rb +100 -0
  239. data/lib/graphql/schema/member/has_unresolved_type_error.rb +15 -0
  240. data/lib/graphql/schema/member/has_validators.rb +31 -0
  241. data/lib/graphql/schema/member/instrumentation.rb +6 -2
  242. data/lib/graphql/schema/member/relay_shortcuts.rb +2 -2
  243. data/lib/graphql/schema/member/type_system_helpers.rb +3 -3
  244. data/lib/graphql/schema/member/validates_input.rb +33 -0
  245. data/lib/graphql/schema/member.rb +11 -0
  246. data/lib/graphql/schema/middleware_chain.rb +1 -1
  247. data/lib/graphql/schema/mutation.rb +5 -1
  248. data/lib/graphql/schema/non_null.rb +37 -1
  249. data/lib/graphql/schema/object.rb +52 -37
  250. data/lib/graphql/schema/possible_types.rb +12 -7
  251. data/lib/graphql/schema/printer.rb +17 -34
  252. data/lib/graphql/schema/relay_classic_mutation.rb +51 -7
  253. data/lib/graphql/schema/resolver/has_payload_type.rb +36 -5
  254. data/lib/graphql/schema/resolver.rb +159 -59
  255. data/lib/graphql/schema/scalar.rb +43 -3
  256. data/lib/graphql/schema/subscription.rb +83 -25
  257. data/lib/graphql/schema/timeout.rb +123 -0
  258. data/lib/graphql/schema/timeout_middleware.rb +6 -3
  259. data/lib/graphql/schema/traversal.rb +2 -2
  260. data/lib/graphql/schema/type_expression.rb +21 -13
  261. data/lib/graphql/schema/type_membership.rb +48 -0
  262. data/lib/graphql/schema/union.rb +67 -6
  263. data/lib/graphql/schema/unique_within_type.rb +1 -2
  264. data/lib/graphql/schema/validation.rb +30 -8
  265. data/lib/graphql/schema/validator/allow_blank_validator.rb +29 -0
  266. data/lib/graphql/schema/validator/allow_null_validator.rb +26 -0
  267. data/lib/graphql/schema/validator/exclusion_validator.rb +33 -0
  268. data/lib/graphql/schema/validator/format_validator.rb +48 -0
  269. data/lib/graphql/schema/validator/inclusion_validator.rb +35 -0
  270. data/lib/graphql/schema/validator/length_validator.rb +59 -0
  271. data/lib/graphql/schema/validator/numericality_validator.rb +82 -0
  272. data/lib/graphql/schema/validator/required_validator.rb +82 -0
  273. data/lib/graphql/schema/validator.rb +171 -0
  274. data/lib/graphql/schema/warden.rb +263 -30
  275. data/lib/graphql/schema/wrapper.rb +1 -1
  276. data/lib/graphql/schema.rb +1016 -256
  277. data/lib/graphql/static_validation/all_rules.rb +2 -0
  278. data/lib/graphql/static_validation/base_visitor.rb +17 -10
  279. data/lib/graphql/static_validation/definition_dependencies.rb +21 -13
  280. data/lib/graphql/static_validation/error.rb +3 -1
  281. data/lib/graphql/static_validation/literal_validator.rb +52 -27
  282. data/lib/graphql/static_validation/rules/argument_literals_are_compatible.rb +46 -79
  283. data/lib/graphql/static_validation/rules/argument_literals_are_compatible_error.rb +23 -6
  284. data/lib/graphql/static_validation/rules/arguments_are_defined.rb +35 -26
  285. data/lib/graphql/static_validation/rules/arguments_are_defined_error.rb +4 -2
  286. data/lib/graphql/static_validation/rules/directives_are_defined.rb +1 -1
  287. data/lib/graphql/static_validation/rules/directives_are_in_valid_locations.rb +2 -2
  288. data/lib/graphql/static_validation/rules/fields_are_defined_on_type.rb +4 -4
  289. data/lib/graphql/static_validation/rules/fields_have_appropriate_selections.rb +5 -5
  290. data/lib/graphql/static_validation/rules/fields_will_merge.rb +105 -55
  291. data/lib/graphql/static_validation/rules/fields_will_merge_error.rb +25 -4
  292. data/lib/graphql/static_validation/rules/fragment_spreads_are_possible.rb +3 -3
  293. data/lib/graphql/static_validation/rules/fragments_are_finite.rb +2 -2
  294. data/lib/graphql/static_validation/rules/input_object_names_are_unique.rb +30 -0
  295. data/lib/graphql/static_validation/rules/input_object_names_are_unique_error.rb +30 -0
  296. data/lib/graphql/static_validation/rules/query_root_exists.rb +17 -0
  297. data/lib/graphql/static_validation/rules/query_root_exists_error.rb +26 -0
  298. data/lib/graphql/static_validation/rules/required_arguments_are_present.rb +5 -3
  299. data/lib/graphql/static_validation/rules/required_input_object_attributes_are_present.rb +9 -10
  300. data/lib/graphql/static_validation/rules/unique_directives_per_location.rb +1 -1
  301. data/lib/graphql/static_validation/rules/variable_default_values_are_correctly_typed.rb +12 -13
  302. data/lib/graphql/static_validation/rules/variable_usages_are_allowed.rb +19 -14
  303. data/lib/graphql/static_validation/rules/variables_are_input_types.rb +1 -1
  304. data/lib/graphql/static_validation/rules/variables_are_used_and_defined.rb +5 -3
  305. data/lib/graphql/static_validation/type_stack.rb +2 -2
  306. data/lib/graphql/static_validation/validation_context.rb +13 -3
  307. data/lib/graphql/static_validation/validation_timeout_error.rb +25 -0
  308. data/lib/graphql/static_validation/validator.rb +43 -9
  309. data/lib/graphql/static_validation.rb +1 -0
  310. data/lib/graphql/string_encoding_error.rb +13 -3
  311. data/lib/graphql/string_type.rb +1 -1
  312. data/lib/graphql/subscriptions/action_cable_subscriptions.rb +123 -22
  313. data/lib/graphql/subscriptions/broadcast_analyzer.rb +81 -0
  314. data/lib/graphql/subscriptions/default_subscription_resolve_extension.rb +21 -0
  315. data/lib/graphql/subscriptions/event.rb +94 -26
  316. data/lib/graphql/subscriptions/instrumentation.rb +10 -6
  317. data/lib/graphql/subscriptions/serialize.rb +53 -6
  318. data/lib/graphql/subscriptions/subscription_root.rb +15 -5
  319. data/lib/graphql/subscriptions.rb +122 -54
  320. data/lib/graphql/tracing/active_support_notifications_tracing.rb +8 -17
  321. data/lib/graphql/tracing/appoptics_tracing.rb +173 -0
  322. data/lib/graphql/tracing/appsignal_tracing.rb +23 -0
  323. data/lib/graphql/tracing/data_dog_tracing.rb +32 -2
  324. data/lib/graphql/tracing/new_relic_tracing.rb +9 -12
  325. data/lib/graphql/tracing/notifications_tracing.rb +59 -0
  326. data/lib/graphql/tracing/platform_tracing.rb +66 -7
  327. data/lib/graphql/tracing/prometheus_tracing/graphql_collector.rb +4 -1
  328. data/lib/graphql/tracing/prometheus_tracing.rb +8 -0
  329. data/lib/graphql/tracing/scout_tracing.rb +19 -0
  330. data/lib/graphql/tracing/skylight_tracing.rb +9 -0
  331. data/lib/graphql/tracing/statsd_tracing.rb +42 -0
  332. data/lib/graphql/tracing.rb +15 -35
  333. data/lib/graphql/types/big_int.rb +5 -1
  334. data/lib/graphql/types/int.rb +10 -3
  335. data/lib/graphql/types/iso_8601_date.rb +42 -0
  336. data/lib/graphql/types/iso_8601_date_time.rb +32 -8
  337. data/lib/graphql/types/relay/base_connection.rb +6 -88
  338. data/lib/graphql/types/relay/base_edge.rb +2 -37
  339. data/lib/graphql/types/relay/connection_behaviors.rb +174 -0
  340. data/lib/graphql/types/relay/default_relay.rb +31 -0
  341. data/lib/graphql/types/relay/edge_behaviors.rb +64 -0
  342. data/lib/graphql/types/relay/has_node_field.rb +41 -0
  343. data/lib/graphql/types/relay/has_nodes_field.rb +41 -0
  344. data/lib/graphql/types/relay/node.rb +2 -4
  345. data/lib/graphql/types/relay/node_behaviors.rb +15 -0
  346. data/lib/graphql/types/relay/node_field.rb +4 -23
  347. data/lib/graphql/types/relay/nodes_field.rb +16 -18
  348. data/lib/graphql/types/relay/page_info.rb +2 -14
  349. data/lib/graphql/types/relay/page_info_behaviors.rb +25 -0
  350. data/lib/graphql/types/relay.rb +11 -3
  351. data/lib/graphql/types/string.rb +8 -2
  352. data/lib/graphql/types.rb +1 -0
  353. data/lib/graphql/unauthorized_error.rb +2 -2
  354. data/lib/graphql/union_type.rb +61 -46
  355. data/lib/graphql/unresolved_type_error.rb +2 -2
  356. data/lib/graphql/upgrader/member.rb +150 -112
  357. data/lib/graphql/upgrader/schema.rb +1 -0
  358. data/lib/graphql/version.rb +1 -1
  359. data/lib/graphql.rb +89 -18
  360. data/readme.md +4 -7
  361. metadata +115 -703
  362. data/lib/graphql/execution/interpreter/hash_response.rb +0 -46
  363. data/lib/graphql/literal_validation_error.rb +0 -6
  364. data/lib/graphql/types/relay/base_field.rb +0 -22
  365. data/lib/graphql/types/relay/base_interface.rb +0 -29
  366. data/lib/graphql/types/relay/base_object.rb +0 -26
  367. data/spec/dummy/Gemfile +0 -12
  368. data/spec/dummy/Gemfile.lock +0 -157
  369. data/spec/dummy/README.md +0 -24
  370. data/spec/dummy/Rakefile +0 -7
  371. data/spec/dummy/app/assets/config/manifest.js +0 -1
  372. data/spec/dummy/app/assets/javascripts/application.js +0 -66
  373. data/spec/dummy/app/channels/application_cable/channel.rb +0 -5
  374. data/spec/dummy/app/channels/application_cable/connection.rb +0 -5
  375. data/spec/dummy/app/channels/graphql_channel.rb +0 -116
  376. data/spec/dummy/app/controllers/application_controller.rb +0 -4
  377. data/spec/dummy/app/controllers/pages_controller.rb +0 -5
  378. data/spec/dummy/app/helpers/application_helper.rb +0 -3
  379. data/spec/dummy/app/jobs/application_job.rb +0 -3
  380. data/spec/dummy/app/views/layouts/application.html.erb +0 -12
  381. data/spec/dummy/app/views/pages/show.html +0 -16
  382. data/spec/dummy/bin/bundle +0 -4
  383. data/spec/dummy/bin/rails +0 -5
  384. data/spec/dummy/bin/rake +0 -5
  385. data/spec/dummy/bin/setup +0 -31
  386. data/spec/dummy/bin/update +0 -27
  387. data/spec/dummy/bin/yarn +0 -12
  388. data/spec/dummy/config/application.rb +0 -30
  389. data/spec/dummy/config/boot.rb +0 -4
  390. data/spec/dummy/config/cable.yml +0 -10
  391. data/spec/dummy/config/environment.rb +0 -6
  392. data/spec/dummy/config/environments/development.rb +0 -40
  393. data/spec/dummy/config/environments/production.rb +0 -76
  394. data/spec/dummy/config/environments/test.rb +0 -37
  395. data/spec/dummy/config/initializers/application_controller_renderer.rb +0 -9
  396. data/spec/dummy/config/initializers/backtrace_silencers.rb +0 -8
  397. data/spec/dummy/config/initializers/cookies_serializer.rb +0 -6
  398. data/spec/dummy/config/initializers/filter_parameter_logging.rb +0 -5
  399. data/spec/dummy/config/initializers/inflections.rb +0 -17
  400. data/spec/dummy/config/initializers/mime_types.rb +0 -5
  401. data/spec/dummy/config/initializers/wrap_parameters.rb +0 -10
  402. data/spec/dummy/config/locales/en.yml +0 -33
  403. data/spec/dummy/config/puma.rb +0 -57
  404. data/spec/dummy/config/routes.rb +0 -4
  405. data/spec/dummy/config/secrets.yml +0 -32
  406. data/spec/dummy/config.ru +0 -6
  407. data/spec/dummy/log/test.log +0 -199
  408. data/spec/dummy/package.json +0 -5
  409. data/spec/dummy/public/404.html +0 -67
  410. data/spec/dummy/public/422.html +0 -67
  411. data/spec/dummy/public/500.html +0 -66
  412. data/spec/dummy/public/apple-touch-icon-precomposed.png +0 -0
  413. data/spec/dummy/public/apple-touch-icon.png +0 -0
  414. data/spec/dummy/public/favicon.ico +0 -0
  415. data/spec/dummy/public/robots.txt +0 -1
  416. data/spec/dummy/test/application_system_test_case.rb +0 -6
  417. data/spec/dummy/test/system/action_cable_subscription_test.rb +0 -45
  418. data/spec/dummy/test/test_helper.rb +0 -4
  419. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/4w/4wzXRZrAkwKdgYaSE0pid5eB-fer8vSfSku_NPg4rMA.cache +0 -0
  420. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/7I/7IHVBiJT06QSpgLpLoJIxboQ0B-D_tMTxsvoezBTV3Q.cache +0 -1
  421. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/8w/8wY_SKagj8wHuwGNAAf6JnQ8joMbC6cEYpHrTAI8Urc.cache +0 -1
  422. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/AK/AKzz1u6bGb4auXcrObA_g5LL-oV0ejNGa448AgAi_WQ.cache +0 -1
  423. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/ET/ETW4uxvaYpruL8y6_ZptUH82ZowMaHIqvg5WexBFdEM.cache +0 -3
  424. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/F1/F1TWpjjyA56k9Z90n5B3xRn7DUdGjX73QCkYC6k07JQ.cache +0 -0
  425. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/F8/F8MUNRzORGFgr329fNM0xLaoWCXdv3BIalT7dsvLfjs.cache +0 -2
  426. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/KB/KB07ZaKNC5uXJ7TjLi-WqnY6g7dq8wWp_8N3HNjBNxg.cache +0 -2
  427. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Ms/MsKSimH_UCB-H1tLvDABDHuvGciuoW6kVqQWDrXU5FQ.cache +0 -0
  428. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Mt/Mtci-Kim50aPOmeClD4AIicKn1d1WJ0n454IjSd94sk.cache +0 -0
  429. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/QH/QHt3Tc1Y6M66Oo_pDuMyWrQNs4Pp3SMeZR5K1wJj2Ts.cache +0 -1
  430. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/XU/XU4k1OXnfMils5SrirorPvDSyDSqiOWLZNtmAH1HH8k.cache +0 -0
  431. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/ZI/ZIof7mZxWWCnraIFOCuV6a8QRWzKJXJnx2Xd7C0ZyX0.cache +0 -1
  432. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/cG/cGc_puuPS5pZKgUcy1Y_i1L6jl5UtsiIrMH59rTzR6c.cache +0 -3
  433. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/df/dfro_B6bx3KP1Go-7jEOqqZ2j4hVRseXIc3es9PKQno.cache +0 -1
  434. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/jO/jO1DfbqnG0mTULsjJJANc3fefrG2zt7DIMmcptMT628.cache +0 -1
  435. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/pE/pE7gO6pQ-z187Swb4hT554wmqsq-cNzgPWLrCz-LQQQ.cache +0 -0
  436. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/r9/r9iU1l58a6rxkZSW5RSC52_tD-_UQuHxoMVnkfJ7Mhs.cache +0 -1
  437. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/xi/xitPPFfPIyDMpaznV0sBBcw8eSCV8PJcLLWin78sCgE.cache +0 -0
  438. data/spec/dummy/tmp/screenshots/failures_test_it_handles_subscriptions.png +0 -0
  439. data/spec/fixtures/upgrader/account.original.rb +0 -19
  440. data/spec/fixtures/upgrader/account.transformed.rb +0 -20
  441. data/spec/fixtures/upgrader/blame_range.original.rb +0 -43
  442. data/spec/fixtures/upgrader/blame_range.transformed.rb +0 -30
  443. data/spec/fixtures/upgrader/date_time.original.rb +0 -24
  444. data/spec/fixtures/upgrader/date_time.transformed.rb +0 -23
  445. data/spec/fixtures/upgrader/delete_project.original.rb +0 -28
  446. data/spec/fixtures/upgrader/delete_project.transformed.rb +0 -27
  447. data/spec/fixtures/upgrader/gist_order_field.original.rb +0 -14
  448. data/spec/fixtures/upgrader/gist_order_field.transformed.rb +0 -13
  449. data/spec/fixtures/upgrader/increment_count.original.rb +0 -59
  450. data/spec/fixtures/upgrader/increment_count.transformed.rb +0 -50
  451. data/spec/fixtures/upgrader/photo.original.rb +0 -10
  452. data/spec/fixtures/upgrader/photo.transformed.rb +0 -12
  453. data/spec/fixtures/upgrader/release_order.original.rb +0 -15
  454. data/spec/fixtures/upgrader/release_order.transformed.rb +0 -14
  455. data/spec/fixtures/upgrader/starrable.original.rb +0 -49
  456. data/spec/fixtures/upgrader/starrable.transformed.rb +0 -46
  457. data/spec/fixtures/upgrader/subscribable.original.rb +0 -55
  458. data/spec/fixtures/upgrader/subscribable.transformed.rb +0 -51
  459. data/spec/fixtures/upgrader/type_x.original.rb +0 -65
  460. data/spec/fixtures/upgrader/type_x.transformed.rb +0 -56
  461. data/spec/graphql/analysis/analyze_query_spec.rb +0 -272
  462. data/spec/graphql/analysis/ast/field_usage_spec.rb +0 -51
  463. data/spec/graphql/analysis/ast/max_query_complexity_spec.rb +0 -120
  464. data/spec/graphql/analysis/ast/max_query_depth_spec.rb +0 -114
  465. data/spec/graphql/analysis/ast/query_complexity_spec.rb +0 -299
  466. data/spec/graphql/analysis/ast/query_depth_spec.rb +0 -108
  467. data/spec/graphql/analysis/ast_spec.rb +0 -269
  468. data/spec/graphql/analysis/field_usage_spec.rb +0 -62
  469. data/spec/graphql/analysis/max_query_complexity_spec.rb +0 -102
  470. data/spec/graphql/analysis/max_query_depth_spec.rb +0 -101
  471. data/spec/graphql/analysis/query_complexity_spec.rb +0 -301
  472. data/spec/graphql/analysis/query_depth_spec.rb +0 -81
  473. data/spec/graphql/argument_spec.rb +0 -159
  474. data/spec/graphql/authorization_spec.rb +0 -974
  475. data/spec/graphql/backtrace_spec.rb +0 -206
  476. data/spec/graphql/base_type_spec.rb +0 -171
  477. data/spec/graphql/boolean_type_spec.rb +0 -21
  478. data/spec/graphql/compatibility/execution_specification_spec.rb +0 -4
  479. data/spec/graphql/compatibility/lazy_execution_specification_spec.rb +0 -4
  480. data/spec/graphql/compatibility/query_parser_specification_spec.rb +0 -6
  481. data/spec/graphql/compatibility/schema_parser_specification_spec.rb +0 -6
  482. data/spec/graphql/define/assign_argument_spec.rb +0 -61
  483. data/spec/graphql/define/instance_definable_spec.rb +0 -203
  484. data/spec/graphql/directive/skip_directive_spec.rb +0 -9
  485. data/spec/graphql/directive_spec.rb +0 -295
  486. data/spec/graphql/enum_type_spec.rb +0 -158
  487. data/spec/graphql/execution/execute_spec.rb +0 -303
  488. data/spec/graphql/execution/instrumentation_spec.rb +0 -184
  489. data/spec/graphql/execution/interpreter_spec.rb +0 -485
  490. data/spec/graphql/execution/lazy/lazy_method_map_spec.rb +0 -57
  491. data/spec/graphql/execution/lazy_spec.rb +0 -247
  492. data/spec/graphql/execution/lookahead_spec.rb +0 -390
  493. data/spec/graphql/execution/multiplex_spec.rb +0 -211
  494. data/spec/graphql/execution/typecast_spec.rb +0 -47
  495. data/spec/graphql/execution_error_spec.rb +0 -325
  496. data/spec/graphql/field_spec.rb +0 -246
  497. data/spec/graphql/float_type_spec.rb +0 -16
  498. data/spec/graphql/function_spec.rb +0 -152
  499. data/spec/graphql/id_type_spec.rb +0 -33
  500. data/spec/graphql/input_object_type_spec.rb +0 -25
  501. data/spec/graphql/int_type_spec.rb +0 -35
  502. data/spec/graphql/interface_type_spec.rb +0 -196
  503. data/spec/graphql/internal_representation/print_spec.rb +0 -41
  504. data/spec/graphql/internal_representation/rewrite_spec.rb +0 -376
  505. data/spec/graphql/introspection/directive_type_spec.rb +0 -61
  506. data/spec/graphql/introspection/input_value_type_spec.rb +0 -144
  507. data/spec/graphql/introspection/introspection_query_spec.rb +0 -59
  508. data/spec/graphql/introspection/schema_type_spec.rb +0 -56
  509. data/spec/graphql/introspection/type_type_spec.rb +0 -155
  510. data/spec/graphql/language/block_string_spec.rb +0 -70
  511. data/spec/graphql/language/definition_slice_spec.rb +0 -226
  512. data/spec/graphql/language/document_from_schema_definition_spec.rb +0 -770
  513. data/spec/graphql/language/equality_spec.rb +0 -84
  514. data/spec/graphql/language/generation_spec.rb +0 -38
  515. data/spec/graphql/language/lexer_spec.rb +0 -135
  516. data/spec/graphql/language/nodes_spec.rb +0 -67
  517. data/spec/graphql/language/parser_spec.rb +0 -183
  518. data/spec/graphql/language/printer_spec.rb +0 -215
  519. data/spec/graphql/language/visitor_spec.rb +0 -419
  520. data/spec/graphql/list_type_spec.rb +0 -57
  521. data/spec/graphql/non_null_type_spec.rb +0 -48
  522. data/spec/graphql/object_type_spec.rb +0 -197
  523. data/spec/graphql/query/arguments_spec.rb +0 -346
  524. data/spec/graphql/query/context_spec.rb +0 -292
  525. data/spec/graphql/query/executor_spec.rb +0 -341
  526. data/spec/graphql/query/literal_input_spec.rb +0 -91
  527. data/spec/graphql/query/result_spec.rb +0 -29
  528. data/spec/graphql/query/serial_execution/value_resolution_spec.rb +0 -109
  529. data/spec/graphql/query_spec.rb +0 -800
  530. data/spec/graphql/rake_task_spec.rb +0 -59
  531. data/spec/graphql/scalar_type_spec.rb +0 -66
  532. data/spec/graphql/schema/argument_spec.rb +0 -152
  533. data/spec/graphql/schema/build_from_definition_spec.rb +0 -1187
  534. data/spec/graphql/schema/catchall_middleware_spec.rb +0 -35
  535. data/spec/graphql/schema/directive/feature_spec.rb +0 -81
  536. data/spec/graphql/schema/directive/transform_spec.rb +0 -39
  537. data/spec/graphql/schema/enum_spec.rb +0 -83
  538. data/spec/graphql/schema/enum_value_spec.rb +0 -24
  539. data/spec/graphql/schema/field_extension_spec.rb +0 -137
  540. data/spec/graphql/schema/field_spec.rb +0 -301
  541. data/spec/graphql/schema/finder_spec.rb +0 -135
  542. data/spec/graphql/schema/input_object_spec.rb +0 -347
  543. data/spec/graphql/schema/instrumentation_spec.rb +0 -43
  544. data/spec/graphql/schema/interface_spec.rb +0 -215
  545. data/spec/graphql/schema/introspection_system_spec.rb +0 -56
  546. data/spec/graphql/schema/list_spec.rb +0 -46
  547. data/spec/graphql/schema/loader_spec.rb +0 -286
  548. data/spec/graphql/schema/member/accepts_definition_spec.rb +0 -115
  549. data/spec/graphql/schema/member/build_type_spec.rb +0 -63
  550. data/spec/graphql/schema/member/scoped_spec.rb +0 -217
  551. data/spec/graphql/schema/member/type_system_helpers_spec.rb +0 -63
  552. data/spec/graphql/schema/middleware_chain_spec.rb +0 -57
  553. data/spec/graphql/schema/mutation_spec.rb +0 -150
  554. data/spec/graphql/schema/non_null_spec.rb +0 -46
  555. data/spec/graphql/schema/object_spec.rb +0 -315
  556. data/spec/graphql/schema/printer_spec.rb +0 -869
  557. data/spec/graphql/schema/relay_classic_mutation_spec.rb +0 -252
  558. data/spec/graphql/schema/rescue_middleware_spec.rb +0 -88
  559. data/spec/graphql/schema/resolver_spec.rb +0 -714
  560. data/spec/graphql/schema/scalar_spec.rb +0 -101
  561. data/spec/graphql/schema/subscription_spec.rb +0 -440
  562. data/spec/graphql/schema/timeout_middleware_spec.rb +0 -188
  563. data/spec/graphql/schema/traversal_spec.rb +0 -222
  564. data/spec/graphql/schema/type_expression_spec.rb +0 -39
  565. data/spec/graphql/schema/union_spec.rb +0 -72
  566. data/spec/graphql/schema/unique_within_type_spec.rb +0 -44
  567. data/spec/graphql/schema/validation_spec.rb +0 -355
  568. data/spec/graphql/schema/warden_spec.rb +0 -926
  569. data/spec/graphql/static_validation/rules/argument_literals_are_compatible_spec.rb +0 -413
  570. data/spec/graphql/static_validation/rules/argument_names_are_unique_spec.rb +0 -44
  571. data/spec/graphql/static_validation/rules/arguments_are_defined_spec.rb +0 -112
  572. data/spec/graphql/static_validation/rules/directives_are_defined_spec.rb +0 -35
  573. data/spec/graphql/static_validation/rules/directives_are_in_valid_locations_spec.rb +0 -42
  574. data/spec/graphql/static_validation/rules/fields_are_defined_on_type_spec.rb +0 -167
  575. data/spec/graphql/static_validation/rules/fields_have_appropriate_selections_spec.rb +0 -66
  576. data/spec/graphql/static_validation/rules/fields_will_merge_spec.rb +0 -740
  577. data/spec/graphql/static_validation/rules/fragment_names_are_unique_spec.rb +0 -28
  578. data/spec/graphql/static_validation/rules/fragment_spreads_are_possible_spec.rb +0 -52
  579. data/spec/graphql/static_validation/rules/fragment_types_exist_spec.rb +0 -42
  580. data/spec/graphql/static_validation/rules/fragments_are_finite_spec.rb +0 -123
  581. data/spec/graphql/static_validation/rules/fragments_are_named_spec.rb +0 -24
  582. data/spec/graphql/static_validation/rules/fragments_are_on_composite_types_spec.rb +0 -56
  583. data/spec/graphql/static_validation/rules/fragments_are_used_spec.rb +0 -61
  584. data/spec/graphql/static_validation/rules/mutation_root_exists_spec.rb +0 -39
  585. data/spec/graphql/static_validation/rules/no_definitions_are_present_spec.rb +0 -62
  586. data/spec/graphql/static_validation/rules/operation_names_are_valid_spec.rb +0 -82
  587. data/spec/graphql/static_validation/rules/required_arguments_are_present_spec.rb +0 -73
  588. data/spec/graphql/static_validation/rules/required_input_object_attributes_are_present_spec.rb +0 -86
  589. data/spec/graphql/static_validation/rules/subscription_root_exists_spec.rb +0 -34
  590. data/spec/graphql/static_validation/rules/unique_directives_per_location_spec.rb +0 -188
  591. data/spec/graphql/static_validation/rules/variable_default_values_are_correctly_typed_spec.rb +0 -196
  592. data/spec/graphql/static_validation/rules/variable_names_are_unique_spec.rb +0 -23
  593. data/spec/graphql/static_validation/rules/variable_usages_are_allowed_spec.rb +0 -236
  594. data/spec/graphql/static_validation/rules/variables_are_input_types_spec.rb +0 -78
  595. data/spec/graphql/static_validation/rules/variables_are_used_and_defined_spec.rb +0 -81
  596. data/spec/graphql/static_validation/type_stack_spec.rb +0 -29
  597. data/spec/graphql/static_validation/validator_spec.rb +0 -204
  598. data/spec/graphql/string_type_spec.rb +0 -80
  599. data/spec/graphql/subscriptions/serialize_spec.rb +0 -49
  600. data/spec/graphql/subscriptions_spec.rb +0 -540
  601. data/spec/graphql/tracing/new_relic_tracing_spec.rb +0 -84
  602. data/spec/graphql/tracing/platform_tracing_spec.rb +0 -141
  603. data/spec/graphql/tracing/prometheus_tracing_spec.rb +0 -42
  604. data/spec/graphql/tracing/scout_tracing_spec.rb +0 -17
  605. data/spec/graphql/tracing/skylight_tracing_spec.rb +0 -63
  606. data/spec/graphql/tracing_spec.rb +0 -52
  607. data/spec/graphql/types/big_int_spec.rb +0 -24
  608. data/spec/graphql/types/iso_8601_date_time_spec.rb +0 -137
  609. data/spec/graphql/types/relay/base_edge_spec.rb +0 -33
  610. data/spec/graphql/union_type_spec.rb +0 -211
  611. data/spec/graphql/upgrader/member_spec.rb +0 -583
  612. data/spec/graphql/upgrader/schema_spec.rb +0 -82
  613. data/spec/integration/mongoid/graphql/relay/mongo_relation_connection_spec.rb +0 -528
  614. data/spec/integration/mongoid/spec_helper.rb +0 -2
  615. data/spec/integration/mongoid/star_trek/data.rb +0 -126
  616. data/spec/integration/mongoid/star_trek/schema.rb +0 -425
  617. data/spec/integration/rails/data.rb +0 -110
  618. data/spec/integration/rails/generators/base_generator_test.rb +0 -7
  619. data/spec/integration/rails/generators/graphql/enum_generator_spec.rb +0 -30
  620. data/spec/integration/rails/generators/graphql/install_generator_spec.rb +0 -218
  621. data/spec/integration/rails/generators/graphql/interface_generator_spec.rb +0 -34
  622. data/spec/integration/rails/generators/graphql/loader_generator_spec.rb +0 -59
  623. data/spec/integration/rails/generators/graphql/mutation_generator_spec.rb +0 -71
  624. data/spec/integration/rails/generators/graphql/object_generator_spec.rb +0 -54
  625. data/spec/integration/rails/generators/graphql/scalar_generator_spec.rb +0 -28
  626. data/spec/integration/rails/generators/graphql/union_generator_spec.rb +0 -67
  627. data/spec/integration/rails/graphql/input_object_type_spec.rb +0 -364
  628. data/spec/integration/rails/graphql/query/variables_spec.rb +0 -375
  629. data/spec/integration/rails/graphql/relay/array_connection_spec.rb +0 -290
  630. data/spec/integration/rails/graphql/relay/base_connection_spec.rb +0 -101
  631. data/spec/integration/rails/graphql/relay/connection_instrumentation_spec.rb +0 -80
  632. data/spec/integration/rails/graphql/relay/connection_resolve_spec.rb +0 -79
  633. data/spec/integration/rails/graphql/relay/connection_type_spec.rb +0 -106
  634. data/spec/integration/rails/graphql/relay/edge_spec.rb +0 -10
  635. data/spec/integration/rails/graphql/relay/mutation_spec.rb +0 -387
  636. data/spec/integration/rails/graphql/relay/node_spec.rb +0 -263
  637. data/spec/integration/rails/graphql/relay/page_info_spec.rb +0 -111
  638. data/spec/integration/rails/graphql/relay/range_add_spec.rb +0 -117
  639. data/spec/integration/rails/graphql/relay/relation_connection_spec.rb +0 -837
  640. data/spec/integration/rails/graphql/schema_spec.rb +0 -489
  641. data/spec/integration/rails/graphql/tracing/active_support_notifications_tracing_spec.rb +0 -62
  642. data/spec/integration/rails/spec_helper.rb +0 -25
  643. data/spec/integration/tmp/app/graphql/types/bird_type.rb +0 -7
  644. data/spec/spec_helper.rb +0 -116
  645. data/spec/support/dummy/data.rb +0 -45
  646. data/spec/support/dummy/schema.rb +0 -511
  647. data/spec/support/error_bubbling_helpers.rb +0 -23
  648. data/spec/support/global_id.rb +0 -23
  649. data/spec/support/jazz.rb +0 -772
  650. data/spec/support/lazy_helpers.rb +0 -192
  651. data/spec/support/magic_cards/schema.graphql +0 -33
  652. data/spec/support/minimum_input_object.rb +0 -21
  653. data/spec/support/new_relic.rb +0 -27
  654. data/spec/support/parser/filename_example.graphql +0 -5
  655. data/spec/support/parser/filename_example_error_1.graphql +0 -4
  656. data/spec/support/parser/filename_example_error_2.graphql +0 -5
  657. data/spec/support/skylight.rb +0 -39
  658. data/spec/support/star_wars/schema.rb +0 -465
  659. data/spec/support/static_validation_helpers.rb +0 -32
@@ -1,800 +0,0 @@
1
- # frozen_string_literal: true
2
- require "spec_helper"
3
-
4
- describe GraphQL::Query do
5
- let(:query_string) { %|
6
- query getFlavor($cheeseId: Int!) {
7
- brie: cheese(id: 1) { ...cheeseFields, taste: flavor },
8
- cheese(id: $cheeseId) {
9
- __typename,
10
- id,
11
- ...cheeseFields,
12
- ... edibleFields,
13
- ... on Cheese { cheeseKind: flavor },
14
- }
15
- fromSource(source: COW) { id }
16
- fromSheep: fromSource(source: SHEEP) { id }
17
- firstSheep: searchDairy(product: [{source: SHEEP}]) {
18
- __typename,
19
- ... dairyFields,
20
- ... milkFields
21
- }
22
- favoriteEdible { __typename, fatContent }
23
- }
24
- fragment cheeseFields on Cheese { flavor }
25
- fragment edibleFields on Edible { fatContent }
26
- fragment milkFields on Milk { source }
27
- fragment dairyFields on AnimalProduct {
28
- ... on Cheese { flavor }
29
- ... on Milk { source }
30
- }
31
- |}
32
- let(:operation_name) { nil }
33
- let(:max_depth) { nil }
34
- let(:query_variables) { {"cheeseId" => 2} }
35
- let(:schema) { Dummy::Schema }
36
- let(:document) { GraphQL.parse(query_string) }
37
-
38
- let(:query) { GraphQL::Query.new(
39
- schema,
40
- query_string,
41
- variables: query_variables,
42
- operation_name: operation_name,
43
- max_depth: max_depth,
44
- )}
45
- let(:result) { query.result }
46
-
47
- describe "when passed both a query string and a document" do
48
- it "returns an error to the client when query kwarg is used" do
49
- assert_raises ArgumentError do
50
- GraphQL::Query.new(
51
- schema,
52
- query: "{ fromSource(source: COW) { id } }",
53
- document: document
54
- )
55
- end
56
- end
57
-
58
- it "returns an error to the client" do
59
- assert_raises ArgumentError do
60
- GraphQL::Query.new(
61
- schema,
62
- "{ fromSource(source: COW) { id } }",
63
- document: document
64
- )
65
- end
66
- end
67
- end
68
-
69
- describe "when passed no query string or document" do
70
- it 'returns an error to the client' do
71
- res = GraphQL::Query.new(
72
- schema,
73
- variables: query_variables,
74
- operation_name: operation_name,
75
- max_depth: max_depth,
76
- ).result
77
- assert_equal 1, res["errors"].length
78
- assert_equal "No query string was present", res["errors"][0]["message"]
79
- end
80
-
81
- it 'can be assigned later' do
82
- query = GraphQL::Query.new(
83
- schema,
84
- variables: query_variables,
85
- operation_name: operation_name,
86
- max_depth: max_depth,
87
- )
88
- query.query_string = '{ __type(name: """Cheese""") { name } }'
89
- assert_equal "Cheese", query.result["data"] ["__type"]["name"]
90
- end
91
- end
92
-
93
- describe "#operation_name" do
94
- describe "when provided" do
95
- let(:query_string) { <<-GRAPHQL
96
- query q1 { cheese(id: 1) { flavor } }
97
- query q2 { cheese(id: 2) { flavor } }
98
- GRAPHQL
99
- }
100
- let(:operation_name) { "q2" }
101
-
102
- it "returns the provided name" do
103
- assert_equal "q2", query.operation_name
104
- end
105
- end
106
-
107
- describe "when inferred" do
108
- let(:query_string) { <<-GRAPHQL
109
- query q3 { cheese(id: 3) { flavor } }
110
- GRAPHQL
111
- }
112
-
113
- it "returns nil" do
114
- assert_nil query.operation_name
115
- end
116
- end
117
-
118
- describe "#selected_operation_name" do
119
- describe "when an operation isprovided" do
120
- let(:query_string) { <<-GRAPHQL
121
- query q1 { cheese(id: 1) { flavor } }
122
- query q2 { cheese(id: 2) { flavor } }
123
- GRAPHQL
124
- }
125
- let(:operation_name) { "q2" }
126
-
127
- it "returns the provided name" do
128
- assert_equal "q2", query.selected_operation_name
129
- end
130
- end
131
-
132
- describe "when operation is inferred" do
133
- let(:query_string) { <<-GRAPHQL
134
- query q3 { cheese(id: 3) { flavor } }
135
- GRAPHQL
136
- }
137
-
138
- it "returns the inferred operation name" do
139
- assert_equal "q3", query.selected_operation_name
140
- end
141
- end
142
-
143
- describe "when there are no operations" do
144
- let(:query_string) { <<-GRAPHQL
145
- # Only Comments
146
- # In this Query
147
- GRAPHQL
148
- }
149
-
150
- it "returns the inferred operation name" do
151
- assert_nil query.selected_operation_name
152
- end
153
- end
154
- end
155
-
156
- describe "assigning operation_name=" do
157
- let(:query_string) { <<-GRAPHQL
158
- query q3 { manchego: cheese(id: 3) { flavor } }
159
- query q2 { gouda: cheese(id: 2) { flavor } }
160
- GRAPHQL
161
- }
162
-
163
- it "runs the assigned name" do
164
- query = GraphQL::Query.new(Dummy::Schema, query_string, operation_name: "q3")
165
- query.operation_name = "q2"
166
- res = query.result
167
- assert_equal "Gouda", res["data"]["gouda"]["flavor"]
168
- end
169
- end
170
- end
171
-
172
- describe "when passed a document instance" do
173
- let(:query) { GraphQL::Query.new(
174
- schema,
175
- document: document,
176
- variables: query_variables,
177
- operation_name: operation_name,
178
- max_depth: max_depth,
179
- )}
180
-
181
- it "runs the query using the already parsed document" do
182
- expected = {"data"=> {
183
- "brie" => { "flavor" => "Brie", "taste" => "Brie" },
184
- "cheese" => {
185
- "__typename" => "Cheese",
186
- "id" => 2,
187
- "flavor" => "Gouda",
188
- "fatContent" => 0.3,
189
- "cheeseKind" => "Gouda",
190
- },
191
- "fromSource" => [{ "id" => 1 }, {"id" => 2}],
192
- "fromSheep"=>[{"id"=>3}],
193
- "firstSheep" => { "__typename" => "Cheese", "flavor" => "Manchego" },
194
- "favoriteEdible"=>{"__typename"=>"Milk", "fatContent"=>0.04},
195
- }}
196
- assert_equal(expected, result)
197
- end
198
- end
199
-
200
- describe '#result' do
201
- it "returns fields on objects" do
202
- expected = {"data"=> {
203
- "brie" => { "flavor" => "Brie", "taste" => "Brie" },
204
- "cheese" => {
205
- "__typename" => "Cheese",
206
- "id" => 2,
207
- "flavor" => "Gouda",
208
- "fatContent" => 0.3,
209
- "cheeseKind" => "Gouda",
210
- },
211
- "fromSource" => [{ "id" => 1 }, {"id" => 2}],
212
- "fromSheep"=>[{"id"=>3}],
213
- "firstSheep" => { "__typename" => "Cheese", "flavor" => "Manchego" },
214
- "favoriteEdible"=>{"__typename"=>"Milk", "fatContent"=>0.04},
215
- }}
216
- assert_equal(expected, result)
217
- end
218
-
219
- describe "when it hits null objects" do
220
- let(:query_string) {%|
221
- {
222
- maybeNull {
223
- cheese {
224
- flavor,
225
- similarCheese(source: [SHEEP]) { flavor }
226
- }
227
- }
228
- }
229
- |}
230
-
231
- it "skips null objects" do
232
- expected = {"data"=> {
233
- "maybeNull" => { "cheese" => nil }
234
- }}
235
- assert_equal(expected, result)
236
- end
237
- end
238
-
239
- describe "after_query hooks" do
240
- module Instrumenter
241
- ERROR_LOG = []
242
- def self.before_query(q); end;
243
- def self.after_query(q); ERROR_LOG << q.result["errors"]; end;
244
- end
245
-
246
- let(:schema) {
247
- Dummy::Schema.redefine {
248
- instrument(:query, Instrumenter)
249
- }
250
- }
251
- it "can access #result" do
252
- result
253
- assert_equal [nil], Instrumenter::ERROR_LOG
254
- end
255
- end
256
-
257
- describe "when an error propagated through execution" do
258
- module ExtensionsInstrumenter
259
- LOG = []
260
- def self.before_query(q); end;
261
-
262
- def self.after_query(q)
263
- q.result["extensions"] = { "a" => 1 }
264
- LOG << :ok
265
- end
266
- end
267
-
268
- let(:schema) {
269
- Dummy::Schema.redefine {
270
- instrument(:query, ExtensionsInstrumenter)
271
- }
272
- }
273
-
274
- it "can add to extensions" do
275
- ExtensionsInstrumenter::LOG.clear
276
- assert_raises(RuntimeError) do
277
- schema.execute "{ error }"
278
- end
279
- assert_equal [:ok], ExtensionsInstrumenter::LOG
280
- end
281
- end
282
- end
283
-
284
- it "uses root_value as the object for the root type" do
285
- result = GraphQL::Query.new(schema, '{ root }', root_value: "I am root").result
286
- assert_equal 'I am root', result.fetch('data').fetch('root')
287
- end
288
-
289
- it "exposes fragments" do
290
- assert_equal(GraphQL::Language::Nodes::FragmentDefinition, query.fragments["cheeseFields"].class)
291
- end
292
-
293
- it "exposes the original string" do
294
- assert_equal(query_string, query.query_string)
295
- end
296
-
297
- describe "merging fragments with different keys" do
298
- let(:query_string) { %|
299
- query getCheeseFieldsThroughDairy {
300
- ... cheeseFrag3
301
- dairy {
302
- ...flavorFragment
303
- ...fatContentFragment
304
- }
305
- }
306
- fragment flavorFragment on Dairy {
307
- cheese {
308
- flavor
309
- }
310
- milks {
311
- id
312
- }
313
- }
314
- fragment fatContentFragment on Dairy {
315
- cheese {
316
- fatContent
317
- }
318
- milks {
319
- fatContent
320
- }
321
- }
322
-
323
- fragment cheeseFrag1 on Query {
324
- cheese(id: 1) {
325
- id
326
- }
327
- }
328
- fragment cheeseFrag2 on Query {
329
- cheese(id: 1) {
330
- flavor
331
- }
332
- }
333
- fragment cheeseFrag3 on Query {
334
- ... cheeseFrag2
335
- ... cheeseFrag1
336
- }
337
- |}
338
-
339
- it "should include keys from each fragment" do
340
- expected = {"data" => {
341
- "dairy" => {
342
- "cheese" => {
343
- "flavor" => "Brie",
344
- "fatContent" => 0.19
345
- },
346
- "milks" => [
347
- {
348
- "id" => "1",
349
- "fatContent" => 0.04,
350
- }
351
- ],
352
- },
353
- "cheese" => {
354
- "id" => 1,
355
- "flavor" => "Brie"
356
- },
357
- }}
358
- assert_equal(expected, result)
359
- end
360
- end
361
-
362
- describe "field argument default values" do
363
- let(:query_string) {%|
364
- query getCheeses(
365
- $search: [DairyProductInput]
366
- $searchWithDefault: [DairyProductInput] = [{source: COW}]
367
- ){
368
- noVariable: searchDairy(product: $search) {
369
- ... cheeseFields
370
- }
371
- noArgument: searchDairy {
372
- ... cheeseFields
373
- }
374
- variableDefault: searchDairy(product: $searchWithDefault) {
375
- ... cheeseFields
376
- }
377
- convertedDefault: fromSource {
378
- ... cheeseFields
379
- }
380
- }
381
- fragment cheeseFields on Cheese { flavor }
382
- |}
383
-
384
- it "has a default value" do
385
- default_source = schema.query.fields["searchDairy"].arguments["product"].default_value[0]["source"]
386
- assert_equal("SHEEP", default_source)
387
- end
388
-
389
- describe "when a variable is used, but not provided" do
390
- it "uses the default_value" do
391
- assert_equal("Manchego", result["data"]["noVariable"]["flavor"])
392
- end
393
- end
394
-
395
- describe "when the argument isn't passed at all" do
396
- it "uses the default value" do
397
- assert_equal("Manchego", result["data"]["noArgument"]["flavor"])
398
- end
399
- end
400
-
401
- describe "when the variable has a default" do
402
- it "uses the variable default" do
403
- assert_equal("Brie", result["data"]["variableDefault"]["flavor"])
404
- end
405
- end
406
-
407
- describe "when the variable has a default needing conversion" do
408
- it "uses the converted variable default" do
409
- assert_equal([{"flavor" => "Brie"}, {"flavor" => "Gouda"}], result["data"]["convertedDefault"])
410
- end
411
- end
412
- end
413
-
414
- describe "query variables" do
415
- let(:query_string) {%|
416
- query getCheese($cheeseId: Int!){
417
- cheese(id: $cheeseId) { flavor }
418
- }
419
- |}
420
-
421
- describe "when they can be coerced" do
422
- let(:query_variables) { {"cheeseId" => 2.0} }
423
-
424
- it "coerces them on the way in" do
425
- assert("Gouda", result["data"]["cheese"]["flavor"])
426
- end
427
- end
428
-
429
- describe "when they can't be coerced" do
430
- let(:query_variables) { {"cheeseId" => "2"} }
431
-
432
- it "raises an error" do
433
- expected = {
434
- "errors" => [
435
- {
436
- "message" => "Variable cheeseId of type Int! was provided invalid value",
437
- "locations"=>[{ "line" => 2, "column" => 23 }],
438
- "extensions" => {
439
- "value" => "2",
440
- "problems" => [{ "path" => [], "explanation" => 'Could not coerce value "2" to Int' }]
441
- }
442
- }
443
- ]
444
- }
445
- assert_equal(expected, result)
446
- end
447
- end
448
-
449
- describe "when they aren't provided" do
450
- let(:query_variables) { {} }
451
-
452
- it "raises an error" do
453
- expected = {
454
- "errors" => [
455
- {
456
- "message" => "Variable cheeseId of type Int! was provided invalid value",
457
- "locations" => [{"line" => 2, "column" => 23}],
458
- "extensions" => {
459
- "value" => nil,
460
- "problems" => [{ "path" => [], "explanation" => "Expected value to not be null" }]
461
- }
462
- }
463
- ]
464
- }
465
- assert_equal(expected, result)
466
- end
467
- end
468
-
469
- describe "when they are non-null and provided a null value" do
470
- let(:query_variables) { { "cheeseId" => nil } }
471
-
472
- it "raises an error" do
473
- expected = {
474
- "errors" => [
475
- {
476
- "message" => "Variable cheeseId of type Int! was provided invalid value",
477
- "locations" => [{"line" => 2, "column" => 23}],
478
- "extensions" => {
479
- "value" => nil,
480
- "problems" => [{ "path" => [], "explanation" => "Expected value to not be null" }]
481
- }
482
- }
483
- ]
484
- }
485
- assert_equal(expected, result)
486
- end
487
- end
488
-
489
- describe "when they're a string" do
490
- let(:query_variables) { '{ "var" : 1 }' }
491
- it "raises an error" do
492
- assert_raises(ArgumentError) { result }
493
- end
494
- end
495
-
496
- describe "default values" do
497
- let(:query_string) {%|
498
- query getCheese($cheeseId: Int = 3){
499
- cheese(id: $cheeseId) { id, flavor }
500
- }
501
- |}
502
-
503
- describe "when no value is provided" do
504
- let(:query_variables) { {} }
505
-
506
- it "uses the default" do
507
- assert(3, result["data"]["cheese"]["id"])
508
- assert("Manchego", result["data"]["cheese"]["flavor"])
509
- end
510
- end
511
-
512
- describe "when a value is provided" do
513
- it "uses the provided variable" do
514
- assert(2, result["data"]["cheese"]["id"])
515
- assert("Gouda", result["data"]["cheese"]["flavor"])
516
- end
517
- end
518
-
519
- describe "when complex values" do
520
- let(:query_variables) { {"search" => [{"source" => "COW"}]} }
521
- let(:query_string) {%|
522
- query getCheeses($search: [DairyProductInput]!){
523
- cow: searchDairy(product: $search) {
524
- ... on Cheese {
525
- flavor
526
- }
527
- }
528
- }
529
- |}
530
-
531
- it "coerces recursively" do
532
- assert_equal("Brie", result["data"]["cow"]["flavor"])
533
- end
534
- end
535
- end
536
- end
537
-
538
- describe "max_depth" do
539
- let(:query_string) {
540
- <<-GRAPHQL
541
- {
542
- cheese(id: 1) {
543
- similarCheese(source: SHEEP) {
544
- similarCheese(source: SHEEP) {
545
- similarCheese(source: SHEEP) {
546
- similarCheese(source: SHEEP) {
547
- id
548
- }
549
- }
550
- }
551
- }
552
- }
553
- }
554
- GRAPHQL
555
- }
556
-
557
- it "defaults to the schema's max_depth" do
558
- # Constrained by schema's setting of 5
559
- assert_equal 1, result["errors"].length
560
- end
561
-
562
- describe "overriding max_depth" do
563
- let(:max_depth) { 12 }
564
-
565
- it "overrides the schema's max_depth" do
566
- assert result["data"].key?("cheese")
567
- assert_nil result["errors"]
568
- end
569
- end
570
- end
571
-
572
- describe "#provided_variables" do
573
- it "returns the originally-provided object" do
574
- assert_equal({"cheeseId" => 2}, query.provided_variables)
575
- end
576
- end
577
-
578
- describe "parse errors" do
579
- let(:invalid_query_string) {
580
- <<-GRAPHQL
581
- {
582
- getStuff
583
- nonsense
584
- This is broken 1
585
- }
586
- GRAPHQL
587
- }
588
- it "adds an entry to the errors key" do
589
- res = schema.execute(" { ")
590
- assert_equal 1, res["errors"].length
591
- assert_equal "Unexpected end of document", res["errors"][0]["message"]
592
- assert_equal [], res["errors"][0]["locations"]
593
-
594
- res = schema.execute(invalid_query_string)
595
- assert_equal 1, res["errors"].length
596
- assert_equal %|Parse error on "1" (INT) at [4, 26]|, res["errors"][0]["message"]
597
- assert_equal({"line" => 4, "column" => 26}, res["errors"][0]["locations"][0])
598
- end
599
-
600
- it "can be configured to raise" do
601
- raise_schema = schema.redefine(parse_error: ->(err, ctx) { raise err })
602
- assert_raises(GraphQL::ParseError) {
603
- raise_schema.execute(invalid_query_string)
604
- }
605
- end
606
- end
607
-
608
- describe "#mutation?" do
609
- let(:query_string) { <<-GRAPHQL
610
- query Q { __typename }
611
- mutation M { pushValue(value: 1) }
612
- GRAPHQL
613
- }
614
-
615
- it "returns true if the selected operation is a mutation" do
616
- query_query = GraphQL::Query.new(schema, query_string, operation_name: "Q")
617
- assert_equal false, query_query.mutation?
618
- assert_equal true, query_query.query?
619
-
620
- mutation_query = GraphQL::Query.new(schema, query_string, operation_name: "M")
621
- assert_equal true, mutation_query.mutation?
622
- assert_equal false, mutation_query.query?
623
- end
624
- end
625
-
626
- describe "validate: false" do
627
- it "doesn't validate the query" do
628
- invalid_query_string = "{ nonExistantField }"
629
- # Can assign attribute
630
- query = GraphQL::Query.new(schema, invalid_query_string)
631
- query.validate = false
632
- assert_equal true, query.valid?
633
- assert_equal 0, query.static_errors.length
634
-
635
- # Can pass keyword argument
636
- query = GraphQL::Query.new(schema, invalid_query_string, validate: false)
637
- assert_equal true, query.valid?
638
- assert_equal 0, query.static_errors.length
639
-
640
- # Can pass `true`
641
- query = GraphQL::Query.new(schema, invalid_query_string, validate: true)
642
- assert_equal false, query.valid?
643
- assert_equal 1, query.static_errors.length
644
- end
645
- end
646
-
647
- describe "validating with optional arguments and variables: nil" do
648
- it "works" do
649
- query_str = <<-GRAPHQL
650
- query($expiresAfter: Time) {
651
- searchDairy(expiresAfter: $expiresAfter) {
652
- __typename
653
- }
654
- }
655
- GRAPHQL
656
- query = GraphQL::Query.new(schema, query_str, variables: nil)
657
- assert query.valid?
658
- end
659
- end
660
-
661
- describe 'NullValue type arguments' do
662
- let(:schema_definition) {
663
- <<-GRAPHQL
664
- type Query {
665
- foo(id: [ID]): Int
666
- }
667
- GRAPHQL
668
- }
669
- let(:expected_args) { [] }
670
- let(:default_resolver) do
671
- {
672
- 'Query' => { 'foo' => ->(_obj, args, _ctx) { expected_args.push(args); 1 } },
673
- }
674
- end
675
- let(:schema) { GraphQL::Schema.from_definition(schema_definition, default_resolve: default_resolver) }
676
-
677
- it 'sets argument to nil when null is passed' do
678
- query = <<-GRAPHQL
679
- {
680
- foo(id: null)
681
- }
682
- GRAPHQL
683
-
684
- schema.execute(query)
685
-
686
- assert(expected_args.first.key?('id'))
687
- assert_nil(expected_args.first['id'])
688
- end
689
-
690
- it 'sets argument to nil when nil is passed via variable' do
691
- query = <<-GRAPHQL
692
- query baz($id: [ID]) {
693
- foo(id: $id)
694
- }
695
- GRAPHQL
696
-
697
- schema.execute(query, variables: { 'id' => nil })
698
-
699
- assert(expected_args.first.key?('id'))
700
- assert([nil], expected_args.first['id'])
701
- end
702
-
703
- it 'sets argument to [nil] when [null] is passed' do
704
- query = <<-GRAPHQL
705
- {
706
- foo(id: [null])
707
- }
708
- GRAPHQL
709
-
710
- schema.execute(query)
711
-
712
- assert(expected_args.first.key?('id'))
713
- assert_equal([nil], expected_args.first['id'])
714
- end
715
-
716
- it 'sets argument to [nil] when [nil] is passed via variable' do
717
- query = <<-GRAPHQL
718
- query baz($id: [ID]) {
719
- foo(id: $id)
720
- }
721
- GRAPHQL
722
-
723
- schema.execute(query, variables: { 'id' => [nil] })
724
-
725
- assert(expected_args.first.key?('id'))
726
- assert_equal([nil], expected_args.first['id'])
727
- end
728
- end
729
-
730
- describe '#internal_representation' do
731
- it "includes all definition roots" do
732
- assert_kind_of GraphQL::InternalRepresentation::Node, query.internal_representation.operation_definitions["getFlavor"]
733
- assert_kind_of GraphQL::InternalRepresentation::Node, query.internal_representation.fragment_definitions["cheeseFields"]
734
- assert_kind_of GraphQL::InternalRepresentation::Node, query.internal_representation.fragment_definitions["edibleFields"]
735
- assert_kind_of GraphQL::InternalRepresentation::Node, query.internal_representation.fragment_definitions["milkFields"]
736
- assert_kind_of GraphQL::InternalRepresentation::Node, query.internal_representation.fragment_definitions["dairyFields"]
737
- end
738
- end
739
-
740
- describe '#irep_selection' do
741
- it "returns the irep for the selected operation" do
742
- assert_kind_of GraphQL::InternalRepresentation::Node, query.irep_selection
743
- assert_equal 'getFlavor', query.irep_selection.name
744
- end
745
-
746
- it "returns nil when there is no selected operation" do
747
- query = GraphQL::Query.new(schema, '# Only a comment')
748
- assert_nil query.irep_selection
749
- end
750
- end
751
-
752
- describe "query_execution_strategy" do
753
- let(:custom_execution_schema) {
754
- schema.redefine do
755
- query_execution_strategy DummyStrategy
756
- instrument(:multiplex, DummyMultiplexInstrumenter)
757
- end
758
- }
759
-
760
- class DummyStrategy
761
- def execute(ast_operation, root_type, query_object)
762
- { "dummy" => true }
763
- end
764
- end
765
-
766
- class DummyMultiplexInstrumenter
767
- def self.before_multiplex(m)
768
- m.queries.first.context[:before_multiplex] = true
769
- end
770
-
771
- def self.after_multiplex(m)
772
- end
773
- end
774
-
775
- it "is used for running a query, if it's present and not the default" do
776
- result = custom_execution_schema.execute(" { __typename }")
777
- assert_equal({"data"=>{"dummy"=>true}}, result)
778
-
779
- result = custom_execution_schema.execute(" mutation { __typename } ")
780
- assert_equal({"data"=>{"__typename" => "Mutation"}}, result)
781
- end
782
-
783
- it "treats the query as a one-item multiplex" do
784
- ctx = {}
785
- custom_execution_schema.execute(" { __typename }", context: ctx)
786
- assert_equal true, ctx[:before_multiplex]
787
- end
788
-
789
- it "can't run a multiplex" do
790
- err = assert_raises ArgumentError do
791
- custom_execution_schema.multiplex([
792
- {query: " { __typename }"},
793
- {query: " { __typename }"},
794
- ])
795
- end
796
- msg = "Multiplexing doesn't support custom execution strategies, run one query at a time instead"
797
- assert_equal msg, err.message
798
- end
799
- end
800
- end