graphql_cody 1.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (444) hide show
  1. checksums.yaml +7 -0
  2. data/.yardopts +5 -0
  3. data/MIT-LICENSE +20 -0
  4. data/lib/generators/graphql/core.rb +74 -0
  5. data/lib/generators/graphql/enum_generator.rb +33 -0
  6. data/lib/generators/graphql/install_generator.rb +190 -0
  7. data/lib/generators/graphql/interface_generator.rb +27 -0
  8. data/lib/generators/graphql/loader_generator.rb +21 -0
  9. data/lib/generators/graphql/mutation_generator.rb +55 -0
  10. data/lib/generators/graphql/object_generator.rb +79 -0
  11. data/lib/generators/graphql/relay.rb +63 -0
  12. data/lib/generators/graphql/relay_generator.rb +21 -0
  13. data/lib/generators/graphql/scalar_generator.rb +20 -0
  14. data/lib/generators/graphql/templates/base_argument.erb +6 -0
  15. data/lib/generators/graphql/templates/base_connection.erb +8 -0
  16. data/lib/generators/graphql/templates/base_edge.erb +8 -0
  17. data/lib/generators/graphql/templates/base_enum.erb +6 -0
  18. data/lib/generators/graphql/templates/base_field.erb +7 -0
  19. data/lib/generators/graphql/templates/base_input_object.erb +7 -0
  20. data/lib/generators/graphql/templates/base_interface.erb +9 -0
  21. data/lib/generators/graphql/templates/base_mutation.erb +10 -0
  22. data/lib/generators/graphql/templates/base_object.erb +7 -0
  23. data/lib/generators/graphql/templates/base_scalar.erb +6 -0
  24. data/lib/generators/graphql/templates/base_union.erb +6 -0
  25. data/lib/generators/graphql/templates/enum.erb +7 -0
  26. data/lib/generators/graphql/templates/graphql_controller.erb +52 -0
  27. data/lib/generators/graphql/templates/interface.erb +8 -0
  28. data/lib/generators/graphql/templates/loader.erb +19 -0
  29. data/lib/generators/graphql/templates/mutation.erb +16 -0
  30. data/lib/generators/graphql/templates/mutation_type.erb +12 -0
  31. data/lib/generators/graphql/templates/node_type.erb +9 -0
  32. data/lib/generators/graphql/templates/object.erb +8 -0
  33. data/lib/generators/graphql/templates/query_type.erb +15 -0
  34. data/lib/generators/graphql/templates/scalar.erb +15 -0
  35. data/lib/generators/graphql/templates/schema.erb +27 -0
  36. data/lib/generators/graphql/templates/union.erb +7 -0
  37. data/lib/generators/graphql/type_generator.rb +98 -0
  38. data/lib/generators/graphql/union_generator.rb +33 -0
  39. data/lib/graphql/analysis/analyze_query.rb +98 -0
  40. data/lib/graphql/analysis/ast/analyzer.rb +84 -0
  41. data/lib/graphql/analysis/ast/field_usage.rb +51 -0
  42. data/lib/graphql/analysis/ast/max_query_complexity.rb +23 -0
  43. data/lib/graphql/analysis/ast/max_query_depth.rb +22 -0
  44. data/lib/graphql/analysis/ast/query_complexity.rb +230 -0
  45. data/lib/graphql/analysis/ast/query_depth.rb +56 -0
  46. data/lib/graphql/analysis/ast/visitor.rb +268 -0
  47. data/lib/graphql/analysis/ast.rb +91 -0
  48. data/lib/graphql/analysis/field_usage.rb +45 -0
  49. data/lib/graphql/analysis/max_query_complexity.rb +26 -0
  50. data/lib/graphql/analysis/max_query_depth.rb +26 -0
  51. data/lib/graphql/analysis/query_complexity.rb +88 -0
  52. data/lib/graphql/analysis/query_depth.rb +43 -0
  53. data/lib/graphql/analysis/reducer_state.rb +48 -0
  54. data/lib/graphql/analysis.rb +9 -0
  55. data/lib/graphql/analysis_error.rb +5 -0
  56. data/lib/graphql/argument.rb +131 -0
  57. data/lib/graphql/authorization.rb +82 -0
  58. data/lib/graphql/backtrace/inspect_result.rb +50 -0
  59. data/lib/graphql/backtrace/legacy_tracer.rb +56 -0
  60. data/lib/graphql/backtrace/table.rb +159 -0
  61. data/lib/graphql/backtrace/traced_error.rb +54 -0
  62. data/lib/graphql/backtrace/tracer.rb +81 -0
  63. data/lib/graphql/backtrace.rb +64 -0
  64. data/lib/graphql/backwards_compatibility.rb +61 -0
  65. data/lib/graphql/base_type.rb +230 -0
  66. data/lib/graphql/boolean_type.rb +2 -0
  67. data/lib/graphql/coercion_error.rb +13 -0
  68. data/lib/graphql/compatibility/execution_specification/counter_schema.rb +53 -0
  69. data/lib/graphql/compatibility/execution_specification/specification_schema.rb +200 -0
  70. data/lib/graphql/compatibility/execution_specification.rb +436 -0
  71. data/lib/graphql/compatibility/lazy_execution_specification/lazy_schema.rb +111 -0
  72. data/lib/graphql/compatibility/lazy_execution_specification.rb +215 -0
  73. data/lib/graphql/compatibility/query_parser_specification/parse_error_specification.rb +87 -0
  74. data/lib/graphql/compatibility/query_parser_specification/query_assertions.rb +79 -0
  75. data/lib/graphql/compatibility/query_parser_specification.rb +266 -0
  76. data/lib/graphql/compatibility/schema_parser_specification.rb +682 -0
  77. data/lib/graphql/compatibility.rb +5 -0
  78. data/lib/graphql/dataloader/null_dataloader.rb +22 -0
  79. data/lib/graphql/dataloader/request.rb +19 -0
  80. data/lib/graphql/dataloader/request_all.rb +19 -0
  81. data/lib/graphql/dataloader/source.rb +155 -0
  82. data/lib/graphql/dataloader.rb +308 -0
  83. data/lib/graphql/define/assign_argument.rb +12 -0
  84. data/lib/graphql/define/assign_connection.rb +13 -0
  85. data/lib/graphql/define/assign_enum_value.rb +18 -0
  86. data/lib/graphql/define/assign_global_id_field.rb +11 -0
  87. data/lib/graphql/define/assign_mutation_function.rb +34 -0
  88. data/lib/graphql/define/assign_object_field.rb +42 -0
  89. data/lib/graphql/define/defined_object_proxy.rb +53 -0
  90. data/lib/graphql/define/instance_definable.rb +240 -0
  91. data/lib/graphql/define/no_definition_error.rb +7 -0
  92. data/lib/graphql/define/non_null_with_bang.rb +16 -0
  93. data/lib/graphql/define/type_definer.rb +31 -0
  94. data/lib/graphql/define.rb +31 -0
  95. data/lib/graphql/deprecated_dsl.rb +55 -0
  96. data/lib/graphql/deprecation.rb +9 -0
  97. data/lib/graphql/dig.rb +19 -0
  98. data/lib/graphql/directive/deprecated_directive.rb +2 -0
  99. data/lib/graphql/directive/include_directive.rb +2 -0
  100. data/lib/graphql/directive/skip_directive.rb +2 -0
  101. data/lib/graphql/directive.rb +107 -0
  102. data/lib/graphql/enum_type.rb +133 -0
  103. data/lib/graphql/execution/directive_checks.rb +37 -0
  104. data/lib/graphql/execution/errors.rb +163 -0
  105. data/lib/graphql/execution/execute.rb +333 -0
  106. data/lib/graphql/execution/flatten.rb +40 -0
  107. data/lib/graphql/execution/instrumentation.rb +92 -0
  108. data/lib/graphql/execution/interpreter/argument_value.rb +28 -0
  109. data/lib/graphql/execution/interpreter/arguments.rb +88 -0
  110. data/lib/graphql/execution/interpreter/arguments_cache.rb +103 -0
  111. data/lib/graphql/execution/interpreter/execution_errors.rb +29 -0
  112. data/lib/graphql/execution/interpreter/handles_raw_value.rb +18 -0
  113. data/lib/graphql/execution/interpreter/resolve.rb +70 -0
  114. data/lib/graphql/execution/interpreter/runtime.rb +949 -0
  115. data/lib/graphql/execution/interpreter.rb +122 -0
  116. data/lib/graphql/execution/lazy/lazy_method_map.rb +98 -0
  117. data/lib/graphql/execution/lazy/resolve.rb +91 -0
  118. data/lib/graphql/execution/lazy.rb +83 -0
  119. data/lib/graphql/execution/lookahead.rb +307 -0
  120. data/lib/graphql/execution/multiplex.rb +214 -0
  121. data/lib/graphql/execution/typecast.rb +50 -0
  122. data/lib/graphql/execution.rb +11 -0
  123. data/lib/graphql/execution_error.rb +58 -0
  124. data/lib/graphql/field/resolve.rb +59 -0
  125. data/lib/graphql/field.rb +226 -0
  126. data/lib/graphql/filter.rb +53 -0
  127. data/lib/graphql/float_type.rb +2 -0
  128. data/lib/graphql/function.rb +128 -0
  129. data/lib/graphql/id_type.rb +2 -0
  130. data/lib/graphql/input_object_type.rb +138 -0
  131. data/lib/graphql/int_type.rb +2 -0
  132. data/lib/graphql/integer_decoding_error.rb +17 -0
  133. data/lib/graphql/integer_encoding_error.rb +36 -0
  134. data/lib/graphql/interface_type.rb +72 -0
  135. data/lib/graphql/internal_representation/document.rb +27 -0
  136. data/lib/graphql/internal_representation/node.rb +206 -0
  137. data/lib/graphql/internal_representation/print.rb +51 -0
  138. data/lib/graphql/internal_representation/rewrite.rb +184 -0
  139. data/lib/graphql/internal_representation/scope.rb +88 -0
  140. data/lib/graphql/internal_representation/visit.rb +36 -0
  141. data/lib/graphql/internal_representation.rb +7 -0
  142. data/lib/graphql/introspection/base_object.rb +13 -0
  143. data/lib/graphql/introspection/directive_location_enum.rb +15 -0
  144. data/lib/graphql/introspection/directive_type.rb +29 -0
  145. data/lib/graphql/introspection/dynamic_fields.rb +17 -0
  146. data/lib/graphql/introspection/entry_points.rb +35 -0
  147. data/lib/graphql/introspection/enum_value_type.rb +23 -0
  148. data/lib/graphql/introspection/field_type.rb +28 -0
  149. data/lib/graphql/introspection/input_value_type.rb +67 -0
  150. data/lib/graphql/introspection/introspection_query.rb +7 -0
  151. data/lib/graphql/introspection/schema_type.rb +44 -0
  152. data/lib/graphql/introspection/type_kind_enum.rb +13 -0
  153. data/lib/graphql/introspection/type_type.rb +95 -0
  154. data/lib/graphql/introspection.rb +114 -0
  155. data/lib/graphql/invalid_name_error.rb +11 -0
  156. data/lib/graphql/invalid_null_error.rb +50 -0
  157. data/lib/graphql/language/block_string.rb +99 -0
  158. data/lib/graphql/language/cache.rb +37 -0
  159. data/lib/graphql/language/definition_slice.rb +41 -0
  160. data/lib/graphql/language/document_from_schema_definition.rb +347 -0
  161. data/lib/graphql/language/generation.rb +24 -0
  162. data/lib/graphql/language/lexer.rb +1467 -0
  163. data/lib/graphql/language/lexer.rl +258 -0
  164. data/lib/graphql/language/nodes.rb +707 -0
  165. data/lib/graphql/language/parser.rb +1974 -0
  166. data/lib/graphql/language/parser.y +544 -0
  167. data/lib/graphql/language/printer.rb +366 -0
  168. data/lib/graphql/language/sanitized_printer.rb +222 -0
  169. data/lib/graphql/language/token.rb +34 -0
  170. data/lib/graphql/language/visitor.rb +242 -0
  171. data/lib/graphql/language.rb +36 -0
  172. data/lib/graphql/list_type.rb +80 -0
  173. data/lib/graphql/load_application_object_failed_error.rb +22 -0
  174. data/lib/graphql/name_validator.rb +11 -0
  175. data/lib/graphql/non_null_type.rb +71 -0
  176. data/lib/graphql/object_type.rb +130 -0
  177. data/lib/graphql/pagination/active_record_relation_connection.rb +48 -0
  178. data/lib/graphql/pagination/array_connection.rb +77 -0
  179. data/lib/graphql/pagination/connection.rb +226 -0
  180. data/lib/graphql/pagination/connections.rb +160 -0
  181. data/lib/graphql/pagination/mongoid_relation_connection.rb +25 -0
  182. data/lib/graphql/pagination/relation_connection.rb +196 -0
  183. data/lib/graphql/pagination/sequel_dataset_connection.rb +28 -0
  184. data/lib/graphql/pagination.rb +6 -0
  185. data/lib/graphql/parse_error.rb +24 -0
  186. data/lib/graphql/query/arguments.rb +189 -0
  187. data/lib/graphql/query/arguments_cache.rb +24 -0
  188. data/lib/graphql/query/context.rb +371 -0
  189. data/lib/graphql/query/executor.rb +52 -0
  190. data/lib/graphql/query/fingerprint.rb +26 -0
  191. data/lib/graphql/query/input_validation_result.rb +43 -0
  192. data/lib/graphql/query/literal_input.rb +136 -0
  193. data/lib/graphql/query/null_context.rb +55 -0
  194. data/lib/graphql/query/result.rb +63 -0
  195. data/lib/graphql/query/serial_execution/field_resolution.rb +92 -0
  196. data/lib/graphql/query/serial_execution/operation_resolution.rb +19 -0
  197. data/lib/graphql/query/serial_execution/selection_resolution.rb +23 -0
  198. data/lib/graphql/query/serial_execution/value_resolution.rb +87 -0
  199. data/lib/graphql/query/serial_execution.rb +40 -0
  200. data/lib/graphql/query/validation_pipeline.rb +139 -0
  201. data/lib/graphql/query/variable_validation_error.rb +44 -0
  202. data/lib/graphql/query/variables.rb +78 -0
  203. data/lib/graphql/query.rb +454 -0
  204. data/lib/graphql/railtie.rb +117 -0
  205. data/lib/graphql/rake_task/validate.rb +63 -0
  206. data/lib/graphql/rake_task.rb +145 -0
  207. data/lib/graphql/relay/array_connection.rb +83 -0
  208. data/lib/graphql/relay/base_connection.rb +189 -0
  209. data/lib/graphql/relay/connection_instrumentation.rb +54 -0
  210. data/lib/graphql/relay/connection_resolve.rb +43 -0
  211. data/lib/graphql/relay/connection_type.rb +41 -0
  212. data/lib/graphql/relay/edge.rb +27 -0
  213. data/lib/graphql/relay/edge_type.rb +19 -0
  214. data/lib/graphql/relay/edges_instrumentation.rb +39 -0
  215. data/lib/graphql/relay/global_id_resolve.rb +18 -0
  216. data/lib/graphql/relay/mongo_relation_connection.rb +50 -0
  217. data/lib/graphql/relay/mutation/instrumentation.rb +23 -0
  218. data/lib/graphql/relay/mutation/resolve.rb +56 -0
  219. data/lib/graphql/relay/mutation/result.rb +38 -0
  220. data/lib/graphql/relay/mutation.rb +106 -0
  221. data/lib/graphql/relay/node.rb +39 -0
  222. data/lib/graphql/relay/page_info.rb +7 -0
  223. data/lib/graphql/relay/range_add.rb +59 -0
  224. data/lib/graphql/relay/relation_connection.rb +188 -0
  225. data/lib/graphql/relay/type_extensions.rb +32 -0
  226. data/lib/graphql/relay.rb +18 -0
  227. data/lib/graphql/rubocop/graphql/base_cop.rb +36 -0
  228. data/lib/graphql/rubocop/graphql/default_null_true.rb +43 -0
  229. data/lib/graphql/rubocop/graphql/default_required_true.rb +43 -0
  230. data/lib/graphql/rubocop.rb +4 -0
  231. data/lib/graphql/runtime_type_error.rb +5 -0
  232. data/lib/graphql/scalar_type.rb +91 -0
  233. data/lib/graphql/schema/addition.rb +247 -0
  234. data/lib/graphql/schema/argument.rb +383 -0
  235. data/lib/graphql/schema/base_64_bp.rb +26 -0
  236. data/lib/graphql/schema/base_64_encoder.rb +21 -0
  237. data/lib/graphql/schema/build_from_definition/resolve_map/default_resolve.rb +47 -0
  238. data/lib/graphql/schema/build_from_definition/resolve_map.rb +78 -0
  239. data/lib/graphql/schema/build_from_definition.rb +477 -0
  240. data/lib/graphql/schema/built_in_types.rb +12 -0
  241. data/lib/graphql/schema/catchall_middleware.rb +35 -0
  242. data/lib/graphql/schema/default_parse_error.rb +10 -0
  243. data/lib/graphql/schema/default_type_error.rb +17 -0
  244. data/lib/graphql/schema/directive/deprecated.rb +18 -0
  245. data/lib/graphql/schema/directive/feature.rb +66 -0
  246. data/lib/graphql/schema/directive/flagged.rb +57 -0
  247. data/lib/graphql/schema/directive/include.rb +25 -0
  248. data/lib/graphql/schema/directive/skip.rb +25 -0
  249. data/lib/graphql/schema/directive/transform.rb +60 -0
  250. data/lib/graphql/schema/directive.rb +210 -0
  251. data/lib/graphql/schema/enum.rb +193 -0
  252. data/lib/graphql/schema/enum_value.rb +97 -0
  253. data/lib/graphql/schema/field/connection_extension.rb +76 -0
  254. data/lib/graphql/schema/field/scope_extension.rb +22 -0
  255. data/lib/graphql/schema/field.rb +880 -0
  256. data/lib/graphql/schema/field_extension.rb +69 -0
  257. data/lib/graphql/schema/find_inherited_value.rb +36 -0
  258. data/lib/graphql/schema/finder.rb +155 -0
  259. data/lib/graphql/schema/input_object.rb +253 -0
  260. data/lib/graphql/schema/interface.rb +136 -0
  261. data/lib/graphql/schema/introspection_system.rb +169 -0
  262. data/lib/graphql/schema/invalid_type_error.rb +7 -0
  263. data/lib/graphql/schema/late_bound_type.rb +33 -0
  264. data/lib/graphql/schema/list.rb +75 -0
  265. data/lib/graphql/schema/loader.rb +226 -0
  266. data/lib/graphql/schema/member/accepts_definition.rb +159 -0
  267. data/lib/graphql/schema/member/base_dsl_methods.rb +129 -0
  268. data/lib/graphql/schema/member/build_type.rb +180 -0
  269. data/lib/graphql/schema/member/cached_graphql_definition.rb +31 -0
  270. data/lib/graphql/schema/member/graphql_type_names.rb +21 -0
  271. data/lib/graphql/schema/member/has_arguments.rb +332 -0
  272. data/lib/graphql/schema/member/has_ast_node.rb +20 -0
  273. data/lib/graphql/schema/member/has_deprecation_reason.rb +25 -0
  274. data/lib/graphql/schema/member/has_directives.rb +98 -0
  275. data/lib/graphql/schema/member/has_fields.rb +163 -0
  276. data/lib/graphql/schema/member/has_interfaces.rb +90 -0
  277. data/lib/graphql/schema/member/has_path.rb +25 -0
  278. data/lib/graphql/schema/member/has_unresolved_type_error.rb +15 -0
  279. data/lib/graphql/schema/member/has_validators.rb +31 -0
  280. data/lib/graphql/schema/member/instrumentation.rb +131 -0
  281. data/lib/graphql/schema/member/relay_shortcuts.rb +47 -0
  282. data/lib/graphql/schema/member/scoped.rb +21 -0
  283. data/lib/graphql/schema/member/type_system_helpers.rb +38 -0
  284. data/lib/graphql/schema/member/validates_input.rb +33 -0
  285. data/lib/graphql/schema/member.rb +161 -0
  286. data/lib/graphql/schema/middleware_chain.rb +82 -0
  287. data/lib/graphql/schema/mutation.rb +94 -0
  288. data/lib/graphql/schema/non_null.rb +67 -0
  289. data/lib/graphql/schema/null_mask.rb +11 -0
  290. data/lib/graphql/schema/object.rb +150 -0
  291. data/lib/graphql/schema/possible_types.rb +44 -0
  292. data/lib/graphql/schema/printer.rb +100 -0
  293. data/lib/graphql/schema/relay_classic_mutation.rb +160 -0
  294. data/lib/graphql/schema/rescue_middleware.rb +60 -0
  295. data/lib/graphql/schema/resolver/has_payload_type.rb +96 -0
  296. data/lib/graphql/schema/resolver.rb +397 -0
  297. data/lib/graphql/schema/scalar.rb +69 -0
  298. data/lib/graphql/schema/subscription.rb +155 -0
  299. data/lib/graphql/schema/timeout.rb +123 -0
  300. data/lib/graphql/schema/timeout_middleware.rb +88 -0
  301. data/lib/graphql/schema/traversal.rb +228 -0
  302. data/lib/graphql/schema/type_expression.rb +43 -0
  303. data/lib/graphql/schema/type_membership.rb +48 -0
  304. data/lib/graphql/schema/union.rb +95 -0
  305. data/lib/graphql/schema/unique_within_type.rb +34 -0
  306. data/lib/graphql/schema/validation.rb +313 -0
  307. data/lib/graphql/schema/validator/allow_blank_validator.rb +29 -0
  308. data/lib/graphql/schema/validator/allow_null_validator.rb +26 -0
  309. data/lib/graphql/schema/validator/exclusion_validator.rb +33 -0
  310. data/lib/graphql/schema/validator/format_validator.rb +48 -0
  311. data/lib/graphql/schema/validator/inclusion_validator.rb +35 -0
  312. data/lib/graphql/schema/validator/length_validator.rb +59 -0
  313. data/lib/graphql/schema/validator/numericality_validator.rb +82 -0
  314. data/lib/graphql/schema/validator/required_validator.rb +68 -0
  315. data/lib/graphql/schema/validator.rb +174 -0
  316. data/lib/graphql/schema/warden.rb +409 -0
  317. data/lib/graphql/schema/wrapper.rb +29 -0
  318. data/lib/graphql/schema.rb +1945 -0
  319. data/lib/graphql/static_validation/all_rules.rb +40 -0
  320. data/lib/graphql/static_validation/base_visitor.rb +217 -0
  321. data/lib/graphql/static_validation/default_visitor.rb +15 -0
  322. data/lib/graphql/static_validation/definition_dependencies.rb +198 -0
  323. data/lib/graphql/static_validation/error.rb +46 -0
  324. data/lib/graphql/static_validation/interpreter_visitor.rb +14 -0
  325. data/lib/graphql/static_validation/literal_validator.rb +139 -0
  326. data/lib/graphql/static_validation/no_validate_visitor.rb +10 -0
  327. data/lib/graphql/static_validation/rules/argument_literals_are_compatible.rb +66 -0
  328. data/lib/graphql/static_validation/rules/argument_literals_are_compatible_error.rb +48 -0
  329. data/lib/graphql/static_validation/rules/argument_names_are_unique.rb +31 -0
  330. data/lib/graphql/static_validation/rules/argument_names_are_unique_error.rb +30 -0
  331. data/lib/graphql/static_validation/rules/arguments_are_defined.rb +71 -0
  332. data/lib/graphql/static_validation/rules/arguments_are_defined_error.rb +37 -0
  333. data/lib/graphql/static_validation/rules/directives_are_defined.rb +23 -0
  334. data/lib/graphql/static_validation/rules/directives_are_defined_error.rb +29 -0
  335. data/lib/graphql/static_validation/rules/directives_are_in_valid_locations.rb +65 -0
  336. data/lib/graphql/static_validation/rules/directives_are_in_valid_locations_error.rb +31 -0
  337. data/lib/graphql/static_validation/rules/fields_are_defined_on_type.rb +30 -0
  338. data/lib/graphql/static_validation/rules/fields_are_defined_on_type_error.rb +32 -0
  339. data/lib/graphql/static_validation/rules/fields_have_appropriate_selections.rb +73 -0
  340. data/lib/graphql/static_validation/rules/fields_have_appropriate_selections_error.rb +31 -0
  341. data/lib/graphql/static_validation/rules/fields_will_merge.rb +418 -0
  342. data/lib/graphql/static_validation/rules/fields_will_merge_error.rb +53 -0
  343. data/lib/graphql/static_validation/rules/fragment_names_are_unique.rb +30 -0
  344. data/lib/graphql/static_validation/rules/fragment_names_are_unique_error.rb +29 -0
  345. data/lib/graphql/static_validation/rules/fragment_spreads_are_possible.rb +73 -0
  346. data/lib/graphql/static_validation/rules/fragment_spreads_are_possible_error.rb +35 -0
  347. data/lib/graphql/static_validation/rules/fragment_types_exist.rb +39 -0
  348. data/lib/graphql/static_validation/rules/fragment_types_exist_error.rb +29 -0
  349. data/lib/graphql/static_validation/rules/fragments_are_finite.rb +21 -0
  350. data/lib/graphql/static_validation/rules/fragments_are_finite_error.rb +29 -0
  351. data/lib/graphql/static_validation/rules/fragments_are_named.rb +16 -0
  352. data/lib/graphql/static_validation/rules/fragments_are_named_error.rb +26 -0
  353. data/lib/graphql/static_validation/rules/fragments_are_on_composite_types.rb +37 -0
  354. data/lib/graphql/static_validation/rules/fragments_are_on_composite_types_error.rb +30 -0
  355. data/lib/graphql/static_validation/rules/fragments_are_used.rb +32 -0
  356. data/lib/graphql/static_validation/rules/fragments_are_used_error.rb +29 -0
  357. data/lib/graphql/static_validation/rules/input_object_names_are_unique.rb +30 -0
  358. data/lib/graphql/static_validation/rules/input_object_names_are_unique_error.rb +30 -0
  359. data/lib/graphql/static_validation/rules/mutation_root_exists.rb +17 -0
  360. data/lib/graphql/static_validation/rules/mutation_root_exists_error.rb +26 -0
  361. data/lib/graphql/static_validation/rules/no_definitions_are_present.rb +41 -0
  362. data/lib/graphql/static_validation/rules/no_definitions_are_present_error.rb +25 -0
  363. data/lib/graphql/static_validation/rules/operation_names_are_valid.rb +36 -0
  364. data/lib/graphql/static_validation/rules/operation_names_are_valid_error.rb +28 -0
  365. data/lib/graphql/static_validation/rules/required_arguments_are_present.rb +37 -0
  366. data/lib/graphql/static_validation/rules/required_arguments_are_present_error.rb +35 -0
  367. data/lib/graphql/static_validation/rules/required_input_object_attributes_are_present.rb +59 -0
  368. data/lib/graphql/static_validation/rules/required_input_object_attributes_are_present_error.rb +35 -0
  369. data/lib/graphql/static_validation/rules/subscription_root_exists.rb +17 -0
  370. data/lib/graphql/static_validation/rules/subscription_root_exists_error.rb +26 -0
  371. data/lib/graphql/static_validation/rules/unique_directives_per_location.rb +50 -0
  372. data/lib/graphql/static_validation/rules/unique_directives_per_location_error.rb +29 -0
  373. data/lib/graphql/static_validation/rules/variable_default_values_are_correctly_typed.rb +46 -0
  374. data/lib/graphql/static_validation/rules/variable_default_values_are_correctly_typed_error.rb +39 -0
  375. data/lib/graphql/static_validation/rules/variable_names_are_unique.rb +24 -0
  376. data/lib/graphql/static_validation/rules/variable_names_are_unique_error.rb +29 -0
  377. data/lib/graphql/static_validation/rules/variable_usages_are_allowed.rb +153 -0
  378. data/lib/graphql/static_validation/rules/variable_usages_are_allowed_error.rb +38 -0
  379. data/lib/graphql/static_validation/rules/variables_are_input_types.rb +39 -0
  380. data/lib/graphql/static_validation/rules/variables_are_input_types_error.rb +32 -0
  381. data/lib/graphql/static_validation/rules/variables_are_used_and_defined.rb +155 -0
  382. data/lib/graphql/static_validation/rules/variables_are_used_and_defined_error.rb +37 -0
  383. data/lib/graphql/static_validation/type_stack.rb +216 -0
  384. data/lib/graphql/static_validation/validation_context.rb +49 -0
  385. data/lib/graphql/static_validation/validation_timeout_error.rb +25 -0
  386. data/lib/graphql/static_validation/validator.rb +96 -0
  387. data/lib/graphql/static_validation.rb +19 -0
  388. data/lib/graphql/string_encoding_error.rb +20 -0
  389. data/lib/graphql/string_type.rb +2 -0
  390. data/lib/graphql/subscriptions/action_cable_subscriptions.rb +245 -0
  391. data/lib/graphql/subscriptions/broadcast_analyzer.rb +81 -0
  392. data/lib/graphql/subscriptions/default_subscription_resolve_extension.rb +21 -0
  393. data/lib/graphql/subscriptions/event.rb +144 -0
  394. data/lib/graphql/subscriptions/instrumentation.rb +79 -0
  395. data/lib/graphql/subscriptions/serialize.rb +138 -0
  396. data/lib/graphql/subscriptions/subscription_root.rb +76 -0
  397. data/lib/graphql/subscriptions.rb +299 -0
  398. data/lib/graphql/tracing/active_support_notifications_tracing.rb +35 -0
  399. data/lib/graphql/tracing/appoptics_tracing.rb +173 -0
  400. data/lib/graphql/tracing/appsignal_tracing.rb +51 -0
  401. data/lib/graphql/tracing/data_dog_tracing.rb +76 -0
  402. data/lib/graphql/tracing/new_relic_tracing.rb +51 -0
  403. data/lib/graphql/tracing/platform_tracing.rb +139 -0
  404. data/lib/graphql/tracing/prometheus_tracing/graphql_collector.rb +32 -0
  405. data/lib/graphql/tracing/prometheus_tracing.rb +67 -0
  406. data/lib/graphql/tracing/scout_tracing.rb +54 -0
  407. data/lib/graphql/tracing/skylight_tracing.rb +70 -0
  408. data/lib/graphql/tracing/statsd_tracing.rb +42 -0
  409. data/lib/graphql/tracing.rb +95 -0
  410. data/lib/graphql/type_kinds.rb +77 -0
  411. data/lib/graphql/types/big_int.rb +23 -0
  412. data/lib/graphql/types/boolean.rb +18 -0
  413. data/lib/graphql/types/float.rb +19 -0
  414. data/lib/graphql/types/id.rb +24 -0
  415. data/lib/graphql/types/int.rb +36 -0
  416. data/lib/graphql/types/iso_8601_date.rb +34 -0
  417. data/lib/graphql/types/iso_8601_date_time.rb +65 -0
  418. data/lib/graphql/types/json.rb +25 -0
  419. data/lib/graphql/types/relay/base_connection.rb +39 -0
  420. data/lib/graphql/types/relay/base_edge.rb +29 -0
  421. data/lib/graphql/types/relay/connection_behaviors.rb +156 -0
  422. data/lib/graphql/types/relay/default_relay.rb +27 -0
  423. data/lib/graphql/types/relay/edge_behaviors.rb +53 -0
  424. data/lib/graphql/types/relay/has_node_field.rb +41 -0
  425. data/lib/graphql/types/relay/has_nodes_field.rb +41 -0
  426. data/lib/graphql/types/relay/node.rb +15 -0
  427. data/lib/graphql/types/relay/node_behaviors.rb +15 -0
  428. data/lib/graphql/types/relay/node_field.rb +25 -0
  429. data/lib/graphql/types/relay/nodes_field.rb +27 -0
  430. data/lib/graphql/types/relay/page_info.rb +11 -0
  431. data/lib/graphql/types/relay/page_info_behaviors.rb +25 -0
  432. data/lib/graphql/types/relay.rb +41 -0
  433. data/lib/graphql/types/string.rb +29 -0
  434. data/lib/graphql/types.rb +11 -0
  435. data/lib/graphql/unauthorized_error.rb +29 -0
  436. data/lib/graphql/unauthorized_field_error.rb +23 -0
  437. data/lib/graphql/union_type.rb +115 -0
  438. data/lib/graphql/unresolved_type_error.rb +35 -0
  439. data/lib/graphql/upgrader/member.rb +937 -0
  440. data/lib/graphql/upgrader/schema.rb +38 -0
  441. data/lib/graphql/version.rb +4 -0
  442. data/lib/graphql.rb +168 -0
  443. data/readme.md +49 -0
  444. metadata +714 -0
@@ -0,0 +1,53 @@
1
+ # frozen_string_literal: true
2
+ module GraphQL
3
+ module Compatibility
4
+ module ExecutionSpecification
5
+ module CounterSchema
6
+ def self.build(execution_strategy)
7
+ counter_type = nil
8
+ schema = nil
9
+
10
+ has_count_interface = GraphQL::InterfaceType.define do
11
+ name "HasCount"
12
+ field :count, types.Int
13
+ field :counter, ->{ has_count_interface }
14
+ end
15
+
16
+ counter_type = GraphQL::ObjectType.define do
17
+ name "Counter"
18
+ interfaces [has_count_interface]
19
+ field :count, types.Int, resolve: ->(o,a,c) { schema.metadata[:count] += 1 }
20
+ field :counter, has_count_interface, resolve: ->(o,a,c) { :counter }
21
+ end
22
+
23
+ alt_counter_type = GraphQL::ObjectType.define do
24
+ name "AltCounter"
25
+ interfaces [has_count_interface]
26
+ field :count, types.Int, resolve: ->(o,a,c) { schema.metadata[:count] += 1 }
27
+ field :counter, has_count_interface, resolve: ->(o,a,c) { :counter }
28
+ end
29
+
30
+ has_counter_interface = GraphQL::InterfaceType.define do
31
+ name "HasCounter"
32
+ field :counter, has_count_interface
33
+ end
34
+
35
+ query_type = GraphQL::ObjectType.define do
36
+ name "Query"
37
+ interfaces [has_counter_interface]
38
+ field :counter, has_count_interface, resolve: ->(o,a,c) { :counter }
39
+ end
40
+
41
+ schema = GraphQL::Schema.define(
42
+ query: query_type,
43
+ resolve_type: ->(t, o, c) { o == :counter ? counter_type : nil },
44
+ orphan_types: [alt_counter_type, counter_type],
45
+ query_execution_strategy: execution_strategy,
46
+ )
47
+ schema.metadata[:count] = 0
48
+ schema
49
+ end
50
+ end
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,200 @@
1
+ # frozen_string_literal: true
2
+ module GraphQL
3
+ module Compatibility
4
+ module ExecutionSpecification
5
+ module SpecificationSchema
6
+ BOGUS_NODE = OpenStruct.new({ bogus: true })
7
+
8
+ DATA = {
9
+ "1001" => OpenStruct.new({
10
+ name: "Fannie Lou Hamer",
11
+ birthdate: Time.new(1917, 10, 6),
12
+ organization_ids: [],
13
+ }),
14
+ "1002" => OpenStruct.new({
15
+ name: "John Lewis",
16
+ birthdate: Time.new(1940, 2, 21),
17
+ organization_ids: ["2001"],
18
+ }),
19
+ "1003" => OpenStruct.new({
20
+ name: "Diane Nash",
21
+ birthdate: Time.new(1938, 5, 15),
22
+ organization_ids: ["2001", "2002"],
23
+ }),
24
+ "1004" => OpenStruct.new({
25
+ name: "Ralph Abernathy",
26
+ birthdate: Time.new(1926, 3, 11),
27
+ organization_ids: ["2002"],
28
+ }),
29
+ "2001" => OpenStruct.new({
30
+ name: "SNCC",
31
+ leader_id: nil, # fail on purpose
32
+ }),
33
+ "2002" => OpenStruct.new({
34
+ name: "SCLC",
35
+ leader_id: "1004",
36
+ }),
37
+ "2003" => BOGUS_NODE,
38
+ }
39
+
40
+ # A list object must implement #each
41
+ class CustomCollection
42
+ def initialize(storage)
43
+ @storage = storage
44
+ end
45
+
46
+ def each(&block)
47
+ @storage.each(&block)
48
+ end
49
+ end
50
+
51
+ module TestMiddleware
52
+ def self.call(parent_type, parent_object, field_definition, field_args, query_context, &next_middleware)
53
+ query_context[:middleware_log] && query_context[:middleware_log] << field_definition.name
54
+ next_middleware.call
55
+ end
56
+ end
57
+
58
+ def self.build(execution_strategy)
59
+ organization_type = nil
60
+
61
+ timestamp_type = GraphQL::ScalarType.define do
62
+ name "Timestamp"
63
+ coerce_input ->(value, _ctx) { Time.at(value.to_i) }
64
+ coerce_result ->(value, _ctx) { value.to_i }
65
+ end
66
+
67
+ named_entity_interface_type = GraphQL::InterfaceType.define do
68
+ name "NamedEntity"
69
+ field :name, !types.String
70
+ end
71
+
72
+ person_type = GraphQL::ObjectType.define do
73
+ name "Person"
74
+ interfaces [named_entity_interface_type]
75
+ field :name, !types.String
76
+ field :birthdate, timestamp_type
77
+ field :age, types.Int do
78
+ argument :on, !timestamp_type
79
+ resolve ->(obj, args, ctx) {
80
+ if obj.birthdate.nil?
81
+ nil
82
+ else
83
+ age_on = args[:on]
84
+ age_years = age_on.year - obj.birthdate.year
85
+ this_year_birthday = Time.new(age_on.year, obj.birthdate.month, obj.birthdate.day)
86
+ if this_year_birthday > age_on
87
+ age_years -= 1
88
+ end
89
+ end
90
+ age_years
91
+ }
92
+ end
93
+ field :organizations, types[organization_type] do
94
+ resolve ->(obj, args, ctx) {
95
+ CustomCollection.new(obj.organization_ids.map { |id| DATA[id] })
96
+ }
97
+ end
98
+ field :first_organization, !organization_type do
99
+ resolve ->(obj, args, ctx) {
100
+ DATA[obj.organization_ids.first]
101
+ }
102
+ end
103
+ end
104
+
105
+ organization_type = GraphQL::ObjectType.define do
106
+ name "Organization"
107
+ interfaces [named_entity_interface_type]
108
+ field :name, !types.String
109
+ field :leader, !person_type do
110
+ resolve ->(obj, args, ctx) {
111
+ DATA[obj.leader_id] || (ctx[:return_error] ? ExecutionError.new("Error on Nullable") : nil)
112
+ }
113
+ end
114
+ field :returnedError, types.String do
115
+ resolve ->(o, a, c) {
116
+ GraphQL::ExecutionError.new("This error was returned")
117
+ }
118
+ end
119
+ field :raisedError, types.String do
120
+ resolve ->(o, a, c) {
121
+ raise GraphQL::ExecutionError.new("This error was raised")
122
+ }
123
+ end
124
+
125
+ field :nodePresence, !types[!types.Boolean] do
126
+ resolve ->(o, a, ctx) {
127
+ [
128
+ ctx.irep_node.is_a?(GraphQL::InternalRepresentation::Node),
129
+ ctx.ast_node.is_a?(GraphQL::Language::Nodes::AbstractNode),
130
+ false, # just testing
131
+ ]
132
+ }
133
+ end
134
+ end
135
+
136
+ node_union_type = GraphQL::UnionType.define do
137
+ name "Node"
138
+ possible_types [person_type, organization_type]
139
+ end
140
+
141
+ query_type = GraphQL::ObjectType.define do
142
+ name "Query"
143
+ field :node, node_union_type do
144
+ argument :id, !types.ID
145
+ resolve ->(obj, args, ctx) {
146
+ obj[args[:id]]
147
+ }
148
+ end
149
+
150
+ field :requiredNode, node_union_type.to_non_null_type do
151
+ argument :id, !types.ID
152
+ resolve ->(obj, args, ctx) {
153
+ obj[args[:id]]
154
+ }
155
+ end
156
+
157
+ field :organization, !organization_type do
158
+ argument :id, !types.ID
159
+ resolve ->(obj, args, ctx) {
160
+ if args[:id].start_with?("2")
161
+ obj[args[:id]]
162
+ else
163
+ # test context.skip
164
+ ctx.skip
165
+ end
166
+ }
167
+ end
168
+
169
+ field :organizations, types[organization_type] do
170
+ resolve ->(obj, args, ctx) {
171
+ [obj["2001"], obj["2002"]]
172
+ }
173
+ end
174
+ end
175
+
176
+ GraphQL::Schema.define do
177
+ query_execution_strategy execution_strategy
178
+ query query_type
179
+
180
+ resolve_type ->(type, obj, ctx) {
181
+ if obj.respond_to?(:birthdate)
182
+ person_type
183
+ elsif obj.respond_to?(:leader_id)
184
+ organization_type
185
+ else
186
+ nil
187
+ end
188
+ }
189
+
190
+ type_error ->(err, ctx) {
191
+ ctx[:type_errors] && (ctx[:type_errors] << err.value)
192
+ ctx[:gobble] || GraphQL::Schema::DefaultTypeError.call(err, ctx)
193
+ }
194
+ middleware(TestMiddleware)
195
+ end
196
+ end
197
+ end
198
+ end
199
+ end
200
+ end
@@ -0,0 +1,436 @@
1
+ # frozen_string_literal: true
2
+ require "graphql/compatibility/execution_specification/counter_schema"
3
+ require "graphql/compatibility/execution_specification/specification_schema"
4
+
5
+ module GraphQL
6
+ module Compatibility
7
+ # Test an execution strategy. This spec is not meant as a development aid.
8
+ # Rather, when the strategy _works_, run it here to see if it has any differences
9
+ # from the built-in strategy.
10
+ #
11
+ # - Custom scalar input / output
12
+ # - Null propagation
13
+ # - Query-level masking
14
+ # - Directive support
15
+ # - Typecasting
16
+ # - Error handling (raise / return GraphQL::ExecutionError)
17
+ # - Provides Irep & AST node to resolve fn
18
+ # - Skipping fields
19
+ #
20
+ # Some things are explicitly _not_ tested here, because they're handled
21
+ # by other parts of the system:
22
+ #
23
+ # - Schema definition (including types and fields)
24
+ # - Parsing & parse errors
25
+ # - AST -> IRep transformation (eg, fragment merging)
26
+ # - Query validation and analysis
27
+ # - Relay features
28
+ #
29
+ module ExecutionSpecification
30
+ # Make a minitest suite for this execution strategy, making sure it
31
+ # fulfills all the requirements of this library.
32
+ # @param execution_strategy [<#new, #execute>] An execution strategy class
33
+ # @return [Class<Minitest::Test>] A test suite for this execution strategy
34
+ def self.build_suite(execution_strategy)
35
+ GraphQL::Deprecation.warn "#{self} will be removed from GraphQL-Ruby 2.0. There is no replacement, please open an issue on GitHub if you need support."
36
+ Class.new(Minitest::Test) do
37
+ class << self
38
+ attr_accessor :counter_schema, :specification_schema
39
+ end
40
+
41
+ self.specification_schema = SpecificationSchema.build(execution_strategy)
42
+ self.counter_schema = CounterSchema.build(execution_strategy)
43
+
44
+ def execute_query(query_string, **kwargs)
45
+ kwargs[:root_value] = SpecificationSchema::DATA
46
+ self.class.specification_schema.execute(query_string, **kwargs)
47
+ end
48
+
49
+ def test_it_fetches_data
50
+ query_string = %|
51
+ query getData($nodeId: ID = "1001") {
52
+ flh: node(id: $nodeId) {
53
+ __typename
54
+ ... on Person {
55
+ name @include(if: true)
56
+ skippedName: name @skip(if: true)
57
+ birthdate
58
+ age(on: 1477660133)
59
+ }
60
+
61
+ ... on NamedEntity {
62
+ ne_tn: __typename
63
+ ne_n: name
64
+ }
65
+
66
+ ... on Organization {
67
+ org_n: name
68
+ }
69
+ }
70
+ }
71
+ |
72
+ res = execute_query(query_string)
73
+
74
+ assert_equal nil, res["errors"], "It doesn't have an errors key"
75
+
76
+ flh = res["data"]["flh"]
77
+ assert_equal "Fannie Lou Hamer", flh["name"], "It returns values"
78
+ assert_equal Time.new(1917, 10, 6).to_i, flh["birthdate"], "It returns custom scalars"
79
+ assert_equal 99, flh["age"], "It runs resolve functions"
80
+ assert_equal "Person", flh["__typename"], "It serves __typename"
81
+ assert_equal "Person", flh["ne_tn"], "It serves __typename on interfaces"
82
+ assert_equal "Fannie Lou Hamer", flh["ne_n"], "It serves interface fields"
83
+ assert_equal false, flh.key?("skippedName"), "It obeys @skip"
84
+ assert_equal false, flh.key?("org_n"), "It doesn't apply other type fields"
85
+ end
86
+
87
+ def test_it_iterates_over_each
88
+ query_string = %|
89
+ query getData($nodeId: ID = "1002") {
90
+ node(id: $nodeId) {
91
+ ... on Person {
92
+ organizations { name }
93
+ }
94
+ }
95
+ }
96
+ |
97
+
98
+ res = execute_query(query_string)
99
+ assert_equal ["SNCC"], res["data"]["node"]["organizations"].map { |o| o["name"] }
100
+ end
101
+
102
+ def test_it_skips_skipped_fields
103
+ query_str = <<-GRAPHQL
104
+ {
105
+ o3001: organization(id: "3001") { name }
106
+ o2001: organization(id: "2001") { name }
107
+ }
108
+ GRAPHQL
109
+
110
+ res = execute_query(query_str)
111
+ assert_equal ["o2001"], res["data"].keys
112
+ assert_equal false, res.key?("errors")
113
+ end
114
+
115
+ def test_it_propagates_nulls_to_field
116
+ query_string = %|
117
+ query getOrg($id: ID = "2001"){
118
+ failure: node(id: $id) {
119
+ ... on Organization {
120
+ name
121
+ leader { name }
122
+ }
123
+ }
124
+ success: node(id: $id) {
125
+ ... on Organization {
126
+ name
127
+ }
128
+ }
129
+ }
130
+ |
131
+ res = execute_query(query_string)
132
+
133
+ failure = res["data"]["failure"]
134
+ success = res["data"]["success"]
135
+
136
+ assert_equal nil, failure, "It propagates nulls to the next nullable field"
137
+ assert_equal({"name" => "SNCC"}, success, "It serves the same object if no invalid null is encountered")
138
+ assert_equal 1, res["errors"].length , "It returns an error for the invalid null"
139
+ end
140
+
141
+ def test_it_propages_nulls_to_operation
142
+ query_string = %|
143
+ {
144
+ foundOrg: organization(id: "2001") {
145
+ name
146
+ }
147
+ organization(id: "2999") {
148
+ name
149
+ }
150
+ }
151
+ |
152
+
153
+ res = execute_query(query_string)
154
+ assert_equal nil, res["data"]
155
+ assert_equal 1, res["errors"].length
156
+ end
157
+
158
+ def test_it_exposes_raised_and_returned_user_execution_errors
159
+ query_string = %|
160
+ {
161
+ organization(id: "2001") {
162
+ name
163
+ returnedError
164
+ raisedError
165
+ }
166
+ organizations {
167
+ returnedError
168
+ raisedError
169
+ }
170
+ }
171
+ |
172
+
173
+ res = execute_query(query_string)
174
+
175
+ assert_equal "SNCC", res["data"]["organization"]["name"], "It runs the rest of the query"
176
+
177
+ expected_errors = [
178
+ {
179
+ "message"=>"This error was returned",
180
+ "locations"=>[{"line"=>5, "column"=>19}],
181
+ "path"=>["organization", "returnedError"]
182
+ },
183
+ {
184
+ "message"=>"This error was raised",
185
+ "locations"=>[{"line"=>6, "column"=>19}],
186
+ "path"=>["organization", "raisedError"]
187
+ },
188
+ {
189
+ "message"=>"This error was raised",
190
+ "locations"=>[{"line"=>10, "column"=>19}],
191
+ "path"=>["organizations", 0, "raisedError"]
192
+ },
193
+ {
194
+ "message"=>"This error was raised",
195
+ "locations"=>[{"line"=>10, "column"=>19}],
196
+ "path"=>["organizations", 1, "raisedError"]
197
+ },
198
+ {
199
+ "message"=>"This error was returned",
200
+ "locations"=>[{"line"=>9, "column"=>19}],
201
+ "path"=>["organizations", 0, "returnedError"]
202
+ },
203
+ {
204
+ "message"=>"This error was returned",
205
+ "locations"=>[{"line"=>9, "column"=>19}],
206
+ "path"=>["organizations", 1, "returnedError"]
207
+ },
208
+ ]
209
+
210
+ expected_errors.each do |expected_err|
211
+ assert_includes res["errors"], expected_err
212
+ end
213
+ end
214
+
215
+ def test_it_applies_masking
216
+ no_org = ->(member, ctx) { member.name == "Organization" }
217
+ query_string = %|
218
+ {
219
+ node(id: "2001") {
220
+ __typename
221
+ }
222
+ }|
223
+
224
+ err = assert_raises(GraphQL::UnresolvedTypeError) {
225
+ execute_query(query_string, except: no_org)
226
+ }
227
+
228
+ query_string = %|
229
+ {
230
+ organization(id: "2001") { name }
231
+ }|
232
+
233
+ res = execute_query(query_string, except: no_org)
234
+
235
+ assert_equal nil, res["data"]
236
+ assert_equal 1, res["errors"].length
237
+ assert_equal "SNCC", err.value.name
238
+ assert_equal GraphQL::Relay::Node.interface, err.field.type
239
+ assert_equal 1, err.possible_types.length
240
+ assert_equal "Organization", err.resolved_type.name
241
+ assert_equal "Query", err.parent_type.name
242
+
243
+ query_string = %|
244
+ {
245
+ __type(name: "Organization") { name }
246
+ }|
247
+
248
+ res = execute_query(query_string, except: no_org)
249
+
250
+ assert_equal nil, res["data"]["__type"]
251
+ assert_equal nil, res["errors"]
252
+ end
253
+
254
+ def test_it_provides_nodes_to_resolve
255
+ query_string = %|
256
+ {
257
+ organization(id: "2001") {
258
+ name
259
+ nodePresence
260
+ }
261
+ }|
262
+
263
+ res = execute_query(query_string)
264
+ assert_equal "SNCC", res["data"]["organization"]["name"]
265
+ assert_equal [true, true, false], res["data"]["organization"]["nodePresence"]
266
+ end
267
+
268
+ def test_it_runs_the_introspection_query
269
+ execute_query(GraphQL::Introspection::INTROSPECTION_QUERY)
270
+ end
271
+
272
+ def test_it_propagates_deeply_nested_nulls
273
+ query_string = %|
274
+ {
275
+ node(id: "1001") {
276
+ ... on Person {
277
+ name
278
+ first_organization {
279
+ leader {
280
+ name
281
+ }
282
+ }
283
+ }
284
+ }
285
+ }
286
+ |
287
+ res = execute_query(query_string)
288
+ assert_equal nil, res["data"]["node"]
289
+ assert_equal 1, res["errors"].length
290
+ end
291
+
292
+ def test_it_doesnt_add_errors_for_invalid_nulls_from_execution_errors
293
+ query_string = %|
294
+ query getOrg($id: ID = "2001"){
295
+ failure: node(id: $id) {
296
+ ... on Organization {
297
+ name
298
+ leader { name }
299
+ }
300
+ }
301
+ }
302
+ |
303
+ res = execute_query(query_string, context: {return_error: true})
304
+ error_messages = res["errors"].map { |e| e["message"] }
305
+ assert_equal ["Error on Nullable"], error_messages
306
+ end
307
+
308
+ def test_it_only_resolves_fields_once_on_typed_fragments
309
+ res = self.class.counter_schema.execute("
310
+ {
311
+ counter { count }
312
+ ... on HasCounter {
313
+ counter { count }
314
+ }
315
+ }
316
+ ")
317
+
318
+ expected_data = {
319
+ "counter" => { "count" => 1 }
320
+ }
321
+ assert_equal expected_data, res["data"]
322
+ assert_equal 1, self.class.counter_schema.metadata[:count]
323
+
324
+ # Deep typed children are correctly distinguished:
325
+ res = self.class.counter_schema.execute("
326
+ {
327
+ counter {
328
+ ... on Counter {
329
+ counter { count }
330
+ }
331
+ ... on AltCounter {
332
+ counter { count, t: __typename }
333
+ }
334
+ }
335
+ }
336
+ ")
337
+
338
+ expected_data = {
339
+ "counter" => { "counter" => { "count" => 2 } }
340
+ }
341
+ assert_equal expected_data, res["data"]
342
+ end
343
+
344
+ def test_it_runs_middleware
345
+ log = []
346
+ query_string = %|
347
+ {
348
+ node(id: "2001") {
349
+ __typename
350
+ }
351
+ }|
352
+ execute_query(query_string, context: {middleware_log: log})
353
+ assert_equal ["node", "__typename"], log
354
+ end
355
+
356
+ def test_it_uses_type_error_hooks_for_invalid_nulls
357
+ log = []
358
+ query_string = %|
359
+ {
360
+ node(id: "1001") {
361
+ ... on Person {
362
+ name
363
+ first_organization {
364
+ leader {
365
+ name
366
+ }
367
+ }
368
+ }
369
+ }
370
+ }|
371
+
372
+ res = execute_query(query_string, context: { type_errors: log })
373
+ assert_equal nil, res["data"]["node"]
374
+ assert_equal [nil], log
375
+ end
376
+
377
+ def test_it_uses_type_error_hooks_for_failed_type_resolution
378
+ log = []
379
+ query_string = %|
380
+ {
381
+ node(id: "2003") {
382
+ __typename
383
+ }
384
+ }|
385
+
386
+ assert_raises(GraphQL::UnresolvedTypeError) {
387
+ execute_query(query_string, context: { type_errors: log })
388
+ }
389
+
390
+ assert_equal [SpecificationSchema::BOGUS_NODE], log
391
+ end
392
+
393
+ def test_it_treats_failed_type_resolution_like_nil
394
+ log = []
395
+ ctx = { type_errors: log, gobble: true }
396
+ query_string = %|
397
+ {
398
+ node(id: "2003") {
399
+ __typename
400
+ }
401
+ }|
402
+
403
+ res = execute_query(query_string, context: ctx)
404
+
405
+ assert_equal nil, res["data"]["node"]
406
+ assert_equal false, res.key?("errors")
407
+ assert_equal [SpecificationSchema::BOGUS_NODE], log
408
+
409
+ query_string_2 = %|
410
+ {
411
+ requiredNode(id: "2003") {
412
+ __typename
413
+ }
414
+ }|
415
+
416
+ res = execute_query(query_string_2, context: ctx)
417
+
418
+ assert_equal nil, res["data"]
419
+ assert_equal false, res.key?("errors")
420
+ assert_equal [SpecificationSchema::BOGUS_NODE, SpecificationSchema::BOGUS_NODE], log
421
+ end
422
+
423
+ def test_it_skips_connections
424
+ query_type = GraphQL::ObjectType.define do
425
+ name "Query"
426
+ connection :skipped, types[query_type], resolve: ->(o,a,c) { c.skip }
427
+ end
428
+ schema = GraphQL::Schema.define(query: query_type)
429
+ res = schema.execute("{ skipped { __typename } }")
430
+ assert_equal({"data" => nil}, res)
431
+ end
432
+ end
433
+ end
434
+ end
435
+ end
436
+ end