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
@@ -2,7 +2,7 @@
2
2
  require "spec_helper"
3
3
 
4
4
  describe GraphQL::ObjectType do
5
- let(:type) { Dummy::CheeseType }
5
+ let(:type) { Dummy::Cheese.graphql_definition }
6
6
 
7
7
  it "doesn't allow double non-null constraints" do
8
8
  assert_raises(GraphQL::DoubleNonNullTypeError) {
@@ -45,10 +45,10 @@ describe GraphQL::ObjectType do
45
45
  describe "interfaces" do
46
46
  it "may have interfaces" do
47
47
  assert_equal([
48
- Dummy::EdibleInterface,
49
- Dummy::EdibleAsMilkInterface,
50
- Dummy::AnimalProductInterface,
51
- Dummy::LocalProductInterface
48
+ Dummy::Edible.graphql_definition,
49
+ Dummy::EdibleAsMilk.graphql_definition,
50
+ Dummy::AnimalProduct.graphql_definition,
51
+ Dummy::LocalProduct.graphql_definition
52
52
  ], type.interfaces)
53
53
  end
54
54
 
@@ -85,7 +85,7 @@ describe GraphQL::ObjectType do
85
85
  end
86
86
 
87
87
  it "accepts fields definition" do
88
- last_produced_dairy = GraphQL::Field.define(name: :last_produced_dairy, type: Dummy::DairyProductUnion)
88
+ last_produced_dairy = GraphQL::Field.define(name: :last_produced_dairy, type: Dummy::DairyProduct)
89
89
  cow_type = GraphQL::ObjectType.define(name: "Cow", fields: [last_produced_dairy])
90
90
  assert_equal([last_produced_dairy], cow_type.fields)
91
91
  end
@@ -94,54 +94,54 @@ describe GraphQL::ObjectType do
94
94
  it "adds an interface" do
95
95
  type = GraphQL::ObjectType.define do
96
96
  name 'Hello'
97
- implements Dummy::EdibleInterface
98
- implements Dummy::AnimalProductInterface
97
+ implements Dummy::Edible
98
+ implements Dummy::AnimalProduct
99
99
 
100
100
  field :hello, types.String
101
101
  end
102
102
 
103
- assert_equal([Dummy::EdibleInterface, Dummy::AnimalProductInterface], type.interfaces)
103
+ assert_equal([Dummy::Edible.graphql_definition, Dummy::AnimalProduct.graphql_definition], type.interfaces)
104
104
  end
105
105
 
106
106
  it "adds many interfaces" do
107
107
  type = GraphQL::ObjectType.define do
108
108
  name 'Hello'
109
- implements Dummy::EdibleInterface, Dummy::AnimalProductInterface
109
+ implements Dummy::Edible, Dummy::AnimalProduct
110
110
 
111
111
  field :hello, types.String
112
112
  end
113
113
 
114
- assert_equal([Dummy::EdibleInterface, Dummy::AnimalProductInterface], type.interfaces)
114
+ assert_equal([Dummy::Edible.graphql_definition, Dummy::AnimalProduct.graphql_definition], type.interfaces)
115
115
  end
116
116
 
117
117
  it "preserves existing interfaces and appends a new one" do
118
118
  type = GraphQL::ObjectType.define do
119
119
  name 'Hello'
120
- interfaces [Dummy::EdibleInterface]
121
- implements Dummy::AnimalProductInterface
120
+ interfaces [Dummy::Edible]
121
+ implements Dummy::AnimalProduct
122
122
 
123
123
  field :hello, types.String
124
124
  end
125
125
 
126
- assert_equal([Dummy::EdibleInterface, Dummy::AnimalProductInterface], type.interfaces)
126
+ assert_equal([Dummy::Edible.graphql_definition, Dummy::AnimalProduct.graphql_definition], type.interfaces)
127
127
  end
128
128
 
129
129
  it "can be used to inherit fields from the interface" do
130
130
  type_1 = GraphQL::ObjectType.define do
131
131
  name 'Hello'
132
- implements Dummy::EdibleInterface
133
- implements Dummy::AnimalProductInterface
132
+ implements Dummy::Edible
133
+ implements Dummy::AnimalProduct
134
134
  end
135
135
 
136
136
  type_2 = GraphQL::ObjectType.define do
137
137
  name 'Hello'
138
- implements Dummy::EdibleInterface
139
- implements Dummy::AnimalProductInterface, inherit: true
138
+ implements Dummy::Edible
139
+ implements Dummy::AnimalProduct, inherit: true
140
140
  end
141
141
 
142
142
  type_3 = GraphQL::ObjectType.define do
143
143
  name 'Hello'
144
- implements Dummy::EdibleInterface, Dummy::AnimalProductInterface, inherit: true
144
+ implements Dummy::Edible, Dummy::AnimalProduct, inherit: true
145
145
  end
146
146
 
147
147
  assert_equal [], type_1.all_fields.map(&:name)
@@ -158,16 +158,18 @@ describe GraphQL::ObjectType do
158
158
  end
159
159
 
160
160
  it "exposes defined field property" do
161
- field_without_prop = Dummy::CheeseType.get_field("flavor")
162
- field_with_prop = Dummy::CheeseType.get_field("fatContent")
161
+ field_without_prop = Dummy::Cheese.graphql_definition.get_field("flavor")
162
+ field_with_prop = Dummy::Cheese.graphql_definition.get_field("fatContent")
163
163
  assert_equal(field_without_prop.property, nil)
164
- assert_equal(field_with_prop.property, :fat_content)
164
+ # This used to lookup `:fat_content`, but not since migrating to class-based
165
+ assert_equal(field_with_prop.property, nil)
165
166
  end
166
167
 
167
168
  it "looks up from interfaces" do
168
- field_from_self = Dummy::CheeseType.get_field("fatContent")
169
- field_from_iface = Dummy::MilkType.get_field("fatContent")
170
- assert_equal(field_from_self.property, :fat_content)
169
+ field_from_self = Dummy::Cheese.graphql_definition.get_field("fatContent")
170
+ field_from_iface = Dummy::Milk.graphql_definition.get_field("fatContent")
171
+ # This used to lookup `:fat_content`, but not since migrating to class-based
172
+ assert_equal(field_from_self.property, nil)
171
173
  assert_equal(field_from_iface.property, nil)
172
174
  end
173
175
  end
@@ -175,6 +177,9 @@ describe GraphQL::ObjectType do
175
177
  describe "#dup" do
176
178
  it "copies fields and interfaces without altering the original" do
177
179
  type.interfaces # load the internal cache
180
+ assert_equal 4, type.interfaces.size
181
+ assert_equal 9, type.fields.size
182
+
178
183
  type_2 = type.dup
179
184
 
180
185
  # IRL, use `+=`, not this
@@ -185,8 +190,8 @@ describe GraphQL::ObjectType do
185
190
 
186
191
  assert_equal 4, type.interfaces.size
187
192
  assert_equal 5, type_2.interfaces.size
188
- assert_equal 8, type.fields.size
189
- assert_equal 9, type_2.fields.size
193
+ assert_equal 9, type.fields.size
194
+ assert_equal 10, type_2.fields.size
190
195
  end
191
196
  end
192
197
  end
@@ -121,6 +121,27 @@ describe GraphQL::Query::Arguments do
121
121
  end
122
122
  end
123
123
 
124
+ describe "#dig" do
125
+ it "returns the value at that key" do
126
+ assert_equal 1, arguments.dig("a")
127
+ assert_equal 1, arguments.dig(:a)
128
+ assert arguments.dig("inputObject").is_a?(GraphQL::Query::Arguments)
129
+ end
130
+
131
+ it "works with nested keys" do
132
+ assert_equal 3, arguments.dig("inputObject", "d")
133
+ assert_equal 3, arguments.dig(:inputObject, :d)
134
+ assert_equal 3, arguments.dig("inputObject", :d)
135
+ assert_equal 3, arguments.dig(:inputObject, "d")
136
+ end
137
+
138
+ it "returns nil for missing keys" do
139
+ assert_nil arguments.dig("z")
140
+ assert_nil arguments.dig(7)
141
+ end
142
+ end
143
+
144
+
124
145
  describe "#key?" do
125
146
  let(:arg_values) { [] }
126
147
  let(:schema) {
@@ -217,6 +217,34 @@ TABLE
217
217
  end
218
218
  end
219
219
 
220
+ describe "read values" do
221
+ let(:context) { GraphQL::Query::Context.new(query: OpenStruct.new(schema: schema), values: {a: {b: 1}}, object: nil) }
222
+
223
+ it "allows you to read values of contexts using []" do
224
+ assert_equal({b: 1}, context[:a])
225
+ end
226
+
227
+ it "allows you to read values of contexts using dig" do
228
+ if RUBY_VERSION >= '2.3.0'
229
+ assert_equal(1, context.dig(:a, :b))
230
+ else
231
+ assert_raises NoMethodError do
232
+ context.dig(:a, :b)
233
+ end
234
+ end
235
+ end
236
+ end
237
+
238
+ describe "splatting" do
239
+ let(:context) { GraphQL::Query::Context.new(query: OpenStruct.new(schema: schema), values: {a: {b: 1}}, object: nil) }
240
+
241
+ let(:splat) { ->(**context) { context } }
242
+
243
+ it "runs successfully" do
244
+ assert_equal({a: { b: 1 }}, splat.call(context))
245
+ end
246
+ end
247
+
220
248
  describe "accessing context after the fact" do
221
249
  let(:query_string) { %|
222
250
  { pushContext }
@@ -110,7 +110,7 @@ describe GraphQL::Query::Executor do
110
110
  DummyQueryType = GraphQL::ObjectType.define do
111
111
  name "Query"
112
112
  field :dairy do
113
- type Dummy::DairyType
113
+ type Dummy::Dairy.graphql_definition
114
114
  resolve ->(t, a, c) {
115
115
  raise if resolved
116
116
  resolved = true
@@ -119,7 +119,7 @@ describe GraphQL::Query::Executor do
119
119
  end
120
120
  end
121
121
 
122
- GraphQL::Schema.define(query: DummyQueryType, mutation: Dummy::DairyAppMutationType, resolve_type: ->(a,b,c) { :pass }, id_from_object: :pass)
122
+ GraphQL::Schema.define(query: DummyQueryType, mutation: Dummy::DairyAppMutation.graphql_definition, resolve_type: ->(a,b,c) { :pass }, id_from_object: :pass)
123
123
  }
124
124
  let(:variables) { nil }
125
125
  let(:query_string) { %|
@@ -186,29 +186,31 @@ describe GraphQL::Query::Executor do
186
186
  end
187
187
  end
188
188
 
189
- describe "if the schema has a rescue handler" do
190
- before do
191
- # HACK: reach to the underlying instance to perform a side-effect
192
- schema.graphql_definition.rescue_from(RuntimeError) { "Error was handled!" }
193
- end
189
+ if TESTING_RESCUE_FROM
190
+ describe "if the schema has a rescue handler" do
191
+ before do
192
+ # HACK: reach to the underlying instance to perform a side-effect
193
+ schema.graphql_definition.rescue_from(RuntimeError) { "Error was handled!" }
194
+ end
194
195
 
195
- after do
196
- # remove the handler from the middleware:
197
- schema.remove_handler(RuntimeError)
198
- end
196
+ after do
197
+ # remove the handler from the middleware:
198
+ schema.remove_handler(RuntimeError)
199
+ end
199
200
 
200
- it "adds to the errors key" do
201
- expected = {
202
- "data" => {"error" => nil},
203
- "errors"=>[
204
- {
205
- "message"=>"Error was handled!",
206
- "locations" => [{"line"=>1, "column"=>17}],
207
- "path"=>["error"]
208
- }
209
- ]
210
- }
211
- assert_equal(expected, result)
201
+ it "adds to the errors key" do
202
+ expected = {
203
+ "data" => {"error" => nil},
204
+ "errors"=>[
205
+ {
206
+ "message"=>"Error was handled!",
207
+ "locations" => [{"line"=>1, "column"=>17}],
208
+ "path"=>["error"]
209
+ }
210
+ ]
211
+ }
212
+ assert_equal(expected, result)
213
+ end
212
214
  end
213
215
  end
214
216
  end
@@ -255,10 +257,10 @@ describe GraphQL::Query::Executor do
255
257
  {
256
258
  "message" => "Variable input of type ReplaceValuesInput! was provided invalid value",
257
259
  "locations" => [{ "line" => 1, "column" => 13 }],
258
- "value" => nil,
259
- "problems" => [
260
- { "path" => [], "explanation" => "Expected value to not be null" }
261
- ]
260
+ "extensions" => {
261
+ "value" => nil,
262
+ "problems" => [{ "path" => [], "explanation" => "Expected value to not be null" }]
263
+ }
262
264
  }
263
265
  ]
264
266
  }
@@ -275,10 +277,10 @@ describe GraphQL::Query::Executor do
275
277
  {
276
278
  "message" => "Variable input of type ReplaceValuesInput! was provided invalid value",
277
279
  "locations" => [{ "line" => 1, "column" => 13 }],
278
- "value" => {},
279
- "problems" => [
280
- { "path" => ["values"], "explanation" => "Expected value to not be null" }
281
- ]
280
+ "extensions" => {
281
+ "value" => {},
282
+ "problems" => [{ "path" => ["values"], "explanation" => "Expected value to not be null" }]
283
+ }
282
284
  }
283
285
  ]
284
286
  }
@@ -295,11 +297,13 @@ describe GraphQL::Query::Executor do
295
297
  {
296
298
  "message" => "Variable input of type [DairyProductInput] was provided invalid value",
297
299
  "locations" => [{ "line" => 1, "column" => 10 }],
298
- "value" => [{ "foo" => "bar" }],
299
- "problems" => [
300
- { "path" => [0, "foo"], "explanation" => "Field is not defined on DairyProductInput" },
301
- { "path" => [0, "source"], "explanation" => "Expected value to not be null" }
302
- ]
300
+ "extensions" => {
301
+ "value" => [{ "foo" => "bar" }],
302
+ "problems" => [
303
+ { "path" => [0, "foo"], "explanation" => "Field is not defined on DairyProductInput" },
304
+ { "path" => [0, "source"], "explanation" => "Expected value to not be null" }
305
+ ]
306
+ }
303
307
  }
304
308
  ]
305
309
  }
@@ -435,8 +435,10 @@ describe GraphQL::Query do
435
435
  {
436
436
  "message" => "Variable cheeseId of type Int! was provided invalid value",
437
437
  "locations"=>[{ "line" => 2, "column" => 23 }],
438
- "value" => "2",
439
- "problems" => [{ "path" => [], "explanation" => 'Could not coerce value "2" to Int' }]
438
+ "extensions" => {
439
+ "value" => "2",
440
+ "problems" => [{ "path" => [], "explanation" => 'Could not coerce value "2" to Int' }]
441
+ }
440
442
  }
441
443
  ]
442
444
  }
@@ -453,8 +455,10 @@ describe GraphQL::Query do
453
455
  {
454
456
  "message" => "Variable cheeseId of type Int! was provided invalid value",
455
457
  "locations" => [{"line" => 2, "column" => 23}],
456
- "value" => nil,
457
- "problems" => [{ "path" => [], "explanation" => "Expected value to not be null" }]
458
+ "extensions" => {
459
+ "value" => nil,
460
+ "problems" => [{ "path" => [], "explanation" => "Expected value to not be null" }]
461
+ }
458
462
  }
459
463
  ]
460
464
  }
@@ -471,8 +475,10 @@ describe GraphQL::Query do
471
475
  {
472
476
  "message" => "Variable cheeseId of type Int! was provided invalid value",
473
477
  "locations" => [{"line" => 2, "column" => 23}],
474
- "value" => nil,
475
- "problems" => [{ "path" => [], "explanation" => "Expected value to not be null" }]
478
+ "extensions" => {
479
+ "value" => nil,
480
+ "problems" => [{ "path" => [], "explanation" => "Expected value to not be null" }]
481
+ }
476
482
  }
477
483
  ]
478
484
  }
@@ -13,6 +13,15 @@ describe GraphQL::Schema::Argument do
13
13
 
14
14
  argument :aliased_arg, String, required: false, as: :renamed
15
15
  argument :prepared_arg, Int, required: false, prepare: :multiply
16
+ argument :prepared_by_proc_arg, Int, required: false, prepare: ->(val, context) { context[:multiply_by] * val }
17
+
18
+ class Multiply
19
+ def call(val, context)
20
+ context[:multiply_by] * val
21
+ end
22
+ end
23
+
24
+ argument :prepared_by_callable_arg, Int, required: false, prepare: Multiply.new
16
25
  end
17
26
 
18
27
  def field(**args)
@@ -26,10 +35,17 @@ describe GraphQL::Schema::Argument do
26
35
 
27
36
  class Schema < GraphQL::Schema
28
37
  query(Query)
38
+ if TESTING_INTERPRETER
39
+ use GraphQL::Execution::Interpreter
40
+ end
29
41
  end
30
42
  end
31
43
 
32
-
44
+ describe "#path" do
45
+ it "includes type, field and argument names" do
46
+ assert_equal "Query.field.argWithBlock", SchemaArgumentTest::Query.fields["field"].arguments["argWithBlock"].path
47
+ end
48
+ end
33
49
 
34
50
  describe "#name" do
35
51
  it "reflects camelization" do
@@ -89,5 +105,23 @@ describe GraphQL::Schema::Argument do
89
105
  # Make sure it's getting the renamed symbol:
90
106
  assert_equal '{:prepared_arg=>15}', res["data"]["field"]
91
107
  end
108
+ it "calls the method on the provided Proc" do
109
+ query_str = <<-GRAPHQL
110
+ { field(preparedByProcArg: 5) }
111
+ GRAPHQL
112
+
113
+ res = SchemaArgumentTest::Schema.execute(query_str, context: {multiply_by: 3})
114
+ # Make sure it's getting the renamed symbol:
115
+ assert_equal '{:prepared_by_proc_arg=>15}', res["data"]["field"]
116
+ end
117
+ it "calls the method on the provided callable object" do
118
+ query_str = <<-GRAPHQL
119
+ { field(preparedByCallableArg: 5) }
120
+ GRAPHQL
121
+
122
+ res = SchemaArgumentTest::Schema.execute(query_str, context: {multiply_by: 3})
123
+ # Make sure it's getting the renamed symbol:
124
+ assert_equal '{:prepared_by_callable_arg=>15}', res["data"]["field"]
125
+ end
92
126
  end
93
127
  end
@@ -60,37 +60,114 @@ type Hello {
60
60
  build_schema_and_compare_output(schema.chop)
61
61
  end
62
62
 
63
- it 'supports descriptions' do
63
+ it 'supports descriptions and definition_line' do
64
64
  schema = <<-SCHEMA
65
65
  schema {
66
66
  query: Hello
67
67
  }
68
68
 
69
- # This is a directive
69
+ """
70
+ This is a directive
71
+ """
70
72
  directive @foo(
71
- # It has an argument
73
+ """
74
+ It has an argument
75
+ """
72
76
  arg: Int
73
77
  ) on FIELD
74
78
 
75
- # With an enum
79
+ """
80
+ With an enum
81
+ """
76
82
  enum Color {
77
83
  BLUE
78
84
 
79
- # Not a creative color
85
+ """
86
+ Not a creative color
87
+ """
80
88
  GREEN
81
89
  RED
82
90
  }
83
91
 
84
- # What a great type
85
- type Hello {
86
- anEnum: Color
92
+ """
93
+ What a great type
94
+ """
95
+ type Hello implements I {
96
+ anEnum(s: S): Color
87
97
 
88
- # And a field to boot
89
- str: String
98
+ """
99
+ And a field to boot
100
+ """
101
+ str(i: Input): String
102
+ }
103
+
104
+ """
105
+ An interface
106
+ """
107
+ interface I {
108
+ str(i: Input): String
90
109
  }
110
+
111
+ """
112
+ And an Input
113
+ """
114
+ input Input {
115
+ s: String
116
+ }
117
+
118
+ """
119
+ A scalar
120
+ """
121
+ scalar S
122
+
123
+ """
124
+ And a union
125
+ """
126
+ union U = Hello
91
127
  SCHEMA
92
128
 
93
129
  build_schema_and_compare_output(schema.chop)
130
+
131
+ built_schema = GraphQL::Schema.from_definition(schema)
132
+ # The schema's are the same since there's no description
133
+ assert_equal 1, built_schema.ast_node.line
134
+ assert_equal 1, built_schema.ast_node.definition_line
135
+
136
+ # These account for description:
137
+ assert_equal 5, built_schema.directives["foo"].ast_node.line, "The ast_node.line points to the description"
138
+ assert_equal 8, built_schema.directives["foo"].ast_node.definition_line, "The ast_node.definition_line points to the definition"
139
+
140
+ arg = built_schema.directives["foo"].arguments["arg"]
141
+ assert_equal 9, arg.ast_node.line
142
+ assert_equal 12, arg.ast_node.definition_line
143
+
144
+ enum_type = built_schema.types["Color"]
145
+ assert_equal 15, enum_type.ast_node.line, "The ast_node.line points to the description"
146
+ assert_equal 18, enum_type.ast_node.definition_line, "The ast_node.definition_line points to the definition"
147
+
148
+ enum_value = enum_type.values["GREEN"]
149
+ assert_equal 21, enum_value.ast_node.line
150
+ assert_equal 24, enum_value.ast_node.definition_line
151
+
152
+ obj_type = built_schema.types["Hello"]
153
+ assert_equal 28, obj_type.ast_node.line, "The ast_node.line points to the description"
154
+ assert_equal 31, obj_type.ast_node.definition_line, "The ast_node.definition_line points to the definition"
155
+
156
+ field = obj_type.fields["str"]
157
+ assert_equal 34, field.ast_node.line
158
+ assert_equal 37, field.ast_node.definition_line
159
+
160
+ assert_equal 40, built_schema.types["I"].ast_node.line
161
+ assert_equal 43, built_schema.types["I"].ast_node.definition_line
162
+
163
+ assert_equal 47, built_schema.types["Input"].ast_node.line
164
+ assert_equal 50, built_schema.types["Input"].ast_node.definition_line
165
+
166
+ assert_equal 54, built_schema.types["S"].ast_node.line
167
+ assert_equal 57, built_schema.types["S"].ast_node.definition_line
168
+
169
+ assert_equal 59, built_schema.types["U"].ast_node.line
170
+ assert_equal 62, built_schema.types["U"].ast_node.definition_line
94
171
  end
95
172
 
96
173
  it 'maintains built-in directives' do
@@ -233,64 +310,102 @@ type Organization {
233
310
  email: String
234
311
  }
235
312
 
236
- # The connection type for Organization.
313
+ """
314
+ The connection type for Organization.
315
+ """
237
316
  type OrganizationConnection {
238
- # A list of edges.
317
+ """
318
+ A list of edges.
319
+ """
239
320
  edges: [OrganizationEdge]
240
321
 
241
- # A list of nodes.
322
+ """
323
+ A list of nodes.
324
+ """
242
325
  nodes: [Organization]
243
326
 
244
- # Information to aid in pagination.
327
+ """
328
+ Information to aid in pagination.
329
+ """
245
330
  pageInfo: PageInfo!
246
331
 
247
- # Identifies the total count of items in the connection.
332
+ """
333
+ Identifies the total count of items in the connection.
334
+ """
248
335
  totalCount: Int!
249
336
  }
250
337
 
251
- # An edge in a connection.
338
+ """
339
+ An edge in a connection.
340
+ """
252
341
  type OrganizationEdge {
253
- # A cursor for use in pagination.
342
+ """
343
+ A cursor for use in pagination.
344
+ """
254
345
  cursor: String!
255
346
 
256
- # The item at the end of the edge.
347
+ """
348
+ The item at the end of the edge.
349
+ """
257
350
  node: Organization
258
351
  }
259
352
 
260
- # Information about pagination in a connection.
353
+ """
354
+ Information about pagination in a connection.
355
+ """
261
356
  type PageInfo {
262
- # When paginating forwards, the cursor to continue.
357
+ """
358
+ When paginating forwards, the cursor to continue.
359
+ """
263
360
  endCursor: String
264
361
 
265
- # When paginating forwards, are there more items?
362
+ """
363
+ When paginating forwards, are there more items?
364
+ """
266
365
  hasNextPage: Boolean!
267
366
 
268
- # When paginating backwards, are there more items?
367
+ """
368
+ When paginating backwards, are there more items?
369
+ """
269
370
  hasPreviousPage: Boolean!
270
371
 
271
- # When paginating backwards, the cursor to continue.
372
+ """
373
+ When paginating backwards, the cursor to continue.
374
+ """
272
375
  startCursor: String
273
376
  }
274
377
 
275
378
  type Type {
276
379
  name: String
277
380
  organization(
278
- # The login of the organization to find.
381
+ """
382
+ The login of the organization to find.
383
+ """
279
384
  login: String!
280
385
  ): Organization
281
386
 
282
- # A list of organizations the user belongs to.
387
+ """
388
+ A list of organizations the user belongs to.
389
+ """
283
390
  organizations(
284
- # Returns the elements in the list that come after the specified cursor.
391
+ """
392
+ Returns the elements in the list that come after the specified cursor.
393
+ """
285
394
  after: String
286
395
 
287
- # Returns the elements in the list that come before the specified cursor.
396
+ """
397
+ Returns the elements in the list that come before the specified cursor.
398
+ """
288
399
  before: String
289
400
 
290
- # Returns the first _n_ elements from the list.
401
+ """
402
+ Returns the first _n_ elements from the list.
403
+ """
291
404
  first: Int
292
405
 
293
- # Returns the last _n_ elements from the list.
406
+ """
407
+ Returns the last _n_ elements from the list.
408
+ """
294
409
  last: Int
295
410
  ): OrganizationConnection!
296
411
  }