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,25 +0,0 @@
1
- # frozen_string_literal: true
2
- require 'spec_helper'
3
-
4
- describe GraphQL::InputObjectType do
5
- describe 'default values' do
6
- describe 'when the type is an enum with underlying ruby values' do
7
- it 'provides the default value' do
8
- TestEnum = GraphQL::EnumType.define do
9
- name 'Test'
10
-
11
- value 'A', 'Represents an authorized agent in our system.', value: 'a'
12
- value 'B', 'Agent is disabled, web app access is denied.', value: 'b'
13
- end
14
-
15
- class TestInput < GraphQL::Schema::InputObject
16
- argument :foo, TestEnum, 'TestEnum', required: false, default_value: 'a'
17
- end
18
-
19
- test_input_type = TestInput.to_graphql
20
- default_test_input_value = test_input_type.coerce_isolated_input({})
21
- assert_equal default_test_input_value[:foo], 'a'
22
- end
23
- end
24
- end
25
- end
@@ -1,35 +0,0 @@
1
- # frozen_string_literal: true
2
- require "spec_helper"
3
-
4
- describe GraphQL::INT_TYPE do
5
- describe "coerce_input" do
6
- it "accepts ints and floats" do
7
- assert_equal 1, GraphQL::INT_TYPE.coerce_isolated_input(1)
8
- assert_equal 6, GraphQL::INT_TYPE.coerce_isolated_input(6.1)
9
- end
10
-
11
- it "rejects other types" do
12
- assert_nil GraphQL::INT_TYPE.coerce_isolated_input("55")
13
- assert_nil GraphQL::INT_TYPE.coerce_isolated_input(true)
14
- end
15
-
16
- describe "handling boundaries" do
17
- let(:context) { GraphQL::Query.new(Dummy::Schema, "{ __typename }").context }
18
-
19
- it "accepts result values in bounds" do
20
- assert_equal 0, GraphQL::INT_TYPE.coerce_result(0, context)
21
- assert_equal (2**31) - 1, GraphQL::INT_TYPE.coerce_result((2**31) - 1, context)
22
- assert_equal -(2**31), GraphQL::INT_TYPE.coerce_result(-(2**31), context)
23
- end
24
-
25
- it "replaces values, if configured to do so" do
26
- assert_equal Dummy::Schema::MAGIC_INT_COERCE_VALUE, GraphQL::INT_TYPE.coerce_result(99**99, context)
27
- end
28
-
29
- it "raises on values out of bounds" do
30
- assert_raises(GraphQL::IntegerEncodingError) { GraphQL::INT_TYPE.coerce_result(2**31, context) }
31
- assert_raises(GraphQL::IntegerEncodingError) { GraphQL::INT_TYPE.coerce_result(-(2**31 + 1), context) }
32
- end
33
- end
34
- end
35
- end
@@ -1,196 +0,0 @@
1
- # frozen_string_literal: true
2
- require "spec_helper"
3
-
4
- describe GraphQL::InterfaceType do
5
- let(:interface) { Dummy::Edible.graphql_definition }
6
- let(:dummy_query_context) { OpenStruct.new(schema: Dummy::Schema) }
7
-
8
- it "has possible types" do
9
- assert_equal([Dummy::Cheese.graphql_definition, Dummy::Honey.graphql_definition, Dummy::Milk.graphql_definition], Dummy::Schema.possible_types(interface))
10
- end
11
-
12
- describe "query evaluation" do
13
- let(:result) { Dummy::Schema.execute(query_string, variables: {"cheeseId" => 2})}
14
- let(:query_string) {%|
15
- query fav {
16
- favoriteEdible { fatContent }
17
- }
18
- |}
19
- it "gets fields from the type for the given object" do
20
- expected = {"data"=>{"favoriteEdible"=>{"fatContent"=>0.04}}}
21
- assert_equal(expected, result)
22
- end
23
- end
24
-
25
- describe "mergable query evaluation" do
26
- let(:result) { Dummy::Schema.execute(query_string, variables: {"cheeseId" => 2})}
27
- let(:query_string) {%|
28
- query fav {
29
- favoriteEdible { fatContent }
30
- favoriteEdible { origin }
31
- }
32
- |}
33
- it "gets fields from the type for the given object" do
34
- expected = {"data"=>{"favoriteEdible"=>{"fatContent"=>0.04, "origin"=>"Antiquity"}}}
35
- assert_equal(expected, result)
36
- end
37
- end
38
-
39
- describe "fragments" do
40
- let(:query_string) {%|
41
- {
42
- favoriteEdible {
43
- fatContent
44
- ... on LocalProduct {
45
- origin
46
- }
47
- }
48
- }
49
- |}
50
- let(:result) { Dummy::Schema.execute(query_string) }
51
-
52
- it "can apply interface fragments to an interface" do
53
- expected_result = { "data" => {
54
- "favoriteEdible" => {
55
- "fatContent" => 0.04,
56
- "origin" => "Antiquity",
57
- }
58
- } }
59
-
60
- assert_equal(expected_result, result)
61
- end
62
-
63
- describe "filtering members by type" do
64
- let(:query_string) {%|
65
- {
66
- allEdible {
67
- __typename
68
- ... on LocalProduct {
69
- origin
70
- }
71
- }
72
- }
73
- |}
74
-
75
- it "only applies fields to the right object" do
76
- expected_data = [
77
- {"__typename"=>"Cheese", "origin"=>"France"},
78
- {"__typename"=>"Cheese", "origin"=>"Netherlands"},
79
- {"__typename"=>"Cheese", "origin"=>"Spain"},
80
- {"__typename"=>"Milk", "origin"=>"Antiquity"},
81
- ]
82
-
83
- assert_equal expected_data, result["data"]["allEdible"]
84
- end
85
- end
86
- end
87
-
88
- describe "#dup" do
89
- it "copies the fields without altering the original" do
90
- interface_2 = interface.dup
91
- interface_2.fields["extra"] = GraphQL::Field.define(name: "extra", type: GraphQL::BOOLEAN_TYPE)
92
- assert_equal 3, interface.fields.size
93
- assert_equal 4, interface_2.fields.size
94
- end
95
-
96
- it "copies orphan types without affecting the original" do
97
- interface = GraphQL::InterfaceType.define do
98
- name "AInterface"
99
- orphan_types [Dummy::Honey]
100
- end
101
-
102
- interface_2 = interface.dup
103
- interface_2.orphan_types << Dummy::Cheese
104
- assert_equal 1, interface.orphan_types.size
105
- assert_equal 2, interface_2.orphan_types.size
106
- end
107
- end
108
-
109
- describe "#resolve_type" do
110
- let(:result) { Dummy::Schema.execute(query_string) }
111
- let(:query_string) {%|
112
- {
113
- allEdible {
114
- __typename
115
- ... on Milk {
116
- milkFatContent: fatContent
117
- }
118
- ... on Cheese {
119
- cheeseFatContent: fatContent
120
- }
121
- }
122
-
123
- allEdibleAsMilk {
124
- __typename
125
- ... on Milk {
126
- fatContent
127
- }
128
- }
129
- }
130
- |}
131
-
132
- it 'returns correct types for general schema and specific interface' do
133
- expected_result = {
134
- # Uses schema-level resolve_type
135
- "allEdible"=>[
136
- {"__typename"=>"Cheese", "cheeseFatContent"=>0.19},
137
- {"__typename"=>"Cheese", "cheeseFatContent"=>0.3},
138
- {"__typename"=>"Cheese", "cheeseFatContent"=>0.065},
139
- {"__typename"=>"Milk", "milkFatContent"=>0.04}
140
- ],
141
- # Uses type-level resolve_type
142
- "allEdibleAsMilk"=>[
143
- {"__typename"=>"Milk", "fatContent"=>0.19},
144
- {"__typename"=>"Milk", "fatContent"=>0.3},
145
- {"__typename"=>"Milk", "fatContent"=>0.065},
146
- {"__typename"=>"Milk", "fatContent"=>0.04}
147
- ]
148
- }
149
- assert_equal expected_result, result["data"]
150
- end
151
- end
152
-
153
- describe "#get_possible_type" do
154
- let(:query_string) {%|
155
- query fav {
156
- favoriteEdible { fatContent }
157
- }
158
- |}
159
-
160
- let(:query) { GraphQL::Query.new(Dummy::Schema, query_string) }
161
-
162
- it "returns the type definition if the type exists and is a possible type of the interface" do
163
- assert interface.get_possible_type("Cheese", query.context)
164
- end
165
-
166
- it "returns nil if the type is not found in the schema" do
167
- assert_nil interface.get_possible_type("Foo", query.context)
168
- end
169
-
170
- it "returns nil if the type is not a possible type of the interface" do
171
- assert_nil interface.get_possible_type("Beverage", query.context)
172
- end
173
- end
174
-
175
- describe "#possible_type?" do
176
- let(:query_string) {%|
177
- query fav {
178
- favoriteEdible { fatContent }
179
- }
180
- |}
181
-
182
- let(:query) { GraphQL::Query.new(Dummy::Schema, query_string) }
183
-
184
- it "returns true if the type exists and is a possible type of the interface" do
185
- assert interface.possible_type?("Cheese", query.context)
186
- end
187
-
188
- it "returns false if the type is not found in the schema" do
189
- refute interface.possible_type?("Foo", query.context)
190
- end
191
-
192
- it "returns false if the type is not a possible type of the interface" do
193
- refute interface.possible_type?("Beverage", query.context)
194
- end
195
- end
196
- end
@@ -1,41 +0,0 @@
1
- # frozen_string_literal: true
2
- require "spec_helper"
3
-
4
- describe GraphQL::InternalRepresentation::Print do
5
- describe "printing queries" do
6
- let(:query_str) { <<-GRAPHQL
7
- {
8
- cheese(id: 1) {
9
- flavor
10
- ...EdibleFields
11
- ... on Edible {
12
- o2: origin
13
- }
14
- }
15
- }
16
-
17
- fragment EdibleFields on Edible {
18
- o: origin
19
- }
20
- GRAPHQL
21
- }
22
- it "prints the rewritten query" do
23
- query_plan = GraphQL::InternalRepresentation::Print.print(Dummy::Schema, query_str)
24
- expected_plan = <<-GRAPHQL
25
- query {
26
- ... on Query {
27
- cheese(id: 1) {
28
- ... on Cheese {
29
- flavor()
30
- o2: origin()
31
- o: origin()
32
- }
33
- }
34
- }
35
- }
36
- GRAPHQL
37
-
38
- assert_equal expected_plan, query_plan
39
- end
40
- end
41
- end
@@ -1,381 +0,0 @@
1
- # frozen_string_literal: true
2
- require "spec_helper"
3
-
4
- describe GraphQL::InternalRepresentation::Rewrite do
5
- let(:schema) {
6
- GraphQL::Schema.from_definition <<-GRAPHQL
7
- type Query {
8
- plant(id: ID!): Plant
9
- fruit(id: ID!): [Fruit!]
10
- }
11
-
12
- union Plant = Grain | Fruit | Vegetable | Nut
13
-
14
- interface Tree {
15
- name: String!
16
- leafType: LeafType
17
- habitats: [Habitat]
18
- }
19
-
20
- enum LeafType {
21
- NEEDLE
22
- LEAF
23
- }
24
-
25
- type Fruit implements Tree {
26
- name: String!
27
- color: [Int!]!
28
- leafType: LeafType
29
- habitats: [Habitat]
30
- }
31
-
32
- type Vegetable {
33
- name: String!
34
- edibleParts: [String!]!
35
- }
36
-
37
- type Grain {
38
- name: String!
39
- }
40
-
41
- type Nut implements Tree {
42
- name: String!
43
- diameter: Int!
44
- leafType: LeafType
45
- habitats: [Habitat]
46
- }
47
-
48
- interface Environ {
49
- seasons: [String]
50
- }
51
-
52
- type Habitat implements Environ {
53
- residentName: String!
54
- averageWeight: Int!
55
- seasons: [String]
56
- }
57
- GRAPHQL
58
-
59
- }
60
- let(:validator) { GraphQL::StaticValidation::Validator.new(schema: schema) }
61
- let(:query) { GraphQL::Query.new(schema, query_string) }
62
- let(:rewrite_result) {
63
- res = validator.validate(query)
64
- res[:errors].any? && raise(res[:errors].map(&:message).join("; "))
65
- res[:irep]
66
- }
67
-
68
- describe "building a tree over concrete types with fragments" do
69
- let(:query_string) {
70
- <<-GRAPHQL
71
- query getPlant($id: ID!) {
72
- plant(id: $id) {
73
- __typename
74
- ... on Tree {
75
- leafType
76
- habitats {
77
- averageWeight
78
- }
79
- }
80
- ... on Fruit {
81
- name
82
- color
83
- ... on Tree {
84
- leafType
85
- }
86
- }
87
- ... on Nut {
88
- leafType
89
- ...NutFields
90
- }
91
- }
92
- }
93
-
94
- fragment NutFields on Nut {
95
- leafType
96
- ... TreeFields
97
- }
98
-
99
- fragment TreeFields on Tree {
100
- habitats {
101
- ... HabitatFields
102
- }
103
- }
104
-
105
- fragment HabitatFields on Habitat {
106
- seasons
107
- }
108
- GRAPHQL
109
- }
110
-
111
- it "groups selections by object types which they apply to" do
112
- doc = rewrite_result.operation_definitions["getPlant"]
113
- assert_nil doc.definition
114
-
115
- plant_scoped_selection = doc.scoped_children[schema.types["Query"]]["plant"]
116
- assert_equal ["Fruit", "Nut", "Plant"], plant_scoped_selection.scoped_children.keys.map(&:name).sort
117
-
118
- plant_selection = doc.typed_children[schema.types["Query"]]["plant"]
119
- assert_equal ["Fruit", "Grain", "Nut", "Vegetable"], plant_selection.typed_children.keys.map(&:name).sort
120
-
121
- fruit_selections = plant_selection.typed_children[schema.types["Fruit"]]
122
- assert_equal ["__typename", "color", "habitats", "leafType", "name"], fruit_selections.keys.sort
123
- assert_equal 2, fruit_selections["leafType"].ast_nodes.size
124
-
125
- nut_selections = plant_selection.typed_children[schema.types["Nut"]]
126
- # `... on Tree`, `... on Nut`, and `NutFields`, but not `... on Fruit { ... on Tree }`
127
-
128
- if RUBY_VERSION < "2.5"
129
- # Ruby 2.5 changed how hash key collisions worked a little bit.
130
- # This test is "broken", but honestly, it doesn't matter.
131
- # Apparently nobody uses `IrepNode#ast_nodes`, and that's for the best.
132
- assert_equal 3, nut_selections["leafType"].ast_nodes.size
133
- end
134
-
135
- # Multi-level merging when including fragments:
136
- habitats_selections = nut_selections["habitats"].typed_children[schema.types["Habitat"]]
137
- assert_equal ["averageWeight", "seasons"], habitats_selections.keys
138
- end
139
-
140
- it "tracks parent nodes" do
141
- doc = rewrite_result.operation_definitions["getPlant"]
142
- assert_nil doc.parent
143
-
144
- plant_selection = doc.typed_children[schema.types["Query"]]["plant"]
145
- assert_equal doc, plant_selection.parent
146
-
147
- leaf_type_selection = plant_selection.typed_children[schema.types["Nut"]]["leafType"]
148
- assert_equal plant_selection, leaf_type_selection.parent
149
-
150
- habitats_selection = plant_selection.typed_children[schema.types["Nut"]]["habitats"]
151
- assert_equal plant_selection, habitats_selection.parent
152
-
153
- seasons_selection = habitats_selection.typed_children[schema.types["Habitat"]]["seasons"]
154
- average_weight_selection = habitats_selection.typed_children[schema.types["Habitat"]]["averageWeight"]
155
- assert_equal habitats_selection, seasons_selection.parent
156
- assert_equal habitats_selection, average_weight_selection.parent
157
- end
158
-
159
- it "tracks field return type" do
160
- doc = rewrite_result.operation_definitions["getPlant"]
161
-
162
- assert plant_selection = doc.typed_children[schema.types["Query"]]["plant"]
163
- assert_equal "Plant", plant_selection.return_type.to_s
164
-
165
- assert tree_selection = plant_selection.typed_children[schema.types["Fruit"]]
166
- assert_equal "[Int!]!", tree_selection["color"].return_type.to_s
167
- end
168
- end
169
-
170
- describe "tracking directives on fragment spreads" do
171
- let(:query_string) { <<-GRAPHQL
172
- query getPlant($id: ID!) {
173
- plant(id: $id) {
174
- ... on Nut @skip(if: true) {
175
- leafType
176
- }
177
-
178
- ... on Tree {
179
- leafType @include(if: true)
180
- }
181
-
182
- ... on Nut {
183
- leafType # no directives
184
- }
185
-
186
- ... NutFields @include(if: false)
187
- }
188
- }
189
- fragment NutFields on Nut {
190
- leafType @skip(if: false)
191
- }
192
- GRAPHQL
193
- }
194
-
195
- it "applies directives from all contexts" do
196
- doc = rewrite_result.operation_definitions["getPlant"]
197
- plant_selection = doc.typed_children[schema.types["Query"]]["plant"]
198
- leaf_type_selection = plant_selection.typed_children[schema.types["Nut"]]["leafType"]
199
- # Only unskipped occurrences in the AST
200
- assert_equal 2, leaf_type_selection.ast_nodes.size
201
- end
202
- end
203
-
204
- describe "deep fragment merging" do
205
- let(:query_string) { <<-GRAPHQL
206
- {
207
- plant(id: 1) {
208
- ...TreeFields
209
- ...NutFields
210
- }
211
- }
212
-
213
- fragment TreeFields on Tree {
214
- habitats {
215
- seasons
216
- }
217
- }
218
-
219
- fragment NutFields on Nut {
220
- habitats {
221
- residentName
222
- ... HabitatFields
223
- }
224
- }
225
-
226
- fragment HabitatFields on Habitat {
227
- averageWeight
228
- }
229
- GRAPHQL
230
- }
231
-
232
- it "applies spreads to their parents only" do
233
- doc = rewrite_result.operation_definitions[nil]
234
- plant_selection = doc.typed_children[schema.types["Query"]]["plant"]
235
- nut_habitat_selections = plant_selection.typed_children[schema.types["Nut"]]["habitats"].typed_children[schema.types["Habitat"]]
236
- assert_equal ["averageWeight", "residentName", "seasons"], nut_habitat_selections.keys.sort
237
- fruit_habitat_selections = plant_selection.typed_children[schema.types["Fruit"]]["habitats"].typed_children[schema.types["Habitat"]]
238
- assert_equal ["seasons"], fruit_habitat_selections.keys
239
- end
240
- end
241
-
242
- describe "nested fields on typed fragments" do
243
- let(:result) { Dummy::Schema.execute(query_string) }
244
- let(:query_string) {%|
245
- {
246
- allDairy {
247
- __typename
248
-
249
- ... on Milk {
250
- selfAsEdible {
251
- milkInlineOrigin: origin
252
- }
253
- }
254
-
255
- ... on Cheese {
256
- selfAsEdible {
257
- cheeseInlineOrigin: origin
258
- }
259
- }
260
-
261
- ... on Edible {
262
- selfAsEdible {
263
- edibleInlineOrigin: origin
264
- }
265
- }
266
-
267
- ... {
268
- ... on Edible {
269
- selfAsEdible {
270
- untypedInlineOrigin: origin
271
- }
272
- }
273
- }
274
- ...milkFields
275
- ...cheeseFields
276
- }
277
- }
278
-
279
- fragment cheeseFields on Cheese {
280
- selfAsEdible {
281
- cheeseFragmentOrigin: origin
282
- }
283
- }
284
- fragment milkFields on Milk {
285
- selfAsEdible {
286
- milkFragmentOrigin: origin
287
- }
288
- }
289
- |}
290
-
291
- it "distinguishes between nested fields with the same name on different typed fragments" do
292
- all_dairy = result["data"]["allDairy"]
293
- cheeses = all_dairy.select { |d| d["__typename"] == "Cheese" }
294
- milks = all_dairy.select { |d| d["__typename"] == "Milk" }
295
-
296
- # Make sure all the data is there:
297
- assert_equal 3, cheeses.length
298
- assert_equal 1, milks.length
299
-
300
- expected_cheese_fields = ["cheeseFragmentOrigin", "cheeseInlineOrigin", "edibleInlineOrigin", "untypedInlineOrigin"]
301
- cheeses.each do |cheese|
302
- assert_equal expected_cheese_fields, cheese["selfAsEdible"].keys.sort
303
- end
304
-
305
- expected_milk_fields = ["edibleInlineOrigin", "milkFragmentOrigin", "milkInlineOrigin", "untypedInlineOrigin"]
306
- milks.each do |milk|
307
- assert_equal expected_milk_fields, milk["selfAsEdible"].keys.sort
308
- end
309
- end
310
- end
311
-
312
- describe "fragment merging bug" do
313
- let(:query_string) {
314
- <<-GRAPHQL
315
- {
316
- ...Frag1
317
- __type(name: "Query") {
318
- ...Frag2
319
- }
320
- }
321
-
322
- fragment Frag1 on Query {
323
- __type(name: "Query") {
324
- ...Frag2
325
- }
326
- }
327
-
328
- fragment Frag2 on __Type {
329
- __typename
330
- }
331
- GRAPHQL
332
- }
333
-
334
- it "finishes" do
335
- doc = rewrite_result.operation_definitions[nil]
336
- type_node = doc.typed_children[schema.types["Query"]]["__type"]
337
- typename_node = type_node.typed_children[schema.types["__Type"]]["__typename"]
338
- assert_equal 1, typename_node.ast_nodes.size
339
- assert_equal 15, typename_node.ast_node.line
340
- assert_equal 9, typename_node.ast_node.col
341
- end
342
- end
343
-
344
- describe "fragment definition without query" do
345
- let(:query_string) {
346
- <<-GRAPHQL
347
- fragment NutFields on Nut {
348
- leafType
349
- ... TreeFields
350
- }
351
-
352
- fragment TreeFields on Tree {
353
- habitats {
354
- ... HabitatFields
355
- }
356
- }
357
-
358
- fragment HabitatFields on Habitat {
359
- seasons
360
- }
361
- GRAPHQL
362
- }
363
-
364
- let(:validator) {
365
- rules = GraphQL::StaticValidation::ALL_RULES - [
366
- GraphQL::StaticValidation::FragmentsAreUsed
367
- ]
368
- GraphQL::StaticValidation::Validator.new(schema: schema, rules: rules)
369
- }
370
-
371
- it "tracks fragment definitions without operation" do
372
- doc = rewrite_result.fragment_definitions["NutFields"]
373
-
374
- assert doc.typed_children[schema.types["Nut"]]["leafType"]
375
-
376
- assert nut_selections = doc.typed_children[schema.types["Nut"]]
377
- habitats_selections = nut_selections["habitats"].typed_children[schema.types["Habitat"]]
378
- assert_equal ["seasons"], habitats_selections.keys
379
- end
380
- end
381
- end