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,714 +0,0 @@
1
- # frozen_string_literal: true
2
- require "spec_helper"
3
-
4
- describe GraphQL::Schema::Resolver do
5
- module ResolverTest
6
- class LazyBlock
7
- def initialize
8
- @get_value = Proc.new
9
- end
10
-
11
- def value
12
- @get_value.call
13
- end
14
- end
15
-
16
- class BaseResolver < GraphQL::Schema::Resolver
17
- end
18
-
19
- class Resolver1 < BaseResolver
20
- argument :value, Integer, required: false
21
- type [Integer, null: true], null: false
22
-
23
- def initialize(object:, context:)
24
- super
25
- if defined?(@value)
26
- raise "The instance should start fresh"
27
- end
28
- @value = [100]
29
- end
30
-
31
- def resolve(value: nil)
32
- @value << value
33
- @value
34
- end
35
- end
36
-
37
- class Resolver2 < Resolver1
38
- argument :extra_value, Integer, required: true
39
-
40
- def resolve(extra_value:, **_rest)
41
- value = super(_rest)
42
- value << extra_value
43
- value
44
- end
45
- end
46
-
47
- class Resolver3 < Resolver1
48
- end
49
-
50
- class Resolver4 < BaseResolver
51
- type Integer, null: false
52
-
53
- extras [:ast_node]
54
- def resolve(ast_node:)
55
- object.value + ast_node.name.size
56
- end
57
- end
58
-
59
- class ResolverWithPath < BaseResolver
60
- type String, null: false
61
-
62
- extras [:path]
63
- def resolve(path:)
64
- path.inspect
65
- end
66
- end
67
-
68
- class Resolver5 < Resolver4
69
- end
70
-
71
- class Resolver6 < Resolver1
72
- type Integer, null: false
73
-
74
- def resolve
75
- self.class.complexity
76
- end
77
- end
78
-
79
- class Resolver7 < Resolver6
80
- complexity 2
81
- end
82
-
83
- class Resolver8 < Resolver7
84
- end
85
-
86
- class PrepResolver1 < BaseResolver
87
- argument :int, Integer, required: true
88
- undef_method :load_int
89
- def load_int(i)
90
- i * 10
91
- end
92
-
93
- type Integer, null: false
94
-
95
- def resolve(int:)
96
- int
97
- end
98
-
99
- private
100
-
101
- def check_for_magic_number(int)
102
- if int == 13
103
- raise GraphQL::ExecutionError, "13 is unlucky!"
104
- elsif int > 99
105
- raise GraphQL::UnauthorizedError, "Top secret big number: #{int}"
106
- else
107
- int
108
- end
109
- end
110
- end
111
-
112
- class PrepResolver2 < PrepResolver1
113
- def load_int(i)
114
- LazyBlock.new {
115
- super - 35
116
- }
117
- end
118
- end
119
-
120
- class PrepResolver3 < PrepResolver1
121
- type Integer, null: true
122
-
123
- def load_int(i)
124
- check_for_magic_number(i)
125
- end
126
- end
127
-
128
- class PrepResolver4 < PrepResolver3
129
- def load_int(i)
130
- LazyBlock.new {
131
- super
132
- }
133
- end
134
- end
135
-
136
- class PrepResolver5 < PrepResolver1
137
- type Integer, null: true
138
-
139
- def ready?(int:)
140
- check_for_magic_number(int)
141
- end
142
- end
143
-
144
- class PrepResolver6 < PrepResolver5
145
- def ready?(**args)
146
- LazyBlock.new {
147
- super
148
- }
149
- end
150
- end
151
-
152
- class PrepResolver7 < GraphQL::Schema::Mutation
153
- argument :int, Integer, required: true
154
- field :errors, [String], null: true
155
- field :int, Integer, null: true
156
-
157
- def ready?(int:)
158
- if int == 13
159
- return false, { errors: ["Bad number!"] }
160
- else
161
- true
162
- end
163
- end
164
-
165
- def resolve(int:)
166
- { int: int }
167
- end
168
- end
169
-
170
- module HasValue
171
- include GraphQL::Schema::Interface
172
- field :value, Integer, null: false
173
- def self.resolve_type(obj, ctx)
174
- LazyBlock.new {
175
- if obj.is_a?(Integer)
176
- IntegerWrapper
177
- elsif obj == :resolve_type_as_wrong_type
178
- GraphQL::Types::String
179
- else
180
- raise "Unexpected: #{obj.inspect}"
181
- end
182
- }
183
- end
184
- end
185
-
186
- class IntegerWrapper < GraphQL::Schema::Object
187
- implements HasValue
188
- field :value, Integer, null: false, method: :itself
189
- end
190
-
191
- class PrepResolver9 < BaseResolver
192
- argument :int_id, ID, required: true, loads: HasValue
193
- # Make sure the lazy object is resolved properly:
194
- type HasValue, null: false
195
- def object_from_id(type, id, ctx)
196
- # Make sure a lazy object is handled appropriately
197
- LazyBlock.new {
198
- # Make sure that the right type ends up here
199
- id.to_i + type.graphql_name.length
200
- }
201
- end
202
-
203
- def resolve(int:)
204
- int * 3
205
- end
206
- end
207
-
208
- class PrepResolver9Array < BaseResolver
209
- argument :int_ids, [ID], required: true, loads: HasValue, as: :ints
210
- # Make sure the lazy object is resolved properly:
211
- type [HasValue], null: false
212
- def object_from_id(type, id, ctx)
213
- # Make sure a lazy object is handled appropriately
214
- LazyBlock.new {
215
- # Make sure that the right type ends up here
216
- id.to_i + type.graphql_name.length
217
- }
218
- end
219
-
220
- def resolve(ints:)
221
- ints.map { |int| int * 3}
222
- end
223
- end
224
-
225
- class ResolverWithErrorHandler < BaseResolver
226
- argument :int, ID, required: true, loads: HasValue
227
- type HasValue, null: true
228
- def object_from_id(type, id, ctx)
229
- LazyBlock.new {
230
- if id == "failed_to_find"
231
- nil
232
- elsif id == "resolve_type_as_wrong_type"
233
- :resolve_type_as_wrong_type
234
- else
235
- id.length
236
- end
237
- }
238
- end
239
-
240
- def resolve(int:)
241
- int * 4
242
- end
243
-
244
- def load_application_object_failed(err)
245
- raise GraphQL::ExecutionError.new("ResolverWithErrorHandler failed for id: #{err.id.inspect} (#{err.object.inspect}) (#{err.class.name})")
246
- end
247
- end
248
-
249
- class PrepResolver10 < BaseResolver
250
- argument :int1, Integer, required: true
251
- argument :int2, Integer, required: true, as: :integer_2
252
- type Integer, null: true
253
- def authorized?(int1:, integer_2:)
254
- if int1 + integer_2 > context[:max_int]
255
- raise GraphQL::ExecutionError, "Inputs too big"
256
- elsif context[:min_int] && (int1 + integer_2 < context[:min_int])
257
- false
258
- else
259
- true
260
- end
261
- end
262
-
263
- def resolve(int1:, integer_2:)
264
- int1 + integer_2
265
- end
266
- end
267
-
268
- class PrepResolver11 < PrepResolver10
269
- def authorized?(int1:, integer_2:)
270
- LazyBlock.new { super(int1: int1 * 2, integer_2: integer_2) }
271
- end
272
- end
273
-
274
- class PrepResolver12 < GraphQL::Schema::Mutation
275
- argument :int1, Integer, required: true
276
- argument :int2, Integer, required: true
277
- field :error_messages, [String], null: true
278
- field :value, Integer, null: true
279
- def authorized?(int1:, int2:)
280
- if int1 + int2 > context[:max_int]
281
- return false, { error_messages: ["Inputs must be less than #{context[:max_int]} (but you provided #{int1 + int2})"] }
282
- else
283
- true
284
- end
285
- end
286
-
287
- def resolve(int1:, int2:)
288
- { value: int1 + int2 }
289
- end
290
- end
291
-
292
- class PrepResolver13 < PrepResolver12
293
- def authorized?(int1:, int2:)
294
- # Increment the numbers so we can be sure they're passing through here
295
- LazyBlock.new { super(int1: int1 + 1, int2: int2 + 1) }
296
- end
297
- end
298
-
299
- class PrepResolver14 < GraphQL::Schema::RelayClassicMutation
300
- field :number, Integer, null: false
301
-
302
- def authorized?
303
- true
304
- end
305
-
306
- def resolve
307
- { number: 1 }
308
- end
309
- end
310
-
311
- class MutationWithNullableLoadsArgument < GraphQL::Schema::Mutation
312
- argument :label_id, ID, required: false, loads: HasValue
313
- argument :label_ids, [ID], required: false, loads: HasValue
314
-
315
- field :inputs, String, null: false
316
-
317
- def resolve(**inputs)
318
- {
319
- inputs: JSON.dump(inputs)
320
- }
321
- end
322
- end
323
-
324
- class MutationWithRequiredLoadsArgument < GraphQL::Schema::Mutation
325
- argument :label_id, ID, required: true, loads: HasValue
326
-
327
- field :inputs, String, null: false
328
-
329
- def resolve(**inputs)
330
- {
331
- inputs: JSON.dump(inputs)
332
- }
333
- end
334
- end
335
-
336
- class Mutation < GraphQL::Schema::Object
337
- field :mutation_with_nullable_loads_argument, mutation: MutationWithNullableLoadsArgument
338
- field :mutation_with_required_loads_argument, mutation: MutationWithRequiredLoadsArgument
339
- end
340
-
341
- class Query < GraphQL::Schema::Object
342
- class CustomField < GraphQL::Schema::Field
343
- def resolve_field(*args)
344
- value = super
345
- if @name == "resolver3"
346
- value << -1
347
- end
348
- value
349
- end
350
-
351
- def resolve(*)
352
- value = super
353
- if @name == "resolver3"
354
- value << -1
355
- end
356
- value
357
- end
358
- end
359
-
360
- field_class(CustomField)
361
-
362
- field :resolver_1, resolver: Resolver1
363
- field :resolver_2, resolver: Resolver2
364
- field :resolver_3, resolver: Resolver3
365
- field :resolver_3_again, resolver: Resolver3, description: "field desc"
366
- field :resolver_4, "Positional description", resolver: Resolver4
367
- field :resolver_5, resolver: Resolver5
368
- field :resolver_6, resolver: Resolver6
369
- field :resolver_7, resolver: Resolver7
370
- field :resolver_8, resolver: Resolver8
371
- field :resolver_with_path, resolver: ResolverWithPath
372
-
373
- field :prep_resolver_1, resolver: PrepResolver1
374
- field :prep_resolver_2, resolver: PrepResolver2
375
- field :prep_resolver_3, resolver: PrepResolver3
376
- field :prep_resolver_4, resolver: PrepResolver4
377
- field :prep_resolver_5, resolver: PrepResolver5
378
- field :prep_resolver_6, resolver: PrepResolver6
379
- field :prep_resolver_7, resolver: PrepResolver7
380
- field :prep_resolver_9, resolver: PrepResolver9
381
- field :prep_resolver_9_array, resolver: PrepResolver9Array
382
- field :prep_resolver_10, resolver: PrepResolver10
383
- field :prep_resolver_11, resolver: PrepResolver11
384
- field :prep_resolver_12, resolver: PrepResolver12
385
- field :prep_resolver_13, resolver: PrepResolver13
386
- field :prep_resolver_14, resolver: PrepResolver14
387
- field :resolver_with_error_handler, resolver: ResolverWithErrorHandler
388
- end
389
-
390
- class Schema < GraphQL::Schema
391
- query(Query)
392
- mutation(Mutation)
393
- lazy_resolve LazyBlock, :value
394
- orphan_types IntegerWrapper
395
- if TESTING_INTERPRETER
396
- use GraphQL::Execution::Interpreter
397
- end
398
-
399
- def object_from_id(id, ctx)
400
- if id == "invalid"
401
- nil
402
- else
403
- 1
404
- end
405
- end
406
- end
407
- end
408
-
409
- def exec_query(*args)
410
- ResolverTest::Schema.execute(*args)
411
- end
412
-
413
- describe ".path" do
414
- it "is the name" do
415
- assert_equal "Resolver1", ResolverTest::Resolver1.path
416
- end
417
-
418
- it "is used for arguments and fields" do
419
- assert_equal "Resolver1.value", ResolverTest::Resolver1.arguments["value"].path
420
- assert_equal "PrepResolver7.int", ResolverTest::PrepResolver7.fields["int"].path
421
- end
422
-
423
- it "works on instances" do
424
- r = ResolverTest::Resolver1.new(object: nil, context: nil)
425
- assert_equal "Resolver1", r.path
426
- end
427
- end
428
-
429
- it "gets initialized for each resolution" do
430
- # State isn't shared between calls:
431
- res = exec_query " { r1: resolver1(value: 1) r2: resolver1 }"
432
- assert_equal [100, 1], res["data"]["r1"]
433
- assert_equal [100, nil], res["data"]["r2"]
434
- end
435
-
436
- it "inherits type and arguments" do
437
- res = exec_query " { r1: resolver2(value: 1, extraValue: 2) r2: resolver2(extraValue: 3) }"
438
- assert_equal [100, 1, 2], res["data"]["r1"]
439
- assert_equal [100, nil, 3], res["data"]["r2"]
440
- end
441
-
442
- it "uses the object's field_class" do
443
- res = exec_query " { r1: resolver3(value: 1) r2: resolver3 }"
444
- assert_equal [100, 1, -1], res["data"]["r1"]
445
- assert_equal [100, nil, -1], res["data"]["r2"]
446
- end
447
-
448
- describe "resolve method" do
449
- it "has access to the application object" do
450
- res = exec_query " { resolver4 } ", root_value: OpenStruct.new(value: 4)
451
- assert_equal 13, res["data"]["resolver4"]
452
- end
453
-
454
- it "gets extras" do
455
- res = exec_query " { resolver4 } ", root_value: OpenStruct.new(value: 0)
456
- assert_equal 9, res["data"]["resolver4"]
457
- end
458
-
459
- it "gets path from extras" do
460
- res = exec_query " { resolverWithPath } ", root_value: OpenStruct.new(value: 0)
461
- assert_equal '["resolverWithPath"]', res["data"]["resolverWithPath"]
462
- end
463
- end
464
-
465
- describe "load_application_object_failed hook" do
466
- it "isn't called for successful queries" do
467
- query_str = <<-GRAPHQL
468
- {
469
- resolverWithErrorHandler(int: "abcd") { value }
470
- }
471
- GRAPHQL
472
-
473
- res = exec_query(query_str)
474
- assert_equal 16, res["data"]["resolverWithErrorHandler"]["value"]
475
- refute res.key?("errors")
476
- end
477
-
478
- describe "when the id doesn't find anything" do
479
- it "passes an error to the handler" do
480
- query_str = <<-GRAPHQL
481
- {
482
- resolverWithErrorHandler(int: "failed_to_find") { value }
483
- }
484
- GRAPHQL
485
-
486
- res = exec_query(query_str)
487
- assert_nil res["data"].fetch("resolverWithErrorHandler")
488
- expected_err = "ResolverWithErrorHandler failed for id: \"failed_to_find\" (nil) (GraphQL::LoadApplicationObjectFailedError)"
489
- assert_equal [expected_err], res["errors"].map { |e| e["message"] }
490
- end
491
- end
492
-
493
- describe "when resolve_type returns a no-good type" do
494
- it "calls the handler" do
495
- query_str = <<-GRAPHQL
496
- {
497
- resolverWithErrorHandler(int: "resolve_type_as_wrong_type") { value }
498
- }
499
- GRAPHQL
500
-
501
- res = exec_query(query_str)
502
- assert_nil res["data"].fetch("resolverWithErrorHandler")
503
- expected_err = "ResolverWithErrorHandler failed for id: \"resolve_type_as_wrong_type\" (:resolve_type_as_wrong_type) (GraphQL::LoadApplicationObjectFailedError)"
504
- assert_equal [expected_err], res["errors"].map { |e| e["message"] }
505
- end
506
- end
507
- end
508
-
509
-
510
- describe "extras" do
511
- it "is inherited" do
512
- res = exec_query " { resolver4 resolver5 } ", root_value: OpenStruct.new(value: 0)
513
- assert_equal 9, res["data"]["resolver4"]
514
- assert_equal 9, res["data"]["resolver5"]
515
- end
516
- end
517
-
518
- describe "complexity" do
519
- it "has default values" do
520
- res = exec_query " { resolver6 } ", root_value: OpenStruct.new(value: 0)
521
- assert_equal 1, res["data"]["resolver6"]
522
- end
523
-
524
- it "is inherited" do
525
- res = exec_query " { resolver7 resolver8 } ", root_value: OpenStruct.new(value: 0)
526
- assert_equal 2, res["data"]["resolver7"]
527
- assert_equal 2, res["data"]["resolver8"]
528
- end
529
- end
530
-
531
- describe "when applied to a field" do
532
- it "gets the field's description" do
533
- assert_nil ResolverTest::Schema.find("Query.resolver3").description
534
- assert_equal "field desc", ResolverTest::Schema.find("Query.resolver3Again").description
535
- assert_equal "Positional description", ResolverTest::Schema.find("Query.resolver4").description
536
- end
537
-
538
- it "gets the field's name" do
539
- # Matching name:
540
- assert ResolverTest::Schema.find("Query.resolver3")
541
- # Mismatched name:
542
- assert ResolverTest::Schema.find("Query.resolver3Again")
543
- end
544
- end
545
-
546
- describe "preparing inputs" do
547
- # Add assertions for a given field, assuming the behavior of `check_for_magic_number`
548
- def add_error_assertions(field_name, description)
549
- res = exec_query("{ int: #{field_name}(int: 13) }")
550
- assert_nil res["data"].fetch("int"), "#{description}: no result for execution error"
551
- assert_equal ["13 is unlucky!"], res["errors"].map { |e| e["message"] }, "#{description}: top-level error is added"
552
-
553
- res = exec_query("{ int: #{field_name}(int: 200) }")
554
- assert_nil res["data"].fetch("int"), "#{description}: No result for authorization error"
555
- refute res.key?("errors"), "#{description}: silent auth failure (no top-level error)"
556
- end
557
-
558
- describe "ready?" do
559
- it "can raise errors" do
560
- res = exec_query("{ int: prepResolver5(int: 5) }")
561
- assert_equal 50, res["data"]["int"]
562
- add_error_assertions("prepResolver5", "ready?")
563
- end
564
-
565
- it "can raise errors in lazy sync" do
566
- res = exec_query("{ int: prepResolver6(int: 5) }")
567
- assert_equal 50, res["data"]["int"]
568
- add_error_assertions("prepResolver6", "lazy ready?")
569
- end
570
-
571
- it "can return false and data" do
572
- res = exec_query("{ int: prepResolver7(int: 13) { errors int } }")
573
- assert_equal ["Bad number!"], res["data"]["int"]["errors"]
574
-
575
- res = exec_query("{ int: prepResolver7(int: 213) { errors int } }")
576
- assert_equal 213, res["data"]["int"]["int"]
577
- end
578
- end
579
-
580
- describe "loading arguments" do
581
- it "calls load methods and injects the return value" do
582
- res = exec_query("{ prepResolver1(int: 5) }")
583
- assert_equal 50, res["data"]["prepResolver1"], "The load multiplier was called"
584
- end
585
-
586
- it "supports lazy values" do
587
- res = exec_query("{ prepResolver2(int: 5) }")
588
- assert_equal 15, res["data"]["prepResolver2"], "The load multiplier was called"
589
- end
590
-
591
- it "supports raising GraphQL::UnauthorizedError and GraphQL::ExecutionError" do
592
- res = exec_query("{ prepResolver3(int: 5) }")
593
- assert_equal 5, res["data"]["prepResolver3"]
594
- add_error_assertions("prepResolver3", "load_ hook")
595
- end
596
-
597
- it "supports raising errors from promises" do
598
- res = exec_query("{ prepResolver4(int: 5) }")
599
- assert_equal 5, res["data"]["prepResolver4"]
600
- add_error_assertions("prepResolver4", "lazy load_ hook")
601
- end
602
- end
603
-
604
- describe "validating arguments" do
605
- describe ".authorized?" do
606
- it "can raise an error to halt" do
607
- res = exec_query("{ prepResolver10(int1: 5, int2: 6) }", context: { max_int: 9 })
608
- assert_equal ["Inputs too big"], res["errors"].map { |e| e["message"] }
609
-
610
- res = exec_query("{ prepResolver10(int1: 5, int2: 6) }", context: { max_int: 90 })
611
- assert_equal 11, res["data"]["prepResolver10"]
612
- end
613
-
614
- it "uses the argument name provided in `as:`" do
615
- res = exec_query("{ prepResolver10(int1: 5, int2: 6) }", context: { max_int: 90 })
616
- assert_equal 11, res["data"]["prepResolver10"]
617
- end
618
-
619
- it "can return a lazy object" do
620
- # This is too big because it's modified in the overridden authorized? hook:
621
- res = exec_query("{ prepResolver11(int1: 3, int2: 5) }", context: { max_int: 9 })
622
- assert_equal ["Inputs too big"], res["errors"].map { |e| e["message"] }
623
-
624
- res = exec_query("{ prepResolver11(int1: 3, int2: 5) }", context: { max_int: 90 })
625
- assert_equal 8, res["data"]["prepResolver11"]
626
- end
627
-
628
- it "can return data early" do
629
- res = exec_query("{ prepResolver12(int1: 9, int2: 5) { errorMessages } }", context: { max_int: 9 })
630
- assert_equal ["Inputs must be less than 9 (but you provided 14)"], res["data"]["prepResolver12"]["errorMessages"]
631
- # This works
632
- res = exec_query("{ prepResolver12(int1: 2, int2: 5) { value } }", context: { max_int: 9 })
633
- assert_equal 7, res["data"]["prepResolver12"]["value"]
634
- end
635
-
636
- it "can return data early in a promise" do
637
- # This is too big because it's modified in the overridden authorized? hook:
638
- res = exec_query("{ prepResolver13(int1: 4, int2: 4) { errorMessages } }", context: { max_int: 9 })
639
- assert_equal ["Inputs must be less than 9 (but you provided 10)"], res["data"]["prepResolver13"]["errorMessages"]
640
- # This works
641
- res = exec_query("{ prepResolver13(int1: 2, int2: 5) { value } }", context: { max_int: 9 })
642
- assert_equal 7, res["data"]["prepResolver13"]["value"]
643
- end
644
-
645
- it "can return false to halt" do
646
- str = <<-GRAPHQL
647
- {
648
- prepResolver10(int1: 5, int2: 10)
649
- prepResolver11(int1: 3, int2: 5)
650
- }
651
- GRAPHQL
652
- res = exec_query(str, context: { max_int: 100, min_int: 20 })
653
- assert_equal({ "prepResolver10" => nil, "prepResolver11" => nil }, res["data"])
654
- end
655
-
656
- it "works with no arguments for RelayClassicMutation" do
657
- res = exec_query("{ prepResolver14(input: {}) { number } }")
658
- assert_equal 1, res["data"]["prepResolver14"]["number"]
659
- end
660
- end
661
- end
662
-
663
- describe "Loading inputs" do
664
- it "calls object_from_id" do
665
- res = exec_query('{ prepResolver9(intId: "5") { value } }')
666
- # (5 + 8) * 3
667
- assert_equal 39, res["data"]["prepResolver9"]["value"]
668
- end
669
-
670
- it "supports loading array of ids" do
671
- res = exec_query('{ prepResolver9Array(intIds: ["1", "10", "100"]) { value } }')
672
- # (1 + 8) * 3
673
- # (10 + 8) * 3
674
- # (100 + 8) * 3
675
- assert_equal [27, 54, 324], res["data"]["prepResolver9Array"].map { |v| v["value"] }
676
- end
677
-
678
- it "preserves `nil` when nullable argument is provided `null`" do
679
- res = exec_query("mutation { mutationWithNullableLoadsArgument(labelId: null) { inputs } }")
680
-
681
- assert_equal nil, res["errors"]
682
- assert_equal '{"label":null}', res["data"]["mutationWithNullableLoadsArgument"]["inputs"]
683
- end
684
-
685
- it "preserves `nil` when nullable list argument is provided `null`" do
686
- res = exec_query("mutation { mutationWithNullableLoadsArgument(labelIds: null) { inputs } }")
687
-
688
- assert_equal nil, res["errors"]
689
- assert_equal '{"labels":null}', res["data"]["mutationWithNullableLoadsArgument"]["inputs"]
690
- end
691
-
692
- it "omits omitted nullable argument" do
693
- res = exec_query("mutation { mutationWithNullableLoadsArgument { inputs } }")
694
-
695
- assert_equal nil, res["errors"]
696
- assert_equal "{}", res["data"]["mutationWithNullableLoadsArgument"]["inputs"]
697
- end
698
-
699
- it "returns an error when nullable argument is provided an invalid value" do
700
- res = exec_query('mutation { mutationWithNullableLoadsArgument(labelId: "invalid") { inputs } }')
701
-
702
- assert res["errors"]
703
- assert_equal 'No object found for `labelId: "invalid"`', res["errors"][0]["message"]
704
- end
705
-
706
- it "returns an error when a non-nullable argument is provided an invalid value" do
707
- res = exec_query('mutation { mutationWithRequiredLoadsArgument(labelId: "invalid") { inputs } }')
708
-
709
- assert res["errors"]
710
- assert_equal 'No object found for `labelId: "invalid"`', res["errors"][0]["message"]
711
- end
712
- end
713
- end
714
- end