graphql 1.9.0 → 2.1.1

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.

Potentially problematic release.


This version of graphql might be problematic. Click here for more details.

Files changed (723) hide show
  1. checksums.yaml +5 -5
  2. data/lib/generators/graphql/core.rb +21 -9
  3. data/lib/generators/graphql/enum_generator.rb +4 -10
  4. data/lib/generators/graphql/field_extractor.rb +31 -0
  5. data/lib/generators/graphql/input_generator.rb +50 -0
  6. data/lib/generators/graphql/install/mutation_root_generator.rb +34 -0
  7. data/lib/generators/graphql/install/templates/base_mutation.erb +12 -0
  8. data/lib/generators/graphql/{templates → install/templates}/mutation_type.erb +4 -0
  9. data/lib/generators/graphql/install_generator.rb +49 -9
  10. data/lib/generators/graphql/interface_generator.rb +7 -7
  11. data/lib/generators/graphql/loader_generator.rb +1 -0
  12. data/lib/generators/graphql/mutation_create_generator.rb +22 -0
  13. data/lib/generators/graphql/mutation_delete_generator.rb +22 -0
  14. data/lib/generators/graphql/mutation_generator.rb +6 -30
  15. data/lib/generators/graphql/mutation_update_generator.rb +22 -0
  16. data/lib/generators/graphql/object_generator.rb +28 -12
  17. data/lib/generators/graphql/orm_mutations_base.rb +40 -0
  18. data/lib/generators/graphql/relay.rb +66 -0
  19. data/lib/generators/graphql/relay_generator.rb +21 -0
  20. data/lib/generators/graphql/scalar_generator.rb +4 -2
  21. data/lib/generators/graphql/templates/base_argument.erb +8 -0
  22. data/lib/generators/graphql/templates/base_connection.erb +10 -0
  23. data/lib/generators/graphql/templates/base_edge.erb +10 -0
  24. data/lib/generators/graphql/templates/base_enum.erb +4 -0
  25. data/lib/generators/graphql/templates/base_field.erb +9 -0
  26. data/lib/generators/graphql/templates/base_input_object.erb +5 -0
  27. data/lib/generators/graphql/templates/base_interface.erb +6 -0
  28. data/lib/generators/graphql/templates/base_object.erb +5 -0
  29. data/lib/generators/graphql/templates/base_scalar.erb +4 -0
  30. data/lib/generators/graphql/templates/base_union.erb +4 -0
  31. data/lib/generators/graphql/templates/enum.erb +7 -1
  32. data/lib/generators/graphql/templates/graphql_controller.erb +23 -12
  33. data/lib/generators/graphql/templates/input.erb +9 -0
  34. data/lib/generators/graphql/templates/interface.erb +6 -2
  35. data/lib/generators/graphql/templates/loader.erb +4 -0
  36. data/lib/generators/graphql/templates/mutation.erb +5 -1
  37. data/lib/generators/graphql/templates/mutation_create.erb +20 -0
  38. data/lib/generators/graphql/templates/mutation_delete.erb +20 -0
  39. data/lib/generators/graphql/templates/mutation_update.erb +21 -0
  40. data/lib/generators/graphql/templates/node_type.erb +11 -0
  41. data/lib/generators/graphql/templates/object.erb +7 -3
  42. data/lib/generators/graphql/templates/query_type.erb +5 -3
  43. data/lib/generators/graphql/templates/scalar.erb +5 -1
  44. data/lib/generators/graphql/templates/schema.erb +27 -27
  45. data/lib/generators/graphql/templates/union.erb +6 -2
  46. data/lib/generators/graphql/type_generator.rb +47 -10
  47. data/lib/generators/graphql/union_generator.rb +5 -5
  48. data/lib/graphql/analysis/ast/analyzer.rb +41 -12
  49. data/lib/graphql/analysis/ast/field_usage.rb +32 -3
  50. data/lib/graphql/analysis/ast/max_query_complexity.rb +4 -5
  51. data/lib/graphql/analysis/ast/max_query_depth.rb +7 -3
  52. data/lib/graphql/analysis/ast/query_complexity.rb +182 -66
  53. data/lib/graphql/analysis/ast/query_depth.rb +15 -26
  54. data/lib/graphql/analysis/ast/visitor.rb +83 -62
  55. data/lib/graphql/analysis/ast.rb +23 -20
  56. data/lib/graphql/analysis.rb +0 -7
  57. data/lib/graphql/backtrace/inspect_result.rb +0 -1
  58. data/lib/graphql/backtrace/table.rb +37 -16
  59. data/lib/graphql/backtrace/trace.rb +96 -0
  60. data/lib/graphql/backtrace/traced_error.rb +0 -1
  61. data/lib/graphql/backtrace/tracer.rb +39 -9
  62. data/lib/graphql/backtrace.rb +22 -18
  63. data/lib/graphql/coercion_error.rb +8 -0
  64. data/lib/graphql/dataloader/null_dataloader.rb +24 -0
  65. data/lib/graphql/dataloader/request.rb +19 -0
  66. data/lib/graphql/dataloader/request_all.rb +19 -0
  67. data/lib/graphql/dataloader/source.rb +195 -0
  68. data/lib/graphql/dataloader.rb +320 -0
  69. data/lib/graphql/date_encoding_error.rb +16 -0
  70. data/lib/graphql/deprecation.rb +9 -0
  71. data/lib/graphql/dig.rb +1 -1
  72. data/lib/graphql/execution/directive_checks.rb +2 -2
  73. data/lib/graphql/execution/errors.rb +93 -0
  74. data/lib/graphql/execution/interpreter/argument_value.rb +28 -0
  75. data/lib/graphql/execution/interpreter/arguments.rb +88 -0
  76. data/lib/graphql/execution/interpreter/arguments_cache.rb +105 -0
  77. data/lib/graphql/execution/interpreter/handles_raw_value.rb +18 -0
  78. data/lib/graphql/execution/interpreter/resolve.rb +62 -24
  79. data/lib/graphql/execution/interpreter/runtime/graphql_result.rb +170 -0
  80. data/lib/graphql/execution/interpreter/runtime.rb +695 -392
  81. data/lib/graphql/execution/interpreter.rb +199 -74
  82. data/lib/graphql/execution/lazy/lazy_method_map.rb +4 -0
  83. data/lib/graphql/execution/lazy.rb +11 -21
  84. data/lib/graphql/execution/lookahead.rb +110 -150
  85. data/lib/graphql/execution/multiplex.rb +6 -148
  86. data/lib/graphql/execution.rb +12 -4
  87. data/lib/graphql/execution_error.rb +3 -2
  88. data/lib/graphql/integer_decoding_error.rb +17 -0
  89. data/lib/graphql/integer_encoding_error.rb +26 -2
  90. data/lib/graphql/introspection/base_object.rb +2 -5
  91. data/lib/graphql/introspection/directive_location_enum.rb +2 -2
  92. data/lib/graphql/introspection/directive_type.rb +12 -6
  93. data/lib/graphql/introspection/dynamic_fields.rb +3 -8
  94. data/lib/graphql/introspection/entry_points.rb +6 -18
  95. data/lib/graphql/introspection/enum_value_type.rb +2 -2
  96. data/lib/graphql/introspection/field_type.rb +9 -5
  97. data/lib/graphql/introspection/input_value_type.rb +41 -7
  98. data/lib/graphql/introspection/introspection_query.rb +6 -92
  99. data/lib/graphql/introspection/schema_type.rb +13 -12
  100. data/lib/graphql/introspection/type_type.rb +34 -17
  101. data/lib/graphql/introspection.rb +100 -0
  102. data/lib/graphql/invalid_null_error.rb +18 -0
  103. data/lib/graphql/language/block_string.rb +50 -23
  104. data/lib/graphql/language/cache.rb +37 -0
  105. data/lib/graphql/language/definition_slice.rb +21 -10
  106. data/lib/graphql/language/document_from_schema_definition.rb +153 -87
  107. data/lib/graphql/language/lexer.rb +249 -1450
  108. data/lib/graphql/language/nodes.rb +152 -142
  109. data/lib/graphql/language/parser.rb +1036 -953
  110. data/lib/graphql/language/parser.y +159 -120
  111. data/lib/graphql/language/printer.rb +342 -154
  112. data/lib/graphql/language/sanitized_printer.rb +220 -0
  113. data/lib/graphql/language/static_visitor.rb +167 -0
  114. data/lib/graphql/language/token.rb +2 -2
  115. data/lib/graphql/language/visitor.rb +196 -140
  116. data/lib/graphql/language.rb +4 -1
  117. data/lib/graphql/load_application_object_failed_error.rb +22 -0
  118. data/lib/graphql/name_validator.rb +2 -7
  119. data/lib/graphql/pagination/active_record_relation_connection.rb +77 -0
  120. data/lib/graphql/pagination/array_connection.rb +79 -0
  121. data/lib/graphql/pagination/connection.rb +275 -0
  122. data/lib/graphql/pagination/connections.rb +135 -0
  123. data/lib/graphql/pagination/mongoid_relation_connection.rb +25 -0
  124. data/lib/graphql/pagination/relation_connection.rb +228 -0
  125. data/lib/graphql/pagination/sequel_dataset_connection.rb +28 -0
  126. data/lib/graphql/pagination.rb +6 -0
  127. data/lib/graphql/parse_error.rb +0 -1
  128. data/lib/graphql/query/context/scoped_context.rb +101 -0
  129. data/lib/graphql/query/context.rb +157 -187
  130. data/lib/graphql/query/fingerprint.rb +26 -0
  131. data/lib/graphql/query/input_validation_result.rb +33 -7
  132. data/lib/graphql/query/null_context.rb +21 -14
  133. data/lib/graphql/query/validation_pipeline.rb +17 -38
  134. data/lib/graphql/query/variable_validation_error.rb +17 -3
  135. data/lib/graphql/query/variables.rb +49 -14
  136. data/lib/graphql/query.rb +142 -61
  137. data/lib/graphql/railtie.rb +6 -102
  138. data/lib/graphql/rake_task/validate.rb +5 -2
  139. data/lib/graphql/rake_task.rb +42 -20
  140. data/lib/graphql/relay/range_add.rb +17 -10
  141. data/lib/graphql/relay.rb +0 -15
  142. data/lib/graphql/rubocop/graphql/base_cop.rb +36 -0
  143. data/lib/graphql/rubocop/graphql/default_null_true.rb +43 -0
  144. data/lib/graphql/rubocop/graphql/default_required_true.rb +43 -0
  145. data/lib/graphql/rubocop.rb +4 -0
  146. data/lib/graphql/schema/addition.rb +271 -0
  147. data/lib/graphql/schema/always_visible.rb +10 -0
  148. data/lib/graphql/schema/argument.rb +301 -32
  149. data/lib/graphql/schema/base_64_bp.rb +3 -2
  150. data/lib/graphql/schema/base_64_encoder.rb +2 -0
  151. data/lib/graphql/schema/build_from_definition/resolve_map/default_resolve.rb +1 -1
  152. data/lib/graphql/schema/build_from_definition/resolve_map.rb +13 -5
  153. data/lib/graphql/schema/build_from_definition.rb +349 -203
  154. data/lib/graphql/schema/built_in_types.rb +5 -5
  155. data/lib/graphql/schema/directive/deprecated.rb +18 -0
  156. data/lib/graphql/schema/directive/feature.rb +2 -2
  157. data/lib/graphql/schema/directive/flagged.rb +57 -0
  158. data/lib/graphql/schema/directive/include.rb +2 -2
  159. data/lib/graphql/schema/directive/one_of.rb +12 -0
  160. data/lib/graphql/schema/directive/skip.rb +2 -2
  161. data/lib/graphql/schema/directive/specified_by.rb +14 -0
  162. data/lib/graphql/schema/directive/transform.rb +14 -2
  163. data/lib/graphql/schema/directive.rb +134 -15
  164. data/lib/graphql/schema/enum.rb +137 -39
  165. data/lib/graphql/schema/enum_value.rb +17 -23
  166. data/lib/graphql/schema/field/connection_extension.rb +36 -20
  167. data/lib/graphql/schema/field/scope_extension.rb +15 -5
  168. data/lib/graphql/schema/field.rb +570 -334
  169. data/lib/graphql/schema/field_extension.rb +88 -4
  170. data/lib/graphql/schema/find_inherited_value.rb +31 -0
  171. data/lib/graphql/schema/finder.rb +16 -14
  172. data/lib/graphql/schema/has_single_input_argument.rb +156 -0
  173. data/lib/graphql/schema/input_object.rb +190 -48
  174. data/lib/graphql/schema/interface.rb +24 -49
  175. data/lib/graphql/schema/introspection_system.rb +109 -36
  176. data/lib/graphql/schema/late_bound_type.rb +9 -2
  177. data/lib/graphql/schema/list.rb +61 -3
  178. data/lib/graphql/schema/loader.rb +146 -97
  179. data/lib/graphql/schema/member/base_dsl_methods.rb +45 -51
  180. data/lib/graphql/schema/member/build_type.rb +34 -17
  181. data/lib/graphql/schema/member/has_arguments.rb +385 -10
  182. data/lib/graphql/schema/member/has_ast_node.rb +32 -0
  183. data/lib/graphql/schema/member/has_deprecation_reason.rb +24 -0
  184. data/lib/graphql/schema/member/has_directives.rb +118 -0
  185. data/lib/graphql/schema/member/has_fields.rb +180 -35
  186. data/lib/graphql/schema/member/has_interfaces.rb +143 -0
  187. data/lib/graphql/schema/member/has_unresolved_type_error.rb +15 -0
  188. data/lib/graphql/schema/member/has_validators.rb +57 -0
  189. data/lib/graphql/schema/member/relay_shortcuts.rb +47 -2
  190. data/lib/graphql/schema/member/scoped.rb +19 -0
  191. data/lib/graphql/schema/member/type_system_helpers.rb +20 -3
  192. data/lib/graphql/schema/member/validates_input.rb +33 -0
  193. data/lib/graphql/schema/member.rb +11 -6
  194. data/lib/graphql/schema/mutation.rb +4 -9
  195. data/lib/graphql/schema/non_null.rb +34 -4
  196. data/lib/graphql/schema/object.rb +55 -64
  197. data/lib/graphql/schema/printer.rb +26 -40
  198. data/lib/graphql/schema/relay_classic_mutation.rb +13 -80
  199. data/lib/graphql/schema/resolver/has_payload_type.rb +53 -12
  200. data/lib/graphql/schema/resolver.rb +182 -162
  201. data/lib/graphql/schema/scalar.rb +40 -15
  202. data/lib/graphql/schema/subscription.rb +85 -27
  203. data/lib/graphql/schema/timeout.rb +119 -0
  204. data/lib/graphql/schema/type_expression.rb +21 -13
  205. data/lib/graphql/schema/type_membership.rb +51 -0
  206. data/lib/graphql/schema/union.rb +69 -15
  207. data/lib/graphql/schema/unique_within_type.rb +1 -2
  208. data/lib/graphql/schema/validator/allow_blank_validator.rb +29 -0
  209. data/lib/graphql/schema/validator/allow_null_validator.rb +26 -0
  210. data/lib/graphql/schema/validator/exclusion_validator.rb +33 -0
  211. data/lib/graphql/schema/validator/format_validator.rb +48 -0
  212. data/lib/graphql/schema/validator/inclusion_validator.rb +35 -0
  213. data/lib/graphql/schema/validator/length_validator.rb +59 -0
  214. data/lib/graphql/schema/validator/numericality_validator.rb +82 -0
  215. data/lib/graphql/schema/validator/required_validator.rb +82 -0
  216. data/lib/graphql/schema/validator.rb +171 -0
  217. data/lib/graphql/schema/warden.rb +330 -59
  218. data/lib/graphql/schema/wrapper.rb +0 -5
  219. data/lib/graphql/schema.rb +985 -858
  220. data/lib/graphql/static_validation/all_rules.rb +4 -1
  221. data/lib/graphql/static_validation/base_visitor.rb +33 -32
  222. data/lib/graphql/static_validation/definition_dependencies.rb +28 -14
  223. data/lib/graphql/static_validation/error.rb +3 -1
  224. data/lib/graphql/static_validation/literal_validator.rb +71 -28
  225. data/lib/graphql/static_validation/rules/argument_literals_are_compatible.rb +46 -79
  226. data/lib/graphql/static_validation/rules/argument_literals_are_compatible_error.rb +23 -6
  227. data/lib/graphql/static_validation/rules/arguments_are_defined.rb +35 -26
  228. data/lib/graphql/static_validation/rules/arguments_are_defined_error.rb +4 -2
  229. data/lib/graphql/static_validation/rules/directives_are_defined.rb +12 -6
  230. data/lib/graphql/static_validation/rules/directives_are_in_valid_locations.rb +14 -14
  231. data/lib/graphql/static_validation/rules/fields_are_defined_on_type.rb +4 -4
  232. data/lib/graphql/static_validation/rules/fields_have_appropriate_selections.rb +15 -7
  233. data/lib/graphql/static_validation/rules/fields_will_merge.rb +107 -57
  234. data/lib/graphql/static_validation/rules/fields_will_merge_error.rb +25 -4
  235. data/lib/graphql/static_validation/rules/fragment_spreads_are_possible.rb +3 -3
  236. data/lib/graphql/static_validation/rules/fragments_are_finite.rb +2 -2
  237. data/lib/graphql/static_validation/rules/input_object_names_are_unique.rb +30 -0
  238. data/lib/graphql/static_validation/rules/input_object_names_are_unique_error.rb +30 -0
  239. data/lib/graphql/static_validation/rules/one_of_input_objects_are_valid.rb +66 -0
  240. data/lib/graphql/static_validation/rules/one_of_input_objects_are_valid_error.rb +29 -0
  241. data/lib/graphql/static_validation/rules/query_root_exists.rb +17 -0
  242. data/lib/graphql/static_validation/rules/query_root_exists_error.rb +26 -0
  243. data/lib/graphql/static_validation/rules/required_arguments_are_present.rb +6 -4
  244. data/lib/graphql/static_validation/rules/required_input_object_attributes_are_present.rb +22 -10
  245. data/lib/graphql/static_validation/rules/unique_directives_per_location.rb +13 -7
  246. data/lib/graphql/static_validation/rules/variable_default_values_are_correctly_typed.rb +12 -13
  247. data/lib/graphql/static_validation/rules/variable_usages_are_allowed.rb +19 -14
  248. data/lib/graphql/static_validation/rules/variables_are_input_types.rb +1 -1
  249. data/lib/graphql/static_validation/rules/variables_are_used_and_defined.rb +5 -3
  250. data/lib/graphql/static_validation/validation_context.rb +17 -7
  251. data/lib/graphql/static_validation/validation_timeout_error.rb +25 -0
  252. data/lib/graphql/static_validation/validator.rb +32 -20
  253. data/lib/graphql/static_validation.rb +1 -3
  254. data/lib/graphql/string_encoding_error.rb +13 -3
  255. data/lib/graphql/subscriptions/action_cable_subscriptions.rb +134 -24
  256. data/lib/graphql/subscriptions/broadcast_analyzer.rb +81 -0
  257. data/lib/graphql/subscriptions/default_subscription_resolve_extension.rb +58 -0
  258. data/lib/graphql/subscriptions/event.rb +90 -27
  259. data/lib/graphql/subscriptions/instrumentation.rb +0 -47
  260. data/lib/graphql/subscriptions/serialize.rb +53 -6
  261. data/lib/graphql/subscriptions.rb +147 -62
  262. data/lib/graphql/tracing/active_support_notifications_trace.rb +16 -0
  263. data/lib/graphql/tracing/active_support_notifications_tracing.rb +8 -17
  264. data/lib/graphql/tracing/appoptics_trace.rb +251 -0
  265. data/lib/graphql/tracing/appoptics_tracing.rb +173 -0
  266. data/lib/graphql/tracing/appsignal_trace.rb +77 -0
  267. data/lib/graphql/tracing/appsignal_tracing.rb +23 -0
  268. data/lib/graphql/tracing/data_dog_trace.rb +196 -0
  269. data/lib/graphql/tracing/data_dog_tracing.rb +53 -2
  270. data/lib/graphql/tracing/legacy_trace.rb +69 -0
  271. data/lib/graphql/tracing/new_relic_trace.rb +75 -0
  272. data/lib/graphql/tracing/new_relic_tracing.rb +9 -12
  273. data/lib/graphql/tracing/notifications_trace.rb +45 -0
  274. data/lib/graphql/tracing/notifications_tracing.rb +59 -0
  275. data/lib/graphql/tracing/platform_trace.rb +118 -0
  276. data/lib/graphql/tracing/platform_tracing.rb +77 -31
  277. data/lib/graphql/tracing/prometheus_trace.rb +89 -0
  278. data/lib/graphql/tracing/prometheus_tracing/graphql_collector.rb +5 -2
  279. data/lib/graphql/tracing/prometheus_tracing.rb +11 -3
  280. data/lib/graphql/tracing/scout_trace.rb +72 -0
  281. data/lib/graphql/tracing/scout_tracing.rb +19 -0
  282. data/lib/graphql/tracing/statsd_trace.rb +56 -0
  283. data/lib/graphql/tracing/statsd_tracing.rb +42 -0
  284. data/lib/graphql/tracing/trace.rb +75 -0
  285. data/lib/graphql/tracing.rb +24 -67
  286. data/lib/graphql/type_kinds.rb +6 -3
  287. data/lib/graphql/types/big_int.rb +23 -0
  288. data/lib/graphql/types/int.rb +11 -3
  289. data/lib/graphql/types/iso_8601_date.rb +45 -0
  290. data/lib/graphql/types/iso_8601_date_time.rb +36 -8
  291. data/lib/graphql/types/json.rb +25 -0
  292. data/lib/graphql/types/relay/base_connection.rb +18 -90
  293. data/lib/graphql/types/relay/base_edge.rb +2 -36
  294. data/lib/graphql/types/relay/connection_behaviors.rb +193 -0
  295. data/lib/graphql/types/relay/edge_behaviors.rb +82 -0
  296. data/lib/graphql/types/relay/has_node_field.rb +41 -0
  297. data/lib/graphql/types/relay/has_nodes_field.rb +41 -0
  298. data/lib/graphql/types/relay/node.rb +2 -4
  299. data/lib/graphql/types/relay/node_behaviors.rb +25 -0
  300. data/lib/graphql/types/relay/page_info.rb +2 -14
  301. data/lib/graphql/types/relay/page_info_behaviors.rb +30 -0
  302. data/lib/graphql/types/relay.rb +10 -5
  303. data/lib/graphql/types/string.rb +8 -2
  304. data/lib/graphql/types.rb +3 -0
  305. data/lib/graphql/unauthorized_error.rb +3 -3
  306. data/lib/graphql/unauthorized_field_error.rb +1 -1
  307. data/lib/graphql/unresolved_type_error.rb +2 -2
  308. data/lib/graphql/version.rb +1 -1
  309. data/lib/graphql.rb +68 -54
  310. data/readme.md +4 -7
  311. metadata +150 -822
  312. data/lib/graphql/analysis/analyze_query.rb +0 -91
  313. data/lib/graphql/analysis/field_usage.rb +0 -45
  314. data/lib/graphql/analysis/max_query_complexity.rb +0 -26
  315. data/lib/graphql/analysis/max_query_depth.rb +0 -26
  316. data/lib/graphql/analysis/query_complexity.rb +0 -88
  317. data/lib/graphql/analysis/query_depth.rb +0 -56
  318. data/lib/graphql/analysis/reducer_state.rb +0 -48
  319. data/lib/graphql/argument.rb +0 -153
  320. data/lib/graphql/authorization.rb +0 -82
  321. data/lib/graphql/backwards_compatibility.rb +0 -60
  322. data/lib/graphql/base_type.rb +0 -226
  323. data/lib/graphql/boolean_type.rb +0 -2
  324. data/lib/graphql/compatibility/execution_specification/counter_schema.rb +0 -53
  325. data/lib/graphql/compatibility/execution_specification/specification_schema.rb +0 -200
  326. data/lib/graphql/compatibility/execution_specification.rb +0 -435
  327. data/lib/graphql/compatibility/lazy_execution_specification/lazy_schema.rb +0 -111
  328. data/lib/graphql/compatibility/lazy_execution_specification.rb +0 -213
  329. data/lib/graphql/compatibility/query_parser_specification/parse_error_specification.rb +0 -91
  330. data/lib/graphql/compatibility/query_parser_specification/query_assertions.rb +0 -79
  331. data/lib/graphql/compatibility/query_parser_specification.rb +0 -264
  332. data/lib/graphql/compatibility/schema_parser_specification.rb +0 -680
  333. data/lib/graphql/compatibility.rb +0 -5
  334. data/lib/graphql/define/assign_argument.rb +0 -12
  335. data/lib/graphql/define/assign_connection.rb +0 -13
  336. data/lib/graphql/define/assign_enum_value.rb +0 -18
  337. data/lib/graphql/define/assign_global_id_field.rb +0 -11
  338. data/lib/graphql/define/assign_mutation_function.rb +0 -34
  339. data/lib/graphql/define/assign_object_field.rb +0 -42
  340. data/lib/graphql/define/defined_object_proxy.rb +0 -50
  341. data/lib/graphql/define/instance_definable.rb +0 -300
  342. data/lib/graphql/define/no_definition_error.rb +0 -7
  343. data/lib/graphql/define/non_null_with_bang.rb +0 -16
  344. data/lib/graphql/define/type_definer.rb +0 -31
  345. data/lib/graphql/define.rb +0 -31
  346. data/lib/graphql/deprecated_dsl.rb +0 -42
  347. data/lib/graphql/directive/deprecated_directive.rb +0 -13
  348. data/lib/graphql/directive/include_directive.rb +0 -2
  349. data/lib/graphql/directive/skip_directive.rb +0 -2
  350. data/lib/graphql/directive.rb +0 -104
  351. data/lib/graphql/enum_type.rb +0 -193
  352. data/lib/graphql/execution/execute.rb +0 -319
  353. data/lib/graphql/execution/flatten.rb +0 -40
  354. data/lib/graphql/execution/instrumentation.rb +0 -92
  355. data/lib/graphql/execution/interpreter/hash_response.rb +0 -46
  356. data/lib/graphql/execution/lazy/resolve.rb +0 -91
  357. data/lib/graphql/execution/typecast.rb +0 -50
  358. data/lib/graphql/field/resolve.rb +0 -59
  359. data/lib/graphql/field.rb +0 -330
  360. data/lib/graphql/filter.rb +0 -53
  361. data/lib/graphql/float_type.rb +0 -2
  362. data/lib/graphql/function.rb +0 -153
  363. data/lib/graphql/id_type.rb +0 -2
  364. data/lib/graphql/input_object_type.rb +0 -153
  365. data/lib/graphql/int_type.rb +0 -2
  366. data/lib/graphql/interface_type.rb +0 -86
  367. data/lib/graphql/internal_representation/document.rb +0 -27
  368. data/lib/graphql/internal_representation/node.rb +0 -206
  369. data/lib/graphql/internal_representation/print.rb +0 -51
  370. data/lib/graphql/internal_representation/rewrite.rb +0 -184
  371. data/lib/graphql/internal_representation/scope.rb +0 -88
  372. data/lib/graphql/internal_representation/visit.rb +0 -36
  373. data/lib/graphql/internal_representation.rb +0 -7
  374. data/lib/graphql/language/lexer.rl +0 -236
  375. data/lib/graphql/list_type.rb +0 -80
  376. data/lib/graphql/literal_validation_error.rb +0 -6
  377. data/lib/graphql/non_null_type.rb +0 -81
  378. data/lib/graphql/object_type.rb +0 -141
  379. data/lib/graphql/query/arguments.rb +0 -179
  380. data/lib/graphql/query/arguments_cache.rb +0 -25
  381. data/lib/graphql/query/executor.rb +0 -53
  382. data/lib/graphql/query/literal_input.rb +0 -115
  383. data/lib/graphql/query/serial_execution/field_resolution.rb +0 -92
  384. data/lib/graphql/query/serial_execution/operation_resolution.rb +0 -19
  385. data/lib/graphql/query/serial_execution/selection_resolution.rb +0 -23
  386. data/lib/graphql/query/serial_execution/value_resolution.rb +0 -87
  387. data/lib/graphql/query/serial_execution.rb +0 -39
  388. data/lib/graphql/relay/array_connection.rb +0 -85
  389. data/lib/graphql/relay/base_connection.rb +0 -172
  390. data/lib/graphql/relay/connection_instrumentation.rb +0 -54
  391. data/lib/graphql/relay/connection_resolve.rb +0 -43
  392. data/lib/graphql/relay/connection_type.rb +0 -40
  393. data/lib/graphql/relay/edge.rb +0 -27
  394. data/lib/graphql/relay/edge_type.rb +0 -18
  395. data/lib/graphql/relay/edges_instrumentation.rb +0 -40
  396. data/lib/graphql/relay/global_id_resolve.rb +0 -18
  397. data/lib/graphql/relay/mongo_relation_connection.rb +0 -50
  398. data/lib/graphql/relay/mutation/instrumentation.rb +0 -23
  399. data/lib/graphql/relay/mutation/resolve.rb +0 -56
  400. data/lib/graphql/relay/mutation/result.rb +0 -38
  401. data/lib/graphql/relay/mutation.rb +0 -190
  402. data/lib/graphql/relay/node.rb +0 -36
  403. data/lib/graphql/relay/page_info.rb +0 -7
  404. data/lib/graphql/relay/relation_connection.rb +0 -186
  405. data/lib/graphql/relay/type_extensions.rb +0 -30
  406. data/lib/graphql/scalar_type.rb +0 -135
  407. data/lib/graphql/schema/catchall_middleware.rb +0 -35
  408. data/lib/graphql/schema/default_parse_error.rb +0 -10
  409. data/lib/graphql/schema/default_type_error.rb +0 -15
  410. data/lib/graphql/schema/member/accepts_definition.rb +0 -152
  411. data/lib/graphql/schema/member/cached_graphql_definition.rb +0 -26
  412. data/lib/graphql/schema/member/instrumentation.rb +0 -121
  413. data/lib/graphql/schema/middleware_chain.rb +0 -82
  414. data/lib/graphql/schema/possible_types.rb +0 -39
  415. data/lib/graphql/schema/rescue_middleware.rb +0 -55
  416. data/lib/graphql/schema/timeout_middleware.rb +0 -85
  417. data/lib/graphql/schema/traversal.rb +0 -228
  418. data/lib/graphql/schema/validation.rb +0 -286
  419. data/lib/graphql/static_validation/default_visitor.rb +0 -15
  420. data/lib/graphql/static_validation/no_validate_visitor.rb +0 -10
  421. data/lib/graphql/static_validation/type_stack.rb +0 -216
  422. data/lib/graphql/string_type.rb +0 -2
  423. data/lib/graphql/subscriptions/subscription_root.rb +0 -66
  424. data/lib/graphql/tracing/skylight_tracing.rb +0 -61
  425. data/lib/graphql/types/relay/base_field.rb +0 -22
  426. data/lib/graphql/types/relay/base_interface.rb +0 -29
  427. data/lib/graphql/types/relay/base_object.rb +0 -26
  428. data/lib/graphql/types/relay/node_field.rb +0 -43
  429. data/lib/graphql/types/relay/nodes_field.rb +0 -45
  430. data/lib/graphql/union_type.rb +0 -100
  431. data/lib/graphql/upgrader/member.rb +0 -899
  432. data/lib/graphql/upgrader/schema.rb +0 -37
  433. data/spec/dummy/Gemfile +0 -12
  434. data/spec/dummy/Gemfile.lock +0 -157
  435. data/spec/dummy/README.md +0 -24
  436. data/spec/dummy/Rakefile +0 -7
  437. data/spec/dummy/app/assets/config/manifest.js +0 -1
  438. data/spec/dummy/app/assets/javascripts/application.js +0 -66
  439. data/spec/dummy/app/channels/application_cable/channel.rb +0 -5
  440. data/spec/dummy/app/channels/application_cable/connection.rb +0 -5
  441. data/spec/dummy/app/channels/graphql_channel.rb +0 -116
  442. data/spec/dummy/app/controllers/application_controller.rb +0 -4
  443. data/spec/dummy/app/controllers/pages_controller.rb +0 -5
  444. data/spec/dummy/app/helpers/application_helper.rb +0 -3
  445. data/spec/dummy/app/jobs/application_job.rb +0 -3
  446. data/spec/dummy/app/views/layouts/application.html.erb +0 -12
  447. data/spec/dummy/app/views/pages/show.html +0 -16
  448. data/spec/dummy/bin/bundle +0 -4
  449. data/spec/dummy/bin/rails +0 -5
  450. data/spec/dummy/bin/rake +0 -5
  451. data/spec/dummy/bin/setup +0 -31
  452. data/spec/dummy/bin/update +0 -27
  453. data/spec/dummy/bin/yarn +0 -12
  454. data/spec/dummy/config/application.rb +0 -30
  455. data/spec/dummy/config/boot.rb +0 -4
  456. data/spec/dummy/config/cable.yml +0 -10
  457. data/spec/dummy/config/environment.rb +0 -6
  458. data/spec/dummy/config/environments/development.rb +0 -40
  459. data/spec/dummy/config/environments/production.rb +0 -76
  460. data/spec/dummy/config/environments/test.rb +0 -37
  461. data/spec/dummy/config/initializers/application_controller_renderer.rb +0 -9
  462. data/spec/dummy/config/initializers/backtrace_silencers.rb +0 -8
  463. data/spec/dummy/config/initializers/cookies_serializer.rb +0 -6
  464. data/spec/dummy/config/initializers/filter_parameter_logging.rb +0 -5
  465. data/spec/dummy/config/initializers/inflections.rb +0 -17
  466. data/spec/dummy/config/initializers/mime_types.rb +0 -5
  467. data/spec/dummy/config/initializers/wrap_parameters.rb +0 -10
  468. data/spec/dummy/config/locales/en.yml +0 -33
  469. data/spec/dummy/config/puma.rb +0 -57
  470. data/spec/dummy/config/routes.rb +0 -4
  471. data/spec/dummy/config/secrets.yml +0 -32
  472. data/spec/dummy/config.ru +0 -6
  473. data/spec/dummy/log/test.log +0 -199
  474. data/spec/dummy/package.json +0 -5
  475. data/spec/dummy/public/404.html +0 -67
  476. data/spec/dummy/public/422.html +0 -67
  477. data/spec/dummy/public/500.html +0 -66
  478. data/spec/dummy/public/apple-touch-icon-precomposed.png +0 -0
  479. data/spec/dummy/public/apple-touch-icon.png +0 -0
  480. data/spec/dummy/public/favicon.ico +0 -0
  481. data/spec/dummy/public/robots.txt +0 -1
  482. data/spec/dummy/test/application_system_test_case.rb +0 -6
  483. data/spec/dummy/test/system/action_cable_subscription_test.rb +0 -45
  484. data/spec/dummy/test/test_helper.rb +0 -4
  485. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/4w/4wzXRZrAkwKdgYaSE0pid5eB-fer8vSfSku_NPg4rMA.cache +0 -0
  486. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/7I/7IHVBiJT06QSpgLpLoJIxboQ0B-D_tMTxsvoezBTV3Q.cache +0 -1
  487. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/8w/8wY_SKagj8wHuwGNAAf6JnQ8joMbC6cEYpHrTAI8Urc.cache +0 -1
  488. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/AK/AKzz1u6bGb4auXcrObA_g5LL-oV0ejNGa448AgAi_WQ.cache +0 -1
  489. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/ET/ETW4uxvaYpruL8y6_ZptUH82ZowMaHIqvg5WexBFdEM.cache +0 -3
  490. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/F1/F1TWpjjyA56k9Z90n5B3xRn7DUdGjX73QCkYC6k07JQ.cache +0 -0
  491. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/F8/F8MUNRzORGFgr329fNM0xLaoWCXdv3BIalT7dsvLfjs.cache +0 -2
  492. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/KB/KB07ZaKNC5uXJ7TjLi-WqnY6g7dq8wWp_8N3HNjBNxg.cache +0 -2
  493. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Ms/MsKSimH_UCB-H1tLvDABDHuvGciuoW6kVqQWDrXU5FQ.cache +0 -0
  494. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Mt/Mtci-Kim50aPOmeClD4AIicKn1d1WJ0n454IjSd94sk.cache +0 -0
  495. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/QH/QHt3Tc1Y6M66Oo_pDuMyWrQNs4Pp3SMeZR5K1wJj2Ts.cache +0 -1
  496. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/XU/XU4k1OXnfMils5SrirorPvDSyDSqiOWLZNtmAH1HH8k.cache +0 -0
  497. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/ZI/ZIof7mZxWWCnraIFOCuV6a8QRWzKJXJnx2Xd7C0ZyX0.cache +0 -1
  498. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/cG/cGc_puuPS5pZKgUcy1Y_i1L6jl5UtsiIrMH59rTzR6c.cache +0 -3
  499. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/df/dfro_B6bx3KP1Go-7jEOqqZ2j4hVRseXIc3es9PKQno.cache +0 -1
  500. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/jO/jO1DfbqnG0mTULsjJJANc3fefrG2zt7DIMmcptMT628.cache +0 -1
  501. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/pE/pE7gO6pQ-z187Swb4hT554wmqsq-cNzgPWLrCz-LQQQ.cache +0 -0
  502. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/r9/r9iU1l58a6rxkZSW5RSC52_tD-_UQuHxoMVnkfJ7Mhs.cache +0 -1
  503. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/xi/xitPPFfPIyDMpaznV0sBBcw8eSCV8PJcLLWin78sCgE.cache +0 -0
  504. data/spec/dummy/tmp/screenshots/failures_test_it_handles_subscriptions.png +0 -0
  505. data/spec/fixtures/upgrader/account.original.rb +0 -19
  506. data/spec/fixtures/upgrader/account.transformed.rb +0 -20
  507. data/spec/fixtures/upgrader/blame_range.original.rb +0 -43
  508. data/spec/fixtures/upgrader/blame_range.transformed.rb +0 -30
  509. data/spec/fixtures/upgrader/date_time.original.rb +0 -24
  510. data/spec/fixtures/upgrader/date_time.transformed.rb +0 -23
  511. data/spec/fixtures/upgrader/delete_project.original.rb +0 -28
  512. data/spec/fixtures/upgrader/delete_project.transformed.rb +0 -27
  513. data/spec/fixtures/upgrader/gist_order_field.original.rb +0 -14
  514. data/spec/fixtures/upgrader/gist_order_field.transformed.rb +0 -13
  515. data/spec/fixtures/upgrader/increment_count.original.rb +0 -59
  516. data/spec/fixtures/upgrader/increment_count.transformed.rb +0 -50
  517. data/spec/fixtures/upgrader/photo.original.rb +0 -10
  518. data/spec/fixtures/upgrader/photo.transformed.rb +0 -12
  519. data/spec/fixtures/upgrader/release_order.original.rb +0 -15
  520. data/spec/fixtures/upgrader/release_order.transformed.rb +0 -14
  521. data/spec/fixtures/upgrader/starrable.original.rb +0 -49
  522. data/spec/fixtures/upgrader/starrable.transformed.rb +0 -46
  523. data/spec/fixtures/upgrader/subscribable.original.rb +0 -55
  524. data/spec/fixtures/upgrader/subscribable.transformed.rb +0 -51
  525. data/spec/fixtures/upgrader/type_x.original.rb +0 -65
  526. data/spec/fixtures/upgrader/type_x.transformed.rb +0 -56
  527. data/spec/graphql/analysis/analyze_query_spec.rb +0 -272
  528. data/spec/graphql/analysis/ast/field_usage_spec.rb +0 -51
  529. data/spec/graphql/analysis/ast/max_query_complexity_spec.rb +0 -120
  530. data/spec/graphql/analysis/ast/max_query_depth_spec.rb +0 -114
  531. data/spec/graphql/analysis/ast/query_complexity_spec.rb +0 -299
  532. data/spec/graphql/analysis/ast/query_depth_spec.rb +0 -108
  533. data/spec/graphql/analysis/ast_spec.rb +0 -269
  534. data/spec/graphql/analysis/field_usage_spec.rb +0 -62
  535. data/spec/graphql/analysis/max_query_complexity_spec.rb +0 -102
  536. data/spec/graphql/analysis/max_query_depth_spec.rb +0 -101
  537. data/spec/graphql/analysis/query_complexity_spec.rb +0 -301
  538. data/spec/graphql/analysis/query_depth_spec.rb +0 -81
  539. data/spec/graphql/argument_spec.rb +0 -159
  540. data/spec/graphql/authorization_spec.rb +0 -901
  541. data/spec/graphql/backtrace_spec.rb +0 -206
  542. data/spec/graphql/base_type_spec.rb +0 -171
  543. data/spec/graphql/boolean_type_spec.rb +0 -21
  544. data/spec/graphql/compatibility/execution_specification_spec.rb +0 -4
  545. data/spec/graphql/compatibility/lazy_execution_specification_spec.rb +0 -4
  546. data/spec/graphql/compatibility/query_parser_specification_spec.rb +0 -6
  547. data/spec/graphql/compatibility/schema_parser_specification_spec.rb +0 -6
  548. data/spec/graphql/define/assign_argument_spec.rb +0 -61
  549. data/spec/graphql/define/instance_definable_spec.rb +0 -203
  550. data/spec/graphql/directive/skip_directive_spec.rb +0 -9
  551. data/spec/graphql/directive_spec.rb +0 -295
  552. data/spec/graphql/enum_type_spec.rb +0 -158
  553. data/spec/graphql/execution/execute_spec.rb +0 -303
  554. data/spec/graphql/execution/instrumentation_spec.rb +0 -184
  555. data/spec/graphql/execution/interpreter_spec.rb +0 -485
  556. data/spec/graphql/execution/lazy/lazy_method_map_spec.rb +0 -57
  557. data/spec/graphql/execution/lazy_spec.rb +0 -240
  558. data/spec/graphql/execution/lookahead_spec.rb +0 -363
  559. data/spec/graphql/execution/multiplex_spec.rb +0 -211
  560. data/spec/graphql/execution/typecast_spec.rb +0 -47
  561. data/spec/graphql/execution_error_spec.rb +0 -325
  562. data/spec/graphql/field_spec.rb +0 -246
  563. data/spec/graphql/float_type_spec.rb +0 -16
  564. data/spec/graphql/function_spec.rb +0 -129
  565. data/spec/graphql/id_type_spec.rb +0 -33
  566. data/spec/graphql/input_object_type_spec.rb +0 -25
  567. data/spec/graphql/int_type_spec.rb +0 -35
  568. data/spec/graphql/interface_type_spec.rb +0 -196
  569. data/spec/graphql/internal_representation/print_spec.rb +0 -41
  570. data/spec/graphql/internal_representation/rewrite_spec.rb +0 -376
  571. data/spec/graphql/introspection/directive_type_spec.rb +0 -61
  572. data/spec/graphql/introspection/input_value_type_spec.rb +0 -105
  573. data/spec/graphql/introspection/introspection_query_spec.rb +0 -59
  574. data/spec/graphql/introspection/schema_type_spec.rb +0 -56
  575. data/spec/graphql/introspection/type_type_spec.rb +0 -155
  576. data/spec/graphql/language/block_string_spec.rb +0 -70
  577. data/spec/graphql/language/definition_slice_spec.rb +0 -226
  578. data/spec/graphql/language/document_from_schema_definition_spec.rb +0 -770
  579. data/spec/graphql/language/equality_spec.rb +0 -84
  580. data/spec/graphql/language/generation_spec.rb +0 -38
  581. data/spec/graphql/language/lexer_spec.rb +0 -135
  582. data/spec/graphql/language/nodes_spec.rb +0 -67
  583. data/spec/graphql/language/parser_spec.rb +0 -175
  584. data/spec/graphql/language/printer_spec.rb +0 -215
  585. data/spec/graphql/language/visitor_spec.rb +0 -400
  586. data/spec/graphql/list_type_spec.rb +0 -57
  587. data/spec/graphql/non_null_type_spec.rb +0 -48
  588. data/spec/graphql/object_type_spec.rb +0 -197
  589. data/spec/graphql/query/arguments_spec.rb +0 -346
  590. data/spec/graphql/query/context_spec.rb +0 -292
  591. data/spec/graphql/query/executor_spec.rb +0 -314
  592. data/spec/graphql/query/literal_input_spec.rb +0 -91
  593. data/spec/graphql/query/result_spec.rb +0 -29
  594. data/spec/graphql/query/serial_execution/value_resolution_spec.rb +0 -109
  595. data/spec/graphql/query_spec.rb +0 -800
  596. data/spec/graphql/rake_task_spec.rb +0 -59
  597. data/spec/graphql/scalar_type_spec.rb +0 -66
  598. data/spec/graphql/schema/argument_spec.rb +0 -127
  599. data/spec/graphql/schema/build_from_definition_spec.rb +0 -1187
  600. data/spec/graphql/schema/catchall_middleware_spec.rb +0 -35
  601. data/spec/graphql/schema/directive/feature_spec.rb +0 -81
  602. data/spec/graphql/schema/directive/transform_spec.rb +0 -39
  603. data/spec/graphql/schema/enum_spec.rb +0 -83
  604. data/spec/graphql/schema/enum_value_spec.rb +0 -24
  605. data/spec/graphql/schema/field_extension_spec.rb +0 -115
  606. data/spec/graphql/schema/field_spec.rb +0 -301
  607. data/spec/graphql/schema/finder_spec.rb +0 -135
  608. data/spec/graphql/schema/input_object_spec.rb +0 -238
  609. data/spec/graphql/schema/instrumentation_spec.rb +0 -43
  610. data/spec/graphql/schema/interface_spec.rb +0 -215
  611. data/spec/graphql/schema/introspection_system_spec.rb +0 -47
  612. data/spec/graphql/schema/list_spec.rb +0 -46
  613. data/spec/graphql/schema/loader_spec.rb +0 -286
  614. data/spec/graphql/schema/member/accepts_definition_spec.rb +0 -115
  615. data/spec/graphql/schema/member/build_type_spec.rb +0 -63
  616. data/spec/graphql/schema/member/scoped_spec.rb +0 -177
  617. data/spec/graphql/schema/member/type_system_helpers_spec.rb +0 -63
  618. data/spec/graphql/schema/middleware_chain_spec.rb +0 -57
  619. data/spec/graphql/schema/mutation_spec.rb +0 -150
  620. data/spec/graphql/schema/non_null_spec.rb +0 -46
  621. data/spec/graphql/schema/object_spec.rb +0 -244
  622. data/spec/graphql/schema/printer_spec.rb +0 -869
  623. data/spec/graphql/schema/relay_classic_mutation_spec.rb +0 -234
  624. data/spec/graphql/schema/rescue_middleware_spec.rb +0 -74
  625. data/spec/graphql/schema/resolver_spec.rb +0 -640
  626. data/spec/graphql/schema/scalar_spec.rb +0 -101
  627. data/spec/graphql/schema/subscription_spec.rb +0 -416
  628. data/spec/graphql/schema/timeout_middleware_spec.rb +0 -188
  629. data/spec/graphql/schema/traversal_spec.rb +0 -222
  630. data/spec/graphql/schema/type_expression_spec.rb +0 -39
  631. data/spec/graphql/schema/union_spec.rb +0 -72
  632. data/spec/graphql/schema/unique_within_type_spec.rb +0 -44
  633. data/spec/graphql/schema/validation_spec.rb +0 -355
  634. data/spec/graphql/schema/warden_spec.rb +0 -926
  635. data/spec/graphql/static_validation/rules/argument_literals_are_compatible_spec.rb +0 -413
  636. data/spec/graphql/static_validation/rules/argument_names_are_unique_spec.rb +0 -44
  637. data/spec/graphql/static_validation/rules/arguments_are_defined_spec.rb +0 -112
  638. data/spec/graphql/static_validation/rules/directives_are_defined_spec.rb +0 -35
  639. data/spec/graphql/static_validation/rules/directives_are_in_valid_locations_spec.rb +0 -42
  640. data/spec/graphql/static_validation/rules/fields_are_defined_on_type_spec.rb +0 -167
  641. data/spec/graphql/static_validation/rules/fields_have_appropriate_selections_spec.rb +0 -66
  642. data/spec/graphql/static_validation/rules/fields_will_merge_spec.rb +0 -740
  643. data/spec/graphql/static_validation/rules/fragment_names_are_unique_spec.rb +0 -28
  644. data/spec/graphql/static_validation/rules/fragment_spreads_are_possible_spec.rb +0 -52
  645. data/spec/graphql/static_validation/rules/fragment_types_exist_spec.rb +0 -42
  646. data/spec/graphql/static_validation/rules/fragments_are_finite_spec.rb +0 -123
  647. data/spec/graphql/static_validation/rules/fragments_are_named_spec.rb +0 -24
  648. data/spec/graphql/static_validation/rules/fragments_are_on_composite_types_spec.rb +0 -56
  649. data/spec/graphql/static_validation/rules/fragments_are_used_spec.rb +0 -61
  650. data/spec/graphql/static_validation/rules/mutation_root_exists_spec.rb +0 -39
  651. data/spec/graphql/static_validation/rules/no_definitions_are_present_spec.rb +0 -62
  652. data/spec/graphql/static_validation/rules/operation_names_are_valid_spec.rb +0 -82
  653. data/spec/graphql/static_validation/rules/required_arguments_are_present_spec.rb +0 -73
  654. data/spec/graphql/static_validation/rules/required_input_object_attributes_are_present_spec.rb +0 -58
  655. data/spec/graphql/static_validation/rules/subscription_root_exists_spec.rb +0 -34
  656. data/spec/graphql/static_validation/rules/unique_directives_per_location_spec.rb +0 -188
  657. data/spec/graphql/static_validation/rules/variable_default_values_are_correctly_typed_spec.rb +0 -196
  658. data/spec/graphql/static_validation/rules/variable_names_are_unique_spec.rb +0 -23
  659. data/spec/graphql/static_validation/rules/variable_usages_are_allowed_spec.rb +0 -236
  660. data/spec/graphql/static_validation/rules/variables_are_input_types_spec.rb +0 -78
  661. data/spec/graphql/static_validation/rules/variables_are_used_and_defined_spec.rb +0 -81
  662. data/spec/graphql/static_validation/type_stack_spec.rb +0 -29
  663. data/spec/graphql/static_validation/validator_spec.rb +0 -204
  664. data/spec/graphql/string_type_spec.rb +0 -80
  665. data/spec/graphql/subscriptions/serialize_spec.rb +0 -49
  666. data/spec/graphql/subscriptions_spec.rb +0 -502
  667. data/spec/graphql/tracing/new_relic_tracing_spec.rb +0 -63
  668. data/spec/graphql/tracing/platform_tracing_spec.rb +0 -137
  669. data/spec/graphql/tracing/prometheus_tracing_spec.rb +0 -42
  670. data/spec/graphql/tracing/scout_tracing_spec.rb +0 -17
  671. data/spec/graphql/tracing/skylight_tracing_spec.rb +0 -63
  672. data/spec/graphql/tracing_spec.rb +0 -52
  673. data/spec/graphql/types/iso_8601_date_time_spec.rb +0 -137
  674. data/spec/graphql/union_type_spec.rb +0 -211
  675. data/spec/graphql/upgrader/member_spec.rb +0 -583
  676. data/spec/graphql/upgrader/schema_spec.rb +0 -82
  677. data/spec/integration/mongoid/graphql/relay/mongo_relation_connection_spec.rb +0 -528
  678. data/spec/integration/mongoid/spec_helper.rb +0 -2
  679. data/spec/integration/mongoid/star_trek/data.rb +0 -126
  680. data/spec/integration/mongoid/star_trek/schema.rb +0 -425
  681. data/spec/integration/rails/data.rb +0 -110
  682. data/spec/integration/rails/generators/base_generator_test.rb +0 -7
  683. data/spec/integration/rails/generators/graphql/enum_generator_spec.rb +0 -30
  684. data/spec/integration/rails/generators/graphql/install_generator_spec.rb +0 -218
  685. data/spec/integration/rails/generators/graphql/interface_generator_spec.rb +0 -34
  686. data/spec/integration/rails/generators/graphql/loader_generator_spec.rb +0 -59
  687. data/spec/integration/rails/generators/graphql/mutation_generator_spec.rb +0 -71
  688. data/spec/integration/rails/generators/graphql/object_generator_spec.rb +0 -54
  689. data/spec/integration/rails/generators/graphql/scalar_generator_spec.rb +0 -28
  690. data/spec/integration/rails/generators/graphql/union_generator_spec.rb +0 -67
  691. data/spec/integration/rails/graphql/input_object_type_spec.rb +0 -364
  692. data/spec/integration/rails/graphql/query/variables_spec.rb +0 -375
  693. data/spec/integration/rails/graphql/relay/array_connection_spec.rb +0 -290
  694. data/spec/integration/rails/graphql/relay/base_connection_spec.rb +0 -101
  695. data/spec/integration/rails/graphql/relay/connection_instrumentation_spec.rb +0 -80
  696. data/spec/integration/rails/graphql/relay/connection_resolve_spec.rb +0 -79
  697. data/spec/integration/rails/graphql/relay/connection_type_spec.rb +0 -106
  698. data/spec/integration/rails/graphql/relay/edge_spec.rb +0 -10
  699. data/spec/integration/rails/graphql/relay/mutation_spec.rb +0 -387
  700. data/spec/integration/rails/graphql/relay/node_spec.rb +0 -263
  701. data/spec/integration/rails/graphql/relay/page_info_spec.rb +0 -111
  702. data/spec/integration/rails/graphql/relay/range_add_spec.rb +0 -117
  703. data/spec/integration/rails/graphql/relay/relation_connection_spec.rb +0 -837
  704. data/spec/integration/rails/graphql/schema_spec.rb +0 -476
  705. data/spec/integration/rails/graphql/tracing/active_support_notifications_tracing_spec.rb +0 -62
  706. data/spec/integration/rails/spec_helper.rb +0 -25
  707. data/spec/integration/tmp/app/graphql/types/family_type.rb +0 -9
  708. data/spec/spec_helper.rb +0 -116
  709. data/spec/support/dummy/data.rb +0 -45
  710. data/spec/support/dummy/schema.rb +0 -492
  711. data/spec/support/error_bubbling_helpers.rb +0 -23
  712. data/spec/support/global_id.rb +0 -23
  713. data/spec/support/jazz.rb +0 -759
  714. data/spec/support/lazy_helpers.rb +0 -192
  715. data/spec/support/magic_cards/schema.graphql +0 -33
  716. data/spec/support/minimum_input_object.rb +0 -21
  717. data/spec/support/new_relic.rb +0 -27
  718. data/spec/support/parser/filename_example.graphql +0 -5
  719. data/spec/support/parser/filename_example_error_1.graphql +0 -4
  720. data/spec/support/parser/filename_example_error_2.graphql +0 -5
  721. data/spec/support/skylight.rb +0 -39
  722. data/spec/support/star_wars/schema.rb +0 -465
  723. data/spec/support/static_validation_helpers.rb +0 -32
@@ -1,901 +0,0 @@
1
- # frozen_string_literal: true
2
- require "spec_helper"
3
-
4
- describe GraphQL::Authorization do
5
- module AuthTest
6
- class Box
7
- attr_reader :value
8
- def initialize(value:)
9
- @value = value
10
- end
11
- end
12
-
13
- class BaseArgument < GraphQL::Schema::Argument
14
- def visible?(context)
15
- super && (context[:hide] ? @name != "hidden" : true)
16
- end
17
-
18
- def accessible?(context)
19
- super && (context[:hide] ? @name != "inaccessible" : true)
20
- end
21
-
22
- def authorized?(parent_object, context)
23
- super && parent_object != :hide2
24
- end
25
- end
26
-
27
- class BaseField < GraphQL::Schema::Field
28
- def initialize(*args, edge_class: nil, **kwargs, &block)
29
- @edge_class = edge_class
30
- super(*args, **kwargs, &block)
31
- end
32
-
33
- def to_graphql
34
- field_defn = super
35
- if @edge_class
36
- field_defn.edge_class = @edge_class
37
- end
38
- field_defn
39
- end
40
-
41
- argument_class BaseArgument
42
- def visible?(context)
43
- super && (context[:hide] ? @name != "hidden" : true)
44
- end
45
-
46
- def accessible?(context)
47
- super && (context[:hide] ? @name != "inaccessible" : true)
48
- end
49
-
50
- def authorized?(object, context)
51
- super && object != :hide && object != :replace
52
- end
53
- end
54
-
55
- class BaseObject < GraphQL::Schema::Object
56
- field_class BaseField
57
- end
58
-
59
- module BaseInterface
60
- include GraphQL::Schema::Interface
61
- end
62
-
63
- class BaseEnumValue < GraphQL::Schema::EnumValue
64
- def initialize(*args, role: nil, **kwargs)
65
- @role = role
66
- super(*args, **kwargs)
67
- end
68
-
69
- def visible?(context)
70
- super && (context[:hide] ? @role != :hidden : true)
71
- end
72
- end
73
-
74
- class BaseEnum < GraphQL::Schema::Enum
75
- enum_value_class(BaseEnumValue)
76
- end
77
-
78
- module HiddenInterface
79
- include BaseInterface
80
-
81
- def self.visible?(ctx)
82
- super && !ctx[:hide]
83
- end
84
-
85
- def self.resolve_type(obj, ctx)
86
- HiddenObject
87
- end
88
- end
89
-
90
- module HiddenDefaultInterface
91
- include BaseInterface
92
- # visible? will call the super method
93
- def self.resolve_type(obj, ctx)
94
- HiddenObject
95
- end
96
- end
97
-
98
- class HiddenObject < BaseObject
99
- implements HiddenInterface
100
- implements HiddenDefaultInterface
101
- def self.visible?(ctx)
102
- super && !ctx[:hide]
103
- end
104
- end
105
-
106
- class RelayObject < BaseObject
107
- def self.visible?(ctx)
108
- super && !ctx[:hidden_relay]
109
- end
110
-
111
- def self.accessible?(ctx)
112
- super && !ctx[:inaccessible_relay]
113
- end
114
-
115
- def self.authorized?(_val, ctx)
116
- super && !ctx[:unauthorized_relay]
117
- end
118
- end
119
-
120
- # TODO test default behavior for abstract types,
121
- # that they check their concrete types
122
- module InaccessibleInterface
123
- include BaseInterface
124
-
125
- def self.accessible?(ctx)
126
- super && !ctx[:hide]
127
- end
128
-
129
- def self.resolve_type(obj, ctx)
130
- InaccessibleObject
131
- end
132
- end
133
-
134
- module InaccessibleDefaultInterface
135
- include BaseInterface
136
- # accessible? will call the super method
137
- def self.resolve_type(obj, ctx)
138
- InaccessibleObject
139
- end
140
- end
141
-
142
- class InaccessibleObject < BaseObject
143
- implements InaccessibleInterface
144
- implements InaccessibleDefaultInterface
145
- def self.accessible?(ctx)
146
- super && !ctx[:hide]
147
- end
148
- end
149
-
150
- class UnauthorizedObject < BaseObject
151
- def self.authorized?(value, context)
152
- super && !context[:hide]
153
- end
154
- end
155
-
156
- class UnauthorizedBox < BaseObject
157
- # Hide `"a"`
158
- def self.authorized?(value, context)
159
- super && value != "a"
160
- end
161
-
162
- field :value, String, null: false, method: :itself
163
- end
164
-
165
- module UnauthorizedInterface
166
- include BaseInterface
167
-
168
- def self.resolve_type(obj, ctx)
169
- if obj.is_a?(String)
170
- UnauthorizedCheckBox
171
- else
172
- raise "Unexpected value: #{obj.inspect}"
173
- end
174
- end
175
- end
176
-
177
- class UnauthorizedCheckBox < BaseObject
178
- implements UnauthorizedInterface
179
- # This authorized check returns a lazy object, it should be synced by the runtime.
180
- def self.authorized?(value, context)
181
- if !value.is_a?(String)
182
- raise "Unexpected box value: #{value.inspect}"
183
- end
184
- is_authed = super && value != "a"
185
- # Make it many levels nested just to make sure we support nested lazy objects
186
- Box.new(value: Box.new(value: Box.new(value: Box.new(value: is_authed))))
187
- end
188
-
189
- field :value, String, null: false, method: :itself
190
- end
191
-
192
- class IntegerObject < BaseObject
193
- def self.authorized?(obj, ctx)
194
- if !obj.is_a?(Integer)
195
- raise "Unexpected IntegerObject: #{obj}"
196
- end
197
- is_allowed = !(ctx[:unauthorized_relay] || obj == ctx[:exclude_integer])
198
- Box.new(value: Box.new(value: is_allowed))
199
- end
200
- field :value, Integer, null: false, method: :itself
201
- end
202
-
203
- class IntegerObjectEdge < GraphQL::Types::Relay::BaseEdge
204
- node_type(IntegerObject)
205
- end
206
-
207
- class IntegerObjectConnection < GraphQL::Types::Relay::BaseConnection
208
- edge_type(IntegerObjectEdge)
209
- end
210
-
211
- # This object responds with `replaced => false`,
212
- # but if its replacement value is used, it gives `replaced => true`
213
- class Replaceable
214
- def replacement
215
- { replaced: true }
216
- end
217
-
218
- def replaced
219
- false
220
- end
221
- end
222
-
223
- class ReplacedObject < BaseObject
224
- def self.authorized?(obj, ctx)
225
- super && !ctx[:replace_me]
226
- end
227
-
228
- field :replaced, Boolean, null: false
229
- end
230
-
231
- class LandscapeFeature < BaseEnum
232
- value "MOUNTAIN"
233
- value "STREAM", role: :unauthorized
234
- value "FIELD", role: :inaccessible
235
- value "TAR_PIT", role: :hidden
236
- end
237
-
238
- class Query < BaseObject
239
- field :hidden, Integer, null: false
240
- field :unauthorized, Integer, null: true, method: :itself
241
- field :int2, Integer, null: true do
242
- argument :int, Integer, required: false
243
- argument :hidden, Integer, required: false
244
- argument :inaccessible, Integer, required: false
245
- argument :unauthorized, Integer, required: false
246
- end
247
-
248
- def int2(**args)
249
- args[:unauthorized] || 1
250
- end
251
-
252
- field :landscape_feature, LandscapeFeature, null: false do
253
- argument :string, String, required: false
254
- argument :enum, LandscapeFeature, required: false
255
- end
256
-
257
- def landscape_feature(string: nil, enum: nil)
258
- string || enum
259
- end
260
-
261
- field :landscape_features, [LandscapeFeature], null: false do
262
- argument :strings, [String], required: false
263
- argument :enums, [LandscapeFeature], required: false
264
- end
265
-
266
- def landscape_features(strings: [], enums: [])
267
- strings + enums
268
- end
269
-
270
- def empty_array; []; end
271
- field :hidden_object, HiddenObject, null: false, resolver_method: :itself
272
- field :hidden_interface, HiddenInterface, null: false, resolver_method: :itself
273
- field :hidden_default_interface, HiddenDefaultInterface, null: false, resolver_method: :itself
274
- field :hidden_connection, RelayObject.connection_type, null: :false, resolver_method: :empty_array
275
- field :hidden_edge, RelayObject.edge_type, null: :false, resolver_method: :edge_object
276
-
277
- field :inaccessible, Integer, null: false, method: :object_id
278
- field :inaccessible_object, InaccessibleObject, null: false, resolver_method: :itself
279
- field :inaccessible_interface, InaccessibleInterface, null: false, resolver_method: :itself
280
- field :inaccessible_default_interface, InaccessibleDefaultInterface, null: false, resolver_method: :itself
281
- field :inaccessible_connection, RelayObject.connection_type, null: :false, resolver_method: :empty_array
282
- field :inaccessible_edge, RelayObject.edge_type, null: :false, resolver_method: :edge_object
283
-
284
- field :unauthorized_object, UnauthorizedObject, null: true, resolver_method: :itself
285
- field :unauthorized_connection, RelayObject.connection_type, null: false, resolver_method: :array_with_item
286
- field :unauthorized_edge, RelayObject.edge_type, null: false, resolver_method: :edge_object
287
-
288
- def edge_object
289
- OpenStruct.new(node: 100)
290
- end
291
-
292
- def array_with_item
293
- [1]
294
- end
295
-
296
- field :unauthorized_lazy_box, UnauthorizedBox, null: true do
297
- argument :value, String, required: true
298
- end
299
- def unauthorized_lazy_box(value:)
300
- # Make it extra nested, just for good measure.
301
- Box.new(value: Box.new(value: value))
302
- end
303
- field :unauthorized_list_items, [UnauthorizedObject], null: true
304
- def unauthorized_list_items
305
- [self, self]
306
- end
307
-
308
- field :unauthorized_lazy_check_box, UnauthorizedCheckBox, null: true, resolver_method: :unauthorized_lazy_box do
309
- argument :value, String, required: true
310
- end
311
-
312
- field :unauthorized_interface, UnauthorizedInterface, null: true, resolver_method: :unauthorized_lazy_box do
313
- argument :value, String, required: true
314
- end
315
-
316
- field :unauthorized_lazy_list_interface, [UnauthorizedInterface, null: true], null: true
317
-
318
- def unauthorized_lazy_list_interface
319
- ["z", Box.new(value: Box.new(value: "z2")), "a", Box.new(value: "a")]
320
- end
321
-
322
- field :integers, IntegerObjectConnection, null: false
323
-
324
- def integers
325
- [1,2,3]
326
- end
327
-
328
- field :lazy_integers, IntegerObjectConnection, null: false
329
-
330
- def lazy_integers
331
- Box.new(value: Box.new(value: [1,2,3]))
332
- end
333
-
334
- field :replaced_object, ReplacedObject, null: false
335
- def replaced_object
336
- Replaceable.new
337
- end
338
- end
339
-
340
- class DoHiddenStuff < GraphQL::Schema::RelayClassicMutation
341
- def self.visible?(ctx)
342
- super && (ctx[:hidden_mutation] ? false : true)
343
- end
344
- end
345
-
346
- class DoHiddenStuff2 < GraphQL::Schema::Mutation
347
- def self.visible?(ctx)
348
- super && !ctx[:hidden_mutation]
349
- end
350
- end
351
-
352
- class DoInaccessibleStuff < GraphQL::Schema::RelayClassicMutation
353
- def self.accessible?(ctx)
354
- super && (ctx[:inaccessible_mutation] ? false : true)
355
- end
356
- end
357
-
358
- class DoUnauthorizedStuff < GraphQL::Schema::RelayClassicMutation
359
- def self.authorized?(obj, ctx)
360
- super && (ctx[:unauthorized_mutation] ? false : true)
361
- end
362
- end
363
-
364
- class Mutation < BaseObject
365
- field :do_hidden_stuff, mutation: DoHiddenStuff
366
- field :do_hidden_stuff2, mutation: DoHiddenStuff2
367
- field :do_inaccessible_stuff, mutation: DoInaccessibleStuff
368
- field :do_unauthorized_stuff, mutation: DoUnauthorizedStuff
369
- end
370
-
371
- class Schema < GraphQL::Schema
372
- if TESTING_INTERPRETER
373
- use GraphQL::Execution::Interpreter
374
- end
375
- query(Query)
376
- mutation(Mutation)
377
-
378
- # Opt in to accessible? checks
379
- query_analyzer GraphQL::Authorization::Analyzer
380
-
381
- lazy_resolve(Box, :value)
382
-
383
- def self.unauthorized_object(err)
384
- if err.object.respond_to?(:replacement)
385
- err.object.replacement
386
- elsif err.object == :replace
387
- 33
388
- else
389
- raise GraphQL::ExecutionError, "Unauthorized #{err.type.graphql_name}: #{err.object}"
390
- end
391
- end
392
-
393
- # use GraphQL::Backtrace
394
- end
395
-
396
- class SchemaWithFieldHook < GraphQL::Schema
397
- query(Query)
398
-
399
- def self.unauthorized_field(err)
400
- if err.object == :replace
401
- 42
402
- else
403
- raise GraphQL::ExecutionError, "Unauthorized field #{err.field.graphql_name} on #{err.type.graphql_name}: #{err.object}"
404
- end
405
- end
406
- end
407
- end
408
-
409
- def auth_execute(*args)
410
- AuthTest::Schema.execute(*args)
411
- end
412
-
413
- describe "applying the visible? method" do
414
- it "works in queries" do
415
- res = auth_execute(" { int int2 } ", context: { hide: true })
416
- assert_equal 1, res["errors"].size
417
- end
418
-
419
- it "applies return type visibility to fields" do
420
- error_queries = {
421
- "hiddenObject" => "{ hiddenObject { __typename } }",
422
- "hiddenInterface" => "{ hiddenInterface { __typename } }",
423
- "hiddenDefaultInterface" => "{ hiddenDefaultInterface { __typename } }",
424
- }
425
-
426
- error_queries.each do |name, q|
427
- hidden_res = auth_execute(q, context: { hide: true})
428
- assert_equal ["Field '#{name}' doesn't exist on type 'Query'"], hidden_res["errors"].map { |e| e["message"] }
429
-
430
- visible_res = auth_execute(q)
431
- # Both fields exist; the interface resolves to the object type, though
432
- assert_equal "HiddenObject", visible_res["data"][name]["__typename"]
433
- end
434
- end
435
-
436
- it "uses the mutation for derived fields, inputs and outputs" do
437
- query = "mutation { doHiddenStuff(input: {}) { __typename } }"
438
- res = auth_execute(query, context: { hidden_mutation: true })
439
- assert_equal ["Field 'doHiddenStuff' doesn't exist on type 'Mutation'"], res["errors"].map { |e| e["message"] }
440
-
441
- # `#resolve` isn't implemented, so this errors out:
442
- assert_raises NotImplementedError do
443
- auth_execute(query)
444
- end
445
-
446
- introspection_q = <<-GRAPHQL
447
- {
448
- t1: __type(name: "DoHiddenStuffInput") { name }
449
- t2: __type(name: "DoHiddenStuffPayload") { name }
450
- }
451
- GRAPHQL
452
- hidden_introspection_res = auth_execute(introspection_q, context: { hidden_mutation: true })
453
- assert_nil hidden_introspection_res["data"]["t1"]
454
- assert_nil hidden_introspection_res["data"]["t2"]
455
-
456
- visible_introspection_res = auth_execute(introspection_q)
457
- assert_equal "DoHiddenStuffInput", visible_introspection_res["data"]["t1"]["name"]
458
- assert_equal "DoHiddenStuffPayload", visible_introspection_res["data"]["t2"]["name"]
459
- end
460
-
461
- it "works with Schema::Mutation" do
462
- query = "mutation { doHiddenStuff2 { __typename } }"
463
- res = auth_execute(query, context: { hidden_mutation: true })
464
- assert_equal ["Field 'doHiddenStuff2' doesn't exist on type 'Mutation'"], res["errors"].map { |e| e["message"] }
465
-
466
- # `#resolve` isn't implemented, so this errors out:
467
- assert_raises NotImplementedError do
468
- auth_execute(query)
469
- end
470
- end
471
-
472
- it "uses the base type for edges and connections" do
473
- query = <<-GRAPHQL
474
- {
475
- hiddenConnection { __typename }
476
- hiddenEdge { __typename }
477
- }
478
- GRAPHQL
479
-
480
- hidden_res = auth_execute(query, context: { hidden_relay: true })
481
- assert_equal 2, hidden_res["errors"].size
482
-
483
- visible_res = auth_execute(query)
484
- assert_equal "RelayObjectConnection", visible_res["data"]["hiddenConnection"]["__typename"]
485
- assert_equal "RelayObjectEdge", visible_res["data"]["hiddenEdge"]["__typename"]
486
- end
487
-
488
- it "treats hidden enum values as non-existant, even in lists" do
489
- hidden_res_1 = auth_execute <<-GRAPHQL, context: { hide: true }
490
- {
491
- landscapeFeature(enum: TAR_PIT)
492
- }
493
- GRAPHQL
494
-
495
- assert_equal ["Argument 'enum' on Field 'landscapeFeature' has an invalid value. Expected type 'LandscapeFeature'."], hidden_res_1["errors"].map { |e| e["message"] }
496
-
497
- hidden_res_2 = auth_execute <<-GRAPHQL, context: { hide: true }
498
- {
499
- landscapeFeatures(enums: [STREAM, TAR_PIT])
500
- }
501
- GRAPHQL
502
-
503
- assert_equal ["Argument 'enums' on Field 'landscapeFeatures' has an invalid value. Expected type '[LandscapeFeature!]'."], hidden_res_2["errors"].map { |e| e["message"] }
504
-
505
- success_res = auth_execute <<-GRAPHQL, context: { hide: false }
506
- {
507
- landscapeFeature(enum: TAR_PIT)
508
- landscapeFeatures(enums: [STREAM, TAR_PIT])
509
- }
510
- GRAPHQL
511
-
512
- assert_equal "TAR_PIT", success_res["data"]["landscapeFeature"]
513
- assert_equal ["STREAM", "TAR_PIT"], success_res["data"]["landscapeFeatures"]
514
- end
515
-
516
- it "refuses to resolve to hidden enum values" do
517
- assert_raises(GraphQL::EnumType::UnresolvedValueError) do
518
- auth_execute <<-GRAPHQL, context: { hide: true }
519
- {
520
- landscapeFeature(string: "TAR_PIT")
521
- }
522
- GRAPHQL
523
- end
524
-
525
- assert_raises(GraphQL::EnumType::UnresolvedValueError) do
526
- auth_execute <<-GRAPHQL, context: { hide: true }
527
- {
528
- landscapeFeatures(strings: ["STREAM", "TAR_PIT"])
529
- }
530
- GRAPHQL
531
- end
532
- end
533
-
534
- it "works in introspection" do
535
- res = auth_execute <<-GRAPHQL, context: { hide: true, hidden_mutation: true }
536
- {
537
- query: __type(name: "Query") {
538
- fields {
539
- name
540
- args { name }
541
- }
542
- }
543
-
544
- hiddenObject: __type(name: "HiddenObject") { name }
545
- hiddenInterface: __type(name: "HiddenInterface") { name }
546
- landscapeFeatures: __type(name: "LandscapeFeature") { enumValues { name } }
547
- }
548
- GRAPHQL
549
- query_field_names = res["data"]["query"]["fields"].map { |f| f["name"] }
550
- refute_includes query_field_names, "int"
551
- int2_arg_names = res["data"]["query"]["fields"].find { |f| f["name"] == "int2" }["args"].map { |a| a["name"] }
552
- assert_equal ["int", "inaccessible", "unauthorized"], int2_arg_names
553
-
554
- assert_nil res["data"]["hiddenObject"]
555
- assert_nil res["data"]["hiddenInterface"]
556
-
557
- visible_landscape_features = res["data"]["landscapeFeatures"]["enumValues"].map { |v| v["name"] }
558
- assert_equal ["MOUNTAIN", "STREAM", "FIELD"], visible_landscape_features
559
- end
560
- end
561
-
562
- describe "applying the accessible? method" do
563
- it "works with fields and arguments" do
564
- queries = {
565
- "{ inaccessible }" => ["Some fields in this query are not accessible: inaccessible"],
566
- "{ int2(inaccessible: 1) }" => ["Some fields in this query are not accessible: int2"],
567
- }
568
-
569
- queries.each do |query_str, errors|
570
- res = auth_execute(query_str, context: { hide: true })
571
- assert_equal errors, res.fetch("errors").map { |e| e["message"] }
572
-
573
- res = auth_execute(query_str, context: { hide: false })
574
- refute res.key?("errors")
575
- end
576
- end
577
-
578
- it "works with return types" do
579
- queries = {
580
- "{ inaccessibleObject { __typename } }" => ["Some fields in this query are not accessible: inaccessibleObject"],
581
- "{ inaccessibleInterface { __typename } }" => ["Some fields in this query are not accessible: inaccessibleInterface"],
582
- "{ inaccessibleDefaultInterface { __typename } }" => ["Some fields in this query are not accessible: inaccessibleDefaultInterface"],
583
- }
584
-
585
- queries.each do |query_str, errors|
586
- res = auth_execute(query_str, context: { hide: true })
587
- assert_equal errors, res["errors"].map { |e| e["message"] }
588
-
589
- res = auth_execute(query_str, context: { hide: false })
590
- refute res.key?("errors")
591
- end
592
- end
593
-
594
- it "works with mutations" do
595
- query = "mutation { doInaccessibleStuff(input: {}) { __typename } }"
596
- res = auth_execute(query, context: { inaccessible_mutation: true })
597
- assert_equal ["Some fields in this query are not accessible: doInaccessibleStuff"], res["errors"].map { |e| e["message"] }
598
-
599
- assert_raises NotImplementedError do
600
- auth_execute(query)
601
- end
602
- end
603
-
604
- it "works with edges and connections" do
605
- query = <<-GRAPHQL
606
- {
607
- inaccessibleConnection { __typename }
608
- inaccessibleEdge { __typename }
609
- }
610
- GRAPHQL
611
-
612
- inaccessible_res = auth_execute(query, context: { inaccessible_relay: true })
613
- assert_equal ["Some fields in this query are not accessible: inaccessibleConnection, inaccessibleEdge"], inaccessible_res["errors"].map { |e| e["message"] }
614
-
615
- accessible_res = auth_execute(query)
616
- refute accessible_res.key?("errors")
617
- end
618
- end
619
-
620
- describe "applying the authorized? method" do
621
- it "halts on unauthorized objects, replacing the object with nil" do
622
- query = "{ unauthorizedObject { __typename } }"
623
- hidden_response = auth_execute(query, context: { hide: true })
624
- assert_nil hidden_response["data"].fetch("unauthorizedObject")
625
- visible_response = auth_execute(query, context: {})
626
- assert_equal({ "__typename" => "UnauthorizedObject" }, visible_response["data"]["unauthorizedObject"])
627
- end
628
-
629
- it "halts on unauthorized mutations" do
630
- query = "mutation { doUnauthorizedStuff(input: {}) { __typename } }"
631
- res = auth_execute(query, context: { unauthorized_mutation: true })
632
- assert_nil res["data"].fetch("doUnauthorizedStuff")
633
- assert_raises NotImplementedError do
634
- auth_execute(query)
635
- end
636
- end
637
-
638
- describe "field level authorization" do
639
- describe "unauthorized field" do
640
- describe "with an unauthorized field hook configured" do
641
- describe "when the hook returns a value" do
642
- it "replaces the response with the return value of the unauthorized field hook" do
643
- query = "{ unauthorized }"
644
- response = AuthTest::SchemaWithFieldHook.execute(query, root_value: :replace)
645
- assert_equal 42, response["data"].fetch("unauthorized")
646
- end
647
- end
648
-
649
- describe "when the field hook raises an error" do
650
- it "returns nil" do
651
- query = "{ unauthorized }"
652
- response = AuthTest::SchemaWithFieldHook.execute(query, root_value: :hide)
653
- assert_nil response["data"].fetch("unauthorized")
654
- end
655
-
656
- it "adds the error to the errors key" do
657
- query = "{ unauthorized }"
658
- response = AuthTest::SchemaWithFieldHook.execute(query, root_value: :hide)
659
- assert_equal ["Unauthorized field unauthorized on Query: hide"], response["errors"].map { |e| e["message"] }
660
- end
661
- end
662
- end
663
-
664
- describe "with an unauthorized field hook not configured" do
665
- describe "When the object hook replaces the field" do
666
- it "delegates to the unauthorized object hook, which replaces the object" do
667
- query = "{ unauthorized }"
668
- response = AuthTest::Schema.execute(query, root_value: :replace)
669
- assert_equal 33, response["data"].fetch("unauthorized")
670
- end
671
- end
672
- describe "When the object hook raises an error" do
673
- it "returns nil" do
674
- query = "{ unauthorized }"
675
- response = AuthTest::Schema.execute(query, root_value: :hide)
676
- assert_nil response["data"].fetch("unauthorized")
677
- end
678
-
679
- it "adds the error to the errors key" do
680
- query = "{ unauthorized }"
681
- response = AuthTest::Schema.execute(query, root_value: :hide)
682
- assert_equal ["Unauthorized Query: hide"], response["errors"].map { |e| e["message"] }
683
- end
684
- end
685
- end
686
- end
687
-
688
- describe "authorized field" do
689
- it "returns the field data" do
690
- query = "{ unauthorized }"
691
- response = AuthTest::SchemaWithFieldHook.execute(query, root_value: 1)
692
- assert_equal 1, response["data"].fetch("unauthorized")
693
- end
694
- end
695
- end
696
-
697
- it "halts on unauthorized fields, using the parent object" do
698
- query = "{ unauthorized }"
699
- hidden_response = auth_execute(query, root_value: :hide)
700
- assert_nil hidden_response["data"].fetch("unauthorized")
701
- visible_response = auth_execute(query, root_value: 1)
702
- assert_equal 1, visible_response["data"]["unauthorized"]
703
- end
704
-
705
- it "halts on unauthorized arguments, using the parent object" do
706
- query = "{ int2(unauthorized: 5) }"
707
- hidden_response = auth_execute(query, root_value: :hide2)
708
- assert_nil hidden_response["data"].fetch("int2")
709
- visible_response = auth_execute(query)
710
- assert_equal 5, visible_response["data"]["int2"]
711
- end
712
-
713
- it "works with edges and connections" do
714
- query = <<-GRAPHQL
715
- {
716
- unauthorizedConnection {
717
- __typename
718
- edges {
719
- __typename
720
- node {
721
- __typename
722
- }
723
- }
724
- nodes {
725
- __typename
726
- }
727
- }
728
- unauthorizedEdge {
729
- __typename
730
- node {
731
- __typename
732
- }
733
- }
734
- }
735
- GRAPHQL
736
-
737
- unauthorized_res = auth_execute(query, context: { unauthorized_relay: true })
738
- conn = unauthorized_res["data"].fetch("unauthorizedConnection")
739
- assert_equal "RelayObjectConnection", conn.fetch("__typename")
740
- # This is tricky: the previous behavior was to replace the _whole_
741
- # list with `nil`. This was due to an implementation detail:
742
- # The list field's return value (an array of integers) was wrapped
743
- # _before_ returning, and during this wrapping, a cascading error
744
- # caused the entire field to be nilled out.
745
- #
746
- # In the interpreter, each list item is contained and the error doesn't propagate
747
- # up to the whole list.
748
- #
749
- # Originally, I thought that this was a _feature_ that obscured list entries.
750
- # But really, look at the test below: you don't get this "feature" if
751
- # you use `edges { node }`, so it can't be relied on in any way.
752
- #
753
- # All that to say, in the interpreter, `nodes` and `edges { node }` behave
754
- # the same.
755
- #
756
- # TODO revisit the docs for this.
757
- failed_nodes_value = TESTING_INTERPRETER ? [nil] : nil
758
- assert_equal failed_nodes_value, conn.fetch("nodes")
759
- assert_equal [{"node" => nil, "__typename" => "RelayObjectEdge"}], conn.fetch("edges")
760
-
761
- edge = unauthorized_res["data"].fetch("unauthorizedEdge")
762
- assert_nil edge.fetch("node")
763
- assert_equal "RelayObjectEdge", edge["__typename"]
764
-
765
- unauthorized_object_paths = [
766
- ["unauthorizedConnection", "edges", 0, "node"],
767
- TESTING_INTERPRETER ? ["unauthorizedConnection", "nodes", 0] : ["unauthorizedConnection", "nodes"],
768
- ["unauthorizedEdge", "node"]
769
- ]
770
-
771
- assert_equal unauthorized_object_paths, unauthorized_res["errors"].map { |e| e["path"] }
772
-
773
- authorized_res = auth_execute(query)
774
- conn = authorized_res["data"].fetch("unauthorizedConnection")
775
- assert_equal "RelayObjectConnection", conn.fetch("__typename")
776
- assert_equal [{"__typename"=>"RelayObject"}], conn.fetch("nodes")
777
- assert_equal [{"node" => {"__typename" => "RelayObject"}, "__typename" => "RelayObjectEdge"}], conn.fetch("edges")
778
-
779
- edge = authorized_res["data"].fetch("unauthorizedEdge")
780
- assert_equal "RelayObject", edge.fetch("node").fetch("__typename")
781
- assert_equal "RelayObjectEdge", edge["__typename"]
782
- end
783
-
784
- it "authorizes _after_ resolving lazy objects" do
785
- query = <<-GRAPHQL
786
- {
787
- a: unauthorizedLazyBox(value: "a") { value }
788
- b: unauthorizedLazyBox(value: "b") { value }
789
- }
790
- GRAPHQL
791
-
792
- unauthorized_res = auth_execute(query)
793
- assert_nil unauthorized_res["data"].fetch("a")
794
- assert_equal "b", unauthorized_res["data"]["b"]["value"]
795
- end
796
-
797
- it "authorizes items in a list" do
798
- query = <<-GRAPHQL
799
- {
800
- unauthorizedListItems { __typename }
801
- }
802
- GRAPHQL
803
-
804
- unauthorized_res = auth_execute(query, context: { hide: true })
805
-
806
- assert_nil unauthorized_res["data"]["unauthorizedListItems"]
807
- authorized_res = auth_execute(query, context: { hide: false })
808
- assert_equal 2, authorized_res["data"]["unauthorizedListItems"].size
809
- end
810
-
811
- it "syncs lazy objects from authorized? checks" do
812
- query = <<-GRAPHQL
813
- {
814
- a: unauthorizedLazyCheckBox(value: "a") { value }
815
- b: unauthorizedLazyCheckBox(value: "b") { value }
816
- }
817
- GRAPHQL
818
-
819
- unauthorized_res = auth_execute(query)
820
- assert_nil unauthorized_res["data"].fetch("a")
821
- assert_equal "b", unauthorized_res["data"]["b"]["value"]
822
- # Also, the custom handler was called:
823
- assert_equal ["Unauthorized UnauthorizedCheckBox: a"], unauthorized_res["errors"].map { |e| e["message"] }
824
- end
825
-
826
- it "Works for lazy connections" do
827
- query = <<-GRAPHQL
828
- {
829
- lazyIntegers { edges { node { value } } }
830
- }
831
- GRAPHQL
832
- res = auth_execute(query)
833
- assert_equal [1,2,3], res["data"]["lazyIntegers"]["edges"].map { |e| e["node"]["value"] }
834
- end
835
-
836
- it "Works for eager connections" do
837
- query = <<-GRAPHQL
838
- {
839
- integers { edges { node { value } } }
840
- }
841
- GRAPHQL
842
- res = auth_execute(query)
843
- assert_equal [1,2,3], res["data"]["integers"]["edges"].map { |e| e["node"]["value"] }
844
- end
845
-
846
- it "filters out individual nodes by value" do
847
- query = <<-GRAPHQL
848
- {
849
- integers { edges { node { value } } }
850
- }
851
- GRAPHQL
852
- res = auth_execute(query, context: { exclude_integer: 1 })
853
- assert_equal [nil,2,3], res["data"]["integers"]["edges"].map { |e| e["node"] && e["node"]["value"] }
854
- assert_equal ["Unauthorized IntegerObject: 1"], res["errors"].map { |e| e["message"] }
855
- end
856
-
857
- it "works with lazy values / interfaces" do
858
- query = <<-GRAPHQL
859
- query($value: String!){
860
- unauthorizedInterface(value: $value) {
861
- ... on UnauthorizedCheckBox {
862
- value
863
- }
864
- }
865
- }
866
- GRAPHQL
867
-
868
- res = auth_execute(query, variables: { value: "a"})
869
- assert_nil res["data"]["unauthorizedInterface"]
870
-
871
- res2 = auth_execute(query, variables: { value: "b"})
872
- assert_equal "b", res2["data"]["unauthorizedInterface"]["value"]
873
- end
874
-
875
- it "works with lazy values / lists of interfaces" do
876
- query = <<-GRAPHQL
877
- {
878
- unauthorizedLazyListInterface {
879
- ... on UnauthorizedCheckBox {
880
- value
881
- }
882
- }
883
- }
884
- GRAPHQL
885
-
886
- res = auth_execute(query)
887
- # An error from two, values from the others
888
- assert_equal ["Unauthorized UnauthorizedCheckBox: a", "Unauthorized UnauthorizedCheckBox: a"], res["errors"].map { |e| e["message"] }
889
- assert_equal [{"value" => "z"}, {"value" => "z2"}, nil, nil], res["data"]["unauthorizedLazyListInterface"]
890
- end
891
-
892
- it "replaces objects from the unauthorized_object hook" do
893
- query = "{ replacedObject { replaced } }"
894
- res = auth_execute(query, context: { replace_me: true })
895
- assert_equal true, res["data"]["replacedObject"]["replaced"]
896
-
897
- res = auth_execute(query, context: { replace_me: false })
898
- assert_equal false, res["data"]["replacedObject"]["replaced"]
899
- end
900
- end
901
- end