graphql 1.7.6 → 1.8.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 (289) hide show
  1. checksums.yaml +4 -4
  2. data/lib/generators/graphql/function_generator.rb +1 -1
  3. data/lib/generators/graphql/install_generator.rb +14 -8
  4. data/lib/generators/graphql/loader_generator.rb +1 -1
  5. data/lib/generators/graphql/mutation_generator.rb +6 -1
  6. data/lib/generators/graphql/templates/function.erb +2 -2
  7. data/lib/generators/graphql/templates/loader.erb +2 -2
  8. data/lib/generators/graphql/templates/schema.erb +1 -1
  9. data/lib/graphql/argument.rb +25 -19
  10. data/lib/graphql/backtrace/tracer.rb +16 -22
  11. data/lib/graphql/backtrace.rb +1 -1
  12. data/lib/graphql/backwards_compatibility.rb +2 -3
  13. data/lib/graphql/base_type.rb +31 -31
  14. data/lib/graphql/compatibility/query_parser_specification/parse_error_specification.rb +14 -0
  15. data/lib/graphql/compatibility/query_parser_specification.rb +117 -0
  16. data/lib/graphql/define/assign_object_field.rb +5 -12
  17. data/lib/graphql/deprecated_dsl.rb +42 -0
  18. data/lib/graphql/directive.rb +1 -0
  19. data/lib/graphql/enum_type.rb +3 -1
  20. data/lib/graphql/execution/execute.rb +21 -13
  21. data/lib/graphql/execution/instrumentation.rb +82 -0
  22. data/lib/graphql/execution/lazy/lazy_method_map.rb +1 -1
  23. data/lib/graphql/execution/lazy/resolve.rb +1 -3
  24. data/lib/graphql/execution/multiplex.rb +12 -29
  25. data/lib/graphql/execution.rb +1 -0
  26. data/lib/graphql/field.rb +21 -4
  27. data/lib/graphql/function.rb +14 -0
  28. data/lib/graphql/input_object_type.rb +3 -1
  29. data/lib/graphql/interface_type.rb +5 -3
  30. data/lib/graphql/internal_representation/node.rb +26 -14
  31. data/lib/graphql/internal_representation/visit.rb +3 -6
  32. data/lib/graphql/introspection/base_object.rb +16 -0
  33. data/lib/graphql/introspection/directive_location_enum.rb +11 -7
  34. data/lib/graphql/introspection/directive_type.rb +23 -16
  35. data/lib/graphql/introspection/dynamic_fields.rb +11 -0
  36. data/lib/graphql/introspection/entry_points.rb +29 -0
  37. data/lib/graphql/introspection/enum_value_type.rb +16 -11
  38. data/lib/graphql/introspection/field_type.rb +21 -12
  39. data/lib/graphql/introspection/input_value_type.rb +26 -23
  40. data/lib/graphql/introspection/schema_field.rb +7 -2
  41. data/lib/graphql/introspection/schema_type.rb +36 -22
  42. data/lib/graphql/introspection/type_by_name_field.rb +10 -2
  43. data/lib/graphql/introspection/type_kind_enum.rb +10 -6
  44. data/lib/graphql/introspection/type_type.rb +85 -23
  45. data/lib/graphql/introspection/typename_field.rb +1 -0
  46. data/lib/graphql/introspection.rb +3 -10
  47. data/lib/graphql/language/block_string.rb +47 -0
  48. data/lib/graphql/language/document_from_schema_definition.rb +280 -0
  49. data/lib/graphql/language/generation.rb +3 -182
  50. data/lib/graphql/language/lexer.rb +144 -69
  51. data/lib/graphql/language/lexer.rl +15 -4
  52. data/lib/graphql/language/nodes.rb +141 -78
  53. data/lib/graphql/language/parser.rb +677 -630
  54. data/lib/graphql/language/parser.y +18 -12
  55. data/lib/graphql/language/printer.rb +361 -0
  56. data/lib/graphql/language/token.rb +10 -3
  57. data/lib/graphql/language.rb +3 -0
  58. data/lib/graphql/non_null_type.rb +1 -1
  59. data/lib/graphql/object_type.rb +1 -6
  60. data/lib/graphql/query/arguments.rb +63 -32
  61. data/lib/graphql/query/context.rb +32 -2
  62. data/lib/graphql/query/literal_input.rb +4 -1
  63. data/lib/graphql/query/null_context.rb +1 -1
  64. data/lib/graphql/query/result.rb +1 -1
  65. data/lib/graphql/query/variables.rb +21 -3
  66. data/lib/graphql/query.rb +19 -6
  67. data/lib/graphql/railtie.rb +109 -0
  68. data/lib/graphql/relay/connection_resolve.rb +3 -0
  69. data/lib/graphql/relay/connection_type.rb +5 -3
  70. data/lib/graphql/relay/edge_type.rb +2 -1
  71. data/lib/graphql/relay/global_id_resolve.rb +5 -1
  72. data/lib/graphql/relay/mongo_relation_connection.rb +40 -0
  73. data/lib/graphql/relay/mutation/instrumentation.rb +1 -1
  74. data/lib/graphql/relay/mutation/resolve.rb +5 -1
  75. data/lib/graphql/relay/relation_connection.rb +14 -19
  76. data/lib/graphql/relay/type_extensions.rb +30 -0
  77. data/lib/graphql/relay.rb +2 -0
  78. data/lib/graphql/scalar_type.rb +14 -2
  79. data/lib/graphql/schema/argument.rb +92 -0
  80. data/lib/graphql/schema/build_from_definition.rb +64 -18
  81. data/lib/graphql/schema/enum.rb +85 -0
  82. data/lib/graphql/schema/enum_value.rb +74 -0
  83. data/lib/graphql/schema/field.rb +372 -0
  84. data/lib/graphql/schema/finder.rb +153 -0
  85. data/lib/graphql/schema/input_object.rb +87 -0
  86. data/lib/graphql/schema/interface.rb +105 -0
  87. data/lib/graphql/schema/introspection_system.rb +93 -0
  88. data/lib/graphql/schema/late_bound_type.rb +32 -0
  89. data/lib/graphql/schema/list.rb +32 -0
  90. data/lib/graphql/schema/loader.rb +2 -2
  91. data/lib/graphql/schema/member/accepts_definition.rb +152 -0
  92. data/lib/graphql/schema/member/base_dsl_methods.rb +100 -0
  93. data/lib/graphql/schema/member/build_type.rb +137 -0
  94. data/lib/graphql/schema/member/cached_graphql_definition.rb +26 -0
  95. data/lib/graphql/schema/member/graphql_type_names.rb +21 -0
  96. data/lib/graphql/schema/member/has_arguments.rb +50 -0
  97. data/lib/graphql/schema/member/has_fields.rb +130 -0
  98. data/lib/graphql/schema/member/instrumentation.rb +115 -0
  99. data/lib/graphql/schema/member/type_system_helpers.rb +34 -0
  100. data/lib/graphql/schema/member.rb +28 -0
  101. data/lib/graphql/schema/middleware_chain.rb +5 -1
  102. data/lib/graphql/schema/mutation.rb +138 -0
  103. data/lib/graphql/schema/non_null.rb +38 -0
  104. data/lib/graphql/schema/object.rb +81 -0
  105. data/lib/graphql/schema/printer.rb +33 -266
  106. data/lib/graphql/schema/relay_classic_mutation.rb +87 -0
  107. data/lib/graphql/schema/rescue_middleware.rb +8 -7
  108. data/lib/graphql/schema/resolver.rb +122 -0
  109. data/lib/graphql/schema/scalar.rb +35 -0
  110. data/lib/graphql/schema/traversal.rb +102 -22
  111. data/lib/graphql/schema/union.rb +36 -0
  112. data/lib/graphql/schema/validation.rb +3 -2
  113. data/lib/graphql/schema.rb +381 -12
  114. data/lib/graphql/static_validation/definition_dependencies.rb +1 -1
  115. data/lib/graphql/static_validation/literal_validator.rb +16 -4
  116. data/lib/graphql/static_validation/rules/fields_are_defined_on_type.rb +6 -6
  117. data/lib/graphql/static_validation/rules/fields_have_appropriate_selections.rb +5 -1
  118. data/lib/graphql/static_validation/rules/fields_will_merge.rb +15 -8
  119. data/lib/graphql/static_validation/rules/variables_are_used_and_defined.rb +11 -1
  120. data/lib/graphql/static_validation/validation_context.rb +1 -1
  121. data/lib/graphql/subscriptions/action_cable_subscriptions.rb +7 -5
  122. data/lib/graphql/subscriptions/instrumentation.rb +5 -1
  123. data/lib/graphql/subscriptions/serialize.rb +2 -0
  124. data/lib/graphql/subscriptions.rb +90 -16
  125. data/lib/graphql/tracing/data_dog_tracing.rb +49 -0
  126. data/lib/graphql/tracing/new_relic_tracing.rb +26 -0
  127. data/lib/graphql/tracing/platform_tracing.rb +20 -7
  128. data/lib/graphql/tracing/scout_tracing.rb +2 -2
  129. data/lib/graphql/tracing.rb +1 -0
  130. data/lib/graphql/unresolved_type_error.rb +3 -2
  131. data/lib/graphql/upgrader/member.rb +894 -0
  132. data/lib/graphql/upgrader/schema.rb +37 -0
  133. data/lib/graphql/version.rb +1 -1
  134. data/lib/graphql.rb +5 -25
  135. data/readme.md +2 -2
  136. data/spec/dummy/app/channels/graphql_channel.rb +23 -2
  137. data/spec/dummy/log/development.log +239 -0
  138. data/spec/dummy/log/test.log +410 -0
  139. data/spec/dummy/test/system/action_cable_subscription_test.rb +4 -0
  140. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/-x/-xYZjAnuuzgR79fcznLTQtSdh6AARxu8FcQ_J6p7L3U.cache +0 -0
  141. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/13/13HiV12xyoQvT-1L39ZzLwMZxjyaGMiENmfw7f-QTIc.cache +0 -0
  142. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/3W/3Wtf5pCWdqq0AB-iB0Y9uUNrTkruRxIEf1XFn_BETU0.cache +1 -0
  143. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/5i/5iguGafb4hOn8262Kn8Q37ogNN9MxxQKGKNzHAzUcvI.cache +1 -0
  144. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/8m/8mj2T6yy847Mc2Z7k3Xzh8O91hhVJt3NrPe8ASNDlIA.cache +1 -0
  145. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/DT/DTQyMpr4ABZYQetsdRJ5A7S4jf1r3ie4FGOR7GZBNSs.cache +3 -0
  146. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Dq/DqJ5_yJPrP5iLlOQyTQsjAVI5FE5LCVDkED0f7GgsSo.cache +3 -0
  147. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/F8/F8MUNRzORGFgr329fNM0xLaoWCXdv3BIalT7dsvLfjs.cache +0 -0
  148. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/KB/KB07ZaKNC5uXJ7TjLi-WqnY6g7dq8wWp_8N3HNjBNxg.cache +0 -0
  149. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Rw/RwDuCV-XpnCtjNkvhpJfBuxXMk0b5AD3L9eR6M-wcy0.cache +3 -0
  150. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/UL/ULdjhhb0bRuqmaG7XSZlFYzGYCXTDnqZuJBTWRlzqgw.cache +0 -0
  151. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Up/UpPNgh0yYoUsyMDh5zWqe_U6qJIyTC6-dxMMAs1vvlM.cache +1 -0
  152. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Wg/Wguh-szFGTI1gaL6npYwPekMXflugRei7F_mOyRucXg.cache +0 -0
  153. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/X-/X-khLYMA9mqFRPg3zAi86mREDxpKl4bdKYp3uF6WHos.cache +0 -0
  154. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/bi/BIkdhfxsezxM4q-HZ4oCNTq97WEJTigcq0tpX2cDvbY.cache +0 -0
  155. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/ff/FfxmA4CMHQZT7exx0G7NS1Wpcnny0vzp-Jhc2H36bp8.cache +1 -0
  156. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/gE/gEiiG4GZNy_djEjK2pHm_NgA-gyhLZhdQvo0Yt96GqE.cache +0 -0
  157. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/gn/gnA9ZSqpjccNL2m8pe_jBvY6SinXlCzXDWyop83Od8s.cache +1 -0
  158. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/lO/lOAan3cMwCE_Hli6gsDML88xFNfn0nxPmvrSkW7eEOw.cache +1 -0
  159. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/m1/M1pv8MJEPLXGLvS8QxVh3DSO9cI4mRt5FHFWdrvUj6o.cache +2 -0
  160. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/m7/m77qH7ZqH0_0SmwJbiKGDd-aLau1Dav847DC6ge46zY.cache +1 -0
  161. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/sj/sjRjnjRB37lH2vrgtkdJ8Cz84__IJ978IuKTM7HcztI.cache +0 -0
  162. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/um/um1JrirR4hJhK-1rE-HywlyCi5ibgxHVrReiujZBWJM.cache +1 -0
  163. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/v4/v4fwVytD7ITcE0_GDbslZEYud8a5Okm85fV1o7SDl6g.cache +0 -0
  164. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/v_/v_0PAQt0iipQjFP5zjgkkk9Stnpf4VzvnMv67d1Keuw.cache +1 -0
  165. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/wd/wdT9U4MKxe1PyqNjVuCKMpCl3dxGCIRJIlwUTfh2DQU.cache +1 -0
  166. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/xI/xIaxut_fEIhKBDqljTNwYaADK9kj3gG0ESrfHs-5_og.cache +3 -0
  167. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/y0/y0SJOqIx2fn1SKqOkAihsQow0trRJrSIyAswufVuoA8.cache +0 -0
  168. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/zg/zgpzeaX-KZErHyGJ1aBH3ZusweNXMneVZule88XsIJI.cache +1 -0
  169. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/zy/zYFltDy-8VC-uKq2BVEiJJyYXNFvVzAKuMlR3ZIYZsk.cache +0 -0
  170. data/spec/dummy/tmp/screenshots/failures_test_it_handles_subscriptions.png +0 -0
  171. data/spec/fixtures/upgrader/account.original.rb +19 -0
  172. data/spec/fixtures/upgrader/account.transformed.rb +20 -0
  173. data/spec/fixtures/upgrader/blame_range.original.rb +43 -0
  174. data/spec/fixtures/upgrader/blame_range.transformed.rb +30 -0
  175. data/spec/fixtures/upgrader/date_time.original.rb +24 -0
  176. data/spec/fixtures/upgrader/date_time.transformed.rb +23 -0
  177. data/spec/fixtures/upgrader/delete_project.original.rb +28 -0
  178. data/spec/fixtures/upgrader/delete_project.transformed.rb +27 -0
  179. data/spec/fixtures/upgrader/gist_order_field.original.rb +14 -0
  180. data/spec/fixtures/upgrader/gist_order_field.transformed.rb +13 -0
  181. data/spec/fixtures/upgrader/increment_count.original.rb +59 -0
  182. data/spec/fixtures/upgrader/increment_count.transformed.rb +50 -0
  183. data/spec/fixtures/upgrader/photo.original.rb +10 -0
  184. data/spec/fixtures/upgrader/photo.transformed.rb +12 -0
  185. data/spec/fixtures/upgrader/release_order.original.rb +15 -0
  186. data/spec/fixtures/upgrader/release_order.transformed.rb +14 -0
  187. data/spec/fixtures/upgrader/starrable.original.rb +49 -0
  188. data/spec/fixtures/upgrader/starrable.transformed.rb +46 -0
  189. data/spec/fixtures/upgrader/subscribable.original.rb +55 -0
  190. data/spec/fixtures/upgrader/subscribable.transformed.rb +51 -0
  191. data/spec/fixtures/upgrader/type_x.original.rb +65 -0
  192. data/spec/fixtures/upgrader/type_x.transformed.rb +56 -0
  193. data/spec/generators/graphql/function_generator_spec.rb +26 -0
  194. data/spec/generators/graphql/install_generator_spec.rb +1 -1
  195. data/spec/generators/graphql/loader_generator_spec.rb +24 -0
  196. data/spec/graphql/analysis/max_query_complexity_spec.rb +3 -3
  197. data/spec/graphql/analysis/max_query_depth_spec.rb +3 -3
  198. data/spec/graphql/argument_spec.rb +21 -0
  199. data/spec/graphql/backtrace_spec.rb +10 -0
  200. data/spec/graphql/base_type_spec.rb +42 -0
  201. data/spec/graphql/boolean_type_spec.rb +3 -3
  202. data/spec/graphql/directive_spec.rb +3 -1
  203. data/spec/graphql/enum_type_spec.rb +18 -5
  204. data/spec/graphql/execution/execute_spec.rb +4 -4
  205. data/spec/graphql/execution/instrumentation_spec.rb +165 -0
  206. data/spec/graphql/execution/multiplex_spec.rb +2 -2
  207. data/spec/graphql/execution_error_spec.rb +18 -0
  208. data/spec/graphql/float_type_spec.rb +2 -2
  209. data/spec/graphql/id_type_spec.rb +1 -1
  210. data/spec/graphql/input_object_type_spec.rb +15 -2
  211. data/spec/graphql/int_type_spec.rb +2 -2
  212. data/spec/graphql/interface_type_spec.rb +12 -0
  213. data/spec/graphql/internal_representation/rewrite_spec.rb +2 -2
  214. data/spec/graphql/introspection/schema_type_spec.rb +2 -0
  215. data/spec/graphql/language/block_string_spec.rb +70 -0
  216. data/spec/graphql/language/document_from_schema_definition_spec.rb +770 -0
  217. data/spec/graphql/language/generation_spec.rb +21 -186
  218. data/spec/graphql/language/lexer_spec.rb +21 -1
  219. data/spec/graphql/language/nodes_spec.rb +21 -12
  220. data/spec/graphql/language/parser_spec.rb +1 -1
  221. data/spec/graphql/language/printer_spec.rb +203 -0
  222. data/spec/graphql/object_type_spec.rb +22 -0
  223. data/spec/graphql/query/arguments_spec.rb +25 -15
  224. data/spec/graphql/query/context_spec.rb +18 -0
  225. data/spec/graphql/query/executor_spec.rb +2 -1
  226. data/spec/graphql/query/serial_execution/value_resolution_spec.rb +2 -8
  227. data/spec/graphql/query/variables_spec.rb +42 -1
  228. data/spec/graphql/query_spec.rb +31 -5
  229. data/spec/graphql/rake_task_spec.rb +3 -1
  230. data/spec/graphql/relay/base_connection_spec.rb +1 -1
  231. data/spec/graphql/relay/connection_instrumentation_spec.rb +2 -2
  232. data/spec/graphql/relay/connection_resolve_spec.rb +1 -1
  233. data/spec/graphql/relay/connection_type_spec.rb +1 -1
  234. data/spec/graphql/relay/mongo_relation_connection_spec.rb +474 -0
  235. data/spec/graphql/relay/mutation_spec.rb +9 -7
  236. data/spec/graphql/relay/range_add_spec.rb +5 -1
  237. data/spec/graphql/relay/relation_connection_spec.rb +65 -1
  238. data/spec/graphql/schema/argument_spec.rb +87 -0
  239. data/spec/graphql/schema/build_from_definition_spec.rb +89 -5
  240. data/spec/graphql/schema/enum_spec.rb +74 -0
  241. data/spec/graphql/schema/field_spec.rb +225 -0
  242. data/spec/graphql/schema/finder_spec.rb +135 -0
  243. data/spec/graphql/schema/input_object_spec.rb +111 -0
  244. data/spec/graphql/schema/instrumentation_spec.rb +40 -0
  245. data/spec/graphql/schema/interface_spec.rb +185 -0
  246. data/spec/graphql/schema/introspection_system_spec.rb +39 -0
  247. data/spec/graphql/schema/member/accepts_definition_spec.rb +111 -0
  248. data/spec/graphql/schema/member/build_type_spec.rb +17 -0
  249. data/spec/graphql/schema/member/has_fields_spec.rb +129 -0
  250. data/spec/graphql/schema/member/type_system_helpers_spec.rb +63 -0
  251. data/spec/graphql/schema/mutation_spec.rb +148 -0
  252. data/spec/graphql/schema/object_spec.rb +175 -0
  253. data/spec/graphql/schema/printer_spec.rb +111 -15
  254. data/spec/graphql/schema/relay_classic_mutation_spec.rb +38 -0
  255. data/spec/graphql/schema/rescue_middleware_spec.rb +11 -0
  256. data/spec/graphql/schema/resolver_spec.rb +131 -0
  257. data/spec/graphql/schema/scalar_spec.rb +95 -0
  258. data/spec/graphql/schema/traversal_spec.rb +31 -0
  259. data/spec/graphql/schema/union_spec.rb +65 -0
  260. data/spec/graphql/schema/validation_spec.rb +1 -1
  261. data/spec/graphql/schema/warden_spec.rb +11 -11
  262. data/spec/graphql/schema_spec.rb +55 -12
  263. data/spec/graphql/static_validation/rules/fields_have_appropriate_selections_spec.rb +10 -2
  264. data/spec/graphql/static_validation/rules/fields_will_merge_spec.rb +2 -2
  265. data/spec/graphql/string_type_spec.rb +3 -3
  266. data/spec/graphql/subscriptions_spec.rb +273 -184
  267. data/spec/graphql/tracing/active_support_notifications_tracing_spec.rb +1 -1
  268. data/spec/graphql/tracing/new_relic_tracing_spec.rb +47 -0
  269. data/spec/graphql/tracing/platform_tracing_spec.rb +60 -1
  270. data/spec/graphql/union_type_spec.rb +1 -1
  271. data/spec/graphql/upgrader/member_spec.rb +516 -0
  272. data/spec/graphql/upgrader/schema_spec.rb +82 -0
  273. data/spec/spec_helper.rb +8 -0
  274. data/spec/support/dummy/schema.rb +53 -24
  275. data/spec/support/jazz.rb +544 -0
  276. data/spec/support/lazy_helpers.rb +21 -23
  277. data/spec/support/new_relic.rb +24 -0
  278. data/spec/support/star_trek/data.rb +109 -0
  279. data/spec/support/star_trek/schema.rb +388 -0
  280. data/spec/support/star_wars/data.rb +6 -7
  281. data/spec/support/star_wars/schema.rb +127 -171
  282. metadata +233 -11
  283. data/lib/graphql/introspection/arguments_field.rb +0 -7
  284. data/lib/graphql/introspection/enum_values_field.rb +0 -18
  285. data/lib/graphql/introspection/fields_field.rb +0 -13
  286. data/lib/graphql/introspection/input_fields_field.rb +0 -12
  287. data/lib/graphql/introspection/interfaces_field.rb +0 -11
  288. data/lib/graphql/introspection/of_type_field.rb +0 -6
  289. data/lib/graphql/introspection/possible_types_field.rb +0 -11
@@ -0,0 +1,135 @@
1
+ # frozen_string_literal: true
2
+ require "spec_helper"
3
+
4
+ describe GraphQL::Schema::Finder do
5
+ let(:finder) { GraphQL::Schema::Finder.new(Jazz::Schema) }
6
+
7
+ describe "#find" do
8
+ it "finds a valid object type" do
9
+ type = finder.find("Ensemble")
10
+ assert_equal "Ensemble", type.name
11
+ end
12
+
13
+ it "raises when finding an invalid object type" do
14
+ exception = assert_raises GraphQL::Schema::Finder::MemberNotFoundError do
15
+ finder.find("DoesNotExist")
16
+ end
17
+
18
+ assert_match /Could not find type `DoesNotExist` in schema./, exception.message
19
+ end
20
+
21
+ it "finds a valid directive" do
22
+ directive = finder.find("@include")
23
+ assert_equal "include", directive.name
24
+ end
25
+
26
+ it "raises when finding an invalid directive" do
27
+ exception = assert_raises GraphQL::Schema::Finder::MemberNotFoundError do
28
+ finder.find("@yolo")
29
+ end
30
+
31
+ assert_match /Could not find directive `@yolo` in schema./, exception.message
32
+ end
33
+
34
+ it "finds a valid field" do
35
+ field = finder.find("Ensemble.musicians")
36
+ assert_equal "musicians", field.name
37
+ end
38
+
39
+ it "finds a meta field" do
40
+ field = finder.find("Ensemble.__typename")
41
+ assert_equal "__typename", field.name
42
+ end
43
+
44
+ it "raises when finding an in valid field" do
45
+ exception = assert_raises GraphQL::Schema::Finder::MemberNotFoundError do
46
+ finder.find("Ensemble.nope")
47
+ end
48
+
49
+ assert_match /Could not find field `nope` on object type `Ensemble`./, exception.message
50
+ end
51
+
52
+ it "finds a valid argument" do
53
+ arg = finder.find("Query.find.id")
54
+ assert_equal "id", arg.name
55
+ end
56
+
57
+ it "raises when finding an invalid argument" do
58
+ exception = assert_raises GraphQL::Schema::Finder::MemberNotFoundError do
59
+ finder.find("Query.find.thisArgumentIsInvalid")
60
+ end
61
+
62
+ assert_match /Could not find argument `thisArgumentIsInvalid` on field `find`./, exception.message
63
+ end
64
+
65
+ it "raises when selecting on an argument" do
66
+ exception = assert_raises GraphQL::Schema::Finder::MemberNotFoundError do
67
+ finder.find("Query.find.id.whyYouDoThis")
68
+ end
69
+
70
+ assert_match /Cannot select member `whyYouDoThis` on a field./, exception.message
71
+ end
72
+
73
+ it "finds a valid interface" do
74
+ type = finder.find("NamedEntity")
75
+ assert_equal "NamedEntity", type.name
76
+ end
77
+
78
+ it "finds a valid input type" do
79
+ type = finder.find("LegacyInput")
80
+ assert_equal "LegacyInput", type.name
81
+ end
82
+
83
+ it "finds a valid input field" do
84
+ input_field = finder.find("LegacyInput.intValue")
85
+ assert_equal "intValue", input_field.name
86
+ end
87
+
88
+ it "raises when finding an invalid input field" do
89
+ exception = assert_raises GraphQL::Schema::Finder::MemberNotFoundError do
90
+ finder.find("LegacyInput.wat")
91
+ end
92
+
93
+ assert_match /Could not find input field `wat` on input object type `LegacyInput`./, exception.message
94
+ end
95
+
96
+ it "finds a valid union type" do
97
+ type = finder.find("PerformingAct")
98
+ assert_equal "PerformingAct", type.name
99
+ end
100
+
101
+ it "raises when selecting a possible type" do
102
+ exception = assert_raises GraphQL::Schema::Finder::MemberNotFoundError do
103
+ finder.find("PerformingAct.Musician")
104
+ end
105
+
106
+ assert_match /Cannot select union possible type `Musician`. Select the type directly instead./, exception.message
107
+ end
108
+
109
+ it "finds a valid enum type" do
110
+ type = finder.find("Family")
111
+ assert_equal "Family", type.name
112
+ end
113
+
114
+ it "finds a valid enum value" do
115
+ value = finder.find("Family.BRASS")
116
+ assert_equal "BRASS", value.name
117
+ end
118
+
119
+ it "raises when finding an invalid enum value" do
120
+ exception = assert_raises GraphQL::Schema::Finder::MemberNotFoundError do
121
+ finder.find("Family.THISISNOTASTATUS")
122
+ end
123
+
124
+ assert_match /Could not find enum value `THISISNOTASTATUS` on enum type `Family`./, exception.message
125
+ end
126
+
127
+ it "raises when selecting on an enum value" do
128
+ exception = assert_raises GraphQL::Schema::Finder::MemberNotFoundError do
129
+ finder.find("Family.BRASS.wat")
130
+ end
131
+
132
+ assert_match /Cannot select member `wat` on an enum value./, exception.message
133
+ end
134
+ end
135
+ end
@@ -0,0 +1,111 @@
1
+ # frozen_string_literal: true
2
+ require "spec_helper"
3
+
4
+ describe GraphQL::Schema::InputObject do
5
+ let(:input_object) { Jazz::EnsembleInput }
6
+ describe "type info" do
7
+ it "has it" do
8
+ assert_equal "EnsembleInput", input_object.graphql_name
9
+ assert_equal nil, input_object.description
10
+ assert_equal 1, input_object.arguments.size
11
+ end
12
+
13
+ it "is the #owner of its arguments" do
14
+ argument = input_object.arguments["name"]
15
+ assert_equal input_object, argument.owner
16
+ end
17
+
18
+ it "inherits arguments" do
19
+ base_class = Class.new(GraphQL::Schema::InputObject) do
20
+ argument :arg1, String, required: true
21
+ argument :arg2, String, required: true
22
+ end
23
+
24
+ subclass = Class.new(base_class) do
25
+ argument :arg2, Integer, required: true
26
+ argument :arg3, Integer, required: true
27
+ end
28
+
29
+ assert_equal 3, subclass.arguments.size
30
+ assert_equal ["arg1", "arg2", "arg3"], subclass.arguments.keys
31
+ assert_equal ["String!", "Int!", "Int!"], subclass.arguments.values.map { |a| a.type.to_s }
32
+ end
33
+ end
34
+
35
+ describe ".to_graphql" do
36
+ it "assigns itself as the arguments_class" do
37
+ assert_equal input_object, input_object.to_graphql.arguments_class
38
+ end
39
+
40
+ it "accepts description: kwarg" do
41
+ input_obj_class = Jazz::InspectableInput
42
+ input_obj_type = input_obj_class.to_graphql
43
+ assert_equal "Test description kwarg", input_obj_type.arguments["stringValue"].description
44
+ end
45
+ end
46
+
47
+ describe "prepare: / as:" do
48
+ module InputObjectPrepareTest
49
+ class InputObj < GraphQL::Schema::InputObject
50
+ argument :a, Integer, required: true
51
+ argument :b, Integer, required: true, as: :b2
52
+ argument :c, Integer, required: true, prepare: :prep
53
+ argument :d, Integer, required: true, prepare: :prep, as: :d2
54
+ argument :e, Integer, required: true, prepare: ->(val, ctx) { val * ctx[:multiply_by] * 2 }, as: :e2
55
+
56
+ def prep(val)
57
+ val * context[:multiply_by]
58
+ end
59
+ end
60
+
61
+ class Query < GraphQL::Schema::Object
62
+ field :inputs, String, null: false do
63
+ argument :input, InputObj, required: true
64
+ end
65
+
66
+ def inputs(input:)
67
+ input.to_kwargs.inspect
68
+ end
69
+ end
70
+
71
+ class Schema < GraphQL::Schema
72
+ query(Query)
73
+ end
74
+ end
75
+
76
+ it "calls methods on the input object" do
77
+ query_str = <<-GRAPHQL
78
+ { inputs(input: { a: 1, b: 2, c: 3, d: 4, e: 5 }) }
79
+ GRAPHQL
80
+
81
+ res = InputObjectPrepareTest::Schema.execute(query_str, context: { multiply_by: 3 })
82
+ expected_obj = { a: 1, b2: 2, c: 9, d2: 12, e2: 30 }.inspect
83
+ assert_equal expected_obj, res["data"]["inputs"]
84
+ end
85
+ end
86
+
87
+ describe "in queries" do
88
+ it "is passed to the field method" do
89
+ query_str = <<-GRAPHQL
90
+ {
91
+ inspectInput(input: {
92
+ stringValue: "ABC",
93
+ legacyInput: { intValue: 4 },
94
+ nestedInput: { stringValue: "xyz"}
95
+ })
96
+ }
97
+ GRAPHQL
98
+
99
+ res = Jazz::Schema.execute(query_str, context: { message: "hi" })
100
+ expected_info = [
101
+ "Jazz::InspectableInput",
102
+ "hi, ABC, 4, (hi, xyz, -, (-))",
103
+ "ABC",
104
+ "ABC",
105
+ "true",
106
+ "ABC",
107
+ ]
108
+ assert_equal expected_info, res["data"]["inspectInput"]
109
+ end
110
+ end
111
+ end
@@ -0,0 +1,40 @@
1
+ # frozen_string_literal: true
2
+ require "spec_helper"
3
+
4
+ module InstrumentationSpec
5
+ module SomeInterface
6
+ include GraphQL::Schema::Interface
7
+ field :never_called, String, null: false
8
+
9
+ def never_called
10
+ "should never be called"
11
+ end
12
+ end
13
+
14
+ class SomeType < GraphQL::Schema::Object
15
+ implements SomeInterface
16
+ end
17
+
18
+ class Query < GraphQL::Schema::Object
19
+ field :some_field, [SomeInterface], null: true
20
+
21
+ def some_field
22
+ nil
23
+ end
24
+ end
25
+
26
+ class Schema < GraphQL::Schema
27
+ query Query
28
+ orphan_types [SomeType]
29
+ end
30
+ end
31
+
32
+ describe GraphQL::Schema::Member::Instrumentation do
33
+ describe "resolving nullable interface lists to nil" do
34
+ let(:query) { "query { someField { neverCalled } }"}
35
+ it "returns nil instead of failing" do
36
+ result = InstrumentationSpec::Schema.execute(query)
37
+ assert_nil(result["someField"])
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,185 @@
1
+ # frozen_string_literal: true
2
+ require "spec_helper"
3
+
4
+ describe GraphQL::Schema::Interface do
5
+ let(:interface) { Jazz::GloballyIdentifiableType }
6
+
7
+ describe "type info" do
8
+ it "tells its type info" do
9
+ assert_equal "GloballyIdentifiable", interface.graphql_name
10
+ assert_equal 2, interface.fields.size
11
+ end
12
+
13
+ module NewInterface1
14
+ include Jazz::GloballyIdentifiableType
15
+ end
16
+
17
+ module NewInterface2
18
+ include Jazz::GloballyIdentifiableType
19
+ def new_method
20
+ end
21
+ end
22
+
23
+ it "can override methods" do
24
+ new_object_1 = Class.new(GraphQL::Schema::Object) do
25
+ implements NewInterface1
26
+ end
27
+
28
+ assert_equal 2, new_object_1.fields.size
29
+ assert new_object_1.method_defined?(:id)
30
+
31
+ new_object_2 = Class.new(GraphQL::Schema::Object) do
32
+ graphql_name "XYZ"
33
+ implements NewInterface2
34
+ field :id, "ID", null: false, description: "The ID !!!!!"
35
+ end
36
+
37
+ assert_equal 2, new_object_2.fields.size
38
+ # It got the new method
39
+ assert new_object_2.method_defined?(:new_method)
40
+ # And the inherited method
41
+ assert new_object_2.method_defined?(:id)
42
+
43
+ # It gets an overridden description:
44
+ assert_equal "The ID !!!!!", new_object_2.graphql_definition.fields["id"].description
45
+ end
46
+ end
47
+
48
+ describe ".to_graphql" do
49
+ it "creates an InterfaceType" do
50
+ interface_type = interface.to_graphql
51
+ assert_equal "GloballyIdentifiable", interface_type.name
52
+ field = interface_type.all_fields.first
53
+ assert_equal "id", field.name
54
+ assert_equal GraphQL::ID_TYPE.to_non_null_type, field.type
55
+ assert_equal "A unique identifier for this object", field.description
56
+ assert_nil interface_type.resolve_type_proc
57
+ assert_empty interface_type.orphan_types
58
+ end
59
+
60
+ it "can specify a resolve_type method" do
61
+ interface = Module.new do
62
+ include GraphQL::Schema::Interface
63
+ graphql_name "MyInterface"
64
+
65
+ module self::DefinitionMethods # rubocop:disable Style/ClassAndModuleChildren
66
+ def resolve_type(_object, _context)
67
+ "MyType"
68
+ end
69
+ end
70
+ end
71
+
72
+ interface_type = interface.to_graphql
73
+ assert_equal "MyType", interface_type.resolve_type_proc.call(nil, nil)
74
+ end
75
+
76
+ it "can specify orphan types" do
77
+ interface = Module.new do
78
+ include GraphQL::Schema::Interface
79
+ graphql_name "MyInterface"
80
+ orphan_types Dummy::CheeseType, Dummy::HoneyType
81
+ end
82
+
83
+ interface_type = interface.to_graphql
84
+ assert_equal [Dummy::CheeseType, Dummy::HoneyType], interface_type.orphan_types
85
+ end
86
+ end
87
+
88
+ it 'supports global_id_field' do
89
+ object = Module.new do
90
+ include GraphQL::Schema::Interface
91
+ graphql_name 'GlobalIdFieldTest'
92
+ global_id_field :uuid
93
+ end.to_graphql
94
+
95
+ uuid_field = object.fields["uuid"]
96
+
97
+ assert_equal GraphQL::NonNullType, uuid_field.type.class
98
+ assert_equal GraphQL::ScalarType, uuid_field.type.unwrap.class
99
+ assert_equal(
100
+ GraphQL::Schema::Member::GraphQLTypeNames::ID,
101
+ uuid_field.type.unwrap.name
102
+ )
103
+ end
104
+
105
+ describe "using `include`" do
106
+ it "raises" do
107
+ err = assert_raises RuntimeError do
108
+ Class.new(GraphQL::Schema::Object) do
109
+ include(Jazz::GloballyIdentifiableType)
110
+ end
111
+ end
112
+
113
+ assert_includes err.message, "implements(Jazz::GloballyIdentifiableType)"
114
+ end
115
+ end
116
+
117
+ describe "in queries" do
118
+ it "works" do
119
+ query_str = <<-GRAPHQL
120
+ {
121
+ piano: find(id: "Instrument/Piano") {
122
+ id
123
+ upcasedId
124
+ ... on Instrument {
125
+ family
126
+ }
127
+ }
128
+ }
129
+ GRAPHQL
130
+
131
+ res = Jazz::Schema.execute(query_str)
132
+ expected_piano = {
133
+ "id" => "Instrument/Piano",
134
+ "upcasedId" => "INSTRUMENT/PIANO",
135
+ "family" => "KEYS",
136
+ }
137
+ assert_equal(expected_piano, res["data"]["piano"])
138
+ end
139
+
140
+ it "applies custom field attributes" do
141
+ query_str = <<-GRAPHQL
142
+ {
143
+ find(id: "Ensemble/Bela Fleck and the Flecktones") {
144
+ upcasedId
145
+ ... on Ensemble {
146
+ name
147
+ }
148
+ }
149
+ }
150
+ GRAPHQL
151
+
152
+ res = Jazz::Schema.execute(query_str)
153
+ expected_data = {
154
+ "upcasedId" => "ENSEMBLE/BELA FLECK AND THE FLECKTONES",
155
+ "name" => "Bela Fleck and the Flecktones"
156
+ }
157
+ assert_equal(expected_data, res["data"]["find"])
158
+ end
159
+ end
160
+
161
+ describe ':DefinitionMethods' do
162
+ module InterfaceA
163
+ include GraphQL::Schema::Interface
164
+ end
165
+
166
+ module InterfaceB
167
+ include GraphQL::Schema::Interface
168
+ end
169
+
170
+ module InterfaceC
171
+ include GraphQL::Schema::Interface
172
+ end
173
+
174
+ it "doesn't overwrite them when including multiple interfaces" do
175
+ def_methods = InterfaceC::DefinitionMethods
176
+
177
+ InterfaceC.module_eval do
178
+ include InterfaceA
179
+ include InterfaceB
180
+ end
181
+
182
+ assert_equal(InterfaceC::DefinitionMethods, def_methods)
183
+ end
184
+ end
185
+ end
@@ -0,0 +1,39 @@
1
+ # frozen_string_literal: true
2
+ require "spec_helper"
3
+
4
+ describe GraphQL::Schema::IntrospectionSystem do
5
+ describe "custom introspection" do
6
+ it "serves custom fields on types" do
7
+ res = Jazz::Schema.execute("{ __schema { isJazzy } }")
8
+ assert_equal true, res["data"]["__schema"]["isJazzy"]
9
+ end
10
+
11
+ it "serves overridden fields on types" do
12
+ res = Jazz::Schema.execute(%|{ __type(name: "Ensemble") { name } }|)
13
+ assert_equal "ENSEMBLE", res["data"]["__type"]["name"]
14
+ end
15
+
16
+ it "serves custom entry points" do
17
+ res = Jazz::Schema.execute("{ __classname }", root_value: Set.new)
18
+ assert_equal "Set", res["data"]["__classname"]
19
+ end
20
+
21
+ it "serves custom dynamic fields" do
22
+ res = Jazz::Schema.execute("{ nowPlaying { __typename __typenameLength __astNodeClass } }")
23
+ assert_equal "Ensemble", res["data"]["nowPlaying"]["__typename"]
24
+ assert_equal 8, res["data"]["nowPlaying"]["__typenameLength"]
25
+ assert_equal "GraphQL::Language::Nodes::Field", res["data"]["nowPlaying"]["__astNodeClass"]
26
+ end
27
+
28
+ it "doesn't affect other schemas" do
29
+ res = Dummy::Schema.execute("{ __schema { isJazzy } }")
30
+ assert_equal 1, res["errors"].length
31
+
32
+ res = Dummy::Schema.execute("{ __classname }", root_value: Set.new)
33
+ assert_equal 1, res["errors"].length
34
+
35
+ res = Dummy::Schema.execute("{ ensembles { __typenameLength } }")
36
+ assert_equal 1, res["errors"].length
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,111 @@
1
+ # frozen_string_literal: true
2
+ require "spec_helper"
3
+
4
+ describe GraphQL::Schema::Member::AcceptsDefinition do
5
+ class AcceptsDefinitionSchema < GraphQL::Schema
6
+ accepts_definition :set_metadata
7
+ set_metadata :a, 999
8
+
9
+ class BaseField < GraphQL::Schema::Field
10
+ class BaseField < GraphQL::Schema::Argument
11
+ accepts_definition :metadata
12
+ end
13
+ argument_class BaseField
14
+ accepts_definition :metadata
15
+ end
16
+
17
+ GraphQL::Schema::Object.accepts_definition(:metadata2)
18
+
19
+ class BaseObject < GraphQL::Schema::Object
20
+ field_class BaseField
21
+ accepts_definition :metadata
22
+ end
23
+
24
+ GraphQL::Schema::Interface.accepts_definition(:metadata2)
25
+
26
+ module BaseInterface
27
+ include GraphQL::Schema::Interface
28
+ field_class BaseField
29
+ accepts_definition :metadata
30
+ end
31
+
32
+ class Option < GraphQL::Schema::Enum
33
+ class EnumValue < GraphQL::Schema::EnumValue
34
+ accepts_definition :metadata
35
+ end
36
+ enum_value_class EnumValue
37
+ accepts_definition :metadata
38
+ metadata :a, 123
39
+ value "A", metadata: [:a, 456]
40
+ value "B"
41
+ end
42
+
43
+ module Thing
44
+ include BaseInterface
45
+ metadata :z, 888
46
+ metadata2 :a, :bc
47
+ end
48
+
49
+ module Thing2
50
+ include Thing
51
+ end
52
+
53
+ class SomeObject < BaseObject
54
+ metadata :a, :aaa
55
+ end
56
+
57
+ class SomeObject2 < SomeObject
58
+ end
59
+
60
+ class Query < BaseObject
61
+ metadata :a, :abc
62
+ metadata2 :xyz, :zyx
63
+
64
+ field :option, Option, null: false do
65
+ metadata :a, :def
66
+ argument :value, Integer, required: true, metadata: [:a, :ghi]
67
+ end
68
+
69
+ field :thing, Thing, null: false
70
+ field :thing2, Thing2, null: false
71
+ field :some_object, SomeObject, null: false
72
+ field :some_object2, SomeObject2, null: false
73
+ end
74
+
75
+ query(Query)
76
+ end
77
+
78
+ it "passes along configs for types" do
79
+ assert_equal [:a, 123], AcceptsDefinitionSchema::Option.metadata
80
+ assert_equal 123, AcceptsDefinitionSchema::Option.graphql_definition.metadata[:a]
81
+ assert_equal [:a, :abc], AcceptsDefinitionSchema::Query.metadata
82
+ assert_equal :abc, AcceptsDefinitionSchema::Query.graphql_definition.metadata[:a]
83
+ assert_equal :zyx, AcceptsDefinitionSchema::Query.graphql_definition.metadata[:xyz]
84
+
85
+ assert_equal [:z, 888], AcceptsDefinitionSchema::Thing.metadata
86
+ assert_equal 888, AcceptsDefinitionSchema::Thing.graphql_definition.metadata[:z]
87
+ assert_equal :bc, AcceptsDefinitionSchema::Thing.graphql_definition.metadata[:a]
88
+ # Interface inheritance
89
+ assert_equal [:z, 888], AcceptsDefinitionSchema::Thing2.metadata
90
+ assert_equal 888, AcceptsDefinitionSchema::Thing2.graphql_definition.metadata[:z]
91
+ assert_equal :bc, AcceptsDefinitionSchema::Thing2.graphql_definition.metadata[:a]
92
+
93
+ # Object inheritance
94
+ assert_equal :aaa, AcceptsDefinitionSchema::SomeObject.graphql_definition.metadata[:a]
95
+ assert_equal :aaa, AcceptsDefinitionSchema::SomeObject2.graphql_definition.metadata[:a]
96
+ end
97
+
98
+ it "passes along configs for fields and arguments" do
99
+ assert_equal :def, AcceptsDefinitionSchema.find("Query.option").metadata[:a]
100
+ assert_equal :ghi, AcceptsDefinitionSchema.find("Query.option.value").metadata[:a]
101
+ end
102
+
103
+ it "passes along configs for enum values" do
104
+ assert_equal 456, AcceptsDefinitionSchema.find("Option.A").metadata[:a]
105
+ assert_nil AcceptsDefinitionSchema.find("Option.B").metadata[:a]
106
+ end
107
+
108
+ it "passes along configs for schemas" do
109
+ assert_equal 999, AcceptsDefinitionSchema.graphql_definition.metadata[:a]
110
+ end
111
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+ require "spec_helper"
3
+
4
+ describe GraphQL::Schema::Member::BuildType do
5
+ describe ".to_type_name" do
6
+ it "works with lists and non-nulls" do
7
+ t = Class.new(GraphQL::Schema::Object) do
8
+ graphql_name "T"
9
+ end
10
+
11
+ req_t = GraphQL::Schema::NonNull.new(t)
12
+ list_req_t = GraphQL::Schema::List.new(req_t)
13
+
14
+ assert_equal "T", GraphQL::Schema::Member::BuildType.to_type_name(list_req_t)
15
+ end
16
+ end
17
+ end