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,416 @@
1
+ # frozen_string_literal: true
2
+ require "spec_helper"
3
+
4
+ describe GraphQL::Schema::Subscription do
5
+ class SubscriptionFieldSchema < GraphQL::Schema
6
+ TOOTS = []
7
+ ALL_USERS = {
8
+ "dhh" => {handle: "dhh", private: false},
9
+ "matz" => {handle: "matz", private: false},
10
+ "_why" => {handle: "_why", private: true},
11
+ }
12
+
13
+ USERS = {}
14
+
15
+ class User < GraphQL::Schema::Object
16
+ field :handle, String, null: false
17
+ field :private, Boolean, null: false
18
+ end
19
+
20
+ class Toot < GraphQL::Schema::Object
21
+ field :handle, String, null: false
22
+ field :body, String, null: false
23
+ end
24
+
25
+ class Query < GraphQL::Schema::Object
26
+ field :toots, [Toot], null: false
27
+
28
+ def toots
29
+ TOOTS
30
+ end
31
+ end
32
+
33
+ class BaseSubscription < GraphQL::Schema::Subscription
34
+ end
35
+
36
+ class TootWasTooted < BaseSubscription
37
+ argument :handle, String, required: true, loads: User, as: :user
38
+ field :toot, Toot, null: false
39
+ field :user, User, null: false
40
+ # Can't subscribe to private users
41
+ def authorized?(user:)
42
+ if user[:private]
43
+ raise GraphQL::ExecutionError, "Can't subscribe to private user"
44
+ else
45
+ true
46
+ end
47
+ end
48
+
49
+ def subscribe(user:)
50
+ if context[:prohibit_subscriptions]
51
+ raise GraphQL::ExecutionError, "You don't have permission to subscribe"
52
+ else
53
+ # Default is to return :no_response
54
+ super
55
+ end
56
+ end
57
+
58
+ def update(user:)
59
+ if context[:viewer] == user
60
+ # don't update for one's own toots.
61
+ # (IRL it would make more sense to implement this in `#subscribe`)
62
+ :no_update
63
+ else
64
+ # This assumes that trigger object can fulfill `{toot:, user:}`,
65
+ # for testing that the default implementation is `return object`
66
+ super
67
+ end
68
+ end
69
+ end
70
+
71
+ # Test initial response, which returns all users
72
+ class UsersJoined < BaseSubscription
73
+ class UsersJoinedManualPayload < GraphQL::Schema::Object
74
+ field :users, [User], null: true,
75
+ description: "Includes newly-created users, or all users on the initial load"
76
+ end
77
+
78
+ payload_type UsersJoinedManualPayload
79
+
80
+ def subscribe
81
+ { users: USERS.values }
82
+ end
83
+
84
+ # Test returning a custom object from #update
85
+ def update
86
+ { users: object[:new_users] }
87
+ end
88
+ end
89
+
90
+ class Subscription < GraphQL::Schema::Object
91
+ extend GraphQL::Subscriptions::SubscriptionRoot
92
+ field :toot_was_tooted, subscription: TootWasTooted
93
+ field :users_joined, subscription: UsersJoined
94
+ end
95
+
96
+ class Mutation < GraphQL::Schema::Object
97
+ field :toot, Toot, null: false do
98
+ argument :body, String, required: true
99
+ end
100
+
101
+ def toot(body:)
102
+ handle = context[:viewer][:handle]
103
+ toot = { handle: handle, body: body }
104
+ TOOTS << toot
105
+ SubscriptionFieldSchema.trigger(:toot_was_tooted, {handle: handle}, toot)
106
+ end
107
+ end
108
+
109
+ query(Query)
110
+ mutation(Mutation)
111
+ subscription(Subscription)
112
+ use GraphQL::Execution::Interpreter
113
+ use GraphQL::Analysis::AST
114
+
115
+ def self.object_from_id(id, ctx)
116
+ USERS[id]
117
+ end
118
+
119
+
120
+ class InMemorySubscriptions < GraphQL::Subscriptions
121
+ SUBSCRIPTION_REGISTRY = {}
122
+
123
+ EVENT_REGISTRY = Hash.new { |h, k| h[k] = [] }
124
+
125
+ def write_subscription(query, events)
126
+ query.context[:subscription_mailbox] = []
127
+ subscription_id = build_id
128
+ events.each do |ev|
129
+ EVENT_REGISTRY[ev.topic] << subscription_id
130
+ end
131
+ SUBSCRIPTION_REGISTRY[subscription_id] = [query, events]
132
+ end
133
+
134
+ def each_subscription_id(event)
135
+ EVENT_REGISTRY[event.topic].each do |sub_id|
136
+ yield(sub_id)
137
+ end
138
+ end
139
+
140
+ def read_subscription(subscription_id)
141
+ query, _events = SUBSCRIPTION_REGISTRY[subscription_id]
142
+ {
143
+ query_string: query.query_string,
144
+ context: query.context.to_h,
145
+ variables: query.provided_variables,
146
+ operation_name: query.selected_operation_name,
147
+ }
148
+ end
149
+
150
+ def deliver(subscription_id, result)
151
+ query, _events = SUBSCRIPTION_REGISTRY[subscription_id]
152
+ query.context[:subscription_mailbox] << result
153
+ end
154
+
155
+ def delete_subscription(subscription_id)
156
+ _query, events = SUBSCRIPTION_REGISTRY.delete(subscription_id)
157
+ events.each do |ev|
158
+ EVENT_REGISTRY[ev.topic].delete(subscription_id)
159
+ end
160
+ end
161
+ end
162
+
163
+ use InMemorySubscriptions
164
+ end
165
+
166
+ def exec_query(*args)
167
+ SubscriptionFieldSchema.execute(*args)
168
+ end
169
+
170
+ def in_memory_subscription_count
171
+ SubscriptionFieldSchema::InMemorySubscriptions::SUBSCRIPTION_REGISTRY.size
172
+ end
173
+
174
+ before do
175
+ # Reset databases
176
+ SubscriptionFieldSchema::TOOTS.clear
177
+ # Reset in order:
178
+ SubscriptionFieldSchema::USERS.clear
179
+ SubscriptionFieldSchema::ALL_USERS.map do |k, v|
180
+ SubscriptionFieldSchema::USERS[k] = v.dup
181
+ end
182
+
183
+ SubscriptionFieldSchema::InMemorySubscriptions::SUBSCRIPTION_REGISTRY.clear
184
+ SubscriptionFieldSchema::InMemorySubscriptions::EVENT_REGISTRY.clear
185
+ end
186
+
187
+ it "generates a return type" do
188
+ return_type = SubscriptionFieldSchema::TootWasTooted.payload_type
189
+ assert_equal "TootWasTootedPayload", return_type.graphql_name
190
+ assert_equal ["toot", "user"], return_type.fields.keys
191
+ end
192
+
193
+ it "can use a premade `payload_type`" do
194
+ return_type = SubscriptionFieldSchema::UsersJoined.payload_type
195
+ assert_equal "UsersJoinedManualPayload", return_type.graphql_name
196
+ assert_equal ["users"], return_type.fields.keys
197
+ assert_equal SubscriptionFieldSchema::UsersJoined::UsersJoinedManualPayload, return_type
198
+ end
199
+
200
+ describe "initial subscription" do
201
+ it "calls #subscribe for the initial subscription and returns the result" do
202
+ res = exec_query <<-GRAPHQL
203
+ subscription {
204
+ usersJoined {
205
+ users {
206
+ handle
207
+ }
208
+ }
209
+ }
210
+ GRAPHQL
211
+
212
+ assert_equal ["dhh", "matz", "_why"], res["data"]["usersJoined"]["users"].map { |u| u["handle"] }
213
+ assert_equal 1, in_memory_subscription_count
214
+ end
215
+
216
+ it "rejects the subscription if #subscribe raises an error" do
217
+ res = exec_query <<-GRAPHQL, context: { prohibit_subscriptions: true }
218
+ subscription {
219
+ tootWasTooted(handle: "matz") {
220
+ toot { body }
221
+ }
222
+ }
223
+ GRAPHQL
224
+
225
+ expected_response = {
226
+ "data"=>nil,
227
+ "errors"=>[
228
+ {
229
+ "message"=>"You don't have permission to subscribe",
230
+ "locations"=>[{"line"=>2, "column"=>9}],
231
+ "path"=>["tootWasTooted"]
232
+ }
233
+ ]
234
+ }
235
+
236
+ assert_equal(expected_response, res)
237
+ assert_equal 0, in_memory_subscription_count
238
+ end
239
+
240
+ it "doesn't subscribe if `loads:` fails" do
241
+ res = exec_query <<-GRAPHQL
242
+ subscription {
243
+ tootWasTooted(handle: "jack") {
244
+ toot { body }
245
+ }
246
+ }
247
+ GRAPHQL
248
+
249
+ expected_response = {
250
+ "data" => nil,
251
+ "errors" => [
252
+ {
253
+ "message"=>"No object found for `handle: \"jack\"`",
254
+ "locations"=>[{"line"=>2, "column"=>9}],
255
+ "path"=>["tootWasTooted"]
256
+ }
257
+ ]
258
+ }
259
+ assert_equal(expected_response, res)
260
+ assert_equal 0, in_memory_subscription_count
261
+ end
262
+
263
+ it "rejects if #authorized? fails" do
264
+ res = exec_query <<-GRAPHQL
265
+ subscription {
266
+ tootWasTooted(handle: "_why") {
267
+ toot { body }
268
+ }
269
+ }
270
+ GRAPHQL
271
+ expected_response = {
272
+ "data"=>nil,
273
+ "errors"=>[
274
+ {
275
+ "message"=>"Can't subscribe to private user",
276
+ "locations"=>[{"line"=>2, "column"=>9}],
277
+ "path"=>["tootWasTooted"]
278
+ },
279
+ ],
280
+ }
281
+ assert_equal(expected_response, res)
282
+ end
283
+
284
+ it "sends no initial response if :no_response is returned, which is the default" do
285
+ assert_equal 0, in_memory_subscription_count
286
+
287
+ res = exec_query <<-GRAPHQL
288
+ subscription {
289
+ tootWasTooted(handle: "matz") {
290
+ toot { body }
291
+ }
292
+ }
293
+ GRAPHQL
294
+ assert_equal({"data" => {}}, res)
295
+ assert_equal 1, in_memory_subscription_count
296
+ end
297
+ end
298
+
299
+ describe "updates" do
300
+ it "updates with `object` by default" do
301
+ res = exec_query <<-GRAPHQL
302
+ subscription {
303
+ tootWasTooted(handle: "matz") {
304
+ toot { body }
305
+ }
306
+ }
307
+ GRAPHQL
308
+ assert_equal 1, in_memory_subscription_count
309
+ obj = OpenStruct.new(toot: { body: "I am a C programmer" }, user: SubscriptionFieldSchema::USERS["matz"])
310
+ SubscriptionFieldSchema.subscriptions.trigger(:toot_was_tooted, {handle: "matz"}, obj)
311
+
312
+ mailbox = res.context[:subscription_mailbox]
313
+ update_payload = mailbox.first
314
+ assert_equal "I am a C programmer", update_payload["data"]["tootWasTooted"]["toot"]["body"]
315
+ end
316
+
317
+ it "updates with the returned value" do
318
+ res = exec_query <<-GRAPHQL
319
+ subscription {
320
+ usersJoined {
321
+ users {
322
+ handle
323
+ }
324
+ }
325
+ }
326
+ GRAPHQL
327
+
328
+ assert_equal 1, in_memory_subscription_count
329
+ SubscriptionFieldSchema.subscriptions.trigger(:users_joined, {}, {new_users: [{handle: "eileencodes"}, {handle: "tenderlove"}]})
330
+
331
+ update = res.context[:subscription_mailbox].first
332
+ assert_equal [{"handle" => "eileencodes"}, {"handle" => "tenderlove"}], update["data"]["usersJoined"]["users"]
333
+ end
334
+
335
+ it "skips the update if `:no_update` is returned, but updates other subscribers" do
336
+ query_str = <<-GRAPHQL
337
+ subscription {
338
+ tootWasTooted(handle: "matz") {
339
+ toot { body }
340
+ }
341
+ }
342
+ GRAPHQL
343
+
344
+ res1 = exec_query(query_str)
345
+ res2 = exec_query(query_str, context: { viewer: SubscriptionFieldSchema::USERS["matz"] })
346
+ assert_equal 2, in_memory_subscription_count
347
+
348
+ obj = OpenStruct.new(toot: { body: "Merry Christmas, here's a new Ruby version" }, user: SubscriptionFieldSchema::USERS["matz"])
349
+ SubscriptionFieldSchema.subscriptions.trigger(:toot_was_tooted, {handle: "matz"}, obj)
350
+
351
+ mailbox1 = res1.context[:subscription_mailbox]
352
+ mailbox2 = res2.context[:subscription_mailbox]
353
+ # The anonymous viewer got an update:
354
+ assert_equal "Merry Christmas, here's a new Ruby version", mailbox1.first["data"]["tootWasTooted"]["toot"]["body"]
355
+ # But not matz:
356
+ assert_equal [], mailbox2
357
+ end
358
+
359
+ it "unsubscribes if a `loads:` argument is not found" do
360
+ res = exec_query <<-GRAPHQL
361
+ subscription {
362
+ tootWasTooted(handle: "matz") {
363
+ toot { body }
364
+ }
365
+ }
366
+ GRAPHQL
367
+ assert_equal 1, in_memory_subscription_count
368
+ obj = OpenStruct.new(toot: { body: "I am a C programmer" }, user: SubscriptionFieldSchema::USERS["matz"])
369
+ SubscriptionFieldSchema.subscriptions.trigger(:toot_was_tooted, {handle: "matz"}, obj)
370
+
371
+ # Get 1 successful update
372
+ mailbox = res.context[:subscription_mailbox]
373
+ assert_equal 1, mailbox.size
374
+ update_payload = mailbox.first
375
+ assert_equal "I am a C programmer", update_payload["data"]["tootWasTooted"]["toot"]["body"]
376
+
377
+ # Then cause a not-found and update again
378
+ matz = SubscriptionFieldSchema::USERS.delete("matz")
379
+ obj = OpenStruct.new(toot: { body: "Merry Christmas, here's a new Ruby version" }, user: matz)
380
+ SubscriptionFieldSchema.subscriptions.trigger(:toot_was_tooted, {handle: "matz"}, obj)
381
+ # there was no subsequent update
382
+ assert_equal 1, mailbox.size
383
+ # The database was cleaned up
384
+ assert_equal 0, in_memory_subscription_count
385
+ end
386
+
387
+ it "sends an error if `#authorized?` fails" do
388
+ res = exec_query <<-GRAPHQL
389
+ subscription {
390
+ tootWasTooted(handle: "matz") {
391
+ toot { body }
392
+ }
393
+ }
394
+ GRAPHQL
395
+ assert_equal 1, in_memory_subscription_count
396
+ matz = SubscriptionFieldSchema::USERS["matz"]
397
+ obj = OpenStruct.new(toot: { body: "I am a C programmer" }, user: matz)
398
+ SubscriptionFieldSchema.subscriptions.trigger(:toot_was_tooted, {handle: "matz"}, obj)
399
+
400
+ # Get 1 successful update
401
+ mailbox = res.context[:subscription_mailbox]
402
+ assert_equal 1, mailbox.size
403
+ update_payload = mailbox.first
404
+ assert_equal "I am a C programmer", update_payload["data"]["tootWasTooted"]["toot"]["body"]
405
+
406
+ # Cause an authorized failure
407
+ matz[:private] = true
408
+ obj = OpenStruct.new(toot: { body: "Merry Christmas, here's a new Ruby version" }, user: matz)
409
+ SubscriptionFieldSchema.subscriptions.trigger(:toot_was_tooted, {handle: "matz"}, obj)
410
+ assert_equal 2, mailbox.size
411
+ assert_equal ["Can't subscribe to private user"], mailbox.last["errors"].map { |e| e["message"] }
412
+ # The subscription remains in place
413
+ assert_equal 1, in_memory_subscription_count
414
+ end
415
+ end
416
+ end
@@ -20,24 +20,24 @@ describe GraphQL::Schema::Traversal do
20
20
  it "finds types from a single type and its fields" do
21
21
  expected = {
22
22
  "Boolean" => GraphQL::BOOLEAN_TYPE,
23
- "Cheese" => Dummy::CheeseType,
23
+ "Cheese" => Dummy::Cheese.graphql_definition,
24
24
  "Float" => GraphQL::FLOAT_TYPE,
25
25
  "String" => GraphQL::STRING_TYPE,
26
- "Edible" => Dummy::EdibleInterface,
27
- "EdibleAsMilk" => Dummy::EdibleAsMilkInterface,
28
- "DairyAnimal" => Dummy::DairyAnimalEnum,
26
+ "Edible" => Dummy::Edible.graphql_definition,
27
+ "EdibleAsMilk" => Dummy::EdibleAsMilk.graphql_definition,
28
+ "DairyAnimal" => Dummy::DairyAnimal.graphql_definition,
29
29
  "Int" => GraphQL::INT_TYPE,
30
- "AnimalProduct" => Dummy::AnimalProductInterface,
31
- "LocalProduct" => Dummy::LocalProductInterface,
30
+ "AnimalProduct" => Dummy::AnimalProduct.graphql_definition,
31
+ "LocalProduct" => Dummy::LocalProduct.graphql_definition,
32
32
  }
33
- result = traversal([Dummy::CheeseType]).type_map
33
+ result = traversal([Dummy::Cheese.graphql_definition]).type_map
34
34
  assert_equal(expected.keys.sort, result.keys.sort)
35
35
  assert_equal(expected, result.to_h)
36
36
  end
37
37
 
38
38
  it "finds type from arguments" do
39
- result = traversal([Dummy::DairyAppQueryType]).type_map
40
- assert_equal(Dummy::DairyProductInputType, result["DairyProductInput"])
39
+ result = traversal([Dummy::DairyAppQuery.graphql_definition]).type_map
40
+ assert_equal(Dummy::DairyProductInput.graphql_definition, result["DairyProductInput"])
41
41
  end
42
42
 
43
43
  it "finds types from field instrumentation" do
@@ -126,7 +126,7 @@ describe GraphQL::Schema::Traversal do
126
126
 
127
127
  describe "when a field is only accessible through an interface" do
128
128
  it "is found through Schema.define(types:)" do
129
- assert_equal Dummy::HoneyType, Dummy::Schema.types["Honey"]
129
+ assert_equal Dummy::Honey.graphql_definition, Dummy::Schema.types["Honey"]
130
130
  end
131
131
  end
132
132
 
@@ -13,7 +13,7 @@ describe GraphQL::Schema::TypeExpression do
13
13
  describe "simple types" do
14
14
  let(:type_name) { "DairyProductInput" }
15
15
  it "it gets types from the provided types" do
16
- assert_equal(Dummy::DairyProductInputType, type_expression_result)
16
+ assert_equal(Dummy::DairyProductInput.graphql_definition, type_expression_result)
17
17
  end
18
18
  end
19
19
 
@@ -28,7 +28,7 @@ describe GraphQL::Schema::TypeExpression do
28
28
  let(:type_name) { "[DairyAnimal!]!" }
29
29
 
30
30
  it "makes list types" do
31
- expected = Dummy::DairyAnimalEnum
31
+ expected = Dummy::DairyAnimal.graphql_definition
32
32
  .to_non_null_type
33
33
  .to_list_type
34
34
  .to_non_null_type
@@ -3,6 +3,13 @@ require "spec_helper"
3
3
 
4
4
  describe GraphQL::Schema::Union do
5
5
  let(:union) { Jazz::PerformingAct }
6
+
7
+ describe ".path" do
8
+ it "is the name" do
9
+ assert_equal "PerformingAct", union.path
10
+ end
11
+ end
12
+
6
13
  describe "type info" do
7
14
  it "has some" do
8
15
  assert_equal 2, union.possible_types.size
@@ -315,7 +315,7 @@ describe GraphQL::Schema::Validation do
315
315
  let(:null_default_value) {
316
316
  GraphQL::Argument.define do
317
317
  name "NullDefault"
318
- type Dummy::DairyAnimalEnum
318
+ type Dummy::DairyAnimal
319
319
  default_value nil
320
320
  end
321
321
  }