graphql 1.8.7 → 1.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (368) hide show
  1. checksums.yaml +4 -4
  2. data/lib/generators/graphql/install_generator.rb +2 -1
  3. data/lib/generators/graphql/scalar_generator.rb +20 -0
  4. data/lib/generators/graphql/templates/base_scalar.erb +4 -0
  5. data/lib/generators/graphql/templates/scalar.erb +13 -0
  6. data/lib/graphql/analysis/ast/analyzer.rb +62 -0
  7. data/lib/graphql/analysis/ast/field_usage.rb +28 -0
  8. data/lib/graphql/analysis/ast/max_query_complexity.rb +23 -0
  9. data/lib/graphql/analysis/ast/max_query_depth.rb +18 -0
  10. data/lib/graphql/analysis/ast/query_complexity.rb +114 -0
  11. data/lib/graphql/analysis/ast/query_depth.rb +66 -0
  12. data/lib/graphql/analysis/ast/visitor.rb +255 -0
  13. data/lib/graphql/analysis/ast.rb +82 -0
  14. data/lib/graphql/analysis.rb +1 -0
  15. data/lib/graphql/argument.rb +5 -0
  16. data/lib/graphql/authorization.rb +1 -0
  17. data/lib/graphql/backwards_compatibility.rb +1 -1
  18. data/lib/graphql/base_type.rb +1 -1
  19. data/lib/graphql/compatibility/execution_specification/specification_schema.rb +1 -2
  20. data/lib/graphql/compatibility/schema_parser_specification.rb +2 -6
  21. data/lib/graphql/dig.rb +19 -0
  22. data/lib/graphql/directive/include_directive.rb +1 -7
  23. data/lib/graphql/directive/skip_directive.rb +1 -8
  24. data/lib/graphql/directive.rb +13 -1
  25. data/lib/graphql/enum_type.rb +8 -0
  26. data/lib/graphql/execution/execute.rb +36 -17
  27. data/lib/graphql/execution/instrumentation.rb +2 -0
  28. data/lib/graphql/execution/interpreter/execution_errors.rb +29 -0
  29. data/lib/graphql/execution/interpreter/hash_response.rb +46 -0
  30. data/lib/graphql/execution/interpreter/resolve.rb +58 -0
  31. data/lib/graphql/execution/interpreter/runtime.rb +597 -0
  32. data/lib/graphql/execution/interpreter.rb +99 -0
  33. data/lib/graphql/execution/lazy.rb +8 -1
  34. data/lib/graphql/execution/lookahead.rb +351 -0
  35. data/lib/graphql/execution/multiplex.rb +37 -29
  36. data/lib/graphql/execution.rb +2 -0
  37. data/lib/graphql/execution_error.rb +1 -1
  38. data/lib/graphql/field.rb +1 -7
  39. data/lib/graphql/integer_encoding_error.rb +12 -0
  40. data/lib/graphql/internal_representation/rewrite.rb +127 -142
  41. data/lib/graphql/introspection/dynamic_fields.rb +8 -2
  42. data/lib/graphql/introspection/entry_points.rb +11 -6
  43. data/lib/graphql/introspection/enum_value_type.rb +4 -0
  44. data/lib/graphql/introspection/schema_type.rb +7 -2
  45. data/lib/graphql/introspection/type_type.rb +9 -5
  46. data/lib/graphql/invalid_null_error.rb +1 -1
  47. data/lib/graphql/language/block_string.rb +37 -0
  48. data/lib/graphql/language/document_from_schema_definition.rb +10 -7
  49. data/lib/graphql/language/lexer.rb +55 -36
  50. data/lib/graphql/language/lexer.rl +8 -3
  51. data/lib/graphql/language/nodes.rb +440 -362
  52. data/lib/graphql/language/parser.rb +56 -56
  53. data/lib/graphql/language/parser.y +12 -12
  54. data/lib/graphql/language/printer.rb +2 -2
  55. data/lib/graphql/language/visitor.rb +158 -15
  56. data/lib/graphql/language.rb +0 -1
  57. data/lib/graphql/literal_validation_error.rb +6 -0
  58. data/lib/graphql/query/arguments.rb +3 -2
  59. data/lib/graphql/query/arguments_cache.rb +1 -1
  60. data/lib/graphql/query/context.rb +14 -5
  61. data/lib/graphql/query/executor.rb +1 -1
  62. data/lib/graphql/query/result.rb +1 -1
  63. data/lib/graphql/query/validation_pipeline.rb +35 -11
  64. data/lib/graphql/query/variable_validation_error.rb +10 -1
  65. data/lib/graphql/query.rb +16 -2
  66. data/lib/graphql/relay/base_connection.rb +2 -0
  67. data/lib/graphql/relay/connection_instrumentation.rb +3 -1
  68. data/lib/graphql/relay/connection_resolve.rb +1 -1
  69. data/lib/graphql/relay/node.rb +2 -28
  70. data/lib/graphql/relay/relation_connection.rb +1 -1
  71. data/lib/graphql/schema/argument.rb +13 -5
  72. data/lib/graphql/schema/base_64_encoder.rb +4 -4
  73. data/lib/graphql/schema/build_from_definition.rb +2 -4
  74. data/lib/graphql/schema/default_type_error.rb +1 -1
  75. data/lib/graphql/schema/directive/feature.rb +66 -0
  76. data/lib/graphql/schema/directive/include.rb +25 -0
  77. data/lib/graphql/schema/directive/skip.rb +25 -0
  78. data/lib/graphql/schema/directive/transform.rb +48 -0
  79. data/lib/graphql/schema/directive.rb +103 -0
  80. data/lib/graphql/schema/enum_value.rb +3 -2
  81. data/lib/graphql/schema/field/connection_extension.rb +50 -0
  82. data/lib/graphql/schema/field/scope_extension.rb +18 -0
  83. data/lib/graphql/schema/field.rb +273 -64
  84. data/lib/graphql/schema/field_extension.rb +69 -0
  85. data/lib/graphql/schema/input_object.rb +16 -8
  86. data/lib/graphql/schema/interface.rb +1 -0
  87. data/lib/graphql/schema/loader.rb +22 -16
  88. data/lib/graphql/schema/member/base_dsl_methods.rb +8 -2
  89. data/lib/graphql/schema/member/build_type.rb +33 -1
  90. data/lib/graphql/schema/member/has_arguments.rb +6 -2
  91. data/lib/graphql/schema/member/has_fields.rb +18 -70
  92. data/lib/graphql/schema/member/has_path.rb +25 -0
  93. data/lib/graphql/schema/member/instrumentation.rb +10 -7
  94. data/lib/graphql/schema/member.rb +2 -0
  95. data/lib/graphql/schema/mutation.rb +6 -48
  96. data/lib/graphql/schema/non_null.rb +5 -1
  97. data/lib/graphql/schema/object.rb +18 -4
  98. data/lib/graphql/schema/printer.rb +1 -1
  99. data/lib/graphql/schema/relay_classic_mutation.rb +42 -9
  100. data/lib/graphql/schema/resolver/has_payload_type.rb +65 -0
  101. data/lib/graphql/schema/resolver.rb +45 -20
  102. data/lib/graphql/schema/subscription.rb +97 -0
  103. data/lib/graphql/schema/traversal.rb +11 -7
  104. data/lib/graphql/schema.rb +186 -38
  105. data/lib/graphql/static_validation/all_rules.rb +3 -2
  106. data/lib/graphql/static_validation/base_visitor.rb +199 -0
  107. data/lib/graphql/static_validation/default_visitor.rb +15 -0
  108. data/lib/graphql/static_validation/definition_dependencies.rb +62 -68
  109. data/lib/graphql/static_validation/{message.rb → error.rb} +11 -11
  110. data/lib/graphql/static_validation/interpreter_visitor.rb +14 -0
  111. data/lib/graphql/static_validation/literal_validator.rb +54 -11
  112. data/lib/graphql/static_validation/no_validate_visitor.rb +10 -0
  113. data/lib/graphql/static_validation/rules/argument_literals_are_compatible.rb +87 -16
  114. data/lib/graphql/static_validation/rules/argument_literals_are_compatible_error.rb +31 -0
  115. data/lib/graphql/static_validation/rules/argument_names_are_unique.rb +11 -11
  116. data/lib/graphql/static_validation/rules/argument_names_are_unique_error.rb +30 -0
  117. data/lib/graphql/static_validation/rules/arguments_are_defined.rb +52 -8
  118. data/lib/graphql/static_validation/rules/arguments_are_defined_error.rb +35 -0
  119. data/lib/graphql/static_validation/rules/directives_are_defined.rb +12 -15
  120. data/lib/graphql/static_validation/rules/directives_are_defined_error.rb +29 -0
  121. data/lib/graphql/static_validation/rules/directives_are_in_valid_locations.rb +19 -14
  122. data/lib/graphql/static_validation/rules/directives_are_in_valid_locations_error.rb +31 -0
  123. data/lib/graphql/static_validation/rules/fields_are_defined_on_type.rb +17 -19
  124. data/lib/graphql/static_validation/rules/fields_are_defined_on_type_error.rb +32 -0
  125. data/lib/graphql/static_validation/rules/fields_have_appropriate_selections.rb +30 -14
  126. data/lib/graphql/static_validation/rules/fields_have_appropriate_selections_error.rb +31 -0
  127. data/lib/graphql/static_validation/rules/fields_will_merge.rb +356 -29
  128. data/lib/graphql/static_validation/rules/fields_will_merge_error.rb +32 -0
  129. data/lib/graphql/static_validation/rules/fragment_names_are_unique.rb +20 -13
  130. data/lib/graphql/static_validation/rules/fragment_names_are_unique_error.rb +29 -0
  131. data/lib/graphql/static_validation/rules/fragment_spreads_are_possible.rb +37 -29
  132. data/lib/graphql/static_validation/rules/fragment_spreads_are_possible_error.rb +35 -0
  133. data/lib/graphql/static_validation/rules/fragment_types_exist.rb +25 -17
  134. data/lib/graphql/static_validation/rules/fragment_types_exist_error.rb +29 -0
  135. data/lib/graphql/static_validation/rules/fragments_are_finite.rb +12 -10
  136. data/lib/graphql/static_validation/rules/fragments_are_finite_error.rb +29 -0
  137. data/lib/graphql/static_validation/rules/fragments_are_named.rb +7 -11
  138. data/lib/graphql/static_validation/rules/fragments_are_named_error.rb +26 -0
  139. data/lib/graphql/static_validation/rules/fragments_are_on_composite_types.rb +16 -16
  140. data/lib/graphql/static_validation/rules/fragments_are_on_composite_types_error.rb +30 -0
  141. data/lib/graphql/static_validation/rules/fragments_are_used.rb +21 -14
  142. data/lib/graphql/static_validation/rules/fragments_are_used_error.rb +29 -0
  143. data/lib/graphql/static_validation/rules/mutation_root_exists.rb +10 -14
  144. data/lib/graphql/static_validation/rules/mutation_root_exists_error.rb +26 -0
  145. data/lib/graphql/static_validation/rules/no_definitions_are_present.rb +30 -30
  146. data/lib/graphql/static_validation/rules/no_definitions_are_present_error.rb +25 -0
  147. data/lib/graphql/static_validation/rules/operation_names_are_valid.rb +25 -17
  148. data/lib/graphql/static_validation/rules/operation_names_are_valid_error.rb +28 -0
  149. data/lib/graphql/static_validation/rules/required_arguments_are_present.rb +17 -18
  150. data/lib/graphql/static_validation/rules/required_arguments_are_present_error.rb +35 -0
  151. data/lib/graphql/static_validation/rules/required_input_object_attributes_are_present.rb +47 -0
  152. data/lib/graphql/static_validation/rules/required_input_object_attributes_are_present_error.rb +35 -0
  153. data/lib/graphql/static_validation/rules/subscription_root_exists.rb +10 -14
  154. data/lib/graphql/static_validation/rules/subscription_root_exists_error.rb +26 -0
  155. data/lib/graphql/static_validation/rules/unique_directives_per_location.rb +28 -17
  156. data/lib/graphql/static_validation/rules/unique_directives_per_location_error.rb +29 -0
  157. data/lib/graphql/static_validation/rules/variable_default_values_are_correctly_typed.rb +35 -27
  158. data/lib/graphql/static_validation/rules/variable_default_values_are_correctly_typed_error.rb +39 -0
  159. data/lib/graphql/static_validation/rules/variable_names_are_unique.rb +15 -14
  160. data/lib/graphql/static_validation/rules/variable_names_are_unique_error.rb +29 -0
  161. data/lib/graphql/static_validation/rules/variable_usages_are_allowed.rb +41 -30
  162. data/lib/graphql/static_validation/rules/variable_usages_are_allowed_error.rb +38 -0
  163. data/lib/graphql/static_validation/rules/variables_are_input_types.rb +18 -14
  164. data/lib/graphql/static_validation/rules/variables_are_input_types_error.rb +32 -0
  165. data/lib/graphql/static_validation/rules/variables_are_used_and_defined.rb +73 -65
  166. data/lib/graphql/static_validation/rules/variables_are_used_and_defined_error.rb +37 -0
  167. data/lib/graphql/static_validation/validation_context.rb +8 -51
  168. data/lib/graphql/static_validation/validator.rb +23 -15
  169. data/lib/graphql/static_validation.rb +5 -3
  170. data/lib/graphql/subscriptions/action_cable_subscriptions.rb +21 -2
  171. data/lib/graphql/subscriptions/event.rb +28 -5
  172. data/lib/graphql/subscriptions/subscription_root.rb +66 -0
  173. data/lib/graphql/subscriptions.rb +16 -2
  174. data/lib/graphql/tracing/active_support_notifications_tracing.rb +0 -1
  175. data/lib/graphql/tracing/appsignal_tracing.rb +1 -1
  176. data/lib/graphql/tracing/data_dog_tracing.rb +1 -1
  177. data/lib/graphql/tracing/new_relic_tracing.rb +3 -3
  178. data/lib/graphql/tracing/platform_tracing.rb +17 -1
  179. data/lib/graphql/tracing/prometheus_tracing.rb +1 -1
  180. data/lib/graphql/tracing/scout_tracing.rb +1 -1
  181. data/lib/graphql/tracing/skylight_tracing.rb +3 -3
  182. data/lib/graphql/tracing.rb +8 -8
  183. data/lib/graphql/types/float.rb +1 -1
  184. data/lib/graphql/types/int.rb +11 -2
  185. data/lib/graphql/types/iso_8601_date_time.rb +15 -1
  186. data/lib/graphql/types/relay/base_connection.rb +15 -1
  187. data/lib/graphql/types/relay/node.rb +0 -1
  188. data/lib/graphql/types/relay/node_field.rb +43 -0
  189. data/lib/graphql/types/relay/nodes_field.rb +45 -0
  190. data/lib/graphql/types/relay.rb +2 -0
  191. data/lib/graphql/unauthorized_error.rb +4 -0
  192. data/lib/graphql/unauthorized_field_error.rb +23 -0
  193. data/lib/graphql/upgrader/member.rb +5 -0
  194. data/lib/graphql/version.rb +1 -1
  195. data/lib/graphql.rb +6 -1
  196. data/readme.md +7 -7
  197. data/spec/dummy/Gemfile +1 -1
  198. data/spec/dummy/Gemfile.lock +157 -0
  199. data/spec/dummy/app/channels/graphql_channel.rb +22 -11
  200. data/spec/dummy/config/locales/en.yml +1 -1
  201. data/spec/dummy/log/test.log +199 -0
  202. data/spec/dummy/test/test_helper.rb +1 -0
  203. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/4w/4wzXRZrAkwKdgYaSE0pid5eB-fer8vSfSku_NPg4rMA.cache +0 -0
  204. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/7I/7IHVBiJT06QSpgLpLoJIxboQ0B-D_tMTxsvoezBTV3Q.cache +1 -0
  205. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/8w/8wY_SKagj8wHuwGNAAf6JnQ8joMbC6cEYpHrTAI8Urc.cache +1 -0
  206. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/AK/AKzz1u6bGb4auXcrObA_g5LL-oV0ejNGa448AgAi_WQ.cache +1 -0
  207. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/ET/ETW4uxvaYpruL8y6_ZptUH82ZowMaHIqvg5WexBFdEM.cache +3 -0
  208. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/F1/F1TWpjjyA56k9Z90n5B3xRn7DUdGjX73QCkYC6k07JQ.cache +0 -0
  209. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/F8/F8MUNRzORGFgr329fNM0xLaoWCXdv3BIalT7dsvLfjs.cache +2 -0
  210. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/KB/KB07ZaKNC5uXJ7TjLi-WqnY6g7dq8wWp_8N3HNjBNxg.cache +2 -0
  211. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Ms/MsKSimH_UCB-H1tLvDABDHuvGciuoW6kVqQWDrXU5FQ.cache +0 -0
  212. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Mt/Mtci-Kim50aPOmeClD4AIicKn1d1WJ0n454IjSd94sk.cache +0 -0
  213. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/QH/QHt3Tc1Y6M66Oo_pDuMyWrQNs4Pp3SMeZR5K1wJj2Ts.cache +1 -0
  214. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/XU/XU4k1OXnfMils5SrirorPvDSyDSqiOWLZNtmAH1HH8k.cache +0 -0
  215. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/ZI/ZIof7mZxWWCnraIFOCuV6a8QRWzKJXJnx2Xd7C0ZyX0.cache +1 -0
  216. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/cG/cGc_puuPS5pZKgUcy1Y_i1L6jl5UtsiIrMH59rTzR6c.cache +3 -0
  217. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/df/dfro_B6bx3KP1Go-7jEOqqZ2j4hVRseXIc3es9PKQno.cache +1 -0
  218. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/jO/jO1DfbqnG0mTULsjJJANc3fefrG2zt7DIMmcptMT628.cache +1 -0
  219. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/pE/pE7gO6pQ-z187Swb4hT554wmqsq-cNzgPWLrCz-LQQQ.cache +0 -0
  220. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/r9/r9iU1l58a6rxkZSW5RSC52_tD-_UQuHxoMVnkfJ7Mhs.cache +1 -0
  221. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/xi/xitPPFfPIyDMpaznV0sBBcw8eSCV8PJcLLWin78sCgE.cache +0 -0
  222. data/spec/dummy/tmp/screenshots/failures_test_it_handles_subscriptions.png +0 -0
  223. data/spec/graphql/analysis/analyze_query_spec.rb +1 -1
  224. data/spec/graphql/analysis/ast/field_usage_spec.rb +51 -0
  225. data/spec/graphql/analysis/ast/max_query_complexity_spec.rb +120 -0
  226. data/spec/graphql/analysis/ast/max_query_depth_spec.rb +114 -0
  227. data/spec/graphql/analysis/ast/query_complexity_spec.rb +299 -0
  228. data/spec/graphql/analysis/ast/query_depth_spec.rb +108 -0
  229. data/spec/graphql/analysis/ast_spec.rb +269 -0
  230. data/spec/graphql/authorization_spec.rb +120 -23
  231. data/spec/graphql/base_type_spec.rb +6 -4
  232. data/spec/graphql/enum_type_spec.rb +6 -1
  233. data/spec/graphql/execution/execute_spec.rb +9 -9
  234. data/spec/graphql/execution/instrumentation_spec.rb +19 -0
  235. data/spec/graphql/execution/interpreter_spec.rb +485 -0
  236. data/spec/graphql/execution/lazy_spec.rb +67 -1
  237. data/spec/graphql/execution/lookahead_spec.rb +363 -0
  238. data/spec/graphql/execution/multiplex_spec.rb +31 -3
  239. data/spec/graphql/execution/typecast_spec.rb +20 -20
  240. data/spec/graphql/execution_error_spec.rb +110 -96
  241. data/spec/graphql/field_spec.rb +1 -1
  242. data/spec/graphql/input_object_type_spec.rb +13 -352
  243. data/spec/graphql/int_type_spec.rb +19 -0
  244. data/spec/graphql/interface_type_spec.rb +4 -4
  245. data/spec/graphql/internal_representation/rewrite_spec.rb +2 -0
  246. data/spec/graphql/introspection/input_value_type_spec.rb +1 -1
  247. data/spec/graphql/introspection/type_type_spec.rb +1 -2
  248. data/spec/graphql/language/document_from_schema_definition_spec.rb +2 -2
  249. data/spec/graphql/language/lexer_spec.rb +72 -3
  250. data/spec/graphql/language/nodes_spec.rb +20 -0
  251. data/spec/graphql/language/printer_spec.rb +18 -6
  252. data/spec/graphql/language/visitor_spec.rb +320 -14
  253. data/spec/graphql/non_null_type_spec.rb +1 -1
  254. data/spec/graphql/object_type_spec.rb +32 -27
  255. data/spec/graphql/query/arguments_spec.rb +21 -0
  256. data/spec/graphql/query/context_spec.rb +28 -0
  257. data/spec/graphql/query/executor_spec.rb +40 -36
  258. data/spec/graphql/query_spec.rb +12 -6
  259. data/spec/graphql/schema/argument_spec.rb +35 -1
  260. data/spec/graphql/schema/build_from_definition_spec.rb +144 -29
  261. data/spec/graphql/schema/catchall_middleware_spec.rb +16 -15
  262. data/spec/graphql/schema/directive/feature_spec.rb +81 -0
  263. data/spec/graphql/schema/directive/transform_spec.rb +39 -0
  264. data/spec/graphql/schema/enum_spec.rb +12 -3
  265. data/spec/graphql/schema/enum_value_spec.rb +11 -0
  266. data/spec/graphql/schema/field_extension_spec.rb +115 -0
  267. data/spec/graphql/schema/field_spec.rb +47 -7
  268. data/spec/graphql/schema/input_object_spec.rb +95 -0
  269. data/spec/graphql/schema/instrumentation_spec.rb +3 -0
  270. data/spec/graphql/schema/interface_spec.rb +8 -2
  271. data/spec/graphql/schema/introspection_system_spec.rb +9 -1
  272. data/spec/graphql/schema/loader_spec.rb +5 -0
  273. data/spec/graphql/schema/member/accepts_definition_spec.rb +4 -0
  274. data/spec/graphql/schema/member/build_type_spec.rb +46 -0
  275. data/spec/graphql/schema/member/scoped_spec.rb +19 -3
  276. data/spec/graphql/schema/mutation_spec.rb +5 -3
  277. data/spec/graphql/schema/object_spec.rb +9 -1
  278. data/spec/graphql/schema/printer_spec.rb +255 -93
  279. data/spec/graphql/schema/relay_classic_mutation_spec.rb +133 -0
  280. data/spec/graphql/schema/resolver_spec.rb +173 -9
  281. data/spec/graphql/schema/scalar_spec.rb +6 -0
  282. data/spec/graphql/schema/subscription_spec.rb +416 -0
  283. data/spec/graphql/schema/traversal_spec.rb +10 -10
  284. data/spec/graphql/schema/type_expression_spec.rb +2 -2
  285. data/spec/graphql/schema/union_spec.rb +7 -0
  286. data/spec/graphql/schema/validation_spec.rb +1 -1
  287. data/spec/graphql/schema/warden_spec.rb +145 -88
  288. data/spec/graphql/static_validation/rules/argument_literals_are_compatible_spec.rb +213 -73
  289. data/spec/graphql/static_validation/rules/argument_names_are_unique_spec.rb +2 -2
  290. data/spec/graphql/static_validation/rules/arguments_are_defined_spec.rb +72 -29
  291. data/spec/graphql/static_validation/rules/directives_are_defined_spec.rb +4 -2
  292. data/spec/graphql/static_validation/rules/directives_are_in_valid_locations_spec.rb +4 -2
  293. data/spec/graphql/static_validation/rules/fields_are_defined_on_type_spec.rb +10 -5
  294. data/spec/graphql/static_validation/rules/fields_have_appropriate_selections_spec.rb +10 -5
  295. data/spec/graphql/static_validation/rules/fields_will_merge_spec.rb +131 -5
  296. data/spec/graphql/static_validation/rules/fragment_names_are_unique_spec.rb +2 -1
  297. data/spec/graphql/static_validation/rules/fragment_spreads_are_possible_spec.rb +6 -3
  298. data/spec/graphql/static_validation/rules/fragment_types_exist_spec.rb +4 -2
  299. data/spec/graphql/static_validation/rules/fragments_are_finite_spec.rb +4 -2
  300. data/spec/graphql/static_validation/rules/fragments_are_named_spec.rb +2 -1
  301. data/spec/graphql/static_validation/rules/fragments_are_on_composite_types_spec.rb +6 -3
  302. data/spec/graphql/static_validation/rules/fragments_are_used_spec.rb +22 -2
  303. data/spec/graphql/static_validation/rules/mutation_root_exists_spec.rb +2 -1
  304. data/spec/graphql/static_validation/rules/operation_names_are_valid_spec.rb +6 -3
  305. data/spec/graphql/static_validation/rules/required_arguments_are_present_spec.rb +13 -4
  306. data/spec/graphql/static_validation/rules/required_input_object_attributes_are_present_spec.rb +58 -0
  307. data/spec/graphql/static_validation/rules/subscription_root_exists_spec.rb +2 -1
  308. data/spec/graphql/static_validation/rules/unique_directives_per_location_spec.rb +14 -7
  309. data/spec/graphql/static_validation/rules/variable_default_values_are_correctly_typed_spec.rb +14 -7
  310. data/spec/graphql/static_validation/rules/variable_usages_are_allowed_spec.rb +8 -4
  311. data/spec/graphql/static_validation/rules/variables_are_input_types_spec.rb +8 -4
  312. data/spec/graphql/static_validation/rules/variables_are_used_and_defined_spec.rb +23 -3
  313. data/spec/graphql/static_validation/type_stack_spec.rb +10 -19
  314. data/spec/graphql/static_validation/validator_spec.rb +50 -2
  315. data/spec/graphql/subscriptions_spec.rb +27 -16
  316. data/spec/graphql/tracing/new_relic_tracing_spec.rb +16 -0
  317. data/spec/graphql/tracing/platform_tracing_spec.rb +59 -37
  318. data/spec/graphql/tracing/prometheus_tracing_spec.rb +3 -0
  319. data/spec/graphql/tracing/skylight_tracing_spec.rb +16 -0
  320. data/spec/graphql/types/iso_8601_date_time_spec.rb +29 -2
  321. data/spec/graphql/union_type_spec.rb +2 -2
  322. data/spec/graphql/upgrader/member_spec.rb +67 -0
  323. data/spec/{graphql → integration/mongoid/graphql}/relay/mongo_relation_connection_spec.rb +11 -22
  324. data/spec/integration/mongoid/spec_helper.rb +2 -0
  325. data/spec/{support → integration/mongoid}/star_trek/data.rb +0 -0
  326. data/spec/{support → integration/mongoid}/star_trek/schema.rb +56 -34
  327. data/spec/{support/star_wars → integration/rails}/data.rb +1 -0
  328. data/spec/{support → integration/rails/generators}/base_generator_test.rb +0 -0
  329. data/spec/{generators → integration/rails/generators}/graphql/enum_generator_spec.rb +0 -0
  330. data/spec/{generators → integration/rails/generators}/graphql/install_generator_spec.rb +1 -1
  331. data/spec/{generators → integration/rails/generators}/graphql/interface_generator_spec.rb +0 -0
  332. data/spec/{generators → integration/rails/generators}/graphql/loader_generator_spec.rb +0 -0
  333. data/spec/{generators → integration/rails/generators}/graphql/mutation_generator_spec.rb +0 -0
  334. data/spec/{generators → integration/rails/generators}/graphql/object_generator_spec.rb +0 -0
  335. data/spec/integration/rails/generators/graphql/scalar_generator_spec.rb +28 -0
  336. data/spec/{generators → integration/rails/generators}/graphql/union_generator_spec.rb +0 -0
  337. data/spec/integration/rails/graphql/input_object_type_spec.rb +364 -0
  338. data/spec/{graphql → integration/rails/graphql}/query/variables_spec.rb +7 -7
  339. data/spec/{graphql → integration/rails/graphql}/relay/array_connection_spec.rb +9 -9
  340. data/spec/{graphql → integration/rails/graphql}/relay/base_connection_spec.rb +11 -3
  341. data/spec/{graphql → integration/rails/graphql}/relay/connection_instrumentation_spec.rb +19 -22
  342. data/spec/{graphql → integration/rails/graphql}/relay/connection_resolve_spec.rb +16 -0
  343. data/spec/{graphql → integration/rails/graphql}/relay/connection_type_spec.rb +0 -0
  344. data/spec/{graphql → integration/rails/graphql}/relay/edge_spec.rb +0 -0
  345. data/spec/{graphql → integration/rails/graphql}/relay/mutation_spec.rb +48 -0
  346. data/spec/{graphql → integration/rails/graphql}/relay/node_spec.rb +0 -0
  347. data/spec/{graphql → integration/rails/graphql}/relay/page_info_spec.rb +22 -22
  348. data/spec/{graphql → integration/rails/graphql}/relay/range_add_spec.rb +4 -4
  349. data/spec/{graphql → integration/rails/graphql}/relay/relation_connection_spec.rb +56 -27
  350. data/spec/{graphql → integration/rails/graphql}/schema_spec.rb +15 -11
  351. data/spec/{graphql → integration/rails/graphql}/tracing/active_support_notifications_tracing_spec.rb +16 -9
  352. data/spec/integration/rails/spec_helper.rb +25 -0
  353. data/spec/integration/tmp/app/graphql/types/family_type.rb +9 -0
  354. data/spec/spec_helper.rb +23 -39
  355. data/spec/support/dummy/data.rb +20 -17
  356. data/spec/support/dummy/schema.rb +315 -305
  357. data/spec/support/error_bubbling_helpers.rb +23 -0
  358. data/spec/support/jazz.rb +213 -46
  359. data/spec/support/lazy_helpers.rb +69 -27
  360. data/spec/support/new_relic.rb +3 -0
  361. data/spec/support/skylight.rb +3 -0
  362. data/spec/support/star_wars/schema.rb +131 -81
  363. data/spec/support/static_validation_helpers.rb +9 -5
  364. metadata +418 -261
  365. data/lib/graphql/language/comments.rb +0 -45
  366. data/lib/graphql/static_validation/arguments_validator.rb +0 -50
  367. data/spec/graphql/schema/member/has_fields_spec.rb +0 -129
  368. data/spec/rails_dependency_sanity_spec.rb +0 -14
@@ -0,0 +1,363 @@
1
+ # frozen_string_literal: true
2
+ require "spec_helper"
3
+
4
+ describe GraphQL::Execution::Lookahead do
5
+ module LookaheadTest
6
+ DATA = [
7
+ OpenStruct.new(name: "Cardinal", is_waterfowl: false, similar_species_names: ["Scarlet Tanager"], genus: OpenStruct.new(latin_name: "Piranga")),
8
+ OpenStruct.new(name: "Scarlet Tanager", is_waterfowl: false, similar_species_names: ["Cardinal"], genus: OpenStruct.new(latin_name: "Cardinalis")),
9
+ OpenStruct.new(name: "Great Egret", is_waterfowl: false, similar_species_names: ["Great Blue Heron"], genus: OpenStruct.new(latin_name: "Ardea")),
10
+ OpenStruct.new(name: "Great Blue Heron", is_waterfowl: true, similar_species_names: ["Great Egret"], genus: OpenStruct.new(latin_name: "Ardea")),
11
+ ]
12
+
13
+ def DATA.find_by_name(name)
14
+ DATA.find { |b| b.name == name }
15
+ end
16
+
17
+ module Node
18
+ include GraphQL::Schema::Interface
19
+ field :id, ID, null: false
20
+ end
21
+
22
+ class BirdGenus < GraphQL::Schema::Object
23
+ field :latin_name, String, null: false
24
+ field :id, ID, null: false, method: :latin_name
25
+ end
26
+
27
+ class BirdSpecies < GraphQL::Schema::Object
28
+ field :name, String, null: false
29
+ field :id, ID, null: false, method: :name
30
+ field :is_waterfowl, Boolean, null: false
31
+ field :similar_species, [BirdSpecies], null: false
32
+
33
+ def similar_species
34
+ object.similar_species_names.map { |n| DATA.find_by_name(n) }
35
+ end
36
+
37
+ field :genus, BirdGenus, null: false,
38
+ extras: [:lookahead]
39
+
40
+ def genus(lookahead:)
41
+ if lookahead.selects?(:latin_name)
42
+ context[:lookahead_latin_name] += 1
43
+ end
44
+ object.genus
45
+ end
46
+ end
47
+
48
+ class Query < GraphQL::Schema::Object
49
+ field :find_bird_species, BirdSpecies, null: true do
50
+ argument :by_name, String, required: true
51
+ end
52
+
53
+ def find_bird_species(by_name:)
54
+ DATA.find_by_name(by_name)
55
+ end
56
+
57
+ field :node, Node, null: true do
58
+ argument :id, ID, required: true
59
+ end
60
+
61
+ def node(id:)
62
+ if (node = DATA.find_by_name(id))
63
+ node
64
+ else
65
+ DATA.map { |d| d.genus }.select { |g| g.name == id }
66
+ end
67
+ end
68
+ end
69
+
70
+ class LookaheadInstrumenter
71
+ def self.before_query(query)
72
+ query.context[:root_lookahead_names] = query.lookahead.selections.map(&:name)
73
+ end
74
+
75
+ def self.after_query(q)
76
+ end
77
+ end
78
+
79
+ class Schema < GraphQL::Schema
80
+ query(Query)
81
+ instrument :query, LookaheadInstrumenter
82
+ if TESTING_INTERPRETER
83
+ use GraphQL::Execution::Interpreter
84
+ end
85
+ end
86
+ end
87
+
88
+ describe "looking ahead" do
89
+ let(:document) {
90
+ GraphQL.parse <<-GRAPHQL
91
+ query($name: String!){
92
+ findBirdSpecies(byName: $name) {
93
+ name
94
+ similarSpecies {
95
+ likesWater: isWaterfowl
96
+ }
97
+ }
98
+ t: __typename
99
+ }
100
+ GRAPHQL
101
+ }
102
+ let(:query) {
103
+ GraphQL::Query.new(LookaheadTest::Schema, document: document, variables: { name: "Cardinal" })
104
+ }
105
+
106
+ it "has a good test setup" do
107
+ res = query.result
108
+ assert_equal [false], res["data"]["findBirdSpecies"]["similarSpecies"].map { |s| s["likesWater"] }
109
+ end
110
+
111
+ it "can detect fields on objects with symbol or string" do
112
+ lookahead = query.lookahead.selection("findBirdSpecies")
113
+ assert_equal true, lookahead.selects?("similarSpecies")
114
+ assert_equal true, lookahead.selects?(:similar_species)
115
+ assert_equal false, lookahead.selects?("isWaterfowl")
116
+ assert_equal false, lookahead.selects?(:is_waterfowl)
117
+ end
118
+
119
+ it "detects by name, not by alias" do
120
+ assert_equal true, query.lookahead.selects?("__typename")
121
+ end
122
+
123
+ describe "fields on interfaces" do
124
+ let(:document) {
125
+ GraphQL.parse <<-GRAPHQL
126
+ query {
127
+ node(id: "Cardinal") {
128
+ id
129
+ ... on BirdSpecies {
130
+ name
131
+ }
132
+ ...Other
133
+ }
134
+ }
135
+ fragment Other on BirdGenus {
136
+ latinName
137
+ }
138
+ GRAPHQL
139
+ }
140
+
141
+ it "finds fields on object types and interface types" do
142
+ node_lookahead = query.lookahead.selection("node")
143
+ assert_equal [:id, :name, :latin_name], node_lookahead.selections.map(&:name)
144
+ end
145
+ end
146
+
147
+ describe "inspect" do
148
+ it "works for root lookaheads" do
149
+ assert_includes query.lookahead.inspect, "#<GraphQL::Execution::Lookahead @root_type="
150
+ end
151
+
152
+ it "works for field lookaheads" do
153
+ assert_includes query.lookahead.selection(:find_bird_species).inspect, "#<GraphQL::Execution::Lookahead @field="
154
+ end
155
+ end
156
+
157
+ describe "constraints by arguments" do
158
+ let(:lookahead) do
159
+ query.lookahead
160
+ end
161
+
162
+ it "is true without constraints" do
163
+ assert_equal true, lookahead.selects?("findBirdSpecies")
164
+ end
165
+
166
+ it "is true when all given constraints are satisfied" do
167
+ assert_equal true, lookahead.selects?(:find_bird_species, arguments: { by_name: "Cardinal" })
168
+ assert_equal true, lookahead.selects?("findBirdSpecies", arguments: { "byName" => "Cardinal" })
169
+ end
170
+
171
+ it "is true when no constraints are given" do
172
+ assert_equal true, lookahead.selects?(:find_bird_species, arguments: {})
173
+ assert_equal true, lookahead.selects?("__typename", arguments: {})
174
+ end
175
+
176
+ it "is false when some given constraints aren't satisfied" do
177
+ assert_equal false, lookahead.selects?(:find_bird_species, arguments: { by_name: "Chickadee" })
178
+ assert_equal false, lookahead.selects?(:find_bird_species, arguments: { by_name: "Cardinal", other: "Nonsense" })
179
+ end
180
+
181
+ describe "with literal values" do
182
+ let(:document) {
183
+ GraphQL.parse <<-GRAPHQL
184
+ {
185
+ findBirdSpecies(byName: "Great Blue Heron") {
186
+ isWaterfowl
187
+ }
188
+ }
189
+ GRAPHQL
190
+ }
191
+
192
+ it "works" do
193
+ assert_equal true, lookahead.selects?(:find_bird_species, arguments: { by_name: "Great Blue Heron" })
194
+ end
195
+ end
196
+ end
197
+
198
+ it "can do a chained lookahead" do
199
+ next_lookahead = query.lookahead.selection(:find_bird_species, arguments: { by_name: "Cardinal" })
200
+ assert_equal true, next_lookahead.selected?
201
+ nested_selection = next_lookahead.selection(:similar_species).selection(:is_waterfowl, arguments: {})
202
+ assert_equal true, nested_selection.selected?
203
+ assert_equal false, next_lookahead.selection(:similar_species).selection(:name).selected?
204
+ end
205
+
206
+ it "can detect fields on lists with symbol or string" do
207
+ assert_equal true, query.lookahead.selection(:find_bird_species).selection(:similar_species).selection(:is_waterfowl).selected?
208
+ assert_equal true, query.lookahead.selection("findBirdSpecies").selection("similarSpecies").selection("isWaterfowl").selected?
209
+ end
210
+
211
+ describe "merging branches and fragments" do
212
+ let(:document) {
213
+ GraphQL.parse <<-GRAPHQL
214
+ {
215
+ findBirdSpecies(name: "Cardinal") {
216
+ similarSpecies {
217
+ __typename
218
+ }
219
+ }
220
+ ...F
221
+ ... {
222
+ findBirdSpecies(name: "Cardinal") {
223
+ similarSpecies {
224
+ isWaterfowl
225
+ }
226
+ }
227
+ }
228
+ }
229
+
230
+ fragment F on Query {
231
+ findBirdSpecies(name: "Cardinal") {
232
+ similarSpecies {
233
+ name
234
+ }
235
+ }
236
+ }
237
+ GRAPHQL
238
+ }
239
+
240
+ it "finds selections using merging" do
241
+ merged_lookahead = query.lookahead.selection(:find_bird_species).selection(:similar_species)
242
+ assert merged_lookahead.selects?(:__typename)
243
+ assert merged_lookahead.selects?(:is_waterfowl)
244
+ assert merged_lookahead.selects?(:name)
245
+ end
246
+ end
247
+ end
248
+
249
+ describe "in queries" do
250
+ it "can be an extra" do
251
+ query_str = <<-GRAPHQL
252
+ {
253
+ cardinal: findBirdSpecies(byName: "Cardinal") {
254
+ genus { __typename }
255
+ }
256
+ scarletTanager: findBirdSpecies(byName: "Scarlet Tanager") {
257
+ genus { latinName }
258
+ }
259
+ greatBlueHeron: findBirdSpecies(byName: "Great Blue Heron") {
260
+ genus { latinName }
261
+ }
262
+ }
263
+ GRAPHQL
264
+ context = {lookahead_latin_name: 0}
265
+ res = LookaheadTest::Schema.execute(query_str, context: context)
266
+ refute res.key?("errors")
267
+ assert_equal 2, context[:lookahead_latin_name]
268
+ assert_equal [:find_bird_species], context[:root_lookahead_names]
269
+ end
270
+
271
+ it "works for invalid queries" do
272
+ context = {lookahead_latin_name: 0}
273
+ res = LookaheadTest::Schema.execute("{ doesNotExist }", context: context)
274
+ assert res.key?("errors")
275
+ assert_equal 0, context[:lookahead_latin_name]
276
+ end
277
+ end
278
+
279
+ describe '#selections' do
280
+ let(:document) {
281
+ GraphQL.parse <<-GRAPHQL
282
+ query {
283
+ findBirdSpecies(byName: "Laughing Gull") {
284
+ name
285
+ similarSpecies {
286
+ likesWater: isWaterfowl
287
+ }
288
+ }
289
+ }
290
+ GRAPHQL
291
+ }
292
+
293
+ def query(doc = document)
294
+ GraphQL::Query.new(LookaheadTest::Schema, document: doc)
295
+ end
296
+
297
+ it "provides a list of all selections" do
298
+ ast_node = document.definitions.first.selections.first
299
+ field = LookaheadTest::Query.fields["findBirdSpecies"]
300
+ lookahead = GraphQL::Execution::Lookahead.new(query: query, ast_nodes: [ast_node], field: field)
301
+ assert_equal [:name, :similar_species], lookahead.selections.map(&:name)
302
+ end
303
+
304
+ it "filters outs selections which do not match arguments" do
305
+ ast_node = document.definitions.first
306
+ lookahead = GraphQL::Execution::Lookahead.new(query: query, ast_nodes: [ast_node], root_type: LookaheadTest::Query)
307
+ arguments = { by_name: "Cardinal" }
308
+
309
+ assert_equal lookahead.selections(arguments: arguments).map(&:name), []
310
+ end
311
+
312
+ it "includes selections which match arguments" do
313
+ ast_node = document.definitions.first
314
+ lookahead = GraphQL::Execution::Lookahead.new(query: query, ast_nodes: [ast_node], root_type: LookaheadTest::Query)
315
+ arguments = { by_name: "Laughing Gull" }
316
+
317
+ assert_equal lookahead.selections(arguments: arguments).map(&:name), [:find_bird_species]
318
+ end
319
+
320
+ it 'handles duplicate selections across fragments' do
321
+ doc = GraphQL.parse <<-GRAPHQL
322
+ query {
323
+ ... on Query {
324
+ ...MoreFields
325
+ }
326
+ }
327
+
328
+ fragment MoreFields on Query {
329
+ findBirdSpecies(byName: "Laughing Gull") {
330
+ name
331
+ }
332
+ findBirdSpecies(byName: "Laughing Gull") {
333
+ ...EvenMoreFields
334
+ }
335
+ }
336
+
337
+ fragment EvenMoreFields on BirdSpecies {
338
+ similarSpecies {
339
+ likesWater: isWaterfowl
340
+ }
341
+ }
342
+ GRAPHQL
343
+
344
+ lookahead = query(doc).lookahead
345
+
346
+ root_selections = lookahead.selections
347
+ assert_equal [:find_bird_species], root_selections.map(&:name), "Selections are merged"
348
+ assert_equal 2, root_selections.first.ast_nodes.size, "It represents both nodes"
349
+
350
+ assert_equal [:name, :similar_species], root_selections.first.selections.map(&:name), "Subselections are merged"
351
+ end
352
+
353
+ it "works for missing selections" do
354
+ ast_node = document.definitions.first.selections.first
355
+ field = LookaheadTest::Query.fields["findBirdSpecies"]
356
+ lookahead = GraphQL::Execution::Lookahead.new(query: query, ast_nodes: [ast_node], field: field)
357
+ null_lookahead = lookahead.selection(:genus)
358
+ # This is an implementation detail, but I want to make sure the test is set up right
359
+ assert_instance_of GraphQL::Execution::Lookahead::NullLookahead, null_lookahead
360
+ assert_equal [], null_lookahead.selections
361
+ end
362
+ end
363
+ end
@@ -94,7 +94,8 @@ describe GraphQL::Execution::Multiplex do
94
94
  "errors" => [{
95
95
  "message"=>"Field must have selections (field 'nullableNestedSum' returns LazySum but has no selections. Did you mean 'nullableNestedSum { ... }'?)",
96
96
  "locations"=>[{"line"=>1, "column"=>4}],
97
- "fields"=>["query", "validationError"]
97
+ "path"=>["query", "validationError"],
98
+ "extensions"=>{"code"=>"selectionMismatch", "nodeName"=>"field 'nullableNestedSum'", "typeName"=>"LazySum"}
98
99
  }]
99
100
  },
100
101
  ]
@@ -105,7 +106,7 @@ describe GraphQL::Execution::Multiplex do
105
106
  {query: q3},
106
107
  {query: q4},
107
108
  ])
108
- assert_equal expected_res, res
109
+ assert_equal expected_res, res.map(&:to_h)
109
110
  end
110
111
  end
111
112
 
@@ -160,6 +161,19 @@ describe GraphQL::Execution::Multiplex do
160
161
  raise GraphQL::Error, "Crash"
161
162
  }
162
163
  end
164
+
165
+ field :raiseSyntaxError, types.String do
166
+ resolve ->(object, args, ctx) {
167
+ raise SyntaxError
168
+ }
169
+ end
170
+
171
+ field :raiseException, types.String do
172
+ resolve ->(object, args, ctx) {
173
+ raise Exception
174
+ }
175
+ end
176
+
163
177
  end
164
178
 
165
179
  InspectSchema = GraphQL::Schema.define do
@@ -167,6 +181,8 @@ describe GraphQL::Execution::Multiplex do
167
181
  instrument(:query, InspectQueryInstrumentation)
168
182
  end
169
183
 
184
+ unhandled_err_json = '{}'
185
+
170
186
  it "can access the query results" do
171
187
  InspectSchema.execute("{ raiseExecutionError }")
172
188
  handled_err_json = '{"data":{"raiseExecutionError":null},"errors":[{"message":"Whoops","locations":[{"line":1,"column":3}],"path":["raiseExecutionError"]}]}'
@@ -176,7 +192,19 @@ describe GraphQL::Execution::Multiplex do
176
192
  assert_raises(GraphQL::Error) do
177
193
  InspectSchema.execute("{ raiseError }")
178
194
  end
179
- unhandled_err_json = '{}'
195
+
196
+ assert_equal unhandled_err_json, InspectQueryInstrumentation.last_json
197
+ end
198
+
199
+ it "can access the query results when the error is not a StandardError" do
200
+ assert_raises(SyntaxError) do
201
+ InspectSchema.execute("{ raiseSyntaxError }")
202
+ end
203
+ assert_equal unhandled_err_json, InspectQueryInstrumentation.last_json
204
+
205
+ assert_raises(Exception) do
206
+ InspectSchema.execute("{ raiseException }")
207
+ end
180
208
  assert_equal unhandled_err_json, InspectQueryInstrumentation.last_json
181
209
  end
182
210
  end
@@ -8,36 +8,36 @@ describe GraphQL::Execution::Typecast do
8
8
  end
9
9
 
10
10
  it "counts the same type as a subtype" do
11
- assert subtype?(Dummy::MilkType, Dummy::MilkType)
12
- assert !subtype?(Dummy::MilkType, Dummy::CheeseType)
13
- assert subtype?(Dummy::MilkType.to_list_type.to_non_null_type, Dummy::MilkType.to_list_type.to_non_null_type)
11
+ assert subtype?(Dummy::Milk.graphql_definition, Dummy::Milk.graphql_definition)
12
+ assert !subtype?(Dummy::Milk.graphql_definition, Dummy::Cheese.graphql_definition)
13
+ assert subtype?(Dummy::Milk.graphql_definition.to_list_type.to_non_null_type, Dummy::Milk.graphql_definition.to_list_type.to_non_null_type)
14
14
  end
15
15
 
16
16
  it "counts member types as subtypes" do
17
- assert subtype?(Dummy::EdibleInterface, Dummy::CheeseType)
18
- assert subtype?(Dummy::EdibleInterface, Dummy::MilkType)
19
- assert subtype?(Dummy::DairyProductUnion, Dummy::MilkType)
20
- assert subtype?(Dummy::DairyProductUnion, Dummy::CheeseType)
17
+ assert subtype?(Dummy::Edible.graphql_definition, Dummy::Cheese.graphql_definition)
18
+ assert subtype?(Dummy::Edible.graphql_definition, Dummy::Milk.graphql_definition)
19
+ assert subtype?(Dummy::DairyProduct.graphql_definition, Dummy::Milk.graphql_definition)
20
+ assert subtype?(Dummy::DairyProduct.graphql_definition, Dummy::Cheese.graphql_definition)
21
21
 
22
- assert !subtype?(Dummy::DairyAppQueryType, Dummy::DairyProductUnion)
23
- assert !subtype?(Dummy::CheeseType, Dummy::DairyProductUnion)
24
- assert !subtype?(Dummy::EdibleInterface, Dummy::DairyProductUnion)
25
- assert !subtype?(Dummy::EdibleInterface, GraphQL::STRING_TYPE)
26
- assert !subtype?(Dummy::EdibleInterface, Dummy::DairyProductInputType)
22
+ assert !subtype?(Dummy::DairyAppQuery.graphql_definition, Dummy::DairyProduct.graphql_definition)
23
+ assert !subtype?(Dummy::Cheese.graphql_definition, Dummy::DairyProduct.graphql_definition)
24
+ assert !subtype?(Dummy::Edible.graphql_definition, Dummy::DairyProduct.graphql_definition)
25
+ assert !subtype?(Dummy::Edible.graphql_definition, GraphQL::STRING_TYPE)
26
+ assert !subtype?(Dummy::Edible.graphql_definition, Dummy::DairyProductInput.graphql_definition)
27
27
  end
28
28
 
29
29
  it "counts lists as subtypes if their inner types are subtypes" do
30
- assert subtype?(Dummy::EdibleInterface.to_list_type, Dummy::MilkType.to_list_type)
31
- assert subtype?(Dummy::DairyProductUnion.to_list_type, Dummy::MilkType.to_list_type)
32
- assert !subtype?(Dummy::CheeseType.to_list_type, Dummy::DairyProductUnion.to_list_type)
33
- assert !subtype?(Dummy::EdibleInterface.to_list_type, Dummy::DairyProductUnion.to_list_type)
34
- assert !subtype?(Dummy::EdibleInterface.to_list_type, GraphQL::STRING_TYPE.to_list_type)
30
+ assert subtype?(Dummy::Edible.graphql_definition.to_list_type, Dummy::Milk.graphql_definition.to_list_type)
31
+ assert subtype?(Dummy::DairyProduct.graphql_definition.to_list_type, Dummy::Milk.graphql_definition.to_list_type)
32
+ assert !subtype?(Dummy::Cheese.graphql_definition.to_list_type, Dummy::DairyProduct.graphql_definition.to_list_type)
33
+ assert !subtype?(Dummy::Edible.graphql_definition.to_list_type, Dummy::DairyProduct.graphql_definition.to_list_type)
34
+ assert !subtype?(Dummy::Edible.graphql_definition.to_list_type, GraphQL::STRING_TYPE.to_list_type)
35
35
  end
36
36
 
37
37
  it "counts non-null types as subtypes of nullable parent types" do
38
- assert subtype?(Dummy::MilkType, Dummy::MilkType.to_non_null_type)
39
- assert subtype?(Dummy::EdibleInterface, Dummy::MilkType.to_non_null_type)
40
- assert subtype?(Dummy::EdibleInterface.to_non_null_type, Dummy::MilkType.to_non_null_type)
38
+ assert subtype?(Dummy::Milk.graphql_definition, Dummy::Milk.graphql_definition.to_non_null_type)
39
+ assert subtype?(Dummy::Edible.graphql_definition, Dummy::Milk.graphql_definition.to_non_null_type)
40
+ assert subtype?(Dummy::Edible.graphql_definition.to_non_null_type, Dummy::Milk.graphql_definition.to_non_null_type)
41
41
  assert subtype?(
42
42
  GraphQL::STRING_TYPE.to_non_null_type.to_list_type,
43
43
  GraphQL::STRING_TYPE.to_non_null_type.to_list_type.to_non_null_type,