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,246 +0,0 @@
1
- # frozen_string_literal: true
2
- require "spec_helper"
3
-
4
- # Must be top-level so it can be found by string
5
- FieldSpecReturnType = GraphQL::ObjectType.define do
6
- name "FieldReturn"
7
- field :id, types.Int
8
- field :source, types.String, hash_key: :source
9
- end
10
-
11
- describe GraphQL::Field do
12
-
13
- it "accepts a proc as type" do
14
- field = GraphQL::Field.define do
15
- type(-> { FieldSpecReturnType })
16
- end
17
-
18
- assert_equal(FieldSpecReturnType, field.type)
19
- end
20
-
21
- it "accepts a string as a type" do
22
- field = GraphQL::Field.define do
23
- type("FieldSpecReturnType")
24
- end
25
-
26
- assert_equal(FieldSpecReturnType, field.type)
27
- end
28
-
29
- it "accepts arguments definition" do
30
- number = GraphQL::Argument.define(name: :number, type: -> { GraphQL::INT_TYPE })
31
- field = GraphQL::Field.define(type: FieldSpecReturnType, arguments: [number])
32
- assert_equal([number], field.arguments)
33
- end
34
-
35
- describe ".property " do
36
- let(:field) do
37
- GraphQL::Field.define do
38
- name "field_name"
39
- # satisfies 'can define by config' below
40
- property :internal_prop
41
- end
42
- end
43
-
44
- it "can define by config" do
45
- assert_equal(field.property, :internal_prop)
46
- end
47
-
48
- it "has nil property if not defined" do
49
- no_prop_field = GraphQL::Field.define { }
50
- assert_equal(no_prop_field.property, nil)
51
- end
52
-
53
- describe "default resolver" do
54
- def acts_like_default_resolver(field, old_prop, new_prop)
55
- object = OpenStruct.new(old_prop => "old value", new_prop => "new value", field.name.to_sym => "unset value")
56
-
57
-
58
- old_result = field.resolve(object, nil, nil)
59
- field.property = new_prop
60
- new_result = field.resolve(object, nil, nil)
61
- field.property = nil
62
- unset_result = field.resolve(object, nil, nil)
63
-
64
- assert_equal(old_result, "old value")
65
- assert_equal(new_result, "new value")
66
- assert_equal(unset_result, "unset value")
67
- end
68
-
69
- it "responds to changes in property" do
70
- acts_like_default_resolver(field, :internal_prop, :new_prop)
71
- end
72
-
73
- it "is reassigned if resolve is set to nil" do
74
- field.resolve = nil
75
- acts_like_default_resolver(field, :internal_prop, :new_prop)
76
- end
77
- end
78
- end
79
-
80
- describe "#name" do
81
- it "must be a string" do
82
- dummy_query = GraphQL::ObjectType.define do
83
- name "QueryType"
84
- end
85
-
86
- invalid_field = GraphQL::Field.new
87
- invalid_field.type = dummy_query
88
- invalid_field.name = :symbol_name
89
-
90
- dummy_query.fields["symbol_name"] = invalid_field
91
-
92
- err = assert_raises(GraphQL::Schema::InvalidTypeError) {
93
- GraphQL::Schema.define(query: dummy_query, raise_definition_error: true)
94
- }
95
- assert_equal "QueryType is invalid: field :symbol_name name must return String, not Symbol (:symbol_name)", err.message
96
- end
97
- end
98
-
99
- describe "#hash_key" do
100
- let(:source_field) { FieldSpecReturnType.get_field("source") }
101
- after { source_field.hash_key = :source }
102
-
103
- it "looks up a value with obj[hash_key]" do
104
- resolved_source = source_field.resolve({source: "Abc", "source" => "Xyz"}, nil, nil)
105
- assert_equal :source, source_field.hash_key
106
- assert_equal "Abc", resolved_source
107
- end
108
-
109
- it "can be reassigned" do
110
- source_field.hash_key = "source"
111
- resolved_source = source_field.resolve({source: "Abc", "source" => "Xyz"}, nil, nil)
112
- assert_equal "source", source_field.hash_key
113
- assert_equal "Xyz", resolved_source
114
- end
115
- end
116
-
117
- describe "#metadata" do
118
- it "accepts user-defined metadata" do
119
- similar_cheese_field = Dummy::Cheese.graphql_definition.get_field("similarCheese")
120
- assert_equal [:cheeses, :milks], similar_cheese_field.metadata[:joins]
121
- end
122
- end
123
-
124
- describe "reusing a GraphQL::Field" do
125
- let(:schema) {
126
- int_field = GraphQL::Field.define do
127
- type types.Int
128
- argument :value, types.Int
129
- resolve ->(obj, args, ctx) { args[:value] }
130
- end
131
-
132
- query_type = GraphQL::ObjectType.define do
133
- name "Query"
134
- field :int, int_field
135
- field :int2, int_field
136
- field :int3, field: int_field
137
- end
138
-
139
- GraphQL::Schema.define do
140
- query(query_type)
141
- end
142
- }
143
-
144
- it "can be used in two places" do
145
- res = schema.execute %|{ int(value: 1) int2(value: 2) int3(value: 3) }|
146
- assert_equal({ "int" => 1, "int2" => 2, "int3" => 3}, res["data"], "It works in queries")
147
-
148
- res = schema.execute %|{ __type(name: "Query") { fields { name } } }|
149
- query_field_names = res["data"]["__type"]["fields"].map { |f| f["name"] }
150
- assert_equal ["int", "int2", "int3"], query_field_names, "It works in introspection"
151
- end
152
- end
153
-
154
- describe "#redefine" do
155
- it "can add arguments" do
156
- int_field = GraphQL::Field.define do
157
- argument :value, types.Int
158
- end
159
-
160
- int_field_2 = int_field.redefine do
161
- argument :value_2, types.Int
162
- end
163
-
164
- assert_equal 1, int_field.arguments.size
165
- assert_equal 2, int_field_2.arguments.size
166
- end
167
-
168
- it "rebuilds when the resolve_proc is default NameResolve" do
169
- int_field = GraphQL::Field.define do
170
- name "a"
171
- end
172
-
173
- int_field_2 = int_field.redefine(name: "b")
174
-
175
- object = Struct.new(:a, :b).new(1, 2)
176
-
177
- assert_equal 1, int_field.resolve_proc.call(object, nil, nil)
178
- assert_equal 2, int_field_2.resolve_proc.call(object, nil, nil)
179
- end
180
-
181
- it "keeps the same resolve_proc when it is not a NameResolve" do
182
- int_field = GraphQL::Field.define do
183
- name "a"
184
- resolve ->(obj, _, _) { 'GraphQL is Kool' }
185
- end
186
-
187
- int_field_2 = int_field.redefine(name: "b")
188
-
189
- assert_equal(
190
- int_field.resolve_proc.call(nil, nil, nil),
191
- int_field_2.resolve_proc.call(nil, nil, nil)
192
- )
193
- end
194
-
195
- it "keeps the same resolve_proc when it is a built in property resolve" do
196
- int_field = GraphQL::Field.define do
197
- name "a"
198
- property :c
199
- end
200
-
201
- int_field_2 = int_field.redefine(name: "b")
202
-
203
- object = Struct.new(:a, :b, :c).new(1, 2, 3)
204
-
205
- assert_equal 3, int_field.resolve_proc.call(object, nil, nil)
206
- assert_equal 3, int_field_2.resolve_proc.call(object, nil, nil)
207
- end
208
-
209
- it "copies metadata, even out-of-bounds assignments" do
210
- int_field = GraphQL::Field.define do
211
- metadata(:a, 1)
212
- argument :value, types.Int
213
- end
214
- int_field.metadata[:b] = 2
215
-
216
- int_field_2 = int_field.redefine do
217
- metadata(:c, 3)
218
- argument :value_2, types.Int
219
- end
220
-
221
- assert_equal({a: 1, b: 2}, int_field.metadata)
222
- assert_equal({a: 1, b: 2, c: 3}, int_field_2.metadata)
223
- end
224
- end
225
-
226
- describe "#resolve_proc" do
227
- it "ensures the definition was called" do
228
- class SimpleResolver
229
- def self.call(*args)
230
- :whatever
231
- end
232
- end
233
-
234
- field_with_proc = GraphQL::Field.define do
235
- resolve ->(o, a, c) { :whatever }
236
- end
237
-
238
- field_with_class = GraphQL::Field.define do
239
- resolve SimpleResolver
240
- end
241
-
242
- assert_respond_to field_with_proc.resolve_proc, :call
243
- assert_respond_to field_with_class.resolve_proc, :call
244
- end
245
- end
246
- end
@@ -1,16 +0,0 @@
1
- # frozen_string_literal: true
2
- require "spec_helper"
3
-
4
- describe GraphQL::FLOAT_TYPE do
5
- describe "coerce_input" do
6
- it "accepts ints and floats" do
7
- assert_equal 1.0, GraphQL::FLOAT_TYPE.coerce_isolated_input(1)
8
- assert_equal 6.1, GraphQL::FLOAT_TYPE.coerce_isolated_input(6.1)
9
- end
10
-
11
- it "rejects other types" do
12
- assert_nil GraphQL::FLOAT_TYPE.coerce_isolated_input("55")
13
- assert_nil GraphQL::FLOAT_TYPE.coerce_isolated_input(true)
14
- end
15
- end
16
- end
@@ -1,152 +0,0 @@
1
- # frozen_string_literal: true
2
- require "spec_helper"
3
-
4
- describe GraphQL::Function do
5
- TestFuncPayload = GraphQL::ObjectType.define do
6
- name "TestFuncPayload"
7
- field :name, types.String, hash_key: :name
8
- end
9
-
10
- class TestFunc < GraphQL::Function
11
- argument :name, GraphQL::STRING_TYPE
12
- argument :age, types.Int
13
- type TestFuncPayload
14
-
15
- description "Returns the string you give it"
16
- deprecation_reason "It's useless"
17
- complexity 9
18
- def call(o, a, c)
19
- { name: a[:name] }
20
- end
21
- end
22
-
23
- class TestFuncConn < GraphQL::Function
24
- argument :name, GraphQL::STRING_TYPE
25
- argument :age, types.Int
26
- type TestFuncPayload.connection_type
27
-
28
- description "Returns the string you give it"
29
- deprecation_reason "It's useless"
30
- complexity 9
31
- def call(o, a, c)
32
- [{ name: a[:name] }]
33
- end
34
- end
35
-
36
- describe "function API" do
37
- it "exposes required info" do
38
- f = TestFunc.new
39
- assert_equal ["name", "age"], f.arguments.keys
40
- assert_equal "TestFuncPayload", f.type.name
41
- assert_equal "Returns the string you give it", f.description
42
- assert_equal "It's useless", f.deprecation_reason
43
- assert_equal({name: "stuff"}, f.call(nil, { name: "stuff" }, nil))
44
- assert_equal 9, f.complexity
45
-
46
- assert_equal TestFunc.new.type, TestFunc.new.type
47
- end
48
- end
49
-
50
- it "has default values" do
51
- default_func = GraphQL::Function.new
52
- assert_equal 1, default_func.complexity
53
- assert_equal({}, default_func.arguments)
54
- assert_equal(nil, default_func.type)
55
- assert_equal(nil, default_func.description)
56
- assert_equal(nil, default_func.deprecation_reason)
57
- assert_raises(NotImplementedError) {
58
- default_func.call(nil, nil, nil)
59
- }
60
- end
61
-
62
- describe "use in a schema" do
63
- let(:schema) {
64
- query_type = GraphQL::ObjectType.define do
65
- name "Query"
66
- field :test, function: TestFunc.new
67
- connection :testConn, function: TestFuncConn.new
68
- end
69
-
70
- relay_mutation = GraphQL::Relay::Mutation.define do
71
- name "Test"
72
- function TestFunc.new
73
- end
74
-
75
- mutation_type = GraphQL::ObjectType.define do
76
- name "Mutation"
77
- field :test, field: relay_mutation.field
78
- end
79
-
80
- GraphQL::Schema.define do
81
- query(query_type)
82
- mutation(mutation_type)
83
- end
84
- }
85
-
86
- it "gets attributes from the function" do
87
- field = schema.query.fields["test"]
88
- assert_equal ["name", "age"], field.arguments.keys
89
- assert_equal "TestFuncPayload", field.type.name
90
- assert_equal "Returns the string you give it", field.description
91
- assert_equal "It's useless", field.deprecation_reason
92
- assert_equal({name: "stuff"}, field.resolve(nil, { name: "stuff" }, nil))
93
- assert_equal 9, field.complexity
94
- end
95
-
96
- it "can be used as a field" do
97
- query_str = <<-GRAPHQL
98
- { test(name: "graphql") { name }}
99
- GRAPHQL
100
- res = schema.execute(query_str)
101
- assert_equal "graphql", res["data"]["test"]["name"]
102
- end
103
-
104
- it "can be used as a connection" do
105
- query_str = <<-GRAPHQL
106
- { testConn(name: "graphql") { edges { node { name } } } }
107
- GRAPHQL
108
- res = schema.execute(query_str)
109
- assert_equal "graphql", res["data"]["testConn"]["edges"][0]["node"]["name"]
110
- end
111
-
112
- it "can be used as a mutation" do
113
- query_str = <<-GRAPHQL
114
- mutation { test(input: {clientMutationId: "123", name: "graphql"}) { name, clientMutationId } }
115
- GRAPHQL
116
- res = schema.execute(query_str)
117
- assert_equal "graphql", res["data"]["test"]["name"]
118
- end
119
- end
120
-
121
- describe "when overriding" do
122
- let(:schema) {
123
- query_type = GraphQL::ObjectType.define do
124
- name "Query"
125
- field :blockOverride, function: TestFunc.new do
126
- description "I have altered the description"
127
- argument :anArg, types.Int
128
- argument :oneMoreArg, types.String
129
- end
130
-
131
- field :argOverride, types.String, "New Description", function: TestFunc.new
132
- end
133
-
134
- GraphQL::Schema.define do
135
- query(query_type)
136
- end
137
- }
138
-
139
- it "can override description" do
140
- field = schema.query.fields["blockOverride"]
141
- assert_equal "I have altered the description", field.description
142
- assert_equal ["name", "age", "anArg", "oneMoreArg"], field.arguments.keys
143
- end
144
-
145
- it "can add to arguments" do
146
- field = schema.query.fields["argOverride"]
147
- assert_equal "New Description", field.description
148
- assert_equal GraphQL::STRING_TYPE, field.type
149
- assert_equal ["name", "age"], field.arguments.keys
150
- end
151
- end
152
- end
@@ -1,33 +0,0 @@
1
- # frozen_string_literal: true
2
- require "spec_helper"
3
-
4
- describe GraphQL::ID_TYPE do
5
- let(:result) { Dummy::Schema.execute(query_string)}
6
-
7
- describe "coercion for int inputs" do
8
- let(:query_string) { %|query getMilk { cow: milk(id: 1) { id } }| }
9
-
10
- it "coerces IDs from ints and serializes as strings" do
11
- expected = {"data" => {"cow" => {"id" => "1"}}}
12
- assert_equal(expected, result)
13
- end
14
- end
15
-
16
- describe "coercion for string inputs" do
17
- let(:query_string) { %|query getMilk { cow: milk(id: "1") { id } }| }
18
-
19
- it "coerces IDs from strings and serializes as strings" do
20
- expected = {"data" => {"cow" => {"id" => "1"}}}
21
- assert_equal(expected, result)
22
- end
23
- end
24
-
25
- describe "coercion for other types" do
26
- let(:query_string) { %|query getMilk { cow: milk(id: 1.0) { id } }| }
27
-
28
- it "doesn't allow other types" do
29
- assert_nil result["data"]
30
- assert_equal 1, result["errors"].length
31
- end
32
- end
33
- end
@@ -1,25 +0,0 @@
1
- # frozen_string_literal: true
2
- require 'spec_helper'
3
-
4
- describe GraphQL::InputObjectType do
5
- describe 'default values' do
6
- describe 'when the type is an enum with underlying ruby values' do
7
- it 'provides the default value' do
8
- TestEnum = GraphQL::EnumType.define do
9
- name 'Test'
10
-
11
- value 'A', 'Represents an authorized agent in our system.', value: 'a'
12
- value 'B', 'Agent is disabled, web app access is denied.', value: 'b'
13
- end
14
-
15
- class TestInput < GraphQL::Schema::InputObject
16
- argument :foo, TestEnum, 'TestEnum', required: false, default_value: 'a'
17
- end
18
-
19
- test_input_type = TestInput.to_graphql
20
- default_test_input_value = test_input_type.coerce_isolated_input({})
21
- assert_equal default_test_input_value[:foo], 'a'
22
- end
23
- end
24
- end
25
- end
@@ -1,35 +0,0 @@
1
- # frozen_string_literal: true
2
- require "spec_helper"
3
-
4
- describe GraphQL::INT_TYPE do
5
- describe "coerce_input" do
6
- it "accepts ints and floats" do
7
- assert_equal 1, GraphQL::INT_TYPE.coerce_isolated_input(1)
8
- assert_equal 6, GraphQL::INT_TYPE.coerce_isolated_input(6.1)
9
- end
10
-
11
- it "rejects other types" do
12
- assert_nil GraphQL::INT_TYPE.coerce_isolated_input("55")
13
- assert_nil GraphQL::INT_TYPE.coerce_isolated_input(true)
14
- end
15
-
16
- describe "handling boundaries" do
17
- let(:context) { GraphQL::Query.new(Dummy::Schema, "{ __typename }").context }
18
-
19
- it "accepts result values in bounds" do
20
- assert_equal 0, GraphQL::INT_TYPE.coerce_result(0, context)
21
- assert_equal (2**31) - 1, GraphQL::INT_TYPE.coerce_result((2**31) - 1, context)
22
- assert_equal -(2**31), GraphQL::INT_TYPE.coerce_result(-(2**31), context)
23
- end
24
-
25
- it "replaces values, if configured to do so" do
26
- assert_equal Dummy::Schema::MAGIC_INT_COERCE_VALUE, GraphQL::INT_TYPE.coerce_result(99**99, context)
27
- end
28
-
29
- it "raises on values out of bounds" do
30
- assert_raises(GraphQL::IntegerEncodingError) { GraphQL::INT_TYPE.coerce_result(2**31, context) }
31
- assert_raises(GraphQL::IntegerEncodingError) { GraphQL::INT_TYPE.coerce_result(-(2**31 + 1), context) }
32
- end
33
- end
34
- end
35
- end
@@ -1,196 +0,0 @@
1
- # frozen_string_literal: true
2
- require "spec_helper"
3
-
4
- describe GraphQL::InterfaceType do
5
- let(:interface) { Dummy::Edible.graphql_definition }
6
- let(:dummy_query_context) { OpenStruct.new(schema: Dummy::Schema) }
7
-
8
- it "has possible types" do
9
- assert_equal([Dummy::Cheese.graphql_definition, Dummy::Honey.graphql_definition, Dummy::Milk.graphql_definition], Dummy::Schema.possible_types(interface))
10
- end
11
-
12
- describe "query evaluation" do
13
- let(:result) { Dummy::Schema.execute(query_string, variables: {"cheeseId" => 2})}
14
- let(:query_string) {%|
15
- query fav {
16
- favoriteEdible { fatContent }
17
- }
18
- |}
19
- it "gets fields from the type for the given object" do
20
- expected = {"data"=>{"favoriteEdible"=>{"fatContent"=>0.04}}}
21
- assert_equal(expected, result)
22
- end
23
- end
24
-
25
- describe "mergable query evaluation" do
26
- let(:result) { Dummy::Schema.execute(query_string, variables: {"cheeseId" => 2})}
27
- let(:query_string) {%|
28
- query fav {
29
- favoriteEdible { fatContent }
30
- favoriteEdible { origin }
31
- }
32
- |}
33
- it "gets fields from the type for the given object" do
34
- expected = {"data"=>{"favoriteEdible"=>{"fatContent"=>0.04, "origin"=>"Antiquity"}}}
35
- assert_equal(expected, result)
36
- end
37
- end
38
-
39
- describe "fragments" do
40
- let(:query_string) {%|
41
- {
42
- favoriteEdible {
43
- fatContent
44
- ... on LocalProduct {
45
- origin
46
- }
47
- }
48
- }
49
- |}
50
- let(:result) { Dummy::Schema.execute(query_string) }
51
-
52
- it "can apply interface fragments to an interface" do
53
- expected_result = { "data" => {
54
- "favoriteEdible" => {
55
- "fatContent" => 0.04,
56
- "origin" => "Antiquity",
57
- }
58
- } }
59
-
60
- assert_equal(expected_result, result)
61
- end
62
-
63
- describe "filtering members by type" do
64
- let(:query_string) {%|
65
- {
66
- allEdible {
67
- __typename
68
- ... on LocalProduct {
69
- origin
70
- }
71
- }
72
- }
73
- |}
74
-
75
- it "only applies fields to the right object" do
76
- expected_data = [
77
- {"__typename"=>"Cheese", "origin"=>"France"},
78
- {"__typename"=>"Cheese", "origin"=>"Netherlands"},
79
- {"__typename"=>"Cheese", "origin"=>"Spain"},
80
- {"__typename"=>"Milk", "origin"=>"Antiquity"},
81
- ]
82
-
83
- assert_equal expected_data, result["data"]["allEdible"]
84
- end
85
- end
86
- end
87
-
88
- describe "#dup" do
89
- it "copies the fields without altering the original" do
90
- interface_2 = interface.dup
91
- interface_2.fields["extra"] = GraphQL::Field.define(name: "extra", type: GraphQL::BOOLEAN_TYPE)
92
- assert_equal 3, interface.fields.size
93
- assert_equal 4, interface_2.fields.size
94
- end
95
-
96
- it "copies orphan types without affecting the original" do
97
- interface = GraphQL::InterfaceType.define do
98
- name "AInterface"
99
- orphan_types [Dummy::Honey]
100
- end
101
-
102
- interface_2 = interface.dup
103
- interface_2.orphan_types << Dummy::Cheese
104
- assert_equal 1, interface.orphan_types.size
105
- assert_equal 2, interface_2.orphan_types.size
106
- end
107
- end
108
-
109
- describe "#resolve_type" do
110
- let(:result) { Dummy::Schema.execute(query_string) }
111
- let(:query_string) {%|
112
- {
113
- allEdible {
114
- __typename
115
- ... on Milk {
116
- milkFatContent: fatContent
117
- }
118
- ... on Cheese {
119
- cheeseFatContent: fatContent
120
- }
121
- }
122
-
123
- allEdibleAsMilk {
124
- __typename
125
- ... on Milk {
126
- fatContent
127
- }
128
- }
129
- }
130
- |}
131
-
132
- it 'returns correct types for general schema and specific interface' do
133
- expected_result = {
134
- # Uses schema-level resolve_type
135
- "allEdible"=>[
136
- {"__typename"=>"Cheese", "cheeseFatContent"=>0.19},
137
- {"__typename"=>"Cheese", "cheeseFatContent"=>0.3},
138
- {"__typename"=>"Cheese", "cheeseFatContent"=>0.065},
139
- {"__typename"=>"Milk", "milkFatContent"=>0.04}
140
- ],
141
- # Uses type-level resolve_type
142
- "allEdibleAsMilk"=>[
143
- {"__typename"=>"Milk", "fatContent"=>0.19},
144
- {"__typename"=>"Milk", "fatContent"=>0.3},
145
- {"__typename"=>"Milk", "fatContent"=>0.065},
146
- {"__typename"=>"Milk", "fatContent"=>0.04}
147
- ]
148
- }
149
- assert_equal expected_result, result["data"]
150
- end
151
- end
152
-
153
- describe "#get_possible_type" do
154
- let(:query_string) {%|
155
- query fav {
156
- favoriteEdible { fatContent }
157
- }
158
- |}
159
-
160
- let(:query) { GraphQL::Query.new(Dummy::Schema, query_string) }
161
-
162
- it "returns the type definition if the type exists and is a possible type of the interface" do
163
- assert interface.get_possible_type("Cheese", query.context)
164
- end
165
-
166
- it "returns nil if the type is not found in the schema" do
167
- assert_nil interface.get_possible_type("Foo", query.context)
168
- end
169
-
170
- it "returns nil if the type is not a possible type of the interface" do
171
- assert_nil interface.get_possible_type("Beverage", query.context)
172
- end
173
- end
174
-
175
- describe "#possible_type?" do
176
- let(:query_string) {%|
177
- query fav {
178
- favoriteEdible { fatContent }
179
- }
180
- |}
181
-
182
- let(:query) { GraphQL::Query.new(Dummy::Schema, query_string) }
183
-
184
- it "returns true if the type exists and is a possible type of the interface" do
185
- assert interface.possible_type?("Cheese", query.context)
186
- end
187
-
188
- it "returns false if the type is not found in the schema" do
189
- refute interface.possible_type?("Foo", query.context)
190
- end
191
-
192
- it "returns false if the type is not a possible type of the interface" do
193
- refute interface.possible_type?("Beverage", query.context)
194
- end
195
- end
196
- end