graphql 0.16.0 → 2.0.15

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 (490) hide show
  1. checksums.yaml +5 -5
  2. data/.yardopts +5 -0
  3. data/lib/generators/graphql/core.rb +69 -0
  4. data/lib/generators/graphql/enum_generator.rb +27 -0
  5. data/lib/generators/graphql/field_extractor.rb +31 -0
  6. data/lib/generators/graphql/input_generator.rb +50 -0
  7. data/lib/generators/graphql/install/mutation_root_generator.rb +34 -0
  8. data/lib/generators/graphql/install/templates/base_mutation.erb +10 -0
  9. data/lib/generators/graphql/install/templates/mutation_type.erb +12 -0
  10. data/lib/generators/graphql/install_generator.rb +197 -0
  11. data/lib/generators/graphql/interface_generator.rb +27 -0
  12. data/lib/generators/graphql/loader_generator.rb +21 -0
  13. data/lib/generators/graphql/mutation_create_generator.rb +22 -0
  14. data/lib/generators/graphql/mutation_delete_generator.rb +22 -0
  15. data/lib/generators/graphql/mutation_generator.rb +30 -0
  16. data/lib/generators/graphql/mutation_update_generator.rb +22 -0
  17. data/lib/generators/graphql/object_generator.rb +50 -0
  18. data/lib/generators/graphql/orm_mutations_base.rb +40 -0
  19. data/lib/generators/graphql/relay.rb +49 -0
  20. data/lib/generators/graphql/relay_generator.rb +21 -0
  21. data/lib/generators/graphql/scalar_generator.rb +22 -0
  22. data/lib/generators/graphql/templates/base_argument.erb +6 -0
  23. data/lib/generators/graphql/templates/base_connection.erb +8 -0
  24. data/lib/generators/graphql/templates/base_edge.erb +8 -0
  25. data/lib/generators/graphql/templates/base_enum.erb +6 -0
  26. data/lib/generators/graphql/templates/base_field.erb +7 -0
  27. data/lib/generators/graphql/templates/base_input_object.erb +7 -0
  28. data/lib/generators/graphql/templates/base_interface.erb +9 -0
  29. data/lib/generators/graphql/templates/base_object.erb +7 -0
  30. data/lib/generators/graphql/templates/base_scalar.erb +6 -0
  31. data/lib/generators/graphql/templates/base_union.erb +6 -0
  32. data/lib/generators/graphql/templates/enum.erb +11 -0
  33. data/lib/generators/graphql/templates/graphql_controller.erb +52 -0
  34. data/lib/generators/graphql/templates/input.erb +9 -0
  35. data/lib/generators/graphql/templates/interface.erb +10 -0
  36. data/lib/generators/graphql/templates/loader.erb +19 -0
  37. data/lib/generators/graphql/templates/mutation.erb +16 -0
  38. data/lib/generators/graphql/templates/mutation_create.erb +20 -0
  39. data/lib/generators/graphql/templates/mutation_delete.erb +20 -0
  40. data/lib/generators/graphql/templates/mutation_update.erb +21 -0
  41. data/lib/generators/graphql/templates/node_type.erb +9 -0
  42. data/lib/generators/graphql/templates/object.erb +10 -0
  43. data/lib/generators/graphql/templates/query_type.erb +15 -0
  44. data/lib/generators/graphql/templates/scalar.erb +17 -0
  45. data/lib/generators/graphql/templates/schema.erb +30 -0
  46. data/lib/generators/graphql/templates/union.erb +9 -0
  47. data/lib/generators/graphql/type_generator.rb +135 -0
  48. data/lib/generators/graphql/union_generator.rb +33 -0
  49. data/lib/graphql/analysis/ast/analyzer.rb +84 -0
  50. data/lib/graphql/analysis/ast/field_usage.rb +57 -0
  51. data/lib/graphql/analysis/ast/max_query_complexity.rb +22 -0
  52. data/lib/graphql/analysis/ast/max_query_depth.rb +22 -0
  53. data/lib/graphql/analysis/ast/query_complexity.rb +230 -0
  54. data/lib/graphql/analysis/ast/query_depth.rb +55 -0
  55. data/lib/graphql/analysis/ast/visitor.rb +269 -0
  56. data/lib/graphql/analysis/ast.rb +81 -0
  57. data/lib/graphql/analysis.rb +2 -5
  58. data/lib/graphql/analysis_error.rb +1 -0
  59. data/lib/graphql/backtrace/inspect_result.rb +50 -0
  60. data/lib/graphql/backtrace/table.rb +141 -0
  61. data/lib/graphql/backtrace/traced_error.rb +54 -0
  62. data/lib/graphql/backtrace/tracer.rb +80 -0
  63. data/lib/graphql/backtrace.rb +58 -0
  64. data/lib/graphql/coercion_error.rb +13 -0
  65. data/lib/graphql/dataloader/null_dataloader.rb +24 -0
  66. data/lib/graphql/dataloader/request.rb +19 -0
  67. data/lib/graphql/dataloader/request_all.rb +19 -0
  68. data/lib/graphql/dataloader/source.rb +164 -0
  69. data/lib/graphql/dataloader.rb +311 -0
  70. data/lib/graphql/date_encoding_error.rb +16 -0
  71. data/lib/graphql/deprecation.rb +9 -0
  72. data/lib/graphql/dig.rb +19 -0
  73. data/lib/graphql/execution/directive_checks.rb +37 -0
  74. data/lib/graphql/execution/errors.rb +93 -0
  75. data/lib/graphql/execution/interpreter/argument_value.rb +28 -0
  76. data/lib/graphql/execution/interpreter/arguments.rb +88 -0
  77. data/lib/graphql/execution/interpreter/arguments_cache.rb +105 -0
  78. data/lib/graphql/execution/interpreter/execution_errors.rb +29 -0
  79. data/lib/graphql/execution/interpreter/handles_raw_value.rb +18 -0
  80. data/lib/graphql/execution/interpreter/resolve.rb +77 -0
  81. data/lib/graphql/execution/interpreter/runtime.rb +994 -0
  82. data/lib/graphql/execution/interpreter.rb +226 -0
  83. data/lib/graphql/execution/lazy/lazy_method_map.rb +98 -0
  84. data/lib/graphql/execution/lazy.rb +75 -0
  85. data/lib/graphql/execution/lookahead.rb +311 -0
  86. data/lib/graphql/execution/multiplex.rb +45 -0
  87. data/lib/graphql/execution.rb +18 -0
  88. data/lib/graphql/execution_error.rb +34 -1
  89. data/lib/graphql/filter.rb +53 -0
  90. data/lib/graphql/integer_decoding_error.rb +17 -0
  91. data/lib/graphql/integer_encoding_error.rb +36 -0
  92. data/lib/graphql/introspection/base_object.rb +13 -0
  93. data/lib/graphql/introspection/directive_location_enum.rb +12 -5
  94. data/lib/graphql/introspection/directive_type.rb +30 -10
  95. data/lib/graphql/introspection/dynamic_fields.rb +12 -0
  96. data/lib/graphql/introspection/entry_points.rb +22 -0
  97. data/lib/graphql/introspection/enum_value_type.rb +21 -8
  98. data/lib/graphql/introspection/field_type.rb +26 -10
  99. data/lib/graphql/introspection/input_value_type.rb +64 -14
  100. data/lib/graphql/introspection/introspection_query.rb +7 -76
  101. data/lib/graphql/introspection/schema_type.rb +42 -17
  102. data/lib/graphql/introspection/type_kind_enum.rb +11 -5
  103. data/lib/graphql/introspection/type_type.rb +104 -16
  104. data/lib/graphql/introspection.rb +104 -13
  105. data/lib/graphql/invalid_name_error.rb +11 -0
  106. data/lib/graphql/invalid_null_error.rb +36 -8
  107. data/lib/graphql/language/block_string.rb +99 -0
  108. data/lib/graphql/language/cache.rb +37 -0
  109. data/lib/graphql/language/definition_slice.rb +41 -0
  110. data/lib/graphql/language/document_from_schema_definition.rb +335 -0
  111. data/lib/graphql/language/generation.rb +16 -86
  112. data/lib/graphql/language/lexer.rb +1436 -705
  113. data/lib/graphql/language/lexer.rl +172 -64
  114. data/lib/graphql/language/nodes.rb +617 -105
  115. data/lib/graphql/language/parser.rb +1524 -430
  116. data/lib/graphql/language/parser.y +348 -73
  117. data/lib/graphql/language/printer.rb +386 -0
  118. data/lib/graphql/language/sanitized_printer.rb +222 -0
  119. data/lib/graphql/language/token.rb +16 -3
  120. data/lib/graphql/language/visitor.rb +169 -25
  121. data/lib/graphql/language.rb +30 -0
  122. data/lib/graphql/load_application_object_failed_error.rb +22 -0
  123. data/lib/graphql/name_validator.rb +11 -0
  124. data/lib/graphql/pagination/active_record_relation_connection.rb +85 -0
  125. data/lib/graphql/pagination/array_connection.rb +79 -0
  126. data/lib/graphql/pagination/connection.rb +253 -0
  127. data/lib/graphql/pagination/connections.rb +135 -0
  128. data/lib/graphql/pagination/mongoid_relation_connection.rb +25 -0
  129. data/lib/graphql/pagination/relation_connection.rb +228 -0
  130. data/lib/graphql/pagination/sequel_dataset_connection.rb +28 -0
  131. data/lib/graphql/pagination.rb +6 -0
  132. data/lib/graphql/parse_error.rb +24 -0
  133. data/lib/graphql/query/context.rb +266 -12
  134. data/lib/graphql/query/fingerprint.rb +26 -0
  135. data/lib/graphql/query/input_validation_result.rb +34 -7
  136. data/lib/graphql/query/null_context.rb +52 -0
  137. data/lib/graphql/query/result.rb +63 -0
  138. data/lib/graphql/query/validation_pipeline.rb +114 -0
  139. data/lib/graphql/query/variable_validation_error.rb +27 -3
  140. data/lib/graphql/query/variables.rb +75 -24
  141. data/lib/graphql/query.rb +359 -92
  142. data/lib/graphql/railtie.rb +13 -0
  143. data/lib/graphql/rake_task/validate.rb +63 -0
  144. data/lib/graphql/rake_task.rb +146 -0
  145. data/lib/graphql/relay/range_add.rb +52 -0
  146. data/lib/graphql/relay.rb +3 -0
  147. data/lib/graphql/rubocop/graphql/base_cop.rb +36 -0
  148. data/lib/graphql/rubocop/graphql/default_null_true.rb +43 -0
  149. data/lib/graphql/rubocop/graphql/default_required_true.rb +43 -0
  150. data/lib/graphql/rubocop.rb +4 -0
  151. data/lib/graphql/runtime_type_error.rb +5 -0
  152. data/lib/graphql/schema/addition.rb +245 -0
  153. data/lib/graphql/schema/argument.rb +395 -0
  154. data/lib/graphql/schema/base_64_bp.rb +26 -0
  155. data/lib/graphql/schema/base_64_encoder.rb +21 -0
  156. data/lib/graphql/schema/build_from_definition/resolve_map/default_resolve.rb +47 -0
  157. data/lib/graphql/schema/build_from_definition/resolve_map.rb +78 -0
  158. data/lib/graphql/schema/build_from_definition.rb +492 -0
  159. data/lib/graphql/schema/built_in_types.rb +12 -0
  160. data/lib/graphql/schema/directive/deprecated.rb +18 -0
  161. data/lib/graphql/schema/directive/feature.rb +66 -0
  162. data/lib/graphql/schema/directive/flagged.rb +57 -0
  163. data/lib/graphql/schema/directive/include.rb +25 -0
  164. data/lib/graphql/schema/directive/one_of.rb +12 -0
  165. data/lib/graphql/schema/directive/skip.rb +25 -0
  166. data/lib/graphql/schema/directive/transform.rb +60 -0
  167. data/lib/graphql/schema/directive.rb +212 -0
  168. data/lib/graphql/schema/enum.rb +176 -0
  169. data/lib/graphql/schema/enum_value.rb +77 -0
  170. data/lib/graphql/schema/field/connection_extension.rb +80 -0
  171. data/lib/graphql/schema/field/scope_extension.rb +22 -0
  172. data/lib/graphql/schema/field.rb +862 -0
  173. data/lib/graphql/schema/field_extension.rb +156 -0
  174. data/lib/graphql/schema/find_inherited_value.rb +36 -0
  175. data/lib/graphql/schema/finder.rb +155 -0
  176. data/lib/graphql/schema/input_object.rb +258 -0
  177. data/lib/graphql/schema/interface.rb +113 -0
  178. data/lib/graphql/schema/introspection_system.rb +164 -0
  179. data/lib/graphql/schema/invalid_type_error.rb +1 -0
  180. data/lib/graphql/schema/late_bound_type.rb +37 -0
  181. data/lib/graphql/schema/list.rb +86 -0
  182. data/lib/graphql/schema/loader.rb +228 -0
  183. data/lib/graphql/schema/member/base_dsl_methods.rb +124 -0
  184. data/lib/graphql/schema/member/build_type.rb +178 -0
  185. data/lib/graphql/schema/member/graphql_type_names.rb +21 -0
  186. data/lib/graphql/schema/member/has_arguments.rb +376 -0
  187. data/lib/graphql/schema/member/has_ast_node.rb +20 -0
  188. data/lib/graphql/schema/member/has_deprecation_reason.rb +25 -0
  189. data/lib/graphql/schema/member/has_directives.rb +113 -0
  190. data/lib/graphql/schema/member/has_fields.rb +163 -0
  191. data/lib/graphql/schema/member/has_interfaces.rb +88 -0
  192. data/lib/graphql/schema/member/has_path.rb +25 -0
  193. data/lib/graphql/schema/member/has_unresolved_type_error.rb +15 -0
  194. data/lib/graphql/schema/member/has_validators.rb +31 -0
  195. data/lib/graphql/schema/member/relay_shortcuts.rb +73 -0
  196. data/lib/graphql/schema/member/scoped.rb +21 -0
  197. data/lib/graphql/schema/member/type_system_helpers.rb +38 -0
  198. data/lib/graphql/schema/member/validates_input.rb +33 -0
  199. data/lib/graphql/schema/member.rb +39 -0
  200. data/lib/graphql/schema/mutation.rb +85 -0
  201. data/lib/graphql/schema/non_null.rb +67 -0
  202. data/lib/graphql/schema/null_mask.rb +11 -0
  203. data/lib/graphql/schema/object.rb +117 -0
  204. data/lib/graphql/schema/printer.rb +72 -128
  205. data/lib/graphql/schema/relay_classic_mutation.rb +179 -0
  206. data/lib/graphql/schema/resolver/has_payload_type.rb +106 -0
  207. data/lib/graphql/schema/resolver.rb +402 -0
  208. data/lib/graphql/schema/scalar.rb +68 -0
  209. data/lib/graphql/schema/subscription.rb +148 -0
  210. data/lib/graphql/schema/timeout.rb +123 -0
  211. data/lib/graphql/schema/type_expression.rb +29 -5
  212. data/lib/graphql/schema/type_membership.rb +51 -0
  213. data/lib/graphql/schema/union.rb +81 -0
  214. data/lib/graphql/schema/unique_within_type.rb +34 -0
  215. data/lib/graphql/schema/validator/allow_blank_validator.rb +29 -0
  216. data/lib/graphql/schema/validator/allow_null_validator.rb +26 -0
  217. data/lib/graphql/schema/validator/exclusion_validator.rb +33 -0
  218. data/lib/graphql/schema/validator/format_validator.rb +48 -0
  219. data/lib/graphql/schema/validator/inclusion_validator.rb +35 -0
  220. data/lib/graphql/schema/validator/length_validator.rb +59 -0
  221. data/lib/graphql/schema/validator/numericality_validator.rb +82 -0
  222. data/lib/graphql/schema/validator/required_validator.rb +82 -0
  223. data/lib/graphql/schema/validator.rb +171 -0
  224. data/lib/graphql/schema/warden.rb +413 -0
  225. data/lib/graphql/schema/wrapper.rb +24 -0
  226. data/lib/graphql/schema.rb +1179 -104
  227. data/lib/graphql/static_validation/all_rules.rb +14 -0
  228. data/lib/graphql/static_validation/base_visitor.rb +200 -0
  229. data/lib/graphql/static_validation/definition_dependencies.rb +198 -0
  230. data/lib/graphql/static_validation/error.rb +46 -0
  231. data/lib/graphql/static_validation/interpreter_visitor.rb +14 -0
  232. data/lib/graphql/static_validation/literal_validator.rb +113 -22
  233. data/lib/graphql/static_validation/rules/argument_literals_are_compatible.rb +59 -11
  234. data/lib/graphql/static_validation/rules/argument_literals_are_compatible_error.rb +48 -0
  235. data/lib/graphql/static_validation/rules/argument_names_are_unique.rb +31 -0
  236. data/lib/graphql/static_validation/rules/argument_names_are_unique_error.rb +30 -0
  237. data/lib/graphql/static_validation/rules/arguments_are_defined.rb +62 -8
  238. data/lib/graphql/static_validation/rules/arguments_are_defined_error.rb +37 -0
  239. data/lib/graphql/static_validation/rules/directives_are_defined.rb +20 -13
  240. data/lib/graphql/static_validation/rules/directives_are_defined_error.rb +29 -0
  241. data/lib/graphql/static_validation/rules/directives_are_in_valid_locations.rb +32 -26
  242. data/lib/graphql/static_validation/rules/directives_are_in_valid_locations_error.rb +31 -0
  243. data/lib/graphql/static_validation/rules/fields_are_defined_on_type.rb +21 -23
  244. data/lib/graphql/static_validation/rules/fields_are_defined_on_type_error.rb +32 -0
  245. data/lib/graphql/static_validation/rules/fields_have_appropriate_selections.rb +55 -18
  246. data/lib/graphql/static_validation/rules/fields_have_appropriate_selections_error.rb +31 -0
  247. data/lib/graphql/static_validation/rules/fields_will_merge.rb +390 -70
  248. data/lib/graphql/static_validation/rules/fields_will_merge_error.rb +53 -0
  249. data/lib/graphql/static_validation/rules/fragment_names_are_unique.rb +30 -0
  250. data/lib/graphql/static_validation/rules/fragment_names_are_unique_error.rb +29 -0
  251. data/lib/graphql/static_validation/rules/fragment_spreads_are_possible.rb +54 -37
  252. data/lib/graphql/static_validation/rules/fragment_spreads_are_possible_error.rb +35 -0
  253. data/lib/graphql/static_validation/rules/fragment_types_exist.rb +26 -16
  254. data/lib/graphql/static_validation/rules/fragment_types_exist_error.rb +29 -0
  255. data/lib/graphql/static_validation/rules/fragments_are_finite.rb +13 -19
  256. data/lib/graphql/static_validation/rules/fragments_are_finite_error.rb +29 -0
  257. data/lib/graphql/static_validation/rules/fragments_are_named.rb +16 -0
  258. data/lib/graphql/static_validation/rules/fragments_are_named_error.rb +26 -0
  259. data/lib/graphql/static_validation/rules/fragments_are_on_composite_types.rb +25 -20
  260. data/lib/graphql/static_validation/rules/fragments_are_on_composite_types_error.rb +30 -0
  261. data/lib/graphql/static_validation/rules/fragments_are_used.rb +22 -33
  262. data/lib/graphql/static_validation/rules/fragments_are_used_error.rb +29 -0
  263. data/lib/graphql/static_validation/rules/input_object_names_are_unique.rb +30 -0
  264. data/lib/graphql/static_validation/rules/input_object_names_are_unique_error.rb +30 -0
  265. data/lib/graphql/static_validation/rules/mutation_root_exists.rb +17 -0
  266. data/lib/graphql/static_validation/rules/mutation_root_exists_error.rb +26 -0
  267. data/lib/graphql/static_validation/rules/no_definitions_are_present.rb +41 -0
  268. data/lib/graphql/static_validation/rules/no_definitions_are_present_error.rb +25 -0
  269. data/lib/graphql/static_validation/rules/one_of_input_objects_are_valid.rb +66 -0
  270. data/lib/graphql/static_validation/rules/one_of_input_objects_are_valid_error.rb +29 -0
  271. data/lib/graphql/static_validation/rules/operation_names_are_valid.rb +36 -0
  272. data/lib/graphql/static_validation/rules/operation_names_are_valid_error.rb +28 -0
  273. data/lib/graphql/static_validation/rules/query_root_exists.rb +17 -0
  274. data/lib/graphql/static_validation/rules/query_root_exists_error.rb +26 -0
  275. data/lib/graphql/static_validation/rules/required_arguments_are_present.rb +22 -21
  276. data/lib/graphql/static_validation/rules/required_arguments_are_present_error.rb +35 -0
  277. data/lib/graphql/static_validation/rules/required_input_object_attributes_are_present.rb +59 -0
  278. data/lib/graphql/static_validation/rules/required_input_object_attributes_are_present_error.rb +35 -0
  279. data/lib/graphql/static_validation/rules/subscription_root_exists.rb +17 -0
  280. data/lib/graphql/static_validation/rules/subscription_root_exists_error.rb +26 -0
  281. data/lib/graphql/static_validation/rules/unique_directives_per_location.rb +56 -0
  282. data/lib/graphql/static_validation/rules/unique_directives_per_location_error.rb +29 -0
  283. data/lib/graphql/static_validation/rules/variable_default_values_are_correctly_typed.rb +36 -18
  284. data/lib/graphql/static_validation/rules/variable_default_values_are_correctly_typed_error.rb +39 -0
  285. data/lib/graphql/static_validation/rules/variable_names_are_unique.rb +24 -0
  286. data/lib/graphql/static_validation/rules/variable_names_are_unique_error.rb +29 -0
  287. data/lib/graphql/static_validation/rules/variable_usages_are_allowed.rb +103 -39
  288. data/lib/graphql/static_validation/rules/variable_usages_are_allowed_error.rb +38 -0
  289. data/lib/graphql/static_validation/rules/variables_are_input_types.rb +22 -14
  290. data/lib/graphql/static_validation/rules/variables_are_input_types_error.rb +32 -0
  291. data/lib/graphql/static_validation/rules/variables_are_used_and_defined.rb +92 -70
  292. data/lib/graphql/static_validation/rules/variables_are_used_and_defined_error.rb +37 -0
  293. data/lib/graphql/static_validation/type_stack.rb +85 -24
  294. data/lib/graphql/static_validation/validation_context.rb +25 -46
  295. data/lib/graphql/static_validation/validation_timeout_error.rb +25 -0
  296. data/lib/graphql/static_validation/validator.rb +46 -15
  297. data/lib/graphql/static_validation.rb +6 -3
  298. data/lib/graphql/string_encoding_error.rb +20 -0
  299. data/lib/graphql/subscriptions/action_cable_subscriptions.rb +247 -0
  300. data/lib/graphql/subscriptions/broadcast_analyzer.rb +81 -0
  301. data/lib/graphql/subscriptions/default_subscription_resolve_extension.rb +58 -0
  302. data/lib/graphql/subscriptions/event.rb +144 -0
  303. data/lib/graphql/subscriptions/instrumentation.rb +28 -0
  304. data/lib/graphql/subscriptions/serialize.rb +158 -0
  305. data/lib/graphql/subscriptions.rb +306 -0
  306. data/lib/graphql/tracing/active_support_notifications_tracing.rb +21 -0
  307. data/lib/graphql/tracing/appoptics_tracing.rb +173 -0
  308. data/lib/graphql/tracing/appsignal_tracing.rb +51 -0
  309. data/lib/graphql/tracing/data_dog_tracing.rb +100 -0
  310. data/lib/graphql/tracing/instrumentation_tracing.rb +83 -0
  311. data/lib/graphql/tracing/new_relic_tracing.rb +51 -0
  312. data/lib/graphql/tracing/notifications_tracing.rb +59 -0
  313. data/lib/graphql/tracing/platform_tracing.rb +122 -0
  314. data/lib/graphql/tracing/prometheus_tracing/graphql_collector.rb +32 -0
  315. data/lib/graphql/tracing/prometheus_tracing.rb +67 -0
  316. data/lib/graphql/tracing/scout_tracing.rb +54 -0
  317. data/lib/graphql/tracing/statsd_tracing.rb +42 -0
  318. data/lib/graphql/tracing.rb +94 -0
  319. data/lib/graphql/type_kinds.rb +50 -22
  320. data/lib/graphql/types/big_int.rb +23 -0
  321. data/lib/graphql/types/boolean.rb +18 -0
  322. data/lib/graphql/types/float.rb +19 -0
  323. data/lib/graphql/types/id.rb +24 -0
  324. data/lib/graphql/types/int.rb +36 -0
  325. data/lib/graphql/types/iso_8601_date.rb +45 -0
  326. data/lib/graphql/types/iso_8601_date_time.rb +76 -0
  327. data/lib/graphql/types/json.rb +25 -0
  328. data/lib/graphql/types/relay/base_connection.rb +49 -0
  329. data/lib/graphql/types/relay/base_edge.rb +29 -0
  330. data/lib/graphql/types/relay/connection_behaviors.rb +154 -0
  331. data/lib/graphql/types/relay/default_relay.rb +21 -0
  332. data/lib/graphql/types/relay/edge_behaviors.rb +64 -0
  333. data/lib/graphql/types/relay/has_node_field.rb +41 -0
  334. data/lib/graphql/types/relay/has_nodes_field.rb +41 -0
  335. data/lib/graphql/types/relay/node.rb +15 -0
  336. data/lib/graphql/types/relay/node_behaviors.rb +19 -0
  337. data/lib/graphql/types/relay/page_info.rb +11 -0
  338. data/lib/graphql/types/relay/page_info_behaviors.rb +25 -0
  339. data/lib/graphql/types/relay.rb +39 -0
  340. data/lib/graphql/types/string.rb +29 -0
  341. data/lib/graphql/types.rb +11 -0
  342. data/lib/graphql/unauthorized_error.rb +29 -0
  343. data/lib/graphql/unauthorized_field_error.rb +23 -0
  344. data/lib/graphql/unresolved_type_error.rb +35 -0
  345. data/lib/graphql/version.rb +2 -1
  346. data/lib/graphql.rb +86 -41
  347. data/readme.md +15 -101
  348. metadata +394 -279
  349. data/lib/graphql/analysis/analyze_query.rb +0 -73
  350. data/lib/graphql/analysis/max_query_complexity.rb +0 -25
  351. data/lib/graphql/analysis/max_query_depth.rb +0 -25
  352. data/lib/graphql/analysis/query_complexity.rb +0 -122
  353. data/lib/graphql/analysis/query_depth.rb +0 -54
  354. data/lib/graphql/argument.rb +0 -25
  355. data/lib/graphql/base_type.rb +0 -115
  356. data/lib/graphql/boolean_type.rb +0 -9
  357. data/lib/graphql/define/assign_argument.rb +0 -20
  358. data/lib/graphql/define/assign_enum_value.rb +0 -16
  359. data/lib/graphql/define/assign_object_field.rb +0 -21
  360. data/lib/graphql/define/assignment_dictionary.rb +0 -26
  361. data/lib/graphql/define/defined_object_proxy.rb +0 -32
  362. data/lib/graphql/define/instance_definable.rb +0 -79
  363. data/lib/graphql/define/non_null_with_bang.rb +0 -15
  364. data/lib/graphql/define/type_definer.rb +0 -30
  365. data/lib/graphql/define.rb +0 -8
  366. data/lib/graphql/directive/include_directive.rb +0 -10
  367. data/lib/graphql/directive/skip_directive.rb +0 -11
  368. data/lib/graphql/directive.rb +0 -49
  369. data/lib/graphql/enum_type.rb +0 -95
  370. data/lib/graphql/field.rb +0 -131
  371. data/lib/graphql/float_type.rb +0 -5
  372. data/lib/graphql/id_type.rb +0 -12
  373. data/lib/graphql/input_object_type.rb +0 -71
  374. data/lib/graphql/int_type.rb +0 -5
  375. data/lib/graphql/interface_type.rb +0 -38
  376. data/lib/graphql/internal_representation/node.rb +0 -81
  377. data/lib/graphql/internal_representation/rewrite.rb +0 -177
  378. data/lib/graphql/internal_representation.rb +0 -2
  379. data/lib/graphql/introspection/arguments_field.rb +0 -5
  380. data/lib/graphql/introspection/enum_values_field.rb +0 -13
  381. data/lib/graphql/introspection/fields_field.rb +0 -13
  382. data/lib/graphql/introspection/input_fields_field.rb +0 -12
  383. data/lib/graphql/introspection/interfaces_field.rb +0 -5
  384. data/lib/graphql/introspection/of_type_field.rb +0 -6
  385. data/lib/graphql/introspection/possible_types_field.rb +0 -11
  386. data/lib/graphql/introspection/schema_field.rb +0 -15
  387. data/lib/graphql/introspection/type_by_name_field.rb +0 -16
  388. data/lib/graphql/introspection/typename_field.rb +0 -15
  389. data/lib/graphql/list_type.rb +0 -46
  390. data/lib/graphql/non_null_type.rb +0 -43
  391. data/lib/graphql/object_type.rb +0 -93
  392. data/lib/graphql/query/arguments.rb +0 -76
  393. data/lib/graphql/query/directive_resolution.rb +0 -16
  394. data/lib/graphql/query/executor.rb +0 -45
  395. data/lib/graphql/query/literal_input.rb +0 -90
  396. data/lib/graphql/query/serial_execution/execution_context.rb +0 -31
  397. data/lib/graphql/query/serial_execution/field_resolution.rb +0 -82
  398. data/lib/graphql/query/serial_execution/operation_resolution.rb +0 -27
  399. data/lib/graphql/query/serial_execution/selection_resolution.rb +0 -42
  400. data/lib/graphql/query/serial_execution/value_resolution.rb +0 -107
  401. data/lib/graphql/query/serial_execution.rb +0 -41
  402. data/lib/graphql/query/type_resolver.rb +0 -25
  403. data/lib/graphql/scalar_type.rb +0 -53
  404. data/lib/graphql/schema/catchall_middleware.rb +0 -34
  405. data/lib/graphql/schema/middleware_chain.rb +0 -28
  406. data/lib/graphql/schema/possible_types.rb +0 -34
  407. data/lib/graphql/schema/reduce_types.rb +0 -68
  408. data/lib/graphql/schema/rescue_middleware.rb +0 -53
  409. data/lib/graphql/schema/timeout_middleware.rb +0 -67
  410. data/lib/graphql/schema/type_map.rb +0 -30
  411. data/lib/graphql/schema/validation.rb +0 -164
  412. data/lib/graphql/static_validation/arguments_validator.rb +0 -48
  413. data/lib/graphql/static_validation/message.rb +0 -36
  414. data/lib/graphql/string_type.rb +0 -5
  415. data/lib/graphql/union_type.rb +0 -38
  416. data/spec/graphql/analysis/analyze_query_spec.rb +0 -50
  417. data/spec/graphql/analysis/max_query_complexity_spec.rb +0 -62
  418. data/spec/graphql/analysis/max_query_depth_spec.rb +0 -100
  419. data/spec/graphql/analysis/query_complexity_spec.rb +0 -235
  420. data/spec/graphql/analysis/query_depth_spec.rb +0 -80
  421. data/spec/graphql/argument_spec.rb +0 -20
  422. data/spec/graphql/base_type_spec.rb +0 -24
  423. data/spec/graphql/boolean_type_spec.rb +0 -20
  424. data/spec/graphql/define/instance_definable_spec.rb +0 -55
  425. data/spec/graphql/directive_spec.rb +0 -77
  426. data/spec/graphql/enum_type_spec.rb +0 -31
  427. data/spec/graphql/execution_error_spec.rb +0 -61
  428. data/spec/graphql/field_spec.rb +0 -92
  429. data/spec/graphql/float_type_spec.rb +0 -15
  430. data/spec/graphql/id_type_spec.rb +0 -32
  431. data/spec/graphql/input_object_type_spec.rb +0 -162
  432. data/spec/graphql/int_type_spec.rb +0 -15
  433. data/spec/graphql/interface_type_spec.rb +0 -56
  434. data/spec/graphql/internal_representation/rewrite_spec.rb +0 -120
  435. data/spec/graphql/introspection/directive_type_spec.rb +0 -50
  436. data/spec/graphql/introspection/input_value_type_spec.rb +0 -42
  437. data/spec/graphql/introspection/introspection_query_spec.rb +0 -10
  438. data/spec/graphql/introspection/schema_type_spec.rb +0 -45
  439. data/spec/graphql/introspection/type_type_spec.rb +0 -122
  440. data/spec/graphql/language/generation_spec.rb +0 -42
  441. data/spec/graphql/language/parser_spec.rb +0 -442
  442. data/spec/graphql/language/visitor_spec.rb +0 -49
  443. data/spec/graphql/list_type_spec.rb +0 -32
  444. data/spec/graphql/non_null_type_spec.rb +0 -31
  445. data/spec/graphql/object_type_spec.rb +0 -42
  446. data/spec/graphql/query/arguments_spec.rb +0 -25
  447. data/spec/graphql/query/context_spec.rb +0 -83
  448. data/spec/graphql/query/executor_spec.rb +0 -273
  449. data/spec/graphql/query/serial_execution/execution_context_spec.rb +0 -53
  450. data/spec/graphql/query/serial_execution/value_resolution_spec.rb +0 -66
  451. data/spec/graphql/query/type_resolver_spec.rb +0 -8
  452. data/spec/graphql/query/variables_spec.rb +0 -28
  453. data/spec/graphql/query_spec.rb +0 -363
  454. data/spec/graphql/scalar_type_spec.rb +0 -61
  455. data/spec/graphql/schema/catchall_middleware_spec.rb +0 -32
  456. data/spec/graphql/schema/middleware_chain_spec.rb +0 -42
  457. data/spec/graphql/schema/printer_spec.rb +0 -190
  458. data/spec/graphql/schema/reduce_types_spec.rb +0 -102
  459. data/spec/graphql/schema/rescue_middleware_spec.rb +0 -33
  460. data/spec/graphql/schema/timeout_middleware_spec.rb +0 -180
  461. data/spec/graphql/schema/type_expression_spec.rb +0 -38
  462. data/spec/graphql/schema/validation_spec.rb +0 -219
  463. data/spec/graphql/schema_spec.rb +0 -23
  464. data/spec/graphql/static_validation/rules/argument_literals_are_compatible_spec.rb +0 -63
  465. data/spec/graphql/static_validation/rules/arguments_are_defined_spec.rb +0 -48
  466. data/spec/graphql/static_validation/rules/directives_are_defined_spec.rb +0 -34
  467. data/spec/graphql/static_validation/rules/directives_are_in_valid_locations_spec.rb +0 -39
  468. data/spec/graphql/static_validation/rules/fields_are_defined_on_type_spec.rb +0 -60
  469. data/spec/graphql/static_validation/rules/fields_have_appropriate_selections_spec.rb +0 -31
  470. data/spec/graphql/static_validation/rules/fields_will_merge_spec.rb +0 -48
  471. data/spec/graphql/static_validation/rules/fragment_spreads_are_possible_spec.rb +0 -47
  472. data/spec/graphql/static_validation/rules/fragment_types_exist_spec.rb +0 -39
  473. data/spec/graphql/static_validation/rules/fragments_are_finite_spec.rb +0 -44
  474. data/spec/graphql/static_validation/rules/fragments_are_on_composite_types_spec.rb +0 -49
  475. data/spec/graphql/static_validation/rules/fragments_are_used_spec.rb +0 -25
  476. data/spec/graphql/static_validation/rules/required_arguments_are_present_spec.rb +0 -42
  477. data/spec/graphql/static_validation/rules/variable_default_values_are_correctly_typed_spec.rb +0 -44
  478. data/spec/graphql/static_validation/rules/variable_usages_are_allowed_spec.rb +0 -63
  479. data/spec/graphql/static_validation/rules/variables_are_input_types_spec.rb +0 -37
  480. data/spec/graphql/static_validation/rules/variables_are_used_and_defined_spec.rb +0 -53
  481. data/spec/graphql/static_validation/type_stack_spec.rb +0 -37
  482. data/spec/graphql/static_validation/validator_spec.rb +0 -69
  483. data/spec/graphql/string_type_spec.rb +0 -15
  484. data/spec/graphql/union_type_spec.rb +0 -31
  485. data/spec/spec_helper.rb +0 -18
  486. data/spec/support/dairy_app.rb +0 -309
  487. data/spec/support/dairy_data.rb +0 -23
  488. data/spec/support/minimum_input_object.rb +0 -16
  489. data/spec/support/star_wars_data.rb +0 -71
  490. data/spec/support/star_wars_schema.rb +0 -76
@@ -1,102 +0,0 @@
1
- require "spec_helper"
2
-
3
- describe GraphQL::Schema::ReduceTypes do
4
- def reduce_types(types)
5
- GraphQL::Schema::ReduceTypes.reduce(types)
6
- end
7
-
8
- it "finds types from a single type and its fields" do
9
- expected = {
10
- "Cheese" => CheeseType,
11
- "Float" => GraphQL::FLOAT_TYPE,
12
- "String" => GraphQL::STRING_TYPE,
13
- "DairyAnimal" => DairyAnimalEnum,
14
- "Int" => GraphQL::INT_TYPE,
15
- "Edible" => EdibleInterface,
16
- "AnimalProduct" => AnimalProductInterface,
17
- }
18
- result = reduce_types([CheeseType])
19
- assert_equal(expected.keys, result.keys)
20
- assert_equal(expected, result.to_h)
21
- end
22
-
23
- it "finds type from arguments" do
24
- result = reduce_types([QueryType])
25
- assert_equal(DairyProductInputType, result["DairyProductInput"])
26
- end
27
-
28
- it "finds types from nested InputObjectTypes" do
29
- type_child = GraphQL::InputObjectType.define do
30
- name "InputTypeChild"
31
- input_field :someField, GraphQL::STRING_TYPE
32
- end
33
-
34
- type_parent = GraphQL::InputObjectType.define do
35
- name "InputTypeParent"
36
- input_field :child, type_child
37
- end
38
-
39
- result = reduce_types([type_parent])
40
- expected = {
41
- "InputTypeParent" => type_parent,
42
- "InputTypeChild" => type_child,
43
- "String" => GraphQL::STRING_TYPE
44
- }
45
- assert_equal(expected, result.to_h)
46
- end
47
-
48
- describe "when a type is invalid" do
49
- let(:invalid_type) {
50
- GraphQL::ObjectType.define do
51
- name "InvalidType"
52
- field :someField
53
- end
54
- }
55
-
56
- let(:another_invalid_type) {
57
- GraphQL::ObjectType.define do
58
- name "AnotherInvalidType"
59
- field :someField, String
60
- end
61
- }
62
-
63
- it "raises an InvalidTypeError when passed nil" do
64
- assert_raises(GraphQL::Schema::InvalidTypeError) { reduce_types([invalid_type]) }
65
- end
66
-
67
- it "raises an InvalidTypeError when passed an object that isnt a GraphQL::BaseType" do
68
- assert_raises(GraphQL::Schema::InvalidTypeError) { reduce_types([another_invalid_type]) }
69
- end
70
- end
71
-
72
- describe "when a schema has multiple types with the same name" do
73
- let(:type_1) {
74
- GraphQL::ObjectType.define do
75
- name "MyType"
76
- end
77
- }
78
- let(:type_2) {
79
- GraphQL::ObjectType.define do
80
- name "MyType"
81
- end
82
- }
83
- it "raises an error" do
84
- assert_raises(RuntimeError) {
85
- reduce_types([type_1, type_2])
86
- }
87
- end
88
- end
89
-
90
- describe "when getting a type which doesnt exist" do
91
- it "raises an error" do
92
- type_map = reduce_types([])
93
- assert_raises(RuntimeError) { type_map["SomeType"] }
94
- end
95
- end
96
-
97
- describe "when a field is only accessible through an interface" do
98
- it "is found through Schema.new(types:)" do
99
- assert_equal HoneyType, DummySchema.types["Honey"]
100
- end
101
- end
102
- end
@@ -1,33 +0,0 @@
1
- require "spec_helper"
2
-
3
- class SpecExampleError < StandardError; end
4
-
5
- describe GraphQL::Schema::RescueMiddleware do
6
- let(:error_middleware) { -> (next_middleware) { raise(error_class) } }
7
-
8
- let(:rescue_middleware) do
9
- middleware = GraphQL::Schema::RescueMiddleware.new
10
- middleware.rescue_from(SpecExampleError) { |err| "there was an example error: #{err.class.name}" }
11
- middleware
12
- end
13
-
14
- let(:steps) { [rescue_middleware, error_middleware] }
15
-
16
- let(:middleware_chain) { GraphQL::Schema::MiddlewareChain.new(steps: steps, arguments: [])}
17
-
18
- describe "known errors" do
19
- let(:error_class) { SpecExampleError }
20
- it "handles them as execution errors" do
21
- result = middleware_chain.call
22
- assert_equal("there was an example error: SpecExampleError", result.message)
23
- assert_equal(GraphQL::ExecutionError, result.class)
24
- end
25
- end
26
-
27
- describe "unknown errors" do
28
- let(:error_class) { RuntimeError }
29
- it "re-raises them" do
30
- assert_raises(RuntimeError) { middleware_chain.call }
31
- end
32
- end
33
- end
@@ -1,180 +0,0 @@
1
- require "spec_helper"
2
-
3
- describe GraphQL::Schema::TimeoutMiddleware do
4
- let(:max_seconds) { 2 }
5
- let(:timeout_middleware) { GraphQL::Schema::TimeoutMiddleware.new(max_seconds: 2) }
6
- let(:timeout_schema) {
7
-
8
- sleep_for_seconds_resolve = -> (obj, args, ctx) {
9
- sleep(args[:seconds])
10
- args[:seconds]
11
- }
12
-
13
- nested_sleep_type = GraphQL::ObjectType.define do
14
- name "NestedSleep"
15
- field :seconds, types.Float do
16
- resolve -> (obj, args, ctx) { obj }
17
- end
18
-
19
- field :nestedSleep, -> { nested_sleep_type } do
20
- argument :seconds, !types.Float
21
- resolve(sleep_for_seconds_resolve)
22
- end
23
- end
24
-
25
- query_type = GraphQL::ObjectType.define do
26
- name "Query"
27
- field :sleepFor, types.Float do
28
- argument :seconds, !types.Float
29
- resolve(sleep_for_seconds_resolve)
30
- end
31
-
32
- field :nestedSleep, nested_sleep_type do
33
- argument :seconds, !types.Float
34
- resolve(sleep_for_seconds_resolve)
35
- end
36
- end
37
-
38
- schema = GraphQL::Schema.new(query: query_type)
39
- schema.middleware << timeout_middleware
40
- schema
41
- }
42
-
43
- let(:result) { timeout_schema.execute(query_string) }
44
-
45
- describe "timeout part-way through" do
46
- let(:query_string) {%|
47
- {
48
- a: sleepFor(seconds: 0.7)
49
- b: sleepFor(seconds: 0.7)
50
- c: sleepFor(seconds: 0.7)
51
- d: sleepFor(seconds: 0.7)
52
- e: sleepFor(seconds: 0.7)
53
- }
54
- |}
55
- it "returns a partial response and error messages" do
56
- expected_data = {
57
- "a"=>0.7,
58
- "b"=>0.7,
59
- "c"=>0.7,
60
- "d"=>nil,
61
- "e"=>nil,
62
- }
63
-
64
- expected_errors = [
65
- {
66
- "message"=>"Timeout on Query.sleepFor",
67
- "locations"=>[{"line"=>6, "column"=>9}]
68
- },
69
- {
70
- "message"=>"Timeout on Query.sleepFor",
71
- "locations"=>[{"line"=>7, "column"=>9}]
72
- },
73
- ]
74
- assert_equal expected_data, result["data"]
75
- assert_equal expected_errors, result["errors"]
76
- end
77
- end
78
-
79
- describe "timeout in nested fields" do
80
- let(:query_string) {%|
81
- {
82
- a: nestedSleep(seconds: 1) {
83
- seconds
84
- b: nestedSleep(seconds: 0.4) {
85
- seconds
86
- c: nestedSleep(seconds: 0.4) {
87
- seconds
88
- d: nestedSleep(seconds: 0.4) {
89
- seconds
90
- e: nestedSleep(seconds: 0.4) {
91
- seconds
92
- }
93
- }
94
- }
95
- }
96
- }
97
- }
98
- |}
99
- it "returns a partial response and error messages" do
100
- expected_data = {
101
- "a" => {
102
- "seconds" => 1.0,
103
- "b" => {
104
- "seconds" => 0.4,
105
- "c" => {
106
- "seconds"=>0.4,
107
- "d" => {
108
- "seconds"=>nil,
109
- "e"=>nil
110
- }
111
- }
112
- }
113
- }
114
- }
115
- expected_errors = [
116
- {
117
- "message"=>"Timeout on NestedSleep.seconds",
118
- "locations"=>[{"line"=>10, "column"=>15}]
119
- },
120
- {
121
- "message"=>"Timeout on NestedSleep.nestedSleep",
122
- "locations"=>[{"line"=>11, "column"=>15}]
123
- },
124
- ]
125
-
126
- assert_equal expected_data, result["data"]
127
- assert_equal expected_errors, result["errors"]
128
- end
129
- end
130
-
131
- describe "long-running fields" do
132
- let(:query_string) {%|
133
- {
134
- a: sleepFor(seconds: 0.7)
135
- b: sleepFor(seconds: 0.7)
136
- c: sleepFor(seconds: 1.5)
137
- d: sleepFor(seconds: 0.1)
138
- }
139
- |}
140
- it "doesn't terminate long-running field execution" do
141
- expected_data = {
142
- "a"=>0.7,
143
- "b"=>0.7,
144
- "c"=>1.5,
145
- "d"=>nil,
146
- }
147
-
148
- expected_errors = [
149
- {
150
- "message"=>"Timeout on Query.sleepFor",
151
- "locations"=>[{"line"=>6, "column"=>9}]
152
- },
153
- ]
154
-
155
- assert_equal expected_data, result["data"]
156
- assert_equal expected_errors, result["errors"]
157
- end
158
- end
159
-
160
- describe "with a custom block" do
161
- let(:timeout_middleware) {
162
- GraphQL::Schema::TimeoutMiddleware.new(max_seconds: 2) do |err, query|
163
- raise("Query timed out after 2s: #{query.class.name}")
164
- end
165
- }
166
- let(:query_string) {%|
167
- {
168
- a: sleepFor(seconds: 0.7)
169
- b: sleepFor(seconds: 0.7)
170
- c: sleepFor(seconds: 0.7)
171
- d: sleepFor(seconds: 0.7)
172
- e: sleepFor(seconds: 0.7)
173
- }
174
- |}
175
-
176
- it "calls the block" do
177
- assert_raises(RuntimeError) { result }
178
- end
179
- end
180
- end
@@ -1,38 +0,0 @@
1
- require "spec_helper"
2
-
3
- describe GraphQL::Schema::TypeExpression do
4
- let(:schema) { DummySchema }
5
- let(:ast_node) {
6
- document = GraphQL.parse("query dostuff($var: #{type_name}) { id } ")
7
- document.definitions.first.variables.first.type
8
- }
9
- let(:type_expression_result) { GraphQL::Schema::TypeExpression.build_type(schema, ast_node) }
10
-
11
- describe "#type" do
12
- describe "simple types" do
13
- let(:type_name) { "DairyProductInput" }
14
- it "it gets types from the schema" do
15
- assert_equal(DairyProductInputType, type_expression_result)
16
- end
17
- end
18
-
19
- describe "non-null types" do
20
- let(:type_name) { "String!"}
21
- it "makes non-null types" do
22
- assert_equal(GraphQL::STRING_TYPE.to_non_null_type,type_expression_result)
23
- end
24
- end
25
-
26
- describe "list types" do
27
- let(:type_name) { "[DairyAnimal!]!" }
28
-
29
- it "makes list types" do
30
- expected = DairyAnimalEnum
31
- .to_non_null_type
32
- .to_list_type
33
- .to_non_null_type
34
- assert_equal(expected, type_expression_result)
35
- end
36
- end
37
- end
38
- end
@@ -1,219 +0,0 @@
1
- require "spec_helper"
2
-
3
- describe GraphQL::Schema::Validation do
4
- def assert_error_includes(object, error_substring)
5
- validation_error = GraphQL::Schema::Validation.validate(object)
6
- assert_includes validation_error, error_substring
7
- end
8
-
9
- describe "validating Fields" do
10
- let(:unnamed_field) {
11
- GraphQL::Field.define do
12
- type GraphQL::STRING_TYPE
13
- end
14
- }
15
-
16
- let(:untyped_field) {
17
- GraphQL::Field.define do
18
- name "Untyped"
19
- type :something_invalid
20
- end
21
- }
22
-
23
- let(:bad_arguments_field) {
24
- field = GraphQL::Field.define do
25
- name "BadArgs"
26
- type !GraphQL::BOOLEAN_TYPE
27
- end
28
- field.arguments[:bad_key] = :bad_value
29
- field
30
- }
31
-
32
- let(:invalid_argument_member_field) {
33
- GraphQL::Field.define do
34
- name "InvalidArgument"
35
- type !types[!GraphQL::INT_TYPE]
36
- argument :invalid do
37
- type GraphQL::STRING_TYPE
38
- default_value [1,2,3]
39
- end
40
- end
41
- }
42
-
43
- it "requires a String for name" do
44
- assert_error_includes unnamed_field, "must return String, not NilClass"
45
- end
46
-
47
- it "requires a BaseType for type" do
48
- assert_error_includes untyped_field, "must return GraphQL::BaseType, not Symbol"
49
- end
50
-
51
- it "requires String => Argument arguments" do
52
- assert_error_includes bad_arguments_field, "must map String => GraphQL::Argument, not Symbol => Symbol"
53
- end
54
-
55
- it "applies validation to its member Arguments" do
56
- assert_error_includes invalid_argument_member_field, "default value [1, 2, 3] is not valid for type String"
57
- end
58
- end
59
-
60
- describe "validating BaseType" do
61
- let(:unnamed_type) {
62
- GraphQL::BaseType.define do
63
- name :invalid_name
64
- end
65
- }
66
-
67
- let(:wrongly_described_type) {
68
- GraphQL::BaseType.define do
69
- name "WronglyDescribed"
70
- description 12345
71
- end
72
- }
73
- it "requires a String name" do
74
- assert_error_includes unnamed_type, "must return String, not Symbol"
75
- end
76
-
77
- it "requires String-or-nil description" do
78
- assert_error_includes wrongly_described_type, "must return String or NilClass, not Fixnum"
79
- end
80
- end
81
-
82
- describe "validating ObjectTypes" do
83
- let(:invalid_interfaces_object) {
84
- GraphQL::ObjectType.define do
85
- name "InvalidInterfaces"
86
- interfaces(55)
87
- end
88
- }
89
- let(:invalid_interface_member_object) {
90
- GraphQL::ObjectType.define do
91
- name "InvalidInterfaceMember"
92
- interfaces [:not_an_interface]
93
- end
94
- }
95
-
96
- let(:invalid_field_object) {
97
- GraphQL::ObjectType.define do
98
- name "InvalidField"
99
- field :invalid, :nonsense
100
- end
101
- }
102
-
103
- it "requires an Array for interfaces" do
104
- assert_error_includes invalid_interfaces_object, "must be an Array of GraphQL::InterfaceType, not a Fixnum"
105
- assert_error_includes invalid_interface_member_object, "must contain GraphQL::InterfaceType, not Symbol"
106
- end
107
-
108
- it "validates the fields" do
109
- assert_error_includes invalid_field_object, "must return GraphQL::BaseType, not Symbol"
110
- end
111
- end
112
-
113
- describe "validating UnionTypes" do
114
- let(:non_array_union) {
115
- GraphQL::UnionType.define do
116
- name "NonArray"
117
- possible_types 55
118
- end
119
- }
120
-
121
- let(:non_object_type_union) {
122
- GraphQL::UnionType.define do
123
- name "NonObjectTypes"
124
- possible_types [
125
- GraphQL::InterfaceType.new
126
- ]
127
- end
128
- }
129
-
130
- let(:no_possible_types_union) {
131
- GraphQL::UnionType.define do
132
- name "NoPossibleTypes"
133
- possible_types []
134
- end
135
- }
136
-
137
- it "requires an array of ObjectTypes for possible_types" do
138
- assert_error_includes non_array_union, "must be an Array of GraphQL::ObjectType, not a Fixnum"
139
-
140
- assert_error_includes non_object_type_union, "must contain GraphQL::ObjectType, not GraphQL::InterfaceType"
141
- end
142
-
143
- it "requires at least one possible_types" do
144
- assert_error_includes no_possible_types_union, "must have at least one possible type"
145
- end
146
- end
147
-
148
- describe "validating InputObjectTypes" do
149
- let(:invalid_arguments_input) {
150
- input = GraphQL::InputObjectType.define do
151
- name "InvalidArgumentsHash"
152
- end
153
- input.arguments[123] = :nonsense
154
- input
155
- }
156
-
157
- let(:invalid_argument_member_input) {
158
- GraphQL::InputObjectType.define do
159
- name "InvalidArgumentMember"
160
- argument :nonsense do
161
- type GraphQL::FLOAT_TYPE
162
- default_value "xyz"
163
- end
164
- end
165
- }
166
-
167
- it "requires {String => Argument} arguments" do
168
- assert_error_includes invalid_arguments_input, "map String => GraphQL::Argument, not Fixnum => Symbol"
169
- end
170
-
171
- it "applies validation to its member Arguments" do
172
- assert_error_includes invalid_argument_member_input, "default value \"xyz\" is not valid for type Float"
173
- end
174
- end
175
-
176
- describe "validating InterfaceTypes" do
177
- let(:invalid_field_interface) {
178
- GraphQL::InterfaceType.define do
179
- name "InvalidField"
180
- field :invalid do
181
- type GraphQL::BOOLEAN_TYPE
182
- argument :invalid do
183
- type GraphQL::STRING_TYPE
184
- default_value 4.56
185
- end
186
- end
187
- end
188
- }
189
-
190
- it "validates fields" do
191
- assert_error_includes invalid_field_interface, "default value 4.56 is not valid for type String"
192
- end
193
- end
194
-
195
- describe "validating Arguments" do
196
- let(:untyped_argument) {
197
- GraphQL::Argument.define do
198
- name "Untyped"
199
- type :Bogus
200
- end
201
- }
202
-
203
- let(:invalid_default_argument) {
204
- GraphQL::Argument.define do
205
- name "InvalidDefault"
206
- type GraphQL::INT_TYPE
207
- default_value "abc"
208
- end
209
- }
210
-
211
- it "requires the type is a Base type" do
212
- assert_error_includes untyped_argument, "must be a valid input type (Scalar or InputObject), not Symbol"
213
- end
214
-
215
- it "requires the default value is compatible" do
216
- assert_error_includes invalid_default_argument, 'default value "abc" is not valid for type Int'
217
- end
218
- end
219
- end
@@ -1,23 +0,0 @@
1
- require "spec_helper"
2
-
3
- describe GraphQL::Schema do
4
- let(:schema) { DummySchema }
5
-
6
- describe "#rescue_from" do
7
- let(:rescue_middleware) { schema.middleware.first }
8
-
9
- it "adds handlers to the rescue middleware" do
10
- assert_equal(1, rescue_middleware.rescue_table.length)
11
- # normally, you'd use a real class, not a symbol:
12
- schema.rescue_from(:error_class) { "my custom message" }
13
- assert_equal(2, rescue_middleware.rescue_table.length)
14
- end
15
- end
16
-
17
- describe "#subscription" do
18
- it "calls fields on the subscription type" do
19
- res = schema.execute("subscription { test }")
20
- assert_equal("Test", res["data"]["test"])
21
- end
22
- end
23
- end
@@ -1,63 +0,0 @@
1
- require "spec_helper"
2
-
3
- describe GraphQL::StaticValidation::ArgumentLiteralsAreCompatible do
4
- let(:query_string) {%|
5
- query getCheese {
6
- cheese(id: "aasdlkfj") { source }
7
- cheese(id: 1) { source @skip(if: {id: 1})}
8
- yakSource: searchDairy(product: [{source: COW, fatContent: 1.1}]) { source }
9
- badSource: searchDairy(product: [{source: 1.1}]) { source }
10
- missingSource: searchDairy(product: [{fatContent: 1.1}]) { source }
11
- listCoerce: cheese(id: 1) { similarCheese(source: YAK) }
12
- missingInputField: searchDairy(product: [{source: YAK, wacky: 1}])
13
- }
14
-
15
- fragment cheeseFields on Cheese {
16
- similarCheese(source: 4.5)
17
- }
18
- |}
19
-
20
- let(:validator) { GraphQL::StaticValidation::Validator.new(schema: DummySchema, rules: [GraphQL::StaticValidation::ArgumentLiteralsAreCompatible]) }
21
- let(:query) { GraphQL::Query.new(DummySchema, query_string) }
22
- let(:errors) { validator.validate(query)[:errors] }
23
-
24
- it "finds undefined or missing-required arguments to fields and directives" do
25
- assert_equal(6, errors.length)
26
-
27
- query_root_error = {
28
- "message"=>"Argument 'id' on Field 'cheese' has an invalid value",
29
- "locations"=>[{"line"=>3, "column"=>7}]
30
- }
31
- assert_includes(errors, query_root_error)
32
-
33
- directive_error = {
34
- "message"=>"Argument 'if' on Directive 'skip' has an invalid value",
35
- "locations"=>[{"line"=>4, "column"=>30}]
36
- }
37
- assert_includes(errors, directive_error)
38
-
39
- input_object_error = {
40
- "message"=>"Argument 'product' on Field 'badSource' has an invalid value",
41
- "locations"=>[{"line"=>6, "column"=>7}]
42
- }
43
- assert_includes(errors, input_object_error)
44
-
45
- input_object_field_error = {
46
- "message"=>"Argument 'source' on InputObject 'DairyProductInput' has an invalid value",
47
- "locations"=>[{"line"=>6, "column"=>40}]
48
- }
49
- assert_includes(errors, input_object_field_error)
50
-
51
- missing_required_field_error = {
52
- "message"=>"Argument 'product' on Field 'missingSource' has an invalid value",
53
- "locations"=>[{"line"=>7, "column"=>7}]
54
- }
55
- assert_includes(errors, missing_required_field_error)
56
-
57
- fragment_error = {
58
- "message"=>"Argument 'source' on Field 'similarCheese' has an invalid value",
59
- "locations"=>[{"line"=>13, "column"=>7}]
60
- }
61
- assert_includes(errors, fragment_error)
62
- end
63
- end