graphql 1.8.7 → 1.9.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 (368) hide show
  1. checksums.yaml +4 -4
  2. data/lib/generators/graphql/install_generator.rb +2 -1
  3. data/lib/generators/graphql/scalar_generator.rb +20 -0
  4. data/lib/generators/graphql/templates/base_scalar.erb +4 -0
  5. data/lib/generators/graphql/templates/scalar.erb +13 -0
  6. data/lib/graphql/analysis/ast/analyzer.rb +62 -0
  7. data/lib/graphql/analysis/ast/field_usage.rb +28 -0
  8. data/lib/graphql/analysis/ast/max_query_complexity.rb +23 -0
  9. data/lib/graphql/analysis/ast/max_query_depth.rb +18 -0
  10. data/lib/graphql/analysis/ast/query_complexity.rb +114 -0
  11. data/lib/graphql/analysis/ast/query_depth.rb +66 -0
  12. data/lib/graphql/analysis/ast/visitor.rb +255 -0
  13. data/lib/graphql/analysis/ast.rb +82 -0
  14. data/lib/graphql/analysis.rb +1 -0
  15. data/lib/graphql/argument.rb +5 -0
  16. data/lib/graphql/authorization.rb +1 -0
  17. data/lib/graphql/backwards_compatibility.rb +1 -1
  18. data/lib/graphql/base_type.rb +1 -1
  19. data/lib/graphql/compatibility/execution_specification/specification_schema.rb +1 -2
  20. data/lib/graphql/compatibility/schema_parser_specification.rb +2 -6
  21. data/lib/graphql/dig.rb +19 -0
  22. data/lib/graphql/directive/include_directive.rb +1 -7
  23. data/lib/graphql/directive/skip_directive.rb +1 -8
  24. data/lib/graphql/directive.rb +13 -1
  25. data/lib/graphql/enum_type.rb +8 -0
  26. data/lib/graphql/execution/execute.rb +36 -17
  27. data/lib/graphql/execution/instrumentation.rb +2 -0
  28. data/lib/graphql/execution/interpreter/execution_errors.rb +29 -0
  29. data/lib/graphql/execution/interpreter/hash_response.rb +46 -0
  30. data/lib/graphql/execution/interpreter/resolve.rb +58 -0
  31. data/lib/graphql/execution/interpreter/runtime.rb +597 -0
  32. data/lib/graphql/execution/interpreter.rb +99 -0
  33. data/lib/graphql/execution/lazy.rb +8 -1
  34. data/lib/graphql/execution/lookahead.rb +351 -0
  35. data/lib/graphql/execution/multiplex.rb +37 -29
  36. data/lib/graphql/execution.rb +2 -0
  37. data/lib/graphql/execution_error.rb +1 -1
  38. data/lib/graphql/field.rb +1 -7
  39. data/lib/graphql/integer_encoding_error.rb +12 -0
  40. data/lib/graphql/internal_representation/rewrite.rb +127 -142
  41. data/lib/graphql/introspection/dynamic_fields.rb +8 -2
  42. data/lib/graphql/introspection/entry_points.rb +11 -6
  43. data/lib/graphql/introspection/enum_value_type.rb +4 -0
  44. data/lib/graphql/introspection/schema_type.rb +7 -2
  45. data/lib/graphql/introspection/type_type.rb +9 -5
  46. data/lib/graphql/invalid_null_error.rb +1 -1
  47. data/lib/graphql/language/block_string.rb +37 -0
  48. data/lib/graphql/language/document_from_schema_definition.rb +10 -7
  49. data/lib/graphql/language/lexer.rb +55 -36
  50. data/lib/graphql/language/lexer.rl +8 -3
  51. data/lib/graphql/language/nodes.rb +440 -362
  52. data/lib/graphql/language/parser.rb +56 -56
  53. data/lib/graphql/language/parser.y +12 -12
  54. data/lib/graphql/language/printer.rb +2 -2
  55. data/lib/graphql/language/visitor.rb +158 -15
  56. data/lib/graphql/language.rb +0 -1
  57. data/lib/graphql/literal_validation_error.rb +6 -0
  58. data/lib/graphql/query/arguments.rb +3 -2
  59. data/lib/graphql/query/arguments_cache.rb +1 -1
  60. data/lib/graphql/query/context.rb +14 -5
  61. data/lib/graphql/query/executor.rb +1 -1
  62. data/lib/graphql/query/result.rb +1 -1
  63. data/lib/graphql/query/validation_pipeline.rb +35 -11
  64. data/lib/graphql/query/variable_validation_error.rb +10 -1
  65. data/lib/graphql/query.rb +16 -2
  66. data/lib/graphql/relay/base_connection.rb +2 -0
  67. data/lib/graphql/relay/connection_instrumentation.rb +3 -1
  68. data/lib/graphql/relay/connection_resolve.rb +1 -1
  69. data/lib/graphql/relay/node.rb +2 -28
  70. data/lib/graphql/relay/relation_connection.rb +1 -1
  71. data/lib/graphql/schema/argument.rb +13 -5
  72. data/lib/graphql/schema/base_64_encoder.rb +4 -4
  73. data/lib/graphql/schema/build_from_definition.rb +2 -4
  74. data/lib/graphql/schema/default_type_error.rb +1 -1
  75. data/lib/graphql/schema/directive/feature.rb +66 -0
  76. data/lib/graphql/schema/directive/include.rb +25 -0
  77. data/lib/graphql/schema/directive/skip.rb +25 -0
  78. data/lib/graphql/schema/directive/transform.rb +48 -0
  79. data/lib/graphql/schema/directive.rb +103 -0
  80. data/lib/graphql/schema/enum_value.rb +3 -2
  81. data/lib/graphql/schema/field/connection_extension.rb +50 -0
  82. data/lib/graphql/schema/field/scope_extension.rb +18 -0
  83. data/lib/graphql/schema/field.rb +273 -64
  84. data/lib/graphql/schema/field_extension.rb +69 -0
  85. data/lib/graphql/schema/input_object.rb +16 -8
  86. data/lib/graphql/schema/interface.rb +1 -0
  87. data/lib/graphql/schema/loader.rb +22 -16
  88. data/lib/graphql/schema/member/base_dsl_methods.rb +8 -2
  89. data/lib/graphql/schema/member/build_type.rb +33 -1
  90. data/lib/graphql/schema/member/has_arguments.rb +6 -2
  91. data/lib/graphql/schema/member/has_fields.rb +18 -70
  92. data/lib/graphql/schema/member/has_path.rb +25 -0
  93. data/lib/graphql/schema/member/instrumentation.rb +10 -7
  94. data/lib/graphql/schema/member.rb +2 -0
  95. data/lib/graphql/schema/mutation.rb +6 -48
  96. data/lib/graphql/schema/non_null.rb +5 -1
  97. data/lib/graphql/schema/object.rb +18 -4
  98. data/lib/graphql/schema/printer.rb +1 -1
  99. data/lib/graphql/schema/relay_classic_mutation.rb +42 -9
  100. data/lib/graphql/schema/resolver/has_payload_type.rb +65 -0
  101. data/lib/graphql/schema/resolver.rb +45 -20
  102. data/lib/graphql/schema/subscription.rb +97 -0
  103. data/lib/graphql/schema/traversal.rb +11 -7
  104. data/lib/graphql/schema.rb +186 -38
  105. data/lib/graphql/static_validation/all_rules.rb +3 -2
  106. data/lib/graphql/static_validation/base_visitor.rb +199 -0
  107. data/lib/graphql/static_validation/default_visitor.rb +15 -0
  108. data/lib/graphql/static_validation/definition_dependencies.rb +62 -68
  109. data/lib/graphql/static_validation/{message.rb → error.rb} +11 -11
  110. data/lib/graphql/static_validation/interpreter_visitor.rb +14 -0
  111. data/lib/graphql/static_validation/literal_validator.rb +54 -11
  112. data/lib/graphql/static_validation/no_validate_visitor.rb +10 -0
  113. data/lib/graphql/static_validation/rules/argument_literals_are_compatible.rb +87 -16
  114. data/lib/graphql/static_validation/rules/argument_literals_are_compatible_error.rb +31 -0
  115. data/lib/graphql/static_validation/rules/argument_names_are_unique.rb +11 -11
  116. data/lib/graphql/static_validation/rules/argument_names_are_unique_error.rb +30 -0
  117. data/lib/graphql/static_validation/rules/arguments_are_defined.rb +52 -8
  118. data/lib/graphql/static_validation/rules/arguments_are_defined_error.rb +35 -0
  119. data/lib/graphql/static_validation/rules/directives_are_defined.rb +12 -15
  120. data/lib/graphql/static_validation/rules/directives_are_defined_error.rb +29 -0
  121. data/lib/graphql/static_validation/rules/directives_are_in_valid_locations.rb +19 -14
  122. data/lib/graphql/static_validation/rules/directives_are_in_valid_locations_error.rb +31 -0
  123. data/lib/graphql/static_validation/rules/fields_are_defined_on_type.rb +17 -19
  124. data/lib/graphql/static_validation/rules/fields_are_defined_on_type_error.rb +32 -0
  125. data/lib/graphql/static_validation/rules/fields_have_appropriate_selections.rb +30 -14
  126. data/lib/graphql/static_validation/rules/fields_have_appropriate_selections_error.rb +31 -0
  127. data/lib/graphql/static_validation/rules/fields_will_merge.rb +356 -29
  128. data/lib/graphql/static_validation/rules/fields_will_merge_error.rb +32 -0
  129. data/lib/graphql/static_validation/rules/fragment_names_are_unique.rb +20 -13
  130. data/lib/graphql/static_validation/rules/fragment_names_are_unique_error.rb +29 -0
  131. data/lib/graphql/static_validation/rules/fragment_spreads_are_possible.rb +37 -29
  132. data/lib/graphql/static_validation/rules/fragment_spreads_are_possible_error.rb +35 -0
  133. data/lib/graphql/static_validation/rules/fragment_types_exist.rb +25 -17
  134. data/lib/graphql/static_validation/rules/fragment_types_exist_error.rb +29 -0
  135. data/lib/graphql/static_validation/rules/fragments_are_finite.rb +12 -10
  136. data/lib/graphql/static_validation/rules/fragments_are_finite_error.rb +29 -0
  137. data/lib/graphql/static_validation/rules/fragments_are_named.rb +7 -11
  138. data/lib/graphql/static_validation/rules/fragments_are_named_error.rb +26 -0
  139. data/lib/graphql/static_validation/rules/fragments_are_on_composite_types.rb +16 -16
  140. data/lib/graphql/static_validation/rules/fragments_are_on_composite_types_error.rb +30 -0
  141. data/lib/graphql/static_validation/rules/fragments_are_used.rb +21 -14
  142. data/lib/graphql/static_validation/rules/fragments_are_used_error.rb +29 -0
  143. data/lib/graphql/static_validation/rules/mutation_root_exists.rb +10 -14
  144. data/lib/graphql/static_validation/rules/mutation_root_exists_error.rb +26 -0
  145. data/lib/graphql/static_validation/rules/no_definitions_are_present.rb +30 -30
  146. data/lib/graphql/static_validation/rules/no_definitions_are_present_error.rb +25 -0
  147. data/lib/graphql/static_validation/rules/operation_names_are_valid.rb +25 -17
  148. data/lib/graphql/static_validation/rules/operation_names_are_valid_error.rb +28 -0
  149. data/lib/graphql/static_validation/rules/required_arguments_are_present.rb +17 -18
  150. data/lib/graphql/static_validation/rules/required_arguments_are_present_error.rb +35 -0
  151. data/lib/graphql/static_validation/rules/required_input_object_attributes_are_present.rb +47 -0
  152. data/lib/graphql/static_validation/rules/required_input_object_attributes_are_present_error.rb +35 -0
  153. data/lib/graphql/static_validation/rules/subscription_root_exists.rb +10 -14
  154. data/lib/graphql/static_validation/rules/subscription_root_exists_error.rb +26 -0
  155. data/lib/graphql/static_validation/rules/unique_directives_per_location.rb +28 -17
  156. data/lib/graphql/static_validation/rules/unique_directives_per_location_error.rb +29 -0
  157. data/lib/graphql/static_validation/rules/variable_default_values_are_correctly_typed.rb +35 -27
  158. data/lib/graphql/static_validation/rules/variable_default_values_are_correctly_typed_error.rb +39 -0
  159. data/lib/graphql/static_validation/rules/variable_names_are_unique.rb +15 -14
  160. data/lib/graphql/static_validation/rules/variable_names_are_unique_error.rb +29 -0
  161. data/lib/graphql/static_validation/rules/variable_usages_are_allowed.rb +41 -30
  162. data/lib/graphql/static_validation/rules/variable_usages_are_allowed_error.rb +38 -0
  163. data/lib/graphql/static_validation/rules/variables_are_input_types.rb +18 -14
  164. data/lib/graphql/static_validation/rules/variables_are_input_types_error.rb +32 -0
  165. data/lib/graphql/static_validation/rules/variables_are_used_and_defined.rb +73 -65
  166. data/lib/graphql/static_validation/rules/variables_are_used_and_defined_error.rb +37 -0
  167. data/lib/graphql/static_validation/validation_context.rb +8 -51
  168. data/lib/graphql/static_validation/validator.rb +23 -15
  169. data/lib/graphql/static_validation.rb +5 -3
  170. data/lib/graphql/subscriptions/action_cable_subscriptions.rb +21 -2
  171. data/lib/graphql/subscriptions/event.rb +28 -5
  172. data/lib/graphql/subscriptions/subscription_root.rb +66 -0
  173. data/lib/graphql/subscriptions.rb +16 -2
  174. data/lib/graphql/tracing/active_support_notifications_tracing.rb +0 -1
  175. data/lib/graphql/tracing/appsignal_tracing.rb +1 -1
  176. data/lib/graphql/tracing/data_dog_tracing.rb +1 -1
  177. data/lib/graphql/tracing/new_relic_tracing.rb +3 -3
  178. data/lib/graphql/tracing/platform_tracing.rb +17 -1
  179. data/lib/graphql/tracing/prometheus_tracing.rb +1 -1
  180. data/lib/graphql/tracing/scout_tracing.rb +1 -1
  181. data/lib/graphql/tracing/skylight_tracing.rb +3 -3
  182. data/lib/graphql/tracing.rb +8 -8
  183. data/lib/graphql/types/float.rb +1 -1
  184. data/lib/graphql/types/int.rb +11 -2
  185. data/lib/graphql/types/iso_8601_date_time.rb +15 -1
  186. data/lib/graphql/types/relay/base_connection.rb +15 -1
  187. data/lib/graphql/types/relay/node.rb +0 -1
  188. data/lib/graphql/types/relay/node_field.rb +43 -0
  189. data/lib/graphql/types/relay/nodes_field.rb +45 -0
  190. data/lib/graphql/types/relay.rb +2 -0
  191. data/lib/graphql/unauthorized_error.rb +4 -0
  192. data/lib/graphql/unauthorized_field_error.rb +23 -0
  193. data/lib/graphql/upgrader/member.rb +5 -0
  194. data/lib/graphql/version.rb +1 -1
  195. data/lib/graphql.rb +6 -1
  196. data/readme.md +7 -7
  197. data/spec/dummy/Gemfile +1 -1
  198. data/spec/dummy/Gemfile.lock +157 -0
  199. data/spec/dummy/app/channels/graphql_channel.rb +22 -11
  200. data/spec/dummy/config/locales/en.yml +1 -1
  201. data/spec/dummy/log/test.log +199 -0
  202. data/spec/dummy/test/test_helper.rb +1 -0
  203. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/4w/4wzXRZrAkwKdgYaSE0pid5eB-fer8vSfSku_NPg4rMA.cache +0 -0
  204. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/7I/7IHVBiJT06QSpgLpLoJIxboQ0B-D_tMTxsvoezBTV3Q.cache +1 -0
  205. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/8w/8wY_SKagj8wHuwGNAAf6JnQ8joMbC6cEYpHrTAI8Urc.cache +1 -0
  206. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/AK/AKzz1u6bGb4auXcrObA_g5LL-oV0ejNGa448AgAi_WQ.cache +1 -0
  207. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/ET/ETW4uxvaYpruL8y6_ZptUH82ZowMaHIqvg5WexBFdEM.cache +3 -0
  208. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/F1/F1TWpjjyA56k9Z90n5B3xRn7DUdGjX73QCkYC6k07JQ.cache +0 -0
  209. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/F8/F8MUNRzORGFgr329fNM0xLaoWCXdv3BIalT7dsvLfjs.cache +2 -0
  210. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/KB/KB07ZaKNC5uXJ7TjLi-WqnY6g7dq8wWp_8N3HNjBNxg.cache +2 -0
  211. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Ms/MsKSimH_UCB-H1tLvDABDHuvGciuoW6kVqQWDrXU5FQ.cache +0 -0
  212. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Mt/Mtci-Kim50aPOmeClD4AIicKn1d1WJ0n454IjSd94sk.cache +0 -0
  213. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/QH/QHt3Tc1Y6M66Oo_pDuMyWrQNs4Pp3SMeZR5K1wJj2Ts.cache +1 -0
  214. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/XU/XU4k1OXnfMils5SrirorPvDSyDSqiOWLZNtmAH1HH8k.cache +0 -0
  215. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/ZI/ZIof7mZxWWCnraIFOCuV6a8QRWzKJXJnx2Xd7C0ZyX0.cache +1 -0
  216. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/cG/cGc_puuPS5pZKgUcy1Y_i1L6jl5UtsiIrMH59rTzR6c.cache +3 -0
  217. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/df/dfro_B6bx3KP1Go-7jEOqqZ2j4hVRseXIc3es9PKQno.cache +1 -0
  218. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/jO/jO1DfbqnG0mTULsjJJANc3fefrG2zt7DIMmcptMT628.cache +1 -0
  219. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/pE/pE7gO6pQ-z187Swb4hT554wmqsq-cNzgPWLrCz-LQQQ.cache +0 -0
  220. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/r9/r9iU1l58a6rxkZSW5RSC52_tD-_UQuHxoMVnkfJ7Mhs.cache +1 -0
  221. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/xi/xitPPFfPIyDMpaznV0sBBcw8eSCV8PJcLLWin78sCgE.cache +0 -0
  222. data/spec/dummy/tmp/screenshots/failures_test_it_handles_subscriptions.png +0 -0
  223. data/spec/graphql/analysis/analyze_query_spec.rb +1 -1
  224. data/spec/graphql/analysis/ast/field_usage_spec.rb +51 -0
  225. data/spec/graphql/analysis/ast/max_query_complexity_spec.rb +120 -0
  226. data/spec/graphql/analysis/ast/max_query_depth_spec.rb +114 -0
  227. data/spec/graphql/analysis/ast/query_complexity_spec.rb +299 -0
  228. data/spec/graphql/analysis/ast/query_depth_spec.rb +108 -0
  229. data/spec/graphql/analysis/ast_spec.rb +269 -0
  230. data/spec/graphql/authorization_spec.rb +120 -23
  231. data/spec/graphql/base_type_spec.rb +6 -4
  232. data/spec/graphql/enum_type_spec.rb +6 -1
  233. data/spec/graphql/execution/execute_spec.rb +9 -9
  234. data/spec/graphql/execution/instrumentation_spec.rb +19 -0
  235. data/spec/graphql/execution/interpreter_spec.rb +485 -0
  236. data/spec/graphql/execution/lazy_spec.rb +67 -1
  237. data/spec/graphql/execution/lookahead_spec.rb +363 -0
  238. data/spec/graphql/execution/multiplex_spec.rb +31 -3
  239. data/spec/graphql/execution/typecast_spec.rb +20 -20
  240. data/spec/graphql/execution_error_spec.rb +110 -96
  241. data/spec/graphql/field_spec.rb +1 -1
  242. data/spec/graphql/input_object_type_spec.rb +13 -352
  243. data/spec/graphql/int_type_spec.rb +19 -0
  244. data/spec/graphql/interface_type_spec.rb +4 -4
  245. data/spec/graphql/internal_representation/rewrite_spec.rb +2 -0
  246. data/spec/graphql/introspection/input_value_type_spec.rb +1 -1
  247. data/spec/graphql/introspection/type_type_spec.rb +1 -2
  248. data/spec/graphql/language/document_from_schema_definition_spec.rb +2 -2
  249. data/spec/graphql/language/lexer_spec.rb +72 -3
  250. data/spec/graphql/language/nodes_spec.rb +20 -0
  251. data/spec/graphql/language/printer_spec.rb +18 -6
  252. data/spec/graphql/language/visitor_spec.rb +320 -14
  253. data/spec/graphql/non_null_type_spec.rb +1 -1
  254. data/spec/graphql/object_type_spec.rb +32 -27
  255. data/spec/graphql/query/arguments_spec.rb +21 -0
  256. data/spec/graphql/query/context_spec.rb +28 -0
  257. data/spec/graphql/query/executor_spec.rb +40 -36
  258. data/spec/graphql/query_spec.rb +12 -6
  259. data/spec/graphql/schema/argument_spec.rb +35 -1
  260. data/spec/graphql/schema/build_from_definition_spec.rb +144 -29
  261. data/spec/graphql/schema/catchall_middleware_spec.rb +16 -15
  262. data/spec/graphql/schema/directive/feature_spec.rb +81 -0
  263. data/spec/graphql/schema/directive/transform_spec.rb +39 -0
  264. data/spec/graphql/schema/enum_spec.rb +12 -3
  265. data/spec/graphql/schema/enum_value_spec.rb +11 -0
  266. data/spec/graphql/schema/field_extension_spec.rb +115 -0
  267. data/spec/graphql/schema/field_spec.rb +47 -7
  268. data/spec/graphql/schema/input_object_spec.rb +95 -0
  269. data/spec/graphql/schema/instrumentation_spec.rb +3 -0
  270. data/spec/graphql/schema/interface_spec.rb +8 -2
  271. data/spec/graphql/schema/introspection_system_spec.rb +9 -1
  272. data/spec/graphql/schema/loader_spec.rb +5 -0
  273. data/spec/graphql/schema/member/accepts_definition_spec.rb +4 -0
  274. data/spec/graphql/schema/member/build_type_spec.rb +46 -0
  275. data/spec/graphql/schema/member/scoped_spec.rb +19 -3
  276. data/spec/graphql/schema/mutation_spec.rb +5 -3
  277. data/spec/graphql/schema/object_spec.rb +9 -1
  278. data/spec/graphql/schema/printer_spec.rb +255 -93
  279. data/spec/graphql/schema/relay_classic_mutation_spec.rb +133 -0
  280. data/spec/graphql/schema/resolver_spec.rb +173 -9
  281. data/spec/graphql/schema/scalar_spec.rb +6 -0
  282. data/spec/graphql/schema/subscription_spec.rb +416 -0
  283. data/spec/graphql/schema/traversal_spec.rb +10 -10
  284. data/spec/graphql/schema/type_expression_spec.rb +2 -2
  285. data/spec/graphql/schema/union_spec.rb +7 -0
  286. data/spec/graphql/schema/validation_spec.rb +1 -1
  287. data/spec/graphql/schema/warden_spec.rb +145 -88
  288. data/spec/graphql/static_validation/rules/argument_literals_are_compatible_spec.rb +213 -73
  289. data/spec/graphql/static_validation/rules/argument_names_are_unique_spec.rb +2 -2
  290. data/spec/graphql/static_validation/rules/arguments_are_defined_spec.rb +72 -29
  291. data/spec/graphql/static_validation/rules/directives_are_defined_spec.rb +4 -2
  292. data/spec/graphql/static_validation/rules/directives_are_in_valid_locations_spec.rb +4 -2
  293. data/spec/graphql/static_validation/rules/fields_are_defined_on_type_spec.rb +10 -5
  294. data/spec/graphql/static_validation/rules/fields_have_appropriate_selections_spec.rb +10 -5
  295. data/spec/graphql/static_validation/rules/fields_will_merge_spec.rb +131 -5
  296. data/spec/graphql/static_validation/rules/fragment_names_are_unique_spec.rb +2 -1
  297. data/spec/graphql/static_validation/rules/fragment_spreads_are_possible_spec.rb +6 -3
  298. data/spec/graphql/static_validation/rules/fragment_types_exist_spec.rb +4 -2
  299. data/spec/graphql/static_validation/rules/fragments_are_finite_spec.rb +4 -2
  300. data/spec/graphql/static_validation/rules/fragments_are_named_spec.rb +2 -1
  301. data/spec/graphql/static_validation/rules/fragments_are_on_composite_types_spec.rb +6 -3
  302. data/spec/graphql/static_validation/rules/fragments_are_used_spec.rb +22 -2
  303. data/spec/graphql/static_validation/rules/mutation_root_exists_spec.rb +2 -1
  304. data/spec/graphql/static_validation/rules/operation_names_are_valid_spec.rb +6 -3
  305. data/spec/graphql/static_validation/rules/required_arguments_are_present_spec.rb +13 -4
  306. data/spec/graphql/static_validation/rules/required_input_object_attributes_are_present_spec.rb +58 -0
  307. data/spec/graphql/static_validation/rules/subscription_root_exists_spec.rb +2 -1
  308. data/spec/graphql/static_validation/rules/unique_directives_per_location_spec.rb +14 -7
  309. data/spec/graphql/static_validation/rules/variable_default_values_are_correctly_typed_spec.rb +14 -7
  310. data/spec/graphql/static_validation/rules/variable_usages_are_allowed_spec.rb +8 -4
  311. data/spec/graphql/static_validation/rules/variables_are_input_types_spec.rb +8 -4
  312. data/spec/graphql/static_validation/rules/variables_are_used_and_defined_spec.rb +23 -3
  313. data/spec/graphql/static_validation/type_stack_spec.rb +10 -19
  314. data/spec/graphql/static_validation/validator_spec.rb +50 -2
  315. data/spec/graphql/subscriptions_spec.rb +27 -16
  316. data/spec/graphql/tracing/new_relic_tracing_spec.rb +16 -0
  317. data/spec/graphql/tracing/platform_tracing_spec.rb +59 -37
  318. data/spec/graphql/tracing/prometheus_tracing_spec.rb +3 -0
  319. data/spec/graphql/tracing/skylight_tracing_spec.rb +16 -0
  320. data/spec/graphql/types/iso_8601_date_time_spec.rb +29 -2
  321. data/spec/graphql/union_type_spec.rb +2 -2
  322. data/spec/graphql/upgrader/member_spec.rb +67 -0
  323. data/spec/{graphql → integration/mongoid/graphql}/relay/mongo_relation_connection_spec.rb +11 -22
  324. data/spec/integration/mongoid/spec_helper.rb +2 -0
  325. data/spec/{support → integration/mongoid}/star_trek/data.rb +0 -0
  326. data/spec/{support → integration/mongoid}/star_trek/schema.rb +56 -34
  327. data/spec/{support/star_wars → integration/rails}/data.rb +1 -0
  328. data/spec/{support → integration/rails/generators}/base_generator_test.rb +0 -0
  329. data/spec/{generators → integration/rails/generators}/graphql/enum_generator_spec.rb +0 -0
  330. data/spec/{generators → integration/rails/generators}/graphql/install_generator_spec.rb +1 -1
  331. data/spec/{generators → integration/rails/generators}/graphql/interface_generator_spec.rb +0 -0
  332. data/spec/{generators → integration/rails/generators}/graphql/loader_generator_spec.rb +0 -0
  333. data/spec/{generators → integration/rails/generators}/graphql/mutation_generator_spec.rb +0 -0
  334. data/spec/{generators → integration/rails/generators}/graphql/object_generator_spec.rb +0 -0
  335. data/spec/integration/rails/generators/graphql/scalar_generator_spec.rb +28 -0
  336. data/spec/{generators → integration/rails/generators}/graphql/union_generator_spec.rb +0 -0
  337. data/spec/integration/rails/graphql/input_object_type_spec.rb +364 -0
  338. data/spec/{graphql → integration/rails/graphql}/query/variables_spec.rb +7 -7
  339. data/spec/{graphql → integration/rails/graphql}/relay/array_connection_spec.rb +9 -9
  340. data/spec/{graphql → integration/rails/graphql}/relay/base_connection_spec.rb +11 -3
  341. data/spec/{graphql → integration/rails/graphql}/relay/connection_instrumentation_spec.rb +19 -22
  342. data/spec/{graphql → integration/rails/graphql}/relay/connection_resolve_spec.rb +16 -0
  343. data/spec/{graphql → integration/rails/graphql}/relay/connection_type_spec.rb +0 -0
  344. data/spec/{graphql → integration/rails/graphql}/relay/edge_spec.rb +0 -0
  345. data/spec/{graphql → integration/rails/graphql}/relay/mutation_spec.rb +48 -0
  346. data/spec/{graphql → integration/rails/graphql}/relay/node_spec.rb +0 -0
  347. data/spec/{graphql → integration/rails/graphql}/relay/page_info_spec.rb +22 -22
  348. data/spec/{graphql → integration/rails/graphql}/relay/range_add_spec.rb +4 -4
  349. data/spec/{graphql → integration/rails/graphql}/relay/relation_connection_spec.rb +56 -27
  350. data/spec/{graphql → integration/rails/graphql}/schema_spec.rb +15 -11
  351. data/spec/{graphql → integration/rails/graphql}/tracing/active_support_notifications_tracing_spec.rb +16 -9
  352. data/spec/integration/rails/spec_helper.rb +25 -0
  353. data/spec/integration/tmp/app/graphql/types/family_type.rb +9 -0
  354. data/spec/spec_helper.rb +23 -39
  355. data/spec/support/dummy/data.rb +20 -17
  356. data/spec/support/dummy/schema.rb +315 -305
  357. data/spec/support/error_bubbling_helpers.rb +23 -0
  358. data/spec/support/jazz.rb +213 -46
  359. data/spec/support/lazy_helpers.rb +69 -27
  360. data/spec/support/new_relic.rb +3 -0
  361. data/spec/support/skylight.rb +3 -0
  362. data/spec/support/star_wars/schema.rb +131 -81
  363. data/spec/support/static_validation_helpers.rb +9 -5
  364. metadata +418 -261
  365. data/lib/graphql/language/comments.rb +0 -45
  366. data/lib/graphql/static_validation/arguments_validator.rb +0 -50
  367. data/spec/graphql/schema/member/has_fields_spec.rb +0 -129
  368. data/spec/rails_dependency_sanity_spec.rb +0 -14
@@ -46,63 +46,63 @@ describe GraphQL::Relay::PageInfo do
46
46
  result = star_wars_query(query_string, "first" => 2)
47
47
  assert_equal(true, get_page_info(result)["hasNextPage"])
48
48
  assert_equal(false, get_page_info(result)["hasPreviousPage"], "hasPreviousPage is false if 'last' is missing")
49
- assert_equal("MQ==", get_page_info(result)["startCursor"])
50
- assert_equal("Mg==", get_page_info(result)["endCursor"])
49
+ assert_equal("MQ", get_page_info(result)["startCursor"])
50
+ assert_equal("Mg", get_page_info(result)["endCursor"])
51
51
 
52
52
  last_cursor = get_last_cursor(result)
53
53
  result = star_wars_query(query_string, "first" => 100, "after" => last_cursor)
54
54
  assert_equal(false, get_page_info(result)["hasNextPage"])
55
55
  assert_equal(false, get_page_info(result)["hasPreviousPage"])
56
- assert_equal("Mw==", get_page_info(result)["startCursor"])
57
- assert_equal("Mw==", get_page_info(result)["endCursor"])
56
+ assert_equal("Mw", get_page_info(result)["startCursor"])
57
+ assert_equal("Mw", get_page_info(result)["endCursor"])
58
58
  end
59
59
 
60
60
  it "hasPreviousPage if there are more items" do
61
61
  result = star_wars_query(query_string, "last" => 100, "before" => cursor_of_last_base)
62
62
  assert_equal(false, get_page_info(result)["hasNextPage"])
63
63
  assert_equal(false, get_page_info(result)["hasPreviousPage"])
64
- assert_equal("MQ==", get_page_info(result)["startCursor"])
65
- assert_equal("Mg==", get_page_info(result)["endCursor"])
64
+ assert_equal("MQ", get_page_info(result)["startCursor"])
65
+ assert_equal("Mg", get_page_info(result)["endCursor"])
66
66
 
67
67
  result = star_wars_query(query_string, "last" => 1, "before" => cursor_of_last_base)
68
68
  assert_equal(false, get_page_info(result)["hasNextPage"])
69
69
  assert_equal(true, get_page_info(result)["hasPreviousPage"])
70
- assert_equal("Mg==", get_page_info(result)["startCursor"])
71
- assert_equal("Mg==", get_page_info(result)["endCursor"])
70
+ assert_equal("Mg", get_page_info(result)["startCursor"])
71
+ assert_equal("Mg", get_page_info(result)["endCursor"])
72
72
  end
73
73
 
74
74
  it "has both if first and last are present" do
75
75
  result = star_wars_query(query_string, "last" => 1, "first" => 1, "before" => cursor_of_last_base)
76
76
  assert_equal(true, get_page_info(result)["hasNextPage"])
77
77
  assert_equal(true, get_page_info(result)["hasPreviousPage"])
78
- assert_equal("MQ==", get_page_info(result)["startCursor"])
79
- assert_equal("MQ==", get_page_info(result)["endCursor"])
78
+ assert_equal("MQ", get_page_info(result)["startCursor"])
79
+ assert_equal("MQ", get_page_info(result)["endCursor"])
80
80
  end
81
81
 
82
82
  it "startCursor and endCursor are the cursors of the first and last edge" do
83
83
  result = star_wars_query(query_string, "first" => 2)
84
84
  assert_equal(true, get_page_info(result)["hasNextPage"])
85
85
  assert_equal(false, get_page_info(result)["hasPreviousPage"])
86
- assert_equal("MQ==", get_page_info(result)["startCursor"])
87
- assert_equal("Mg==", get_page_info(result)["endCursor"])
88
- assert_equal("MQ==", get_first_cursor(result))
89
- assert_equal("Mg==", get_last_cursor(result))
86
+ assert_equal("MQ", get_page_info(result)["startCursor"])
87
+ assert_equal("Mg", get_page_info(result)["endCursor"])
88
+ assert_equal("MQ", get_first_cursor(result))
89
+ assert_equal("Mg", get_last_cursor(result))
90
90
 
91
91
  result = star_wars_query(query_string, "first" => 1, "after" => get_page_info(result)["endCursor"])
92
92
  assert_equal(false, get_page_info(result)["hasNextPage"])
93
93
  assert_equal(false, get_page_info(result)["hasPreviousPage"])
94
- assert_equal("Mw==", get_page_info(result)["startCursor"])
95
- assert_equal("Mw==", get_page_info(result)["endCursor"])
96
- assert_equal("Mw==", get_first_cursor(result))
97
- assert_equal("Mw==", get_last_cursor(result))
94
+ assert_equal("Mw", get_page_info(result)["startCursor"])
95
+ assert_equal("Mw", get_page_info(result)["endCursor"])
96
+ assert_equal("Mw", get_first_cursor(result))
97
+ assert_equal("Mw", get_last_cursor(result))
98
98
 
99
99
  result = star_wars_query(query_string, "last" => 1, "before" => get_page_info(result)["endCursor"])
100
100
  assert_equal(false, get_page_info(result)["hasNextPage"])
101
101
  assert_equal(true, get_page_info(result)["hasPreviousPage"])
102
- assert_equal("Mg==", get_page_info(result)["startCursor"])
103
- assert_equal("Mg==", get_page_info(result)["endCursor"])
104
- assert_equal("Mg==", get_first_cursor(result))
105
- assert_equal("Mg==", get_last_cursor(result))
102
+ assert_equal("Mg", get_page_info(result)["startCursor"])
103
+ assert_equal("Mg", get_page_info(result)["endCursor"])
104
+ assert_equal("Mg", get_first_cursor(result))
105
+ assert_equal("Mg", get_last_cursor(result))
106
106
  end
107
107
  end
108
108
 
@@ -4,12 +4,12 @@ require "spec_helper"
4
4
  describe GraphQL::Relay::RangeAdd do
5
5
  # Make sure that the encoder is found through `ctx.schema`:
6
6
  module PassThroughEncoder
7
- def self.encode(plaintext, nonce: false)
8
- "__#{plaintext}"
7
+ def self.encode(unencoded_text, nonce: false)
8
+ "__#{unencoded_text}"
9
9
  end
10
10
 
11
- def self.decode(ciphertext, nonce: false)
12
- ciphertext[2..-1]
11
+ def self.decode(encoded_text, nonce: false)
12
+ encoded_text[2..-1]
13
13
  end
14
14
  end
15
15
 
@@ -21,7 +21,7 @@ describe GraphQL::Relay::RelationConnection do
21
21
 
22
22
  describe "results" do
23
23
  let(:query_string) {%|
24
- query getShips($first: Int, $after: String, $last: Int, $before: String, $nameIncludes: String){
24
+ query getShips($first: Int, $after: String, $last: Int, $before: String, $nameIncludes: String){
25
25
  empire {
26
26
  bases(first: $first, after: $after, last: $last, before: $before, nameIncludes: $nameIncludes) {
27
27
  ... basesConnection
@@ -51,19 +51,52 @@ describe GraphQL::Relay::RelationConnection do
51
51
  assert_equal(2, get_names(result).length)
52
52
  assert_equal(true, get_page_info(result)["hasNextPage"])
53
53
  assert_equal(false, get_page_info(result)["hasPreviousPage"])
54
- assert_equal("MQ==", get_page_info(result)["startCursor"])
55
- assert_equal("Mg==", get_page_info(result)["endCursor"])
56
- assert_equal("MQ==", get_first_cursor(result))
57
- assert_equal("Mg==", get_last_cursor(result))
54
+ assert_equal("MQ", get_page_info(result)["startCursor"])
55
+ assert_equal("Mg", get_page_info(result)["endCursor"])
56
+ assert_equal("MQ", get_first_cursor(result))
57
+ assert_equal("Mg", get_last_cursor(result))
58
58
 
59
59
  result = star_wars_query(query_string, "first" => 3)
60
60
  assert_equal(3, get_names(result).length)
61
61
  assert_equal(false, get_page_info(result)["hasNextPage"])
62
62
  assert_equal(false, get_page_info(result)["hasPreviousPage"])
63
- assert_equal("MQ==", get_page_info(result)["startCursor"])
64
- assert_equal("Mw==", get_page_info(result)["endCursor"])
65
- assert_equal("MQ==", get_first_cursor(result))
66
- assert_equal("Mw==", get_last_cursor(result))
63
+ assert_equal("MQ", get_page_info(result)["startCursor"])
64
+ assert_equal("Mw", get_page_info(result)["endCursor"])
65
+ assert_equal("MQ", get_first_cursor(result))
66
+ assert_equal("Mw", get_last_cursor(result))
67
+ end
68
+
69
+ it "uses unscope(:order) count(*) when the relation has some complicated SQL" do
70
+ query_s = <<-GRAPHQL
71
+ query getShips($first: Int, $after: String, $complexOrder: Boolean){
72
+ empire {
73
+ bases(first: $first, after: $after, complexOrder: $complexOrder) {
74
+ edges {
75
+ node {
76
+ name
77
+ }
78
+ }
79
+ pageInfo {
80
+ hasNextPage
81
+ }
82
+ }
83
+ }
84
+ }
85
+ GRAPHQL
86
+ result = nil
87
+ log = with_active_record_log do
88
+ result = star_wars_query(query_s, "first" => 1, "after" => "MQ==", "complexOrder" => true)
89
+ end
90
+
91
+ conn = result["data"]["empire"]["bases"]
92
+ assert_equal(1, conn["edges"].size)
93
+ assert_equal(true, conn["pageInfo"]["hasNextPage"])
94
+
95
+ log_entries = log.split("\n")
96
+ assert_equal 2, log_entries.size, "It ran 2 sql queries"
97
+ edges_query, has_next_page_query = log_entries
98
+ assert_includes edges_query, "ORDER BY bases.name", "The query for edges _is_ ordered"
99
+ refute_includes has_next_page_query, "ORDER BY bases.name", "The count query **does not** have an order"
67
100
  end
68
101
 
69
102
  it 'provides custom fields on the connection type' do
@@ -90,15 +123,11 @@ describe GraphQL::Relay::RelationConnection do
90
123
  }
91
124
  }
92
125
  GRAPHQL
93
- io = StringIO.new
94
- begin
95
- prev_logger = ActiveRecord::Base.logger
96
- ActiveRecord::Base.logger = Logger.new(io)
126
+ result = nil
127
+ log = with_active_record_log do
97
128
  result = star_wars_query(query_str, "first" => 2)
98
- ensure
99
- ActiveRecord::Base.logger = prev_logger
100
129
  end
101
- assert_equal 2, io.string.scan("\n").count, "Two log entries"
130
+ assert_equal 2, log.scan("\n").count, "Two log entries"
102
131
  assert_equal 3, result["data"]["empire"]["bases"]["totalCount"]
103
132
  assert_equal 2, result["data"]["empire"]["bases"]["edges"].size
104
133
  end
@@ -288,7 +317,7 @@ describe GraphQL::Relay::RelationConnection do
288
317
  assert_equal(first_and_second_names, get_names(result))
289
318
  assert_equal(false, result["data"]["empire"]["bases"]["pageInfo"]["hasPreviousPage"], "hasPreviousPage is false when last is not specified")
290
319
 
291
- third_cursor = "Mw=="
320
+ third_cursor = "Mw"
292
321
  result = star_wars_query(query_string, "last" => 100, "before" => third_cursor)
293
322
  assert_equal(first_and_second_names, get_names(result))
294
323
 
@@ -528,19 +557,19 @@ describe GraphQL::Relay::RelationConnection do
528
557
  assert_equal(2, get_names(result).length)
529
558
  assert_equal(true, get_page_info(result)["hasNextPage"])
530
559
  assert_equal(false, get_page_info(result)["hasPreviousPage"])
531
- assert_equal("MQ==", get_page_info(result)["startCursor"])
532
- assert_equal("Mg==", get_page_info(result)["endCursor"])
533
- assert_equal("MQ==", get_first_cursor(result))
534
- assert_equal("Mg==", get_last_cursor(result))
560
+ assert_equal("MQ", get_page_info(result)["startCursor"])
561
+ assert_equal("Mg", get_page_info(result)["endCursor"])
562
+ assert_equal("MQ", get_first_cursor(result))
563
+ assert_equal("Mg", get_last_cursor(result))
535
564
 
536
565
  result = star_wars_query(query_string, "first" => 3)
537
566
  assert_equal(3, get_names(result).length)
538
567
  assert_equal(false, get_page_info(result)["hasNextPage"])
539
568
  assert_equal(false, get_page_info(result)["hasPreviousPage"])
540
- assert_equal("MQ==", get_page_info(result)["startCursor"])
541
- assert_equal("Mw==", get_page_info(result)["endCursor"])
542
- assert_equal("MQ==", get_first_cursor(result))
543
- assert_equal("Mw==", get_last_cursor(result))
569
+ assert_equal("MQ", get_page_info(result)["startCursor"])
570
+ assert_equal("Mw", get_page_info(result)["endCursor"])
571
+ assert_equal("MQ", get_first_cursor(result))
572
+ assert_equal("Mw", get_last_cursor(result))
544
573
  end
545
574
 
546
575
  it 'provides custom fields on the connection type' do
@@ -635,8 +664,8 @@ describe GraphQL::Relay::RelationConnection do
635
664
  let(:connection) { GraphQL::Relay::RelationConnection.new(StarWars::Base.where(faction_id: 1), {}) }
636
665
 
637
666
  it "returns the cursor for a node in the connection" do
638
- assert_equal "MQ==", connection.cursor_from_node(StarWars::Base.all[0])
639
- assert_equal "Mg==", connection.cursor_from_node(StarWars::Base.all[1])
667
+ assert_equal "MQ", connection.cursor_from_node(StarWars::Base.all[0])
668
+ assert_equal "Mg", connection.cursor_from_node(StarWars::Base.all[1])
640
669
  end
641
670
 
642
671
  it "raises when the node isn't found" do
@@ -18,8 +18,8 @@ describe GraphQL::Schema do
18
18
  rescue_middleware = schema_defn.middleware.first
19
19
  assert_equal(1, rescue_middleware.rescue_table.length)
20
20
  # normally, you'd use a real class, not a symbol:
21
- schema_defn.rescue_from(:error_class) { "my custom message" }
22
- assert_equal(2, rescue_middleware.rescue_table.length)
21
+ schema_defn.rescue_from(:error_class, :another_err_class) { "my custom message" }
22
+ assert_equal(3, rescue_middleware.rescue_table.length)
23
23
  end
24
24
  end
25
25
 
@@ -47,9 +47,9 @@ describe GraphQL::Schema do
47
47
  it "returns a list of the schema's root types" do
48
48
  assert_equal(
49
49
  [
50
- Dummy::DairyAppQueryType,
51
- Dummy::DairyAppMutationType.graphql_definition,
52
- Dummy::SubscriptionType
50
+ Dummy::DairyAppQuery.graphql_definition,
51
+ Dummy::DairyAppMutation.graphql_definition.graphql_definition,
52
+ Dummy::Subscription.graphql_definition
53
53
  ],
54
54
  schema.root_types
55
55
  )
@@ -58,7 +58,8 @@ describe GraphQL::Schema do
58
58
 
59
59
  describe "#references_to" do
60
60
  it "returns a list of Field and Arguments of that type" do
61
- assert_equal [schema.types["Query"].fields["cow"]], schema.references_to("Cow")
61
+ cow_field = schema.get_field("Query", "cow")
62
+ assert_equal [cow_field], schema.references_to("Cow")
62
63
  end
63
64
 
64
65
  it "returns an empty list when type is not referenced by any field or argument" do
@@ -72,10 +73,13 @@ describe GraphQL::Schema do
72
73
  end
73
74
  end
74
75
 
75
- describe "#subscription" do
76
- it "calls fields on the subscription type" do
77
- res = schema.execute("subscription { test }")
78
- assert_equal("Test", res["data"]["test"])
76
+ # Interpreter has subscription support hardcoded, it doesn't just call through.
77
+ if !TESTING_INTERPRETER
78
+ describe "#subscription" do
79
+ it "calls fields on the subscription type" do
80
+ res = schema.execute("subscription { test }")
81
+ assert_equal("Test", res["data"]["test"])
82
+ end
79
83
  end
80
84
  end
81
85
 
@@ -450,7 +454,7 @@ type Query {
450
454
  it "returns fields by type or type name" do
451
455
  field = schema.get_field("Cheese", "id")
452
456
  assert_instance_of GraphQL::Field, field
453
- field_2 = schema.get_field(Dummy::CheeseType, "id")
457
+ field_2 = schema.get_field(Dummy::Cheese.graphql_definition, "id")
454
458
  assert_equal field, field_2
455
459
  end
456
460
  end
@@ -12,7 +12,14 @@ describe GraphQL::Tracing::ActiveSupportNotificationsTracing do
12
12
  traces = []
13
13
 
14
14
  callback = ->(name, started, finished, id, data) {
15
- traces << name
15
+ path_str = if data.key?(:field)
16
+ " (#{data[:field].path})"
17
+ elsif data.key?(:context)
18
+ " (#{data[:context].irep_node.owner_type}.#{data[:context].field.name})"
19
+ else
20
+ ""
21
+ end
22
+ traces << "#{name}#{path_str}"
16
23
  }
17
24
 
18
25
  query_string = <<-GRAPHQL
@@ -37,16 +44,16 @@ describe GraphQL::Tracing::ActiveSupportNotificationsTracing do
37
44
  "graphql.validate",
38
45
  "graphql.analyze_query",
39
46
  "graphql.analyze_multiplex",
40
- "graphql.execute_field",
41
- "graphql.execute_field",
47
+ "graphql.execute_field (Query.batchedBase)",
48
+ "graphql.execute_field (Query.batchedBase)",
42
49
  "graphql.execute_query",
43
50
  "graphql.lazy_loader",
44
- "graphql.execute_field_lazy",
45
- "graphql.execute_field",
46
- "graphql.execute_field_lazy",
47
- "graphql.execute_field",
48
- "graphql.execute_field_lazy",
49
- "graphql.execute_field_lazy",
51
+ "graphql.execute_field_lazy (Query.batchedBase)",
52
+ "graphql.execute_field (Base.name)",
53
+ "graphql.execute_field_lazy (Query.batchedBase)",
54
+ "graphql.execute_field (Base.name)",
55
+ "graphql.execute_field_lazy (Base.name)",
56
+ "graphql.execute_field_lazy (Base.name)",
50
57
  "graphql.execute_query_lazy",
51
58
  "graphql.execute_multiplex",
52
59
  ]
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+ require "rake"
3
+ require "rails/all"
4
+ require "rails/generators"
5
+ require "sequel"
6
+
7
+ if ENV['DATABASE'] == 'POSTGRESQL'
8
+ require 'pg'
9
+ else
10
+ require "jdbc/sqlite3" if RUBY_ENGINE == 'jruby'
11
+ require "sqlite3" if RUBY_ENGINE == 'ruby'
12
+ end
13
+
14
+ require_relative "generators/base_generator_test"
15
+ require_relative "data"
16
+
17
+ def with_active_record_log
18
+ io = StringIO.new
19
+ prev_logger = ActiveRecord::Base.logger
20
+ ActiveRecord::Base.logger = Logger.new(io)
21
+ yield
22
+ io.string
23
+ ensure
24
+ ActiveRecord::Base.logger = prev_logger
25
+ end
@@ -0,0 +1,9 @@
1
+ module Types
2
+ class FamilyType < Types::BaseEnum
3
+ value "NIGHTSHADE"
4
+ value "BRASSICA", value: Family::COLE
5
+ value "UMBELLIFER", value: :umbellifer
6
+ value "LEGUME", value: "bean & friends"
7
+ value "CURCURBITS", value: 5
8
+ end
9
+ end
data/spec/spec_helper.rb CHANGED
@@ -1,26 +1,21 @@
1
1
  # frozen_string_literal: true
2
+
3
+ require 'rubygems'
4
+ require 'bundler'
5
+ Bundler.require
6
+
2
7
  # Print full backtrace for failiures:
3
8
  ENV["BACKTRACE"] = "1"
9
+ # Set this env var to use Interpreter for fixture schemas.
10
+ # Eventually, interpreter will be the default.
11
+ TESTING_INTERPRETER = ENV["TESTING_INTERPRETER"]
12
+ TESTING_RESCUE_FROM = !TESTING_INTERPRETER
4
13
 
5
- def rails_should_be_installed?
6
- ENV['WITHOUT_RAILS'] != 'yes'
7
- end
8
14
  require "codeclimate-test-reporter"
9
15
  CodeClimate::TestReporter.start
10
16
 
11
- if rails_should_be_installed?
12
- require "rake"
13
- require "rails/all"
14
- require "rails/generators"
15
-
16
- require "jdbc/sqlite3" if RUBY_ENGINE == 'jruby'
17
- require "sqlite3" if RUBY_ENGINE == 'ruby'
18
- require "pg" if RUBY_ENGINE == 'ruby'
19
- require "mongoid" if RUBY_ENGINE == 'ruby'
20
- require "sequel"
21
- end
22
-
23
17
  require "graphql"
18
+ require "rake"
24
19
  require "graphql/rake_task"
25
20
  require "benchmark"
26
21
  require "pry"
@@ -28,21 +23,6 @@ require "minitest/autorun"
28
23
  require "minitest/focus"
29
24
  require "minitest/reporters"
30
25
 
31
- MONGO_DETECTED = begin
32
- require "mongo"
33
- Mongo::Client.new('mongodb://127.0.0.1:27017/graphql_ruby_test',
34
- connect_timeout: 1,
35
- socket_timeout: 1,
36
- server_selection_timeout: 1,
37
- logger: Logger.new(nil)
38
- )
39
- .database
40
- .collections
41
- rescue StandardError, LoadError => err # rubocop:disable Lint/UselessAssignment
42
- # puts err.message, err.backtrace
43
- false
44
- end
45
-
46
26
  Minitest::Reporters.use! Minitest::Reporters::DefaultReporter.new(color: true)
47
27
 
48
28
  Minitest::Spec.make_my_diffs_pretty!
@@ -51,7 +31,6 @@ Minitest::Spec.make_my_diffs_pretty!
51
31
  # to be shown.
52
32
  Minitest.backtrace_filter = Minitest::BacktraceFilter.new
53
33
 
54
-
55
34
  # This is for convenient access to metadata in test definitions
56
35
  assign_metadata_key = ->(target, key, value) { target.metadata[key] = value }
57
36
  assign_metadata_flag = ->(target, flag) { target.metadata[flag] = true }
@@ -76,16 +55,20 @@ NO_OP_RESOLVE_TYPE = ->(type, obj, ctx) {
76
55
  raise "this should never be called"
77
56
  }
78
57
 
58
+ # Load dependencies
59
+ ['Mongoid', 'Rails'].each do |integration|
60
+ begin
61
+ Object.const_get(integration)
62
+ Dir["#{File.dirname(__FILE__)}/integration/#{integration.downcase}/**/*.rb"].each do |f|
63
+ require f
64
+ end
65
+ rescue NameError
66
+ # ignore
67
+ end
68
+ end
69
+
79
70
  # Load support files
80
71
  Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each do |f|
81
- # These require mongodb in order to run,
82
- # so only load them in the specific tests that require them.
83
- next if f.include?("star_trek")
84
-
85
- unless rails_should_be_installed?
86
- next if f.end_with?('star_wars/data.rb')
87
- next if f.end_with?('base_generator_test.rb')
88
- end
89
72
  require f
90
73
  end
91
74
 
@@ -123,6 +106,7 @@ module TestTracing
123
106
 
124
107
  def trace(key, data)
125
108
  data[:key] = key
109
+ data[:path] ||= data.key?(:context) ? data[:context].path : nil
126
110
  result = yield
127
111
  data[:result] = result
128
112
  traces << data
@@ -1,27 +1,32 @@
1
1
  # frozen_string_literal: true
2
2
  require 'ostruct'
3
3
  module Dummy
4
- Cheese = Struct.new(:id, :flavor, :origin, :fat_content, :source) do
5
- def ==(other)
6
- # This is buggy on purpose -- it shouldn't be called during execution.
7
- other.id == id
8
- end
4
+ module Data
5
+ Cheese = Struct.new(:id, :flavor, :origin, :fat_content, :source) do
6
+ def ==(other)
7
+ # This is buggy on purpose -- it shouldn't be called during execution.
8
+ other.id == id
9
+ end
9
10
 
10
- # Alias for when this is treated as milk in EdibleAsMilkInterface
11
- def fatContent # rubocop:disable Naming/MethodName
12
- fat_content
11
+ # Alias for when this is treated as milk in EdibleAsMilkInterface
12
+ def fatContent # rubocop:disable Naming/MethodName
13
+ fat_content
14
+ end
13
15
  end
16
+
17
+ Milk = Struct.new(:id, :fat_content, :origin, :source, :flavors)
18
+ Cow = Struct.new(:id, :name, :last_produced_dairy)
19
+ Goat = Struct.new(:id, :name, :last_produced_dairy)
14
20
  end
15
21
 
16
22
  CHEESES = {
17
- 1 => Cheese.new(1, "Brie", "France", 0.19, 1),
18
- 2 => Cheese.new(2, "Gouda", "Netherlands", 0.3, 1),
19
- 3 => Cheese.new(3, "Manchego", "Spain", 0.065, "SHEEP")
23
+ 1 => Data::Cheese.new(1, "Brie", "France", 0.19, 1),
24
+ 2 => Data::Cheese.new(2, "Gouda", "Netherlands", 0.3, 1),
25
+ 3 => Data::Cheese.new(3, "Manchego", "Spain", 0.065, "SHEEP")
20
26
  }
21
27
 
22
- Milk = Struct.new(:id, :fatContent, :origin, :source, :flavors)
23
28
  MILKS = {
24
- 1 => Milk.new(1, 0.04, "Antiquity", 1, ["Natural", "Chocolate", "Strawberry"]),
29
+ 1 => Data::Milk.new(1, 0.04, "Antiquity", 1, ["Natural", "Chocolate", "Strawberry"]),
25
30
  }
26
31
 
27
32
  DAIRY = OpenStruct.new(
@@ -30,13 +35,11 @@ module Dummy
30
35
  milks: [MILKS[1]]
31
36
  )
32
37
 
33
- Cow = Struct.new(:id, :name, :last_produced_dairy)
34
38
  COWS = {
35
- 1 => Cow.new(1, "Billy", MILKS[1])
39
+ 1 => Data::Cow.new(1, "Billy", MILKS[1])
36
40
  }
37
41
 
38
- Goat = Struct.new(:id, :name, :last_produced_dairy)
39
42
  GOATS = {
40
- 1 => Goat.new(1, "Gilly", MILKS[1]),
43
+ 1 => Data::Goat.new(1, "Gilly", MILKS[1]),
41
44
  }
42
45
  end