graphql 1.9.11 → 1.9.12

Sign up to get free protection for your applications and to get access to all the features.
Files changed (286) hide show
  1. checksums.yaml +4 -4
  2. data/lib/graphql/analysis/ast/query_complexity.rb +0 -8
  3. data/lib/graphql/analysis/ast/query_depth.rb +0 -8
  4. data/lib/graphql/analysis/ast/visitor.rb +26 -24
  5. data/lib/graphql/execution.rb +1 -0
  6. data/lib/graphql/execution/errors.rb +60 -0
  7. data/lib/graphql/execution/interpreter/runtime.rb +21 -17
  8. data/lib/graphql/static_validation/rules/fields_will_merge.rb +15 -8
  9. data/lib/graphql/version.rb +1 -1
  10. metadata +5 -556
  11. data/spec/dummy/Gemfile +0 -12
  12. data/spec/dummy/README.md +0 -24
  13. data/spec/dummy/Rakefile +0 -7
  14. data/spec/dummy/app/assets/config/manifest.js +0 -1
  15. data/spec/dummy/app/assets/javascripts/application.js +0 -66
  16. data/spec/dummy/app/channels/application_cable/channel.rb +0 -5
  17. data/spec/dummy/app/channels/application_cable/connection.rb +0 -5
  18. data/spec/dummy/app/channels/graphql_channel.rb +0 -116
  19. data/spec/dummy/app/controllers/application_controller.rb +0 -4
  20. data/spec/dummy/app/controllers/pages_controller.rb +0 -5
  21. data/spec/dummy/app/helpers/application_helper.rb +0 -3
  22. data/spec/dummy/app/jobs/application_job.rb +0 -3
  23. data/spec/dummy/app/views/layouts/application.html.erb +0 -12
  24. data/spec/dummy/app/views/pages/show.html +0 -16
  25. data/spec/dummy/bin/bundle +0 -4
  26. data/spec/dummy/bin/rails +0 -5
  27. data/spec/dummy/bin/rake +0 -5
  28. data/spec/dummy/bin/setup +0 -31
  29. data/spec/dummy/bin/update +0 -27
  30. data/spec/dummy/bin/yarn +0 -12
  31. data/spec/dummy/config.ru +0 -6
  32. data/spec/dummy/config/application.rb +0 -30
  33. data/spec/dummy/config/boot.rb +0 -4
  34. data/spec/dummy/config/cable.yml +0 -10
  35. data/spec/dummy/config/environment.rb +0 -6
  36. data/spec/dummy/config/environments/development.rb +0 -40
  37. data/spec/dummy/config/environments/production.rb +0 -76
  38. data/spec/dummy/config/environments/test.rb +0 -37
  39. data/spec/dummy/config/initializers/application_controller_renderer.rb +0 -9
  40. data/spec/dummy/config/initializers/backtrace_silencers.rb +0 -8
  41. data/spec/dummy/config/initializers/cookies_serializer.rb +0 -6
  42. data/spec/dummy/config/initializers/filter_parameter_logging.rb +0 -5
  43. data/spec/dummy/config/initializers/inflections.rb +0 -17
  44. data/spec/dummy/config/initializers/mime_types.rb +0 -5
  45. data/spec/dummy/config/initializers/wrap_parameters.rb +0 -10
  46. data/spec/dummy/config/locales/en.yml +0 -33
  47. data/spec/dummy/config/puma.rb +0 -57
  48. data/spec/dummy/config/routes.rb +0 -4
  49. data/spec/dummy/config/secrets.yml +0 -32
  50. data/spec/dummy/package.json +0 -5
  51. data/spec/dummy/public/404.html +0 -67
  52. data/spec/dummy/public/422.html +0 -67
  53. data/spec/dummy/public/500.html +0 -66
  54. data/spec/dummy/public/apple-touch-icon-precomposed.png +0 -0
  55. data/spec/dummy/public/apple-touch-icon.png +0 -0
  56. data/spec/dummy/public/favicon.ico +0 -0
  57. data/spec/dummy/public/robots.txt +0 -1
  58. data/spec/dummy/test/application_system_test_case.rb +0 -6
  59. data/spec/dummy/test/system/action_cable_subscription_test.rb +0 -45
  60. data/spec/dummy/test/test_helper.rb +0 -4
  61. data/spec/fixtures/upgrader/account.original.rb +0 -19
  62. data/spec/fixtures/upgrader/account.transformed.rb +0 -20
  63. data/spec/fixtures/upgrader/blame_range.original.rb +0 -43
  64. data/spec/fixtures/upgrader/blame_range.transformed.rb +0 -30
  65. data/spec/fixtures/upgrader/date_time.original.rb +0 -24
  66. data/spec/fixtures/upgrader/date_time.transformed.rb +0 -23
  67. data/spec/fixtures/upgrader/delete_project.original.rb +0 -28
  68. data/spec/fixtures/upgrader/delete_project.transformed.rb +0 -27
  69. data/spec/fixtures/upgrader/gist_order_field.original.rb +0 -14
  70. data/spec/fixtures/upgrader/gist_order_field.transformed.rb +0 -13
  71. data/spec/fixtures/upgrader/increment_count.original.rb +0 -59
  72. data/spec/fixtures/upgrader/increment_count.transformed.rb +0 -50
  73. data/spec/fixtures/upgrader/mutation.original.rb +0 -28
  74. data/spec/fixtures/upgrader/mutation.transformed.rb +0 -28
  75. data/spec/fixtures/upgrader/photo.original.rb +0 -10
  76. data/spec/fixtures/upgrader/photo.transformed.rb +0 -12
  77. data/spec/fixtures/upgrader/release_order.original.rb +0 -15
  78. data/spec/fixtures/upgrader/release_order.transformed.rb +0 -14
  79. data/spec/fixtures/upgrader/starrable.original.rb +0 -49
  80. data/spec/fixtures/upgrader/starrable.transformed.rb +0 -46
  81. data/spec/fixtures/upgrader/subscribable.original.rb +0 -55
  82. data/spec/fixtures/upgrader/subscribable.transformed.rb +0 -51
  83. data/spec/fixtures/upgrader/type_x.original.rb +0 -65
  84. data/spec/fixtures/upgrader/type_x.transformed.rb +0 -56
  85. data/spec/graphql/analysis/analyze_query_spec.rb +0 -261
  86. data/spec/graphql/analysis/ast/field_usage_spec.rb +0 -51
  87. data/spec/graphql/analysis/ast/max_query_complexity_spec.rb +0 -120
  88. data/spec/graphql/analysis/ast/max_query_depth_spec.rb +0 -134
  89. data/spec/graphql/analysis/ast/query_complexity_spec.rb +0 -299
  90. data/spec/graphql/analysis/ast/query_depth_spec.rb +0 -108
  91. data/spec/graphql/analysis/ast_spec.rb +0 -296
  92. data/spec/graphql/analysis/field_usage_spec.rb +0 -62
  93. data/spec/graphql/analysis/max_query_complexity_spec.rb +0 -102
  94. data/spec/graphql/analysis/max_query_depth_spec.rb +0 -103
  95. data/spec/graphql/analysis/query_complexity_spec.rb +0 -301
  96. data/spec/graphql/analysis/query_depth_spec.rb +0 -81
  97. data/spec/graphql/argument_spec.rb +0 -159
  98. data/spec/graphql/authorization_spec.rb +0 -974
  99. data/spec/graphql/backtrace_spec.rb +0 -206
  100. data/spec/graphql/base_type_spec.rb +0 -171
  101. data/spec/graphql/boolean_type_spec.rb +0 -21
  102. data/spec/graphql/compatibility/execution_specification_spec.rb +0 -4
  103. data/spec/graphql/compatibility/lazy_execution_specification_spec.rb +0 -4
  104. data/spec/graphql/compatibility/query_parser_specification_spec.rb +0 -6
  105. data/spec/graphql/compatibility/schema_parser_specification_spec.rb +0 -6
  106. data/spec/graphql/define/assign_argument_spec.rb +0 -61
  107. data/spec/graphql/define/instance_definable_spec.rb +0 -203
  108. data/spec/graphql/directive/skip_directive_spec.rb +0 -9
  109. data/spec/graphql/directive_spec.rb +0 -295
  110. data/spec/graphql/enum_type_spec.rb +0 -158
  111. data/spec/graphql/execution/execute_spec.rb +0 -303
  112. data/spec/graphql/execution/instrumentation_spec.rb +0 -212
  113. data/spec/graphql/execution/interpreter_spec.rb +0 -485
  114. data/spec/graphql/execution/lazy/lazy_method_map_spec.rb +0 -57
  115. data/spec/graphql/execution/lazy_spec.rb +0 -247
  116. data/spec/graphql/execution/lookahead_spec.rb +0 -390
  117. data/spec/graphql/execution/multiplex_spec.rb +0 -222
  118. data/spec/graphql/execution/typecast_spec.rb +0 -47
  119. data/spec/graphql/execution_error_spec.rb +0 -329
  120. data/spec/graphql/field_spec.rb +0 -246
  121. data/spec/graphql/float_type_spec.rb +0 -16
  122. data/spec/graphql/function_spec.rb +0 -152
  123. data/spec/graphql/id_type_spec.rb +0 -33
  124. data/spec/graphql/input_object_type_spec.rb +0 -25
  125. data/spec/graphql/int_type_spec.rb +0 -35
  126. data/spec/graphql/interface_type_spec.rb +0 -196
  127. data/spec/graphql/internal_representation/print_spec.rb +0 -41
  128. data/spec/graphql/internal_representation/rewrite_spec.rb +0 -381
  129. data/spec/graphql/introspection/directive_type_spec.rb +0 -66
  130. data/spec/graphql/introspection/input_value_type_spec.rb +0 -144
  131. data/spec/graphql/introspection/introspection_query_spec.rb +0 -64
  132. data/spec/graphql/introspection/schema_type_spec.rb +0 -57
  133. data/spec/graphql/introspection/type_type_spec.rb +0 -155
  134. data/spec/graphql/language/block_string_spec.rb +0 -70
  135. data/spec/graphql/language/definition_slice_spec.rb +0 -226
  136. data/spec/graphql/language/document_from_schema_definition_spec.rb +0 -770
  137. data/spec/graphql/language/equality_spec.rb +0 -84
  138. data/spec/graphql/language/generation_spec.rb +0 -38
  139. data/spec/graphql/language/lexer_spec.rb +0 -153
  140. data/spec/graphql/language/nodes_spec.rb +0 -67
  141. data/spec/graphql/language/parser_spec.rb +0 -183
  142. data/spec/graphql/language/printer_spec.rb +0 -215
  143. data/spec/graphql/language/visitor_spec.rb +0 -419
  144. data/spec/graphql/list_type_spec.rb +0 -57
  145. data/spec/graphql/non_null_type_spec.rb +0 -48
  146. data/spec/graphql/object_type_spec.rb +0 -197
  147. data/spec/graphql/query/arguments_spec.rb +0 -346
  148. data/spec/graphql/query/context_spec.rb +0 -292
  149. data/spec/graphql/query/executor_spec.rb +0 -341
  150. data/spec/graphql/query/literal_input_spec.rb +0 -91
  151. data/spec/graphql/query/result_spec.rb +0 -29
  152. data/spec/graphql/query/serial_execution/value_resolution_spec.rb +0 -109
  153. data/spec/graphql/query_spec.rb +0 -803
  154. data/spec/graphql/rake_task_spec.rb +0 -59
  155. data/spec/graphql/scalar_type_spec.rb +0 -66
  156. data/spec/graphql/schema/argument_spec.rb +0 -186
  157. data/spec/graphql/schema/build_from_definition_spec.rb +0 -1197
  158. data/spec/graphql/schema/catchall_middleware_spec.rb +0 -32
  159. data/spec/graphql/schema/directive/feature_spec.rb +0 -81
  160. data/spec/graphql/schema/directive/transform_spec.rb +0 -39
  161. data/spec/graphql/schema/enum_spec.rb +0 -83
  162. data/spec/graphql/schema/enum_value_spec.rb +0 -24
  163. data/spec/graphql/schema/field_extension_spec.rb +0 -159
  164. data/spec/graphql/schema/field_spec.rb +0 -319
  165. data/spec/graphql/schema/finder_spec.rb +0 -135
  166. data/spec/graphql/schema/input_object_spec.rb +0 -421
  167. data/spec/graphql/schema/instrumentation_spec.rb +0 -43
  168. data/spec/graphql/schema/interface_spec.rb +0 -215
  169. data/spec/graphql/schema/introspection_system_spec.rb +0 -80
  170. data/spec/graphql/schema/list_spec.rb +0 -73
  171. data/spec/graphql/schema/loader_spec.rb +0 -350
  172. data/spec/graphql/schema/member/accepts_definition_spec.rb +0 -115
  173. data/spec/graphql/schema/member/build_type_spec.rb +0 -63
  174. data/spec/graphql/schema/member/scoped_spec.rb +0 -217
  175. data/spec/graphql/schema/member/type_system_helpers_spec.rb +0 -63
  176. data/spec/graphql/schema/middleware_chain_spec.rb +0 -57
  177. data/spec/graphql/schema/mutation_spec.rb +0 -150
  178. data/spec/graphql/schema/non_null_spec.rb +0 -46
  179. data/spec/graphql/schema/object_spec.rb +0 -355
  180. data/spec/graphql/schema/printer_spec.rb +0 -883
  181. data/spec/graphql/schema/relay_classic_mutation_spec.rb +0 -252
  182. data/spec/graphql/schema/rescue_middleware_spec.rb +0 -88
  183. data/spec/graphql/schema/resolver_spec.rb +0 -743
  184. data/spec/graphql/schema/scalar_spec.rb +0 -101
  185. data/spec/graphql/schema/subscription_spec.rb +0 -505
  186. data/spec/graphql/schema/timeout_middleware_spec.rb +0 -188
  187. data/spec/graphql/schema/timeout_spec.rb +0 -206
  188. data/spec/graphql/schema/traversal_spec.rb +0 -222
  189. data/spec/graphql/schema/type_expression_spec.rb +0 -39
  190. data/spec/graphql/schema/union_spec.rb +0 -72
  191. data/spec/graphql/schema/unique_within_type_spec.rb +0 -44
  192. data/spec/graphql/schema/validation_spec.rb +0 -355
  193. data/spec/graphql/schema/warden_spec.rb +0 -926
  194. data/spec/graphql/schema_spec.rb +0 -169
  195. data/spec/graphql/static_validation/rules/argument_literals_are_compatible_spec.rb +0 -466
  196. data/spec/graphql/static_validation/rules/argument_names_are_unique_spec.rb +0 -44
  197. data/spec/graphql/static_validation/rules/arguments_are_defined_spec.rb +0 -112
  198. data/spec/graphql/static_validation/rules/directives_are_defined_spec.rb +0 -35
  199. data/spec/graphql/static_validation/rules/directives_are_in_valid_locations_spec.rb +0 -42
  200. data/spec/graphql/static_validation/rules/fields_are_defined_on_type_spec.rb +0 -167
  201. data/spec/graphql/static_validation/rules/fields_have_appropriate_selections_spec.rb +0 -66
  202. data/spec/graphql/static_validation/rules/fields_will_merge_spec.rb +0 -740
  203. data/spec/graphql/static_validation/rules/fragment_names_are_unique_spec.rb +0 -28
  204. data/spec/graphql/static_validation/rules/fragment_spreads_are_possible_spec.rb +0 -52
  205. data/spec/graphql/static_validation/rules/fragment_types_exist_spec.rb +0 -42
  206. data/spec/graphql/static_validation/rules/fragments_are_finite_spec.rb +0 -123
  207. data/spec/graphql/static_validation/rules/fragments_are_named_spec.rb +0 -24
  208. data/spec/graphql/static_validation/rules/fragments_are_on_composite_types_spec.rb +0 -56
  209. data/spec/graphql/static_validation/rules/fragments_are_used_spec.rb +0 -61
  210. data/spec/graphql/static_validation/rules/mutation_root_exists_spec.rb +0 -39
  211. data/spec/graphql/static_validation/rules/no_definitions_are_present_spec.rb +0 -62
  212. data/spec/graphql/static_validation/rules/operation_names_are_valid_spec.rb +0 -82
  213. data/spec/graphql/static_validation/rules/required_arguments_are_present_spec.rb +0 -98
  214. data/spec/graphql/static_validation/rules/required_input_object_attributes_are_present_spec.rb +0 -86
  215. data/spec/graphql/static_validation/rules/subscription_root_exists_spec.rb +0 -34
  216. data/spec/graphql/static_validation/rules/unique_directives_per_location_spec.rb +0 -188
  217. data/spec/graphql/static_validation/rules/variable_default_values_are_correctly_typed_spec.rb +0 -196
  218. data/spec/graphql/static_validation/rules/variable_names_are_unique_spec.rb +0 -23
  219. data/spec/graphql/static_validation/rules/variable_usages_are_allowed_spec.rb +0 -236
  220. data/spec/graphql/static_validation/rules/variables_are_input_types_spec.rb +0 -78
  221. data/spec/graphql/static_validation/rules/variables_are_used_and_defined_spec.rb +0 -81
  222. data/spec/graphql/static_validation/type_stack_spec.rb +0 -29
  223. data/spec/graphql/static_validation/validator_spec.rb +0 -204
  224. data/spec/graphql/string_type_spec.rb +0 -80
  225. data/spec/graphql/subscriptions/serialize_spec.rb +0 -49
  226. data/spec/graphql/subscriptions_spec.rb +0 -540
  227. data/spec/graphql/tracing/new_relic_tracing_spec.rb +0 -84
  228. data/spec/graphql/tracing/platform_tracing_spec.rb +0 -141
  229. data/spec/graphql/tracing/prometheus_tracing_spec.rb +0 -42
  230. data/spec/graphql/tracing/scout_tracing_spec.rb +0 -17
  231. data/spec/graphql/tracing/skylight_tracing_spec.rb +0 -63
  232. data/spec/graphql/tracing_spec.rb +0 -52
  233. data/spec/graphql/types/big_int_spec.rb +0 -24
  234. data/spec/graphql/types/iso_8601_date_time_spec.rb +0 -137
  235. data/spec/graphql/types/relay/base_edge_spec.rb +0 -33
  236. data/spec/graphql/union_type_spec.rb +0 -211
  237. data/spec/graphql/upgrader/member_spec.rb +0 -583
  238. data/spec/graphql/upgrader/schema_spec.rb +0 -82
  239. data/spec/integration/mongoid/graphql/relay/mongo_relation_connection_spec.rb +0 -528
  240. data/spec/integration/mongoid/spec_helper.rb +0 -2
  241. data/spec/integration/mongoid/star_trek/data.rb +0 -126
  242. data/spec/integration/mongoid/star_trek/schema.rb +0 -424
  243. data/spec/integration/rails/data.rb +0 -110
  244. data/spec/integration/rails/generators/base_generator_test.rb +0 -7
  245. data/spec/integration/rails/generators/graphql/enum_generator_spec.rb +0 -30
  246. data/spec/integration/rails/generators/graphql/install_generator_spec.rb +0 -238
  247. data/spec/integration/rails/generators/graphql/interface_generator_spec.rb +0 -34
  248. data/spec/integration/rails/generators/graphql/loader_generator_spec.rb +0 -59
  249. data/spec/integration/rails/generators/graphql/mutation_generator_spec.rb +0 -71
  250. data/spec/integration/rails/generators/graphql/object_generator_spec.rb +0 -54
  251. data/spec/integration/rails/generators/graphql/scalar_generator_spec.rb +0 -28
  252. data/spec/integration/rails/generators/graphql/union_generator_spec.rb +0 -67
  253. data/spec/integration/rails/graphql/input_object_spec.rb +0 -19
  254. data/spec/integration/rails/graphql/input_object_type_spec.rb +0 -364
  255. data/spec/integration/rails/graphql/query/variables_spec.rb +0 -375
  256. data/spec/integration/rails/graphql/relay/array_connection_spec.rb +0 -309
  257. data/spec/integration/rails/graphql/relay/base_connection_spec.rb +0 -101
  258. data/spec/integration/rails/graphql/relay/connection_instrumentation_spec.rb +0 -80
  259. data/spec/integration/rails/graphql/relay/connection_resolve_spec.rb +0 -79
  260. data/spec/integration/rails/graphql/relay/connection_type_spec.rb +0 -106
  261. data/spec/integration/rails/graphql/relay/edge_spec.rb +0 -10
  262. data/spec/integration/rails/graphql/relay/mutation_spec.rb +0 -387
  263. data/spec/integration/rails/graphql/relay/node_spec.rb +0 -263
  264. data/spec/integration/rails/graphql/relay/page_info_spec.rb +0 -111
  265. data/spec/integration/rails/graphql/relay/range_add_spec.rb +0 -117
  266. data/spec/integration/rails/graphql/relay/relation_connection_spec.rb +0 -837
  267. data/spec/integration/rails/graphql/schema_spec.rb +0 -507
  268. data/spec/integration/rails/graphql/tracing/active_support_notifications_tracing_spec.rb +0 -62
  269. data/spec/integration/rails/spec_helper.rb +0 -25
  270. data/spec/spec_helper.rb +0 -116
  271. data/spec/support/dummy/data.rb +0 -45
  272. data/spec/support/dummy/schema.rb +0 -519
  273. data/spec/support/error_bubbling_helpers.rb +0 -23
  274. data/spec/support/global_id.rb +0 -23
  275. data/spec/support/jazz.rb +0 -778
  276. data/spec/support/lazy_helpers.rb +0 -192
  277. data/spec/support/magic_cards/schema.graphql +0 -33
  278. data/spec/support/minimum_input_object.rb +0 -21
  279. data/spec/support/new_relic.rb +0 -27
  280. data/spec/support/parser/filename_example.graphql +0 -5
  281. data/spec/support/parser/filename_example_error_1.graphql +0 -4
  282. data/spec/support/parser/filename_example_error_2.graphql +0 -5
  283. data/spec/support/parser/filename_example_invalid_utf8.graphql +0 -1
  284. data/spec/support/skylight.rb +0 -39
  285. data/spec/support/star_wars/schema.rb +0 -464
  286. data/spec/support/static_validation_helpers.rb +0 -32
@@ -1,292 +0,0 @@
1
- # frozen_string_literal: true
2
- require "spec_helper"
3
-
4
- describe GraphQL::Query::Context do
5
- CTX = []
6
- before { CTX.clear }
7
-
8
- let(:parent_info_type) {
9
- GraphQL::ObjectType.define {
10
- name "ParentInfo"
11
- field :object, types.String do
12
- resolve ->(o, a, c) { c.parent.parent.object }
13
- end
14
- field :objectClassName, types.String do
15
- resolve ->(o, a, c) { c.parent.parent.object.class.name }
16
- end
17
- field :valueClassName, types.String do
18
- resolve ->(o, a, c) { c.parent.parent.value.class.name }
19
- end
20
- field :value, types.String do
21
- resolve ->(o, a, c) { c.parent.parent.value.to_s }
22
- end
23
- }
24
- }
25
- let(:backtrace_type) {
26
- GraphQL::ObjectType.define do
27
- name "Backtrace"
28
- field :backtraceEntry, types.String do
29
- argument :idx, !types.Int
30
- resolve ->(o, a, c) { c.backtrace[a[:idx]] }
31
- end
32
- field :backtraceArray, types[types.String] do
33
- resolve ->(o, a, c) { c.backtrace.to_a }
34
- end
35
- field :backtraceTable, types.String do
36
- resolve ->(o, a, c) { c.backtrace.inspect }
37
- end
38
- end
39
- }
40
- let(:query_type) {
41
- parent_info = parent_info_type
42
- backtrace = backtrace_type
43
- GraphQL::ObjectType.define {
44
- name "Query"
45
- field :context, types.String do
46
- argument :key, !types.String
47
- resolve ->(target, args, ctx) { ctx[args[:key]] }
48
- end
49
- field :contextAstNodeName, types.String do
50
- resolve ->(target, args, ctx) { ctx.ast_node.class.name }
51
- end
52
- field :contextIrepNodeName, types.String do
53
- resolve ->(target, args, ctx) { ctx.irep_node.class.name }
54
- end
55
- field :queryName, types.String do
56
- resolve ->(target, args, ctx) { ctx.query.class.name }
57
- end
58
-
59
- field :pushContext, types.Int do
60
- resolve ->(t,a,c) { CTX << c; 1 }
61
- end
62
-
63
- field :pushQueryError, types.Int do
64
- resolve ->(t,a,c) {
65
- c.query.context.add_error(GraphQL::ExecutionError.new("Query-level error"))
66
- 1
67
- }
68
- end
69
-
70
- field :parentInfo, parent_info, resolve: ->(o,a,c) { :noop }
71
- field :backtrace, backtrace, resolve: Proc.new { :noop }
72
- }
73
- }
74
-
75
- let(:schema) { GraphQL::Schema.define(query: query_type, mutation: nil)}
76
- let(:result) { schema.execute(query_string, root_value: "rootval", context: {"some_key" => "some value"})}
77
-
78
- describe "access to parent context" do
79
- let(:query_string) { %|
80
- {
81
- parentInfo {
82
- value
83
- valueClassName
84
- object
85
- objectClassName
86
- }
87
- }
88
- |}
89
-
90
- it "exposes the parent object" do
91
- expected = {
92
- "data" => {
93
- "parentInfo" => {
94
- "objectClassName" => "String",
95
- "object" => "rootval",
96
- "value" => "{}",
97
- "valueClassName" => "Hash",
98
- }
99
- }
100
- }
101
- assert_equal(expected, result)
102
- end
103
- end
104
-
105
- describe "access to passed-in values" do
106
- let(:query_string) { %|
107
- query getCtx { context(key: "some_key") }
108
- |}
109
-
110
- it "passes context to fields" do
111
- expected = {"data" => {"context" => "some value"}}
112
- assert_equal(expected, result)
113
- end
114
- end
115
-
116
- describe "access to the AST node" do
117
- let(:query_string) { %|
118
- query getCtx { contextAstNodeName }
119
- |}
120
-
121
- it "provides access to the AST node" do
122
- expected = {"data" => {"contextAstNodeName" => "GraphQL::Language::Nodes::Field"}}
123
- assert_equal(expected, result)
124
- end
125
- end
126
-
127
- describe "#backtrace" do
128
- let(:query_string) { %|
129
- query {
130
- backtrace {
131
- b1: backtraceEntry(idx: 0)
132
- b2: backtraceEntry(idx: 1)
133
- b3: backtraceEntry(idx: 2)
134
- backtraceArray
135
- backtraceTable
136
- }
137
- pushContext
138
- }
139
- |}
140
-
141
- it "exposes the GraphQL backtrace" do
142
- backtrace_result = result.fetch("data").fetch("backtrace")
143
- assert_equal "4:11: Backtrace.backtraceEntry as b1", backtrace_result.fetch("b1")
144
- assert_equal "3:9: Query.backtrace", backtrace_result.fetch("b2")
145
- assert_equal "2:7: query", backtrace_result.fetch("b3")
146
- assert_equal ["7:11: Backtrace.backtraceArray", "3:9: Query.backtrace", "2:7: query"], backtrace_result.fetch("backtraceArray")
147
- expected_table = [
148
- 'Loc | Field | Object | Arguments | Result',
149
- '8:11 | Backtrace.backtraceTable | :noop | {} | nil',
150
- '3:9 | Query.backtrace | "rootval" | {} | {b1: "4:11: Backtrace.backtraceEntry as b1", b2: "3:9: Query.backtrace", b3: "2:7: query", backtr...',
151
- '2:7 | query | "rootval" | {} | {}',
152
- '',
153
- ].join("\n")
154
- assert_equal expected_table, backtrace_result.fetch("backtraceTable")
155
-
156
- expected_table_2 = <<-TABLE
157
- Loc | Field | Object | Arguments | Result
158
- 10:9 | Query.pushContext | "rootval" | {} | 1
159
- 2:7 | query | "rootval" | {} | {backtrace: {...}, pushContext: 1}
160
- TABLE
161
-
162
- ctx = CTX.last
163
- assert_equal expected_table_2, ctx.backtrace.to_s
164
- end
165
- end
166
-
167
- describe "access to the InternalRepresentation node" do
168
- let(:query_string) { %|
169
- query getCtx { contextIrepNodeName }
170
- |}
171
-
172
- it "provides access to the AST node" do
173
- expected = {"data" => {"contextIrepNodeName" => "GraphQL::InternalRepresentation::Node"}}
174
- assert_equal(expected, result)
175
- end
176
- end
177
-
178
- describe "access to the query" do
179
- let(:query_string) { %|
180
- query getCtx { queryName }
181
- |}
182
-
183
- it "provides access to the AST node" do
184
- expected = {"data" => {"queryName" => "GraphQL::Query"}}
185
- assert_equal(expected, result)
186
- end
187
- end
188
-
189
- describe "empty values" do
190
- let(:context) { GraphQL::Query::Context.new(query: OpenStruct.new(schema: schema), values: nil, object: nil) }
191
-
192
- it "returns returns nil and reports key? => false" do
193
- assert_equal(nil, context[:some_key])
194
- assert_equal(false, context.key?(:some_key))
195
- assert_raises(KeyError) { context.fetch(:some_key) }
196
- end
197
- end
198
-
199
- describe "assigning values" do
200
- let(:context) { GraphQL::Query::Context.new(query: OpenStruct.new(schema: schema), values: nil, object: nil) }
201
-
202
- it "allows you to assign new contexts" do
203
- assert_equal(nil, context[:some_key])
204
- context[:some_key] = "wow!"
205
- assert_equal("wow!", context[:some_key])
206
- end
207
-
208
- describe "namespaces" do
209
- let(:context) { GraphQL::Query::Context.new(query: OpenStruct.new(schema: schema), values: {a: 1}, object: nil) }
210
-
211
- it "doesn't conflict with base values" do
212
- ns = context.namespace(:stuff)
213
- ns[:b] = 2
214
- assert_equal({a: 1}, context.to_h)
215
- assert_equal({b: 2}, context.namespace(:stuff))
216
- end
217
- end
218
- end
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
-
248
- describe "accessing context after the fact" do
249
- let(:query_string) { %|
250
- { pushContext }
251
- |}
252
-
253
- it "preserves path information" do
254
- assert_equal 1, result["data"]["pushContext"]
255
- last_ctx = CTX.pop
256
- assert_equal ["pushContext"], last_ctx.path
257
- err = GraphQL::ExecutionError.new("Test position info")
258
- last_ctx.add_error(err)
259
- assert_equal ["pushContext"], err.path
260
- assert_equal [2, 9], [err.ast_node.line, err.ast_node.col]
261
- end
262
- end
263
-
264
- describe "query-level errors" do
265
- let(:query_string) { %|
266
- { pushQueryError }
267
- |}
268
-
269
- it "allows query-level errors" do
270
- expected_err = { "message" => "Query-level error" }
271
- assert_equal [expected_err], result["errors"]
272
- end
273
- end
274
-
275
- describe "custom context class" do
276
- it "can be specified" do
277
- query_str = '{
278
- inspectContext
279
- find(id: "Musician/Herbie Hancock") {
280
- ... on Musician {
281
- inspectContext
282
- }
283
- }
284
- }'
285
- res = Jazz::Schema.execute(query_str, context: { magic_key: :ignored, normal_key: "normal_value" })
286
- expected_values = ["custom_method", "magic_value", "normal_value"]
287
- expected_values_with_nil = expected_values + [nil]
288
- assert_equal expected_values, res["data"]["inspectContext"]
289
- assert_equal expected_values_with_nil, res["data"]["find"]["inspectContext"]
290
- end
291
- end
292
- end
@@ -1,341 +0,0 @@
1
- # frozen_string_literal: true
2
- require "spec_helper"
3
-
4
- describe GraphQL::Query::Executor do
5
- let(:operation_name) { nil }
6
- let(:schema) { Dummy::Schema }
7
- let(:variables) { {"cheeseId" => 2} }
8
- let(:query) { GraphQL::Query.new(
9
- schema,
10
- query_string,
11
- variables: variables,
12
- operation_name: operation_name,
13
- )}
14
- let(:result) { query.result }
15
-
16
- describe "multiple operations" do
17
- let(:query_string) { %|
18
- query getCheese1 { cheese(id: 1) { flavor } }
19
- query getCheese2 { cheese(id: 2) { flavor } }
20
- |}
21
-
22
- describe "when an operation is named" do
23
- let(:operation_name) { "getCheese2" }
24
-
25
- it "runs the named one" do
26
- expected = {
27
- "data" => {
28
- "cheese" => {
29
- "flavor" => "Gouda"
30
- }
31
- }
32
- }
33
- assert_equal(expected, result)
34
- end
35
- end
36
-
37
- describe "when one is NOT named" do
38
- it "returns an error" do
39
- expected = {
40
- "errors" => [
41
- {"message" => "An operation name is required"}
42
- ]
43
- }
44
- assert_equal(expected, result)
45
- end
46
- end
47
-
48
- describe "when the named operation is not present" do
49
- let(:operation_name) { "nonsenseOperation" }
50
- it "returns an error" do
51
- expected = {
52
- "errors" => [
53
- {"message" => 'No operation named "nonsenseOperation"'}
54
- ]
55
- }
56
- assert_equal(expected, result)
57
- end
58
- end
59
- end
60
-
61
- describe "operation and fragment defintions of the same name" do
62
- let(:query_string) { %|
63
- query Cheese { cheese(id: 1) { ...Cheese } }
64
- query MoreCheese { cheese(id: 2) { ...Cheese } }
65
- fragment Cheese on Cheese { flavor }
66
- |}
67
-
68
- let(:operation_name) { "Cheese" }
69
-
70
- it "runs the named operation" do
71
- expected = {
72
- "data" => {
73
- "cheese" => {
74
- "flavor" => "Brie"
75
- }
76
- }
77
- }
78
- assert_equal(expected, result)
79
- end
80
- end
81
-
82
-
83
- describe "execution order" do
84
- let(:query_string) {%|
85
- mutation setInOrder {
86
- first: pushValue(value: 1)
87
- second: pushValue(value: 5)
88
- third: pushValue(value: 2)
89
- fourth: replaceValues(input: {values: [6,5,4]})
90
- }
91
- |}
92
-
93
- it "executes mutations in order" do
94
- expected = {"data"=>{
95
- "first"=> [1],
96
- "second"=>[1, 5],
97
- "third"=> [1, 5, 2],
98
- "fourth"=> [6, 5 ,4],
99
- }}
100
- assert_equal(expected, result)
101
- end
102
- end
103
-
104
-
105
- describe "fragment resolution" do
106
- let(:schema) {
107
- # we will raise if the dairy field is resolved more than one time
108
- resolved = false
109
-
110
- DummyQueryType = GraphQL::ObjectType.define do
111
- name "Query"
112
- field :dairy do
113
- type Dummy::Dairy.graphql_definition
114
- resolve ->(t, a, c) {
115
- raise if resolved
116
- resolved = true
117
- Dummy::DAIRY
118
- }
119
- end
120
- end
121
-
122
- GraphQL::Schema.define(query: DummyQueryType, mutation: Dummy::DairyAppMutation.graphql_definition, resolve_type: ->(a,b,c) { :pass }, id_from_object: :pass)
123
- }
124
- let(:variables) { nil }
125
- let(:query_string) { %|
126
- query getDairy {
127
- dairy {
128
- id
129
- ... on Dairy {
130
- id
131
- }
132
- ...repetitiveFragment
133
- }
134
- }
135
- fragment repetitiveFragment on Dairy {
136
- id
137
- }
138
- |}
139
-
140
- it "resolves each field only one time, even when present in multiple fragments" do
141
- expected = {"data" => {
142
- "dairy" => { "id" => "1" }
143
- }}
144
- assert_equal(expected, result)
145
- end
146
-
147
- end
148
-
149
-
150
- describe "runtime errors" do
151
- let(:query_string) {%| query noMilk { error }|}
152
-
153
- it "raises error" do
154
- assert_raises(RuntimeError) { result }
155
- end
156
-
157
- describe "if nil is given for a non-null field" do
158
- let(:query_string) {%| query noMilk { cow { name cantBeNullButIs } }|}
159
- it "turns into error message and nulls the entire selection" do
160
- expected = {
161
- "data" => { "cow" => nil },
162
- "errors" => [
163
- {
164
- "message" => "Cannot return null for non-nullable field Cow.cantBeNullButIs"
165
- }
166
- ]
167
- }
168
- assert_equal(expected, result)
169
- end
170
- end
171
-
172
- describe "if an execution error is raised for a non-null field" do
173
- let(:query_string) {%| query noMilk { cow { name cantBeNullButRaisesExecutionError } }|}
174
- it "uses provided error message and nulls the entire selection" do
175
- expected = {
176
- "data" => { "cow" => nil },
177
- "errors" => [
178
- {
179
- "message" => "BOOM",
180
- "locations" => [ { "line" => 1, "column" => 28 } ],
181
- "path" => ["cow", "cantBeNullButRaisesExecutionError"]
182
- }
183
- ]
184
- }
185
- assert_equal(expected, result)
186
- end
187
- end
188
-
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
195
-
196
- after do
197
- # remove the handler from the middleware:
198
- schema.remove_handler(RuntimeError)
199
- end
200
-
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
214
- end
215
-
216
- describe "if the schema has a rescue handler with an instance of GraphQL::ExecutionError as an argument" do
217
- before do
218
- # HACK: reach to the underlying instance to perform a side-effect
219
- schema.graphql_definition.rescue_from(RuntimeError) { GraphQL::ExecutionError.new("Error was handled!", extensions: { code: "DUMMY_ERROR" }) }
220
- end
221
-
222
- after do
223
- # remove the handler from the middleware:
224
- schema.remove_handler(RuntimeError)
225
- end
226
-
227
- it "adds to the errors key" do
228
- expected = {
229
- "data" => {"error" => nil},
230
- "errors"=>[
231
- {
232
- "message"=>"Error was handled!",
233
- "locations" => [{"line"=>1, "column"=>17}],
234
- "path"=>["error"],
235
- "extensions"=>{code: "DUMMY_ERROR"}
236
- }
237
- ]
238
- }
239
- assert_equal(expected, result)
240
- end
241
- end
242
- end
243
- end
244
-
245
- describe "variable coercion" do
246
- describe "for unspecified with default" do
247
- let(:query_string) {%| query Q($limit: Int = 2) { milk(id: 1) { flavors(limit: $limit) } } |}
248
-
249
- it "uses the default value" do
250
- expected = {
251
- "data" => {
252
- "milk" => {
253
- "flavors" => ["Natural", "Chocolate"],
254
- }
255
- }
256
- }
257
- assert_equal(expected, result)
258
- end
259
- end
260
-
261
- describe "for input object type" do
262
- let(:variables) { {"input" => [{ "source" => "SHEEP" }]} }
263
- let(:query_string) {%| query Q($input: [DairyProductInput]) { searchDairy(product: $input) { __typename, ... on Cheese { id, source } } } |}
264
- it "uses the default value" do
265
- expected = {
266
- "data" => {
267
- "searchDairy" => {
268
- "__typename" => "Cheese",
269
- "id" => 3,
270
- "source" => "SHEEP"
271
- }
272
- }
273
- }
274
- assert_equal(expected, result)
275
- end
276
- end
277
-
278
- describe "for required input objects" do
279
- let(:variables) { { } }
280
- let(:query_string) {%| mutation M($input: ReplaceValuesInput!) { replaceValues(input: $input) } |}
281
- it "returns a variable validation error" do
282
- expected = {
283
- "errors"=>[
284
- {
285
- "message" => "Variable input of type ReplaceValuesInput! was provided invalid value",
286
- "locations" => [{ "line" => 1, "column" => 13 }],
287
- "extensions" => {
288
- "value" => nil,
289
- "problems" => [{ "path" => [], "explanation" => "Expected value to not be null" }]
290
- }
291
- }
292
- ]
293
- }
294
- assert_equal(expected, result)
295
- end
296
- end
297
-
298
- describe "for required input object fields" do
299
- let(:variables) { {"input" => {} } }
300
- let(:query_string) {%| mutation M($input: ReplaceValuesInput!) { replaceValues(input: $input) } |}
301
- it "returns a variable validation error" do
302
- expected = {
303
- "errors"=>[
304
- {
305
- "message" => "Variable input of type ReplaceValuesInput! was provided invalid value for values (Expected value to not be null)",
306
- "locations" => [{ "line" => 1, "column" => 13 }],
307
- "extensions" => {
308
- "value" => {},
309
- "problems" => [{ "path" => ["values"], "explanation" => "Expected value to not be null" }]
310
- }
311
- }
312
- ]
313
- }
314
- assert_equal(expected, result)
315
- end
316
- end
317
-
318
- describe "for input objects with unknown keys in value" do
319
- let(:variables) { {"input" => [{ "foo" => "bar" }]} }
320
- let(:query_string) {%| query Q($input: [DairyProductInput]) { searchDairy(product: $input) { __typename, ... on Cheese { id, source } } } |}
321
- it "returns a variable validation error" do
322
- expected = {
323
- "errors"=>[
324
- {
325
- "message" => "Variable input of type [DairyProductInput] was provided invalid value for 0.foo (Field is not defined on DairyProductInput), 0.source (Expected value to not be null)",
326
- "locations" => [{ "line" => 1, "column" => 10 }],
327
- "extensions" => {
328
- "value" => [{ "foo" => "bar" }],
329
- "problems" => [
330
- { "path" => [0, "foo"], "explanation" => "Field is not defined on DairyProductInput" },
331
- { "path" => [0, "source"], "explanation" => "Expected value to not be null" }
332
- ]
333
- }
334
- }
335
- ]
336
- }
337
- assert_equal(expected, result)
338
- end
339
- end
340
- end
341
- end