graphql 1.9.10 → 1.9.11

Sign up to get free protection for your applications and to get access to all the features.
Files changed (45) hide show
  1. checksums.yaml +4 -4
  2. data/lib/graphql/analysis/ast/query_depth.rb +4 -17
  3. data/lib/graphql/analysis/query_depth.rb +4 -17
  4. data/lib/graphql/coercion_error.rb +8 -0
  5. data/lib/graphql/execution/execute.rb +1 -1
  6. data/lib/graphql/execution/interpreter/runtime.rb +3 -3
  7. data/lib/graphql/schema/field.rb +43 -18
  8. data/lib/graphql/static_validation/literal_validator.rb +1 -1
  9. data/lib/graphql/static_validation/rules/argument_literals_are_compatible.rb +8 -3
  10. data/lib/graphql/static_validation/rules/argument_literals_are_compatible_error.rb +3 -2
  11. data/lib/graphql/version.rb +1 -1
  12. data/spec/graphql/analysis/ast/max_query_depth_spec.rb +28 -0
  13. data/spec/graphql/execution_error_spec.rb +18 -14
  14. data/spec/graphql/introspection/directive_type_spec.rb +6 -1
  15. data/spec/graphql/introspection/introspection_query_spec.rb +7 -2
  16. data/spec/graphql/introspection/schema_type_spec.rb +1 -0
  17. data/spec/graphql/schema/field_extension_spec.rb +23 -1
  18. data/spec/graphql/schema/field_spec.rb +18 -0
  19. data/spec/graphql/schema/list_spec.rb +28 -1
  20. data/spec/graphql/static_validation/rules/argument_literals_are_compatible_spec.rb +53 -0
  21. data/spec/support/dummy/schema.rb +8 -0
  22. metadata +3 -49
  23. data/spec/dummy/Gemfile.lock +0 -157
  24. data/spec/dummy/log/test.log +0 -199
  25. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/4w/4wzXRZrAkwKdgYaSE0pid5eB-fer8vSfSku_NPg4rMA.cache +0 -0
  26. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/7I/7IHVBiJT06QSpgLpLoJIxboQ0B-D_tMTxsvoezBTV3Q.cache +0 -1
  27. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/8w/8wY_SKagj8wHuwGNAAf6JnQ8joMbC6cEYpHrTAI8Urc.cache +0 -1
  28. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/AK/AKzz1u6bGb4auXcrObA_g5LL-oV0ejNGa448AgAi_WQ.cache +0 -1
  29. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/ET/ETW4uxvaYpruL8y6_ZptUH82ZowMaHIqvg5WexBFdEM.cache +0 -3
  30. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/F1/F1TWpjjyA56k9Z90n5B3xRn7DUdGjX73QCkYC6k07JQ.cache +0 -0
  31. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/F8/F8MUNRzORGFgr329fNM0xLaoWCXdv3BIalT7dsvLfjs.cache +0 -2
  32. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/KB/KB07ZaKNC5uXJ7TjLi-WqnY6g7dq8wWp_8N3HNjBNxg.cache +0 -2
  33. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Ms/MsKSimH_UCB-H1tLvDABDHuvGciuoW6kVqQWDrXU5FQ.cache +0 -0
  34. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Mt/Mtci-Kim50aPOmeClD4AIicKn1d1WJ0n454IjSd94sk.cache +0 -0
  35. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/QH/QHt3Tc1Y6M66Oo_pDuMyWrQNs4Pp3SMeZR5K1wJj2Ts.cache +0 -1
  36. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/XU/XU4k1OXnfMils5SrirorPvDSyDSqiOWLZNtmAH1HH8k.cache +0 -0
  37. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/ZI/ZIof7mZxWWCnraIFOCuV6a8QRWzKJXJnx2Xd7C0ZyX0.cache +0 -1
  38. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/cG/cGc_puuPS5pZKgUcy1Y_i1L6jl5UtsiIrMH59rTzR6c.cache +0 -3
  39. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/df/dfro_B6bx3KP1Go-7jEOqqZ2j4hVRseXIc3es9PKQno.cache +0 -1
  40. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/jO/jO1DfbqnG0mTULsjJJANc3fefrG2zt7DIMmcptMT628.cache +0 -1
  41. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/pE/pE7gO6pQ-z187Swb4hT554wmqsq-cNzgPWLrCz-LQQQ.cache +0 -0
  42. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/r9/r9iU1l58a6rxkZSW5RSC52_tD-_UQuHxoMVnkfJ7Mhs.cache +0 -1
  43. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/xi/xitPPFfPIyDMpaznV0sBBcw8eSCV8PJcLLWin78sCgE.cache +0 -0
  44. data/spec/dummy/tmp/screenshots/failures_test_it_handles_subscriptions.png +0 -0
  45. data/spec/integration/tmp/app/graphql/types/page_type.rb +0 -5
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 239691cd4bf2f9f93314691a4ae3206438e2c51d544b3ef03f6928f62d5930a2
4
- data.tar.gz: bb8c26e8da805c1020692ac979a5717a521aa14a353e17c0eaddb30ce1ebc092
3
+ metadata.gz: d8cb680ebbc1268d4d67fe4782283318a0202406e81c2b910b189a54ae1222a5
4
+ data.tar.gz: ece10b278186bf9718956435ca66d48f3abeffb892194bf2854666423e61b420
5
5
  SHA512:
6
- metadata.gz: 32e52e6bc896c1b2f62bdefd4ce905ecbead2c81b52e2dac53700fd6a5956ccc594d4ff8eff5c314f496e44b16ab91ad7a3c1ed3c4e784bee489433b19853faa
7
- data.tar.gz: 386a90ecd152c2b450d5c2045814241a6660180aef8edca92eea062cdc2285aa2545045390fa53bd92f0a5423ae2622aa18f7815e73fef5d902649f77e44b80b
6
+ metadata.gz: 652a7ac07da14940edc5e99384db05d697e405c4e7c281ff2d96110b87a6f431f0682015e278a46d3e8ef6087db7296d1cf71256a58c3aaf65c9216ff5498d90
7
+ data.tar.gz: 0b486ca1ad7357a73c95c5ba23e2141053b981532b6820e67cd27fff827da6b79667f747c1b85511334945ff720486a2cd18696f4f5408eecb8b4ac0d97b77dd
@@ -29,35 +29,22 @@ module GraphQL
29
29
  def initialize(query)
30
30
  @max_depth = 0
31
31
  @current_depth = 0
32
- @skip_depth = 0
33
32
  super
34
33
  end
35
34
 
36
35
  def on_enter_field(node, parent, visitor)
37
36
  return if visitor.skipping? || visitor.visiting_fragment_definition?
38
37
 
39
- # Don't validate introspection fields or skipped nodes
40
- if GraphQL::Schema::DYNAMIC_FIELDS.include?(visitor.field_definition.name)
41
- @skip_depth += 1
42
- elsif @skip_depth > 0
43
- # we're inside an introspection query or skipped node
44
- else
45
- @current_depth += 1
46
- end
38
+ @current_depth += 1
47
39
  end
48
40
 
49
41
  def on_leave_field(node, parent, visitor)
50
42
  return if visitor.skipping? || visitor.visiting_fragment_definition?
51
43
 
52
- # Don't validate introspection fields or skipped nodes
53
- if GraphQL::Schema::DYNAMIC_FIELDS.include?(visitor.field_definition.name)
54
- @skip_depth -= 1
55
- else
56
- if @max_depth < @current_depth
57
- @max_depth = @current_depth
58
- end
59
- @current_depth -= 1
44
+ if @max_depth < @current_depth
45
+ @max_depth = @current_depth
60
46
  end
47
+ @current_depth -= 1
61
48
  end
62
49
 
63
50
  def on_enter_fragment_spread(node, _, visitor)
@@ -17,32 +17,19 @@ module GraphQL
17
17
  {
18
18
  max_depth: 0,
19
19
  current_depth: 0,
20
- skip_depth: 0,
21
20
  query: query,
22
21
  }
23
22
  end
24
23
 
25
24
  def call(memo, visit_type, irep_node)
26
25
  if irep_node.ast_node.is_a?(GraphQL::Language::Nodes::Field)
27
- # Don't validate introspection fields or skipped nodes
28
- not_validated_node = GraphQL::Schema::DYNAMIC_FIELDS.include?(irep_node.definition_name)
29
26
  if visit_type == :enter
30
- if not_validated_node
31
- memo[:skip_depth] += 1
32
- elsif memo[:skip_depth] > 0
33
- # we're inside an introspection query or skipped node
34
- else
35
- memo[:current_depth] += 1
36
- end
27
+ memo[:current_depth] += 1
37
28
  else
38
- if not_validated_node
39
- memo[:skip_depth] -= 1
40
- else
41
- if memo[:max_depth] < memo[:current_depth]
42
- memo[:max_depth] = memo[:current_depth]
43
- end
44
- memo[:current_depth] -= 1
29
+ if memo[:max_depth] < memo[:current_depth]
30
+ memo[:max_depth] = memo[:current_depth]
45
31
  end
32
+ memo[:current_depth] -= 1
46
33
  end
47
34
  end
48
35
  memo
@@ -1,5 +1,13 @@
1
1
  # frozen_string_literal: true
2
2
  module GraphQL
3
3
  class CoercionError < GraphQL::Error
4
+ # @return [Hash] Optional custom data for error objects which will be added
5
+ # under the `extensions` key.
6
+ attr_accessor :extensions
7
+
8
+ def initialize(message, extensions: nil)
9
+ @extensions = extensions
10
+ super(message)
11
+ end
4
12
  end
5
13
  end
@@ -197,7 +197,7 @@ module GraphQL
197
197
  raw_value.path = field_ctx.path
198
198
  query.context.errors.push(raw_value)
199
199
  when Array
200
- if !field_type.list?
200
+ if field_type.non_null?
201
201
  # List type errors are handled above, this is for the case of fields returning an array of errors
202
202
  list_errors = raw_value.each_with_index.select { |value, _| value.is_a?(GraphQL::ExecutionError) }
203
203
  if list_errors.any?
@@ -243,9 +243,9 @@ module GraphQL
243
243
  write_execution_errors_in_response(path, [value])
244
244
  HALT
245
245
  elsif value.is_a?(Array) && value.any? && value.all? { |v| v.is_a?(GraphQL::ExecutionError) }
246
- value.each do |v|
247
- v.path ||= path
248
- v.ast_node ||= ast_node
246
+ value.each_with_index do |error, index|
247
+ error.ast_node ||= ast_node
248
+ error.path ||= path + (field.type.list? ? [index] : [])
249
249
  end
250
250
  write_execution_errors_in_response(path, value)
251
251
  HALT
@@ -46,9 +46,6 @@ module GraphQL
46
46
 
47
47
  alias :mutation :resolver
48
48
 
49
- # @return [Array<Symbol>]
50
- attr_reader :extras
51
-
52
49
  # @return [Boolean] Apply tracing to this field? (Default: skip scalars, this is the override value)
53
50
  attr_reader :trace
54
51
 
@@ -159,7 +156,7 @@ module GraphQL
159
156
  # @param complexity [Numeric] When provided, set the complexity for this field
160
157
  # @param scope [Boolean] If true, the return type's `.scope_items` method will be called on the return value
161
158
  # @param subscription_scope [Symbol, String] A key in `context` which will be used to scope subscription payloads
162
- # @param extensions [Array<Class>] Named extensions to apply to this field (see also {#extension})
159
+ # @param extensions [Array<Class, Hash<Class => Object>>] Named extensions to apply to this field (see also {#extension})
163
160
  # @param trace [Boolean] If true, a {GraphQL::Tracing} tracer will measure this scalar field
164
161
  def initialize(type: nil, name: nil, owner: nil, null: nil, field: nil, function: nil, description: nil, deprecation_reason: nil, method: nil, hash_key: nil, resolver_method: nil, resolve: nil, connection: nil, max_page_size: nil, scope: nil, introspection: false, camelize: true, trace: nil, complexity: 1, extras: [], extensions: [], resolver_class: nil, subscription_scope: nil, relay_node_field: false, relay_nodes_field: false, arguments: {}, &definition_block)
165
162
  if name.nil?
@@ -273,38 +270,66 @@ module GraphQL
273
270
 
274
271
  # Read extension instances from this field,
275
272
  # or add new classes/options to be initialized on this field.
273
+ # Extensions are executed in the order they are added.
274
+ #
275
+ # @example adding an extension
276
+ # extensions([MyExtensionClass])
276
277
  #
277
- # @param extensions [Array<Class>, Hash<Class => Object>] Add extensions to this field
278
+ # @example adding multiple extensions
279
+ # extensions([MyExtensionClass, AnotherExtensionClass])
280
+ #
281
+ # @example adding an extension with options
282
+ # extensions([MyExtensionClass, { AnotherExtensionClass => { filter: true } }])
283
+ #
284
+ # @param extensions [Array<Class, Hash<Class => Object>>] Add extensions to this field. For hash elements, only the first key/value is used.
278
285
  # @return [Array<GraphQL::Schema::FieldExtension>] extensions to apply to this field
279
286
  def extensions(new_extensions = nil)
280
287
  if new_extensions.nil?
281
288
  # Read the value
282
289
  @extensions
283
290
  else
284
- # Normalize to a Hash of {name => options}
285
- extensions_with_options = if new_extensions.last.is_a?(Hash)
286
- new_extensions.pop
287
- else
288
- {}
289
- end
290
- new_extensions.each do |f|
291
- extensions_with_options[f] = nil
292
- end
293
-
294
- # Initialize each class and stash the instance
295
- extensions_with_options.each do |extension_class, options|
296
- @extensions << extension_class.new(field: self, options: options)
291
+ new_extensions.each do |extension|
292
+ if extension.is_a?(Hash)
293
+ extension = extension.to_a[0]
294
+ extension_class, options = *extension
295
+ @extensions << extension_class.new(field: self, options: options)
296
+ else
297
+ extension_class = extension
298
+ @extensions << extension_class.new(field: self, options: nil)
299
+ end
297
300
  end
298
301
  end
299
302
  end
300
303
 
301
304
  # Add `extension` to this field, initialized with `options` if provided.
305
+ #
306
+ # @example adding an extension
307
+ # extension(MyExtensionClass)
308
+ #
309
+ # @example adding an extension with options
310
+ # extension(MyExtensionClass, filter: true)
311
+ #
302
312
  # @param extension [Class] subclass of {Schema::Fieldextension}
303
313
  # @param options [Object] if provided, given as `options:` when initializing `extension`.
304
314
  def extension(extension, options = nil)
305
315
  extensions([{extension => options}])
306
316
  end
307
317
 
318
+ # Read extras (as symbols) from this field,
319
+ # or add new extras to be opted into by this field's resolver.
320
+ #
321
+ # @param new_extras [Array<Symbol>] Add extras to this field
322
+ # @return [Array<Symbol>]
323
+ def extras(new_extras = nil)
324
+ if new_extras.nil?
325
+ # Read the value
326
+ @extras
327
+ else
328
+ # Append to the set of extras on this field
329
+ @extras.concat(new_extras)
330
+ end
331
+ end
332
+
308
333
  def complexity(new_complexity)
309
334
  case new_complexity
310
335
  when Proc
@@ -11,7 +11,7 @@ module GraphQL
11
11
  def validate(ast_value, type)
12
12
  if type.nil?
13
13
  # this means we're an undefined argument, see #present_input_field_values_are_valid
14
- return maybe_raise_if_invalid(ast_value) do
14
+ maybe_raise_if_invalid(ast_value) do
15
15
  false
16
16
  end
17
17
  elsif ast_value.is_a?(GraphQL::Language::Nodes::NullValue)
@@ -37,14 +37,19 @@ module GraphQL
37
37
  # short-circuit here so we avoid bubbling this up to whatever input_object / array contains us
38
38
  return super
39
39
  end
40
- error = GraphQL::StaticValidation::ArgumentLiteralsAreCompatibleError.new(err.message, nodes: parent, type: "CoercionError")
40
+ error = GraphQL::StaticValidation::ArgumentLiteralsAreCompatibleError.new(err.message, nodes: parent, type: "CoercionError", extensions: err.extensions)
41
41
  rescue GraphQL::LiteralValidationError => err
42
42
  # check to see if the ast node that caused the error to be raised is
43
43
  # the same as the node we were checking here.
44
- matched = if arg_defn.type.kind.list?
44
+ arg_type = arg_defn.type
45
+ if arg_type.kind.non_null?
46
+ arg_type = arg_type.of_type
47
+ end
48
+
49
+ matched = if arg_type.kind.list?
45
50
  # for a list we claim an error if the node is contained in our list
46
51
  Array(node.value).include?(err.ast_value)
47
- elsif arg_defn.type.kind.input_object? && node.value.is_a?(GraphQL::Language::Nodes::InputObject)
52
+ elsif arg_type.kind.input_object? && node.value.is_a?(GraphQL::Language::Nodes::InputObject)
48
53
  # for an input object we check the arguments
49
54
  node.value.arguments.include?(err.ast_value)
50
55
  else
@@ -5,10 +5,11 @@ module GraphQL
5
5
  attr_reader :type_name
6
6
  attr_reader :argument_name
7
7
 
8
- def initialize(message, path: nil, nodes: [], type:, argument: nil)
8
+ def initialize(message, path: nil, nodes: [], type:, argument: nil, extensions: nil)
9
9
  super(message, path: path, nodes: nodes)
10
10
  @type_name = type
11
11
  @argument_name = argument
12
+ @extensions = extensions
12
13
  end
13
14
 
14
15
  # A hash representation of this Message
@@ -17,7 +18,7 @@ module GraphQL
17
18
  "code" => code,
18
19
  "typeName" => type_name
19
20
  }.tap { |h| h["argumentName"] = argument_name unless argument_name.nil? }
20
-
21
+ extensions.merge!(@extensions) unless @extensions.nil?
21
22
  super.merge({
22
23
  "extensions" => extensions
23
24
  })
@@ -1,4 +1,4 @@
1
1
  # frozen_string_literal: true
2
2
  module GraphQL
3
- VERSION = "1.9.10"
3
+ VERSION = "1.9.11"
4
4
  end
@@ -47,6 +47,34 @@ describe GraphQL::Analysis::AST::MaxQueryDepth do
47
47
  end
48
48
  end
49
49
 
50
+ describe "When the query includes introspective fields" do
51
+ let(:query_string) { "
52
+ query allSchemaTypes {
53
+ __schema {
54
+ types {
55
+ fields {
56
+ type {
57
+ fields {
58
+ type {
59
+ fields {
60
+ type {
61
+ name
62
+ }
63
+ }
64
+ }
65
+ }
66
+ }
67
+ }
68
+ }
69
+ }
70
+ }
71
+ "}
72
+
73
+ it "adds an error message for a too-deep query" do
74
+ assert_equal "Query has depth of 9, which exceeds max depth of 5", result.message
75
+ end
76
+ end
77
+
50
78
  describe "When the query is not deeper than max_depth" do
51
79
  before do
52
80
  schema.max_depth(100)
@@ -295,19 +295,7 @@ describe GraphQL::ExecutionError do
295
295
 
296
296
  describe "more than one ExecutionError" do
297
297
  let(:query_string) { %|{ multipleErrorsOnNonNullableField} |}
298
- it "the errors are inserted into the errors key and the data is nil even for a NonNullable field " do
299
-
300
- # I Think the path here is _wrong_, since this is not an array field:
301
- # expected_result = {
302
- # "data"=>nil,
303
- # "errors"=>
304
- # [{"message"=>"This is an error message for some error.",
305
- # "locations"=>[{"line"=>1, "column"=>3}],
306
- # "path"=>["multipleErrorsOnNonNullableField", 0]},
307
- # {"message"=>"This is another error message for a different error.",
308
- # "locations"=>[{"line"=>1, "column"=>3}],
309
- # "path"=>["multipleErrorsOnNonNullableField", 1]}]
310
- # }
298
+ it "the errors are inserted into the errors key and the data is nil even for a NonNullable field" do
311
299
  expected_result = {
312
300
  "data"=>nil,
313
301
  "errors"=>
@@ -320,6 +308,22 @@ describe GraphQL::ExecutionError do
320
308
  }
321
309
  assert_equal(expected_result, result)
322
310
  end
323
- end
324
311
 
312
+ describe "more than one ExecutionError on a field defined to return a list" do
313
+ let(:query_string) { %|{ multipleErrorsOnNonNullableListField} |}
314
+ it "the errors are inserted into the errors key and the data is nil even for a NonNullable field" do
315
+ expected_result = {
316
+ "data"=>nil,
317
+ "errors"=>
318
+ [{"message"=>"The first error message for a field defined to return a list of strings.",
319
+ "locations"=>[{"line"=>1, "column"=>3}],
320
+ "path"=>["multipleErrorsOnNonNullableListField", 0]},
321
+ {"message"=>"The second error message for a field defined to return a list of strings.",
322
+ "locations"=>[{"line"=>1, "column"=>3}],
323
+ "path"=>["multipleErrorsOnNonNullableListField", 1]}],
324
+ }
325
+ assert_equal(expected_result, result)
326
+ end
327
+ end
328
+ end
325
329
  end
@@ -17,7 +17,12 @@ describe GraphQL::Introspection::DirectiveType do
17
17
  }
18
18
  }
19
19
  |}
20
- let(:result) { Dummy::Schema.execute(query_string) }
20
+
21
+ let(:schema) { Class.new(Dummy::Schema) }
22
+ let(:result) { schema.execute(query_string) }
23
+ before do
24
+ schema.max_depth(100)
25
+ end
21
26
 
22
27
  it "shows directive info " do
23
28
  expected = { "data" => {
@@ -2,14 +2,19 @@
2
2
  require "spec_helper"
3
3
 
4
4
  describe "GraphQL::Introspection::INTROSPECTION_QUERY" do
5
+ let(:schema) { Class.new(Dummy::Schema) }
5
6
  let(:query_string) { GraphQL::Introspection::INTROSPECTION_QUERY }
6
- let(:result) { Dummy::Schema.execute(query_string) }
7
+ let(:result) { schema.execute(query_string) }
8
+
9
+ before do
10
+ schema.max_depth = 15
11
+ end
7
12
 
8
13
  it "runs" do
9
14
  assert(result["data"])
10
15
  end
11
16
 
12
- it "handles deeply nested (<= 7) schemas" do
17
+ it "is limited to the max query depth" do
13
18
  query_type = GraphQL::ObjectType.define do
14
19
  name "DeepQuery"
15
20
  field :foo do
@@ -37,6 +37,7 @@ describe GraphQL::Introspection::SchemaType do
37
37
  {"name"=>"maybeNull"},
38
38
  {"name"=>"milk"},
39
39
  {"name"=>"multipleErrorsOnNonNullableField"},
40
+ {"name"=>"multipleErrorsOnNonNullableListField"},
40
41
  {"name"=>"root"},
41
42
  {"name"=>"searchDairy"},
42
43
  {"name"=>"tracingScalar"},
@@ -72,6 +72,11 @@ describe GraphQL::Schema::FieldExtension do
72
72
  argument :input, Integer, required: true
73
73
  end
74
74
 
75
+ field :tripled_by_option2, Integer, null: false, resolver_method: :pass_thru,
76
+ extensions: [{ MultiplyByOption => { factor: 3 } }] do
77
+ argument :input, Integer, required: true
78
+ end
79
+
75
80
  field :multiply_input, Integer, null: false, resolver_method: :pass_thru, extensions: [MultiplyByArgument] do
76
81
  argument :input, Integer, required: true
77
82
  end
@@ -83,6 +88,11 @@ describe GraphQL::Schema::FieldExtension do
83
88
  def pass_thru(input:, **args)
84
89
  input # return it as-is, it will be modified by extensions
85
90
  end
91
+
92
+ field :multiple_extensions, Integer, null: false, resolver_method: :pass_thru,
93
+ extensions: [DoubleFilter, { MultiplyByOption => { factor: 3 } }] do
94
+ argument :input, Integer, required: true
95
+ end
86
96
  end
87
97
 
88
98
  class Schema < GraphQL::Schema
@@ -122,7 +132,13 @@ describe GraphQL::Schema::FieldExtension do
122
132
  assert_equal 12, res["data"]["tripledByOption"]
123
133
  end
124
134
 
125
- it "provides an empty hash as default options" do
135
+ it "supports extension with options via extensions kwarg" do
136
+ # The factor of three came from an option
137
+ res = exec_query("{ tripledByOption2(input: 4) }")
138
+ assert_equal 12, res["data"]["tripledByOption2"]
139
+ end
140
+
141
+ it "provides an empty hash as default options" do
126
142
  res = exec_query("{ square(input: 4) }")
127
143
  assert_equal 16, res["data"]["square"]
128
144
  res = exec_query("{ cube(input: 4) }")
@@ -133,5 +149,11 @@ describe GraphQL::Schema::FieldExtension do
133
149
  res = exec_query("{ multiplyInput(input: 3, factor: 5) }")
134
150
  assert_equal 15, res["data"]["multiplyInput"]
135
151
  end
152
+
153
+ it "supports multiple extensions via extensions kwarg" do
154
+ # doubled then multiplied by 3 specified via option
155
+ res = exec_query("{ multipleExtensions(input: 3) }")
156
+ assert_equal 18, res["data"]["multipleExtensions"]
157
+ end
136
158
  end
137
159
  end
@@ -129,6 +129,24 @@ describe GraphQL::Schema::Field do
129
129
  assert_equal "TRUE", res["data"]["upcaseCheck3"]
130
130
  assert_equal "\"WHY NOT?\"", res["data"]["upcaseCheck4"]
131
131
  end
132
+
133
+ it "can be read via #extras" do
134
+ field = Jazz::Musician.fields["addError"]
135
+ assert_equal [:execution_errors], field.extras
136
+ end
137
+
138
+ it "can be added by passing an array of symbols to #extras" do
139
+ object = Class.new(Jazz::BaseObject) do
140
+ graphql_name "JustAName"
141
+
142
+ field :test, String, null: true, extras: [:lookahead]
143
+ end
144
+
145
+ field = object.fields['test']
146
+
147
+ field.extras([:ast_node])
148
+ assert_equal [:lookahead, :ast_node], field.extras
149
+ end
132
150
  end
133
151
 
134
152
  it "is the #owner of its arguments" do
@@ -33,7 +33,7 @@ describe GraphQL::Schema::List do
33
33
  it "will return true if list types 'of_type' are the same" do
34
34
  new_of_type = Jazz::Musician
35
35
  new_list_type = GraphQL::Schema::List.new(new_of_type)
36
-
36
+
37
37
  assert_equal list_type, new_list_type
38
38
  end
39
39
  end
@@ -43,4 +43,31 @@ describe GraphQL::Schema::List do
43
43
  assert_kind_of GraphQL::ListType, list_type.to_graphql
44
44
  end
45
45
  end
46
+
47
+ describe "validation" do
48
+ class ListEnumValidationSchema < GraphQL::Schema
49
+ class Item < GraphQL::Schema::Enum
50
+ value "A"
51
+ value "B"
52
+ end
53
+
54
+ class Query < GraphQL::Schema::Object
55
+ field :echo, [Item], null: false do
56
+ argument :items, [Item], required: true
57
+ end
58
+
59
+ def echo(items:)
60
+ items
61
+ end
62
+ end
63
+
64
+ query(Query)
65
+ end
66
+
67
+ it "checks non-null lists of enums" do
68
+ res = ListEnumValidationSchema.execute "{ echo(items: [A, B, \"C\"]) }"
69
+ expected_error = "Argument 'items' on Field 'echo' has an invalid value. Expected type '[Item!]!'."
70
+ assert_equal [expected_error], res["errors"].map { |e| e["message"] }
71
+ end
72
+ end
46
73
  end
@@ -410,4 +410,57 @@ describe GraphQL::StaticValidation::ArgumentLiteralsAreCompatible do
410
410
  end
411
411
  end
412
412
  end
413
+
414
+ describe "custom error extensions" do
415
+ let(:schema) {
416
+ CoerceTestEmailType ||= GraphQL::ScalarType.define do
417
+ name "Email"
418
+ description "Email address"
419
+
420
+ coerce_input ->(value, ctx) do
421
+ if URI::MailTo::EMAIL_REGEXP.match(value)
422
+ value
423
+ else
424
+ raise GraphQL::CoercionError.new("Invalid email address", extensions: { "code" => "invalid_email_address" })
425
+ end
426
+ end
427
+
428
+ coerce_result ->(value, ctx) { value.to_f }
429
+ end
430
+
431
+ CoerceTestEmailQueryType ||= GraphQL::ObjectType.define do
432
+ name "Query"
433
+ description "The query root of this schema"
434
+
435
+ field :email do
436
+ type CoerceTestEmailType
437
+ argument :value, CoerceTestEmailType
438
+ resolve ->(obj, args, ctx) { args[:value] }
439
+ end
440
+ end
441
+
442
+ GraphQL::Schema.define do
443
+ query CoerceTestEmailQueryType
444
+ end
445
+ }
446
+
447
+ let(:query_string) {%|
448
+ query {
449
+ email(value: "a")
450
+ }
451
+ |}
452
+
453
+ describe "with a shallow coercion" do
454
+ it "sets error extensions code from a CoercionError if raised" do
455
+ assert_equal 1, errors.length
456
+
457
+ assert_includes errors, {
458
+ "message"=> "Invalid email address",
459
+ "locations"=>[{"line"=>3, "column"=>9}],
460
+ "path"=>["query", "email", "value"],
461
+ "extensions"=>{"code"=>"invalid_email_address", "typeName"=>"CoercionError"}
462
+ }
463
+ end
464
+ end
465
+ end
413
466
  end
@@ -404,6 +404,14 @@ module Dummy
404
404
  ]
405
405
  end
406
406
 
407
+ field :multiple_errors_on_non_nullable_list_field, [String], null: false
408
+ def multiple_errors_on_non_nullable_list_field
409
+ [
410
+ GraphQL::ExecutionError.new("The first error message for a field defined to return a list of strings."),
411
+ GraphQL::ExecutionError.new("The second error message for a field defined to return a list of strings.")
412
+ ]
413
+ end
414
+
407
415
  field :execution_error_with_options, Integer, null: true
408
416
  def execution_error_with_options
409
417
  GraphQL::ExecutionError.new("Permission Denied!", options: { "code" => "permission_denied" })
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: graphql
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.9.10
4
+ version: 1.9.11
5
5
  platform: ruby
6
6
  authors:
7
7
  - Robert Mosolgo
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-08-20 00:00:00.000000000 Z
11
+ date: 2019-08-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: benchmark-ips
@@ -704,7 +704,6 @@ files:
704
704
  - lib/graphql/version.rb
705
705
  - readme.md
706
706
  - spec/dummy/Gemfile
707
- - spec/dummy/Gemfile.lock
708
707
  - spec/dummy/README.md
709
708
  - spec/dummy/Rakefile
710
709
  - spec/dummy/app/assets/config/manifest.js
@@ -743,7 +742,6 @@ files:
743
742
  - spec/dummy/config/puma.rb
744
743
  - spec/dummy/config/routes.rb
745
744
  - spec/dummy/config/secrets.yml
746
- - spec/dummy/log/test.log
747
745
  - spec/dummy/package.json
748
746
  - spec/dummy/public/404.html
749
747
  - spec/dummy/public/422.html
@@ -755,26 +753,6 @@ files:
755
753
  - spec/dummy/test/application_system_test_case.rb
756
754
  - spec/dummy/test/system/action_cable_subscription_test.rb
757
755
  - spec/dummy/test/test_helper.rb
758
- - spec/dummy/tmp/cache/assets/sprockets/v3.0/4w/4wzXRZrAkwKdgYaSE0pid5eB-fer8vSfSku_NPg4rMA.cache
759
- - spec/dummy/tmp/cache/assets/sprockets/v3.0/7I/7IHVBiJT06QSpgLpLoJIxboQ0B-D_tMTxsvoezBTV3Q.cache
760
- - spec/dummy/tmp/cache/assets/sprockets/v3.0/8w/8wY_SKagj8wHuwGNAAf6JnQ8joMbC6cEYpHrTAI8Urc.cache
761
- - spec/dummy/tmp/cache/assets/sprockets/v3.0/AK/AKzz1u6bGb4auXcrObA_g5LL-oV0ejNGa448AgAi_WQ.cache
762
- - spec/dummy/tmp/cache/assets/sprockets/v3.0/ET/ETW4uxvaYpruL8y6_ZptUH82ZowMaHIqvg5WexBFdEM.cache
763
- - spec/dummy/tmp/cache/assets/sprockets/v3.0/F1/F1TWpjjyA56k9Z90n5B3xRn7DUdGjX73QCkYC6k07JQ.cache
764
- - spec/dummy/tmp/cache/assets/sprockets/v3.0/F8/F8MUNRzORGFgr329fNM0xLaoWCXdv3BIalT7dsvLfjs.cache
765
- - spec/dummy/tmp/cache/assets/sprockets/v3.0/KB/KB07ZaKNC5uXJ7TjLi-WqnY6g7dq8wWp_8N3HNjBNxg.cache
766
- - spec/dummy/tmp/cache/assets/sprockets/v3.0/Ms/MsKSimH_UCB-H1tLvDABDHuvGciuoW6kVqQWDrXU5FQ.cache
767
- - spec/dummy/tmp/cache/assets/sprockets/v3.0/Mt/Mtci-Kim50aPOmeClD4AIicKn1d1WJ0n454IjSd94sk.cache
768
- - spec/dummy/tmp/cache/assets/sprockets/v3.0/QH/QHt3Tc1Y6M66Oo_pDuMyWrQNs4Pp3SMeZR5K1wJj2Ts.cache
769
- - spec/dummy/tmp/cache/assets/sprockets/v3.0/XU/XU4k1OXnfMils5SrirorPvDSyDSqiOWLZNtmAH1HH8k.cache
770
- - spec/dummy/tmp/cache/assets/sprockets/v3.0/ZI/ZIof7mZxWWCnraIFOCuV6a8QRWzKJXJnx2Xd7C0ZyX0.cache
771
- - spec/dummy/tmp/cache/assets/sprockets/v3.0/cG/cGc_puuPS5pZKgUcy1Y_i1L6jl5UtsiIrMH59rTzR6c.cache
772
- - spec/dummy/tmp/cache/assets/sprockets/v3.0/df/dfro_B6bx3KP1Go-7jEOqqZ2j4hVRseXIc3es9PKQno.cache
773
- - spec/dummy/tmp/cache/assets/sprockets/v3.0/jO/jO1DfbqnG0mTULsjJJANc3fefrG2zt7DIMmcptMT628.cache
774
- - spec/dummy/tmp/cache/assets/sprockets/v3.0/pE/pE7gO6pQ-z187Swb4hT554wmqsq-cNzgPWLrCz-LQQQ.cache
775
- - spec/dummy/tmp/cache/assets/sprockets/v3.0/r9/r9iU1l58a6rxkZSW5RSC52_tD-_UQuHxoMVnkfJ7Mhs.cache
776
- - spec/dummy/tmp/cache/assets/sprockets/v3.0/xi/xitPPFfPIyDMpaznV0sBBcw8eSCV8PJcLLWin78sCgE.cache
777
- - spec/dummy/tmp/screenshots/failures_test_it_handles_subscriptions.png
778
756
  - spec/fixtures/upgrader/account.original.rb
779
757
  - spec/fixtures/upgrader/account.transformed.rb
780
758
  - spec/fixtures/upgrader/blame_range.original.rb
@@ -984,7 +962,6 @@ files:
984
962
  - spec/integration/rails/graphql/schema_spec.rb
985
963
  - spec/integration/rails/graphql/tracing/active_support_notifications_tracing_spec.rb
986
964
  - spec/integration/rails/spec_helper.rb
987
- - spec/integration/tmp/app/graphql/types/page_type.rb
988
965
  - spec/spec_helper.rb
989
966
  - spec/support/dummy/data.rb
990
967
  - spec/support/dummy/schema.rb
@@ -1026,7 +1003,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
1026
1003
  - !ruby/object:Gem::Version
1027
1004
  version: '0'
1028
1005
  requirements: []
1029
- rubygems_version: 3.0.3
1006
+ rubygems_version: 3.0.2
1030
1007
  signing_key:
1031
1008
  specification_version: 4
1032
1009
  summary: A GraphQL language and runtime for Ruby
@@ -1082,33 +1059,10 @@ test_files:
1082
1059
  - spec/dummy/public/robots.txt
1083
1060
  - spec/dummy/package.json
1084
1061
  - spec/dummy/Gemfile
1085
- - spec/dummy/log/test.log
1086
- - spec/dummy/Gemfile.lock
1087
- - spec/dummy/tmp/screenshots/failures_test_it_handles_subscriptions.png
1088
- - spec/dummy/tmp/cache/assets/sprockets/v3.0/pE/pE7gO6pQ-z187Swb4hT554wmqsq-cNzgPWLrCz-LQQQ.cache
1089
- - spec/dummy/tmp/cache/assets/sprockets/v3.0/Ms/MsKSimH_UCB-H1tLvDABDHuvGciuoW6kVqQWDrXU5FQ.cache
1090
- - spec/dummy/tmp/cache/assets/sprockets/v3.0/Mt/Mtci-Kim50aPOmeClD4AIicKn1d1WJ0n454IjSd94sk.cache
1091
- - spec/dummy/tmp/cache/assets/sprockets/v3.0/KB/KB07ZaKNC5uXJ7TjLi-WqnY6g7dq8wWp_8N3HNjBNxg.cache
1092
- - spec/dummy/tmp/cache/assets/sprockets/v3.0/df/dfro_B6bx3KP1Go-7jEOqqZ2j4hVRseXIc3es9PKQno.cache
1093
- - spec/dummy/tmp/cache/assets/sprockets/v3.0/AK/AKzz1u6bGb4auXcrObA_g5LL-oV0ejNGa448AgAi_WQ.cache
1094
- - spec/dummy/tmp/cache/assets/sprockets/v3.0/cG/cGc_puuPS5pZKgUcy1Y_i1L6jl5UtsiIrMH59rTzR6c.cache
1095
- - spec/dummy/tmp/cache/assets/sprockets/v3.0/jO/jO1DfbqnG0mTULsjJJANc3fefrG2zt7DIMmcptMT628.cache
1096
- - spec/dummy/tmp/cache/assets/sprockets/v3.0/xi/xitPPFfPIyDMpaznV0sBBcw8eSCV8PJcLLWin78sCgE.cache
1097
- - spec/dummy/tmp/cache/assets/sprockets/v3.0/r9/r9iU1l58a6rxkZSW5RSC52_tD-_UQuHxoMVnkfJ7Mhs.cache
1098
- - spec/dummy/tmp/cache/assets/sprockets/v3.0/XU/XU4k1OXnfMils5SrirorPvDSyDSqiOWLZNtmAH1HH8k.cache
1099
- - spec/dummy/tmp/cache/assets/sprockets/v3.0/QH/QHt3Tc1Y6M66Oo_pDuMyWrQNs4Pp3SMeZR5K1wJj2Ts.cache
1100
- - spec/dummy/tmp/cache/assets/sprockets/v3.0/4w/4wzXRZrAkwKdgYaSE0pid5eB-fer8vSfSku_NPg4rMA.cache
1101
- - spec/dummy/tmp/cache/assets/sprockets/v3.0/ZI/ZIof7mZxWWCnraIFOCuV6a8QRWzKJXJnx2Xd7C0ZyX0.cache
1102
- - spec/dummy/tmp/cache/assets/sprockets/v3.0/ET/ETW4uxvaYpruL8y6_ZptUH82ZowMaHIqvg5WexBFdEM.cache
1103
- - spec/dummy/tmp/cache/assets/sprockets/v3.0/F1/F1TWpjjyA56k9Z90n5B3xRn7DUdGjX73QCkYC6k07JQ.cache
1104
- - spec/dummy/tmp/cache/assets/sprockets/v3.0/F8/F8MUNRzORGFgr329fNM0xLaoWCXdv3BIalT7dsvLfjs.cache
1105
- - spec/dummy/tmp/cache/assets/sprockets/v3.0/7I/7IHVBiJT06QSpgLpLoJIxboQ0B-D_tMTxsvoezBTV3Q.cache
1106
- - spec/dummy/tmp/cache/assets/sprockets/v3.0/8w/8wY_SKagj8wHuwGNAAf6JnQ8joMbC6cEYpHrTAI8Urc.cache
1107
1062
  - spec/integration/mongoid/spec_helper.rb
1108
1063
  - spec/integration/mongoid/star_trek/schema.rb
1109
1064
  - spec/integration/mongoid/star_trek/data.rb
1110
1065
  - spec/integration/mongoid/graphql/relay/mongo_relation_connection_spec.rb
1111
- - spec/integration/tmp/app/graphql/types/page_type.rb
1112
1066
  - spec/integration/rails/spec_helper.rb
1113
1067
  - spec/integration/rails/data.rb
1114
1068
  - spec/integration/rails/graphql/tracing/active_support_notifications_tracing_spec.rb
@@ -1,157 +0,0 @@
1
- PATH
2
- remote: /Users/rmosolgo/code/graphql-ruby
3
- specs:
4
- graphql (1.9.0.pre2)
5
-
6
- GEM
7
- remote: https://rubygems.org/
8
- specs:
9
- actioncable (5.2.1)
10
- actionpack (= 5.2.1)
11
- nio4r (~> 2.0)
12
- websocket-driver (>= 0.6.1)
13
- actionmailer (5.2.1)
14
- actionpack (= 5.2.1)
15
- actionview (= 5.2.1)
16
- activejob (= 5.2.1)
17
- mail (~> 2.5, >= 2.5.4)
18
- rails-dom-testing (~> 2.0)
19
- actionpack (5.2.1)
20
- actionview (= 5.2.1)
21
- activesupport (= 5.2.1)
22
- rack (~> 2.0)
23
- rack-test (>= 0.6.3)
24
- rails-dom-testing (~> 2.0)
25
- rails-html-sanitizer (~> 1.0, >= 1.0.2)
26
- actionview (5.2.1)
27
- activesupport (= 5.2.1)
28
- builder (~> 3.1)
29
- erubi (~> 1.4)
30
- rails-dom-testing (~> 2.0)
31
- rails-html-sanitizer (~> 1.0, >= 1.0.3)
32
- activejob (5.2.1)
33
- activesupport (= 5.2.1)
34
- globalid (>= 0.3.6)
35
- activemodel (5.2.1)
36
- activesupport (= 5.2.1)
37
- activerecord (5.2.1)
38
- activemodel (= 5.2.1)
39
- activesupport (= 5.2.1)
40
- arel (>= 9.0)
41
- activestorage (5.2.1)
42
- actionpack (= 5.2.1)
43
- activerecord (= 5.2.1)
44
- marcel (~> 0.3.1)
45
- activesupport (5.2.1)
46
- concurrent-ruby (~> 1.0, >= 1.0.2)
47
- i18n (>= 0.7, < 2)
48
- minitest (~> 5.1)
49
- tzinfo (~> 1.1)
50
- addressable (2.5.2)
51
- public_suffix (>= 2.0.2, < 4.0)
52
- arel (9.0.0)
53
- builder (3.2.3)
54
- capybara (3.7.2)
55
- addressable
56
- mini_mime (>= 0.1.3)
57
- nokogiri (~> 1.8)
58
- rack (>= 1.6.0)
59
- rack-test (>= 0.6.3)
60
- xpath (~> 3.1)
61
- childprocess (0.9.0)
62
- ffi (~> 1.0, >= 1.0.11)
63
- concurrent-ruby (1.0.5)
64
- crass (1.0.4)
65
- erubi (1.7.1)
66
- ffi (1.9.25)
67
- globalid (0.4.1)
68
- activesupport (>= 4.2.0)
69
- i18n (1.1.0)
70
- concurrent-ruby (~> 1.0)
71
- listen (3.1.5)
72
- rb-fsevent (~> 0.9, >= 0.9.4)
73
- rb-inotify (~> 0.9, >= 0.9.7)
74
- ruby_dep (~> 1.2)
75
- loofah (2.2.2)
76
- crass (~> 1.0.2)
77
- nokogiri (>= 1.5.9)
78
- mail (2.7.0)
79
- mini_mime (>= 0.1.1)
80
- marcel (0.3.3)
81
- mimemagic (~> 0.3.2)
82
- method_source (0.9.0)
83
- mimemagic (0.3.2)
84
- mini_mime (1.0.1)
85
- mini_portile2 (2.3.0)
86
- minitest (5.11.3)
87
- nio4r (2.3.1)
88
- nokogiri (1.8.4)
89
- mini_portile2 (~> 2.3.0)
90
- public_suffix (3.0.3)
91
- puma (3.12.0)
92
- rack (2.0.5)
93
- rack-test (1.1.0)
94
- rack (>= 1.0, < 3)
95
- rails (5.2.1)
96
- actioncable (= 5.2.1)
97
- actionmailer (= 5.2.1)
98
- actionpack (= 5.2.1)
99
- actionview (= 5.2.1)
100
- activejob (= 5.2.1)
101
- activemodel (= 5.2.1)
102
- activerecord (= 5.2.1)
103
- activestorage (= 5.2.1)
104
- activesupport (= 5.2.1)
105
- bundler (>= 1.3.0)
106
- railties (= 5.2.1)
107
- sprockets-rails (>= 2.0.0)
108
- rails-dom-testing (2.0.3)
109
- activesupport (>= 4.2.0)
110
- nokogiri (>= 1.6)
111
- rails-html-sanitizer (1.0.4)
112
- loofah (~> 2.2, >= 2.2.2)
113
- railties (5.2.1)
114
- actionpack (= 5.2.1)
115
- activesupport (= 5.2.1)
116
- method_source
117
- rake (>= 0.8.7)
118
- thor (>= 0.19.0, < 2.0)
119
- rake (12.3.1)
120
- rb-fsevent (0.10.3)
121
- rb-inotify (0.9.10)
122
- ffi (>= 0.5.0, < 2)
123
- ruby_dep (1.5.0)
124
- rubyzip (1.2.2)
125
- selenium-webdriver (3.14.0)
126
- childprocess (~> 0.5)
127
- rubyzip (~> 1.2)
128
- sprockets (3.7.2)
129
- concurrent-ruby (~> 1.0)
130
- rack (> 1, < 3)
131
- sprockets-rails (3.2.1)
132
- actionpack (>= 4.0)
133
- activesupport (>= 4.0)
134
- sprockets (>= 3.0.0)
135
- thor (0.20.0)
136
- thread_safe (0.3.6)
137
- tzinfo (1.2.5)
138
- thread_safe (~> 0.1)
139
- websocket-driver (0.7.0)
140
- websocket-extensions (>= 0.1.0)
141
- websocket-extensions (0.1.3)
142
- xpath (3.1.0)
143
- nokogiri (~> 1.8)
144
-
145
- PLATFORMS
146
- ruby
147
-
148
- DEPENDENCIES
149
- capybara
150
- graphql!
151
- listen
152
- puma
153
- rails (~> 5.2.1)
154
- selenium-webdriver
155
-
156
- BUNDLED WITH
157
- 2.0.1
@@ -1,199 +0,0 @@
1
- -----------------------------------------------------------
2
- ActionCableSubscriptionsTest: test_it_handles_subscriptions
3
- -----------------------------------------------------------
4
- Started GET "/" for 127.0.0.1 at 2018-09-29 14:31:04 -0400
5
- Processing by PagesController#show as HTML
6
- Rendering pages/show.html within layouts/application
7
- Rendered pages/show.html within layouts/application (1.3ms)
8
- Completed 200 OK in 211ms (Views: 208.8ms)
9
- Started GET "/assets/application-03569c14ba2ebaf689cf2b8eecd6aba17af7402d872a3eca6c4ec8fac4eb31e9.js" for 127.0.0.1 at 2018-09-29 14:31:05 -0400
10
- Started GET "/cable" for 127.0.0.1 at 2018-09-29 14:31:05 -0400
11
- Started GET "/cable/" [WebSocket] for 127.0.0.1 at 2018-09-29 14:31:05 -0400
12
- Successfully upgraded to WebSocket (REQUEST_METHOD: GET, HTTP_CONNECTION: Upgrade, HTTP_UPGRADE: websocket)
13
- GraphqlChannel is transmitting the subscription confirmation
14
- GraphqlChannel is transmitting the subscription confirmation
15
- GraphqlChannel#execute({"query"=>"subscription($id: ID!) { payload(id: $id) { value } }", "variables"=>{"id"=>"updates-1"}})
16
- GraphqlChannel#execute({"query"=>"subscription($id: ID!) { payload(id: $id) { value } }", "variables"=>{"id"=>"updates-2"}})
17
- Could not execute command from ({"command"=>"message", "identifier"=>"{\"channel\":\"GraphqlChannel\",\"id\":\"1662699726a\"}", "data"=>"{\"query\":\"subscription($id: ID!) { payload(id: $id) { value } }\",\"variables\":{\"id\":\"updates-1\"},\"action\":\"execute\"}"}) [ArgumentError - wrong number of arguments (given 1, expected 0)]: /Users/rmosolgo/code/graphql-ruby/spec/dummy/app/channels/graphql_channel.rb:19:in `payload' | /Users/rmosolgo/code/graphql-ruby/lib/graphql/schema/field.rb:524:in `public_send' | /Users/rmosolgo/code/graphql-ruby/lib/graphql/schema/field.rb:524:in `block in public_send_field' | /Users/rmosolgo/code/graphql-ruby/lib/graphql/schema/field.rb:536:in `with_extensions' | /Users/rmosolgo/code/graphql-ruby/lib/graphql/schema/field.rb:515:in `public_send_field'
18
- Could not execute command from ({"command"=>"message", "identifier"=>"{\"channel\":\"GraphqlChannel\",\"id\":\"166269a4ccc\"}", "data"=>"{\"query\":\"subscription($id: ID!) { payload(id: $id) { value } }\",\"variables\":{\"id\":\"updates-2\"},\"action\":\"execute\"}"}) [ArgumentError - wrong number of arguments (given 1, expected 0)]: /Users/rmosolgo/code/graphql-ruby/spec/dummy/app/channels/graphql_channel.rb:19:in `payload' | /Users/rmosolgo/code/graphql-ruby/lib/graphql/schema/field.rb:524:in `public_send' | /Users/rmosolgo/code/graphql-ruby/lib/graphql/schema/field.rb:524:in `block in public_send_field' | /Users/rmosolgo/code/graphql-ruby/lib/graphql/schema/field.rb:536:in `with_extensions' | /Users/rmosolgo/code/graphql-ruby/lib/graphql/schema/field.rb:515:in `public_send_field'
19
- GraphqlChannel#make_trigger({"id"=>"updates-1", "value"=>1})
20
- [ActionCable] Broadcasting to graphql-event::payload:id:updates-1: "{\"__gid__\":\"Z2lkOi8vZHVtbXkvR3JhcGhxbENoYW5uZWw6OkV4YW1wbGVQYXlsb2FkLzE\"}"
21
- GraphqlChannel#make_trigger({"id"=>"updates-1", "value"=>2})
22
- [ActionCable] Broadcasting to graphql-event::payload:id:updates-1: "{\"__gid__\":\"Z2lkOi8vZHVtbXkvR3JhcGhxbENoYW5uZWw6OkV4YW1wbGVQYXlsb2FkLzI\"}"
23
- GraphqlChannel#make_trigger({"id"=>"updates-1", "value"=>3})
24
- [ActionCable] Broadcasting to graphql-event::payload:id:updates-1: "{\"__gid__\":\"Z2lkOi8vZHVtbXkvR3JhcGhxbENoYW5uZWw6OkV4YW1wbGVQYXlsb2FkLzM\"}"
25
- Finished "/cable/" [WebSocket] for 127.0.0.1 at 2018-09-29 14:31:08 -0400
26
- -----------------------------------------------------------
27
- ActionCableSubscriptionsTest: test_it_handles_subscriptions
28
- -----------------------------------------------------------
29
- Started GET "/" for 127.0.0.1 at 2018-09-29 14:31:34 -0400
30
- Processing by PagesController#show as HTML
31
- Rendering pages/show.html within layouts/application
32
- Rendered pages/show.html within layouts/application (1.2ms)
33
- Completed 200 OK in 209ms (Views: 206.7ms)
34
- Started GET "/assets/application-03569c14ba2ebaf689cf2b8eecd6aba17af7402d872a3eca6c4ec8fac4eb31e9.js" for 127.0.0.1 at 2018-09-29 14:31:34 -0400
35
- Started GET "/cable" for 127.0.0.1 at 2018-09-29 14:31:34 -0400
36
- Started GET "/cable/" [WebSocket] for 127.0.0.1 at 2018-09-29 14:31:34 -0400
37
- Successfully upgraded to WebSocket (REQUEST_METHOD: GET, HTTP_CONNECTION: Upgrade, HTTP_UPGRADE: websocket)
38
- GraphqlChannel is transmitting the subscription confirmation
39
- GraphqlChannel is transmitting the subscription confirmation
40
- GraphqlChannel#execute({"query"=>"subscription($id: ID!) { payload(id: $id) { value } }", "variables"=>{"id"=>"updates-1"}})
41
- GraphqlChannel transmitting {:result=>{"data"=>nil}, :more=>true}
42
- GraphqlChannel#execute({"query"=>"subscription($id: ID!) { payload(id: $id) { value } }", "variables"=>{"id"=>"updates-2"}})
43
- GraphqlChannel transmitting {:result=>{"data"=>nil}, :more=>true}
44
- GraphqlChannel is streaming from graphql-subscription:d39b7767-bfcf-487f-9985-a99e0074a99c
45
- GraphqlChannel is streaming from graphql-subscription:95a2d0a0-e2a1-47d2-b9c4-a305e9532f41
46
- GraphqlChannel is streaming from graphql-event::payload:id:updates-1
47
- GraphqlChannel is streaming from graphql-event::payload:id:updates-2
48
- GraphqlChannel#make_trigger({"id"=>"updates-1", "value"=>1})
49
- [ActionCable] Broadcasting to graphql-event::payload:id:updates-1: "{\"__gid__\":\"Z2lkOi8vZHVtbXkvR3JhcGhxbENoYW5uZWw6OkV4YW1wbGVQYXlsb2FkLzE\"}"
50
- [ActionCable] Broadcasting to graphql-subscription:d39b7767-bfcf-487f-9985-a99e0074a99c: {:result=>{"data"=>{"payload"=>{"value"=>1}}}, :more=>true}
51
- GraphqlChannel transmitting {"result"=>{"data"=>{"payload"=>{"value"=>1}}}, "more"=>true} (via streamed from graphql-subscription:d39b7767-bfcf-487f-9985-a99e0074a99c)
52
- GraphqlChannel#make_trigger({"id"=>"updates-1", "value"=>2})
53
- [ActionCable] Broadcasting to graphql-event::payload:id:updates-1: "{\"__gid__\":\"Z2lkOi8vZHVtbXkvR3JhcGhxbENoYW5uZWw6OkV4YW1wbGVQYXlsb2FkLzI\"}"
54
- [ActionCable] Broadcasting to graphql-subscription:d39b7767-bfcf-487f-9985-a99e0074a99c: {:result=>{"data"=>{"payload"=>{"value"=>2}}}, :more=>true}
55
- GraphqlChannel transmitting {"result"=>{"data"=>{"payload"=>{"value"=>2}}}, "more"=>true} (via streamed from graphql-subscription:d39b7767-bfcf-487f-9985-a99e0074a99c)
56
- GraphqlChannel#make_trigger({"id"=>"updates-1", "value"=>3})
57
- [ActionCable] Broadcasting to graphql-event::payload:id:updates-1: "{\"__gid__\":\"Z2lkOi8vZHVtbXkvR3JhcGhxbENoYW5uZWw6OkV4YW1wbGVQYXlsb2FkLzM\"}"
58
- [ActionCable] Broadcasting to graphql-subscription:d39b7767-bfcf-487f-9985-a99e0074a99c: {:result=>{"data"=>{"payload"=>{"value"=>3}}}, :more=>true}
59
- GraphqlChannel transmitting {"result"=>{"data"=>{"payload"=>{"value"=>3}}}, "more"=>true} (via streamed from graphql-subscription:d39b7767-bfcf-487f-9985-a99e0074a99c)
60
- GraphqlChannel#make_trigger({"id"=>"updates-2", "value"=>1})
61
- [ActionCable] Broadcasting to graphql-event::payload:id:updates-2: "{\"__gid__\":\"Z2lkOi8vZHVtbXkvR3JhcGhxbENoYW5uZWw6OkV4YW1wbGVQYXlsb2FkLzE\"}"
62
- [ActionCable] Broadcasting to graphql-subscription:95a2d0a0-e2a1-47d2-b9c4-a305e9532f41: {:result=>{"data"=>{"payload"=>{"value"=>1}}}, :more=>true}
63
- GraphqlChannel transmitting {"result"=>{"data"=>{"payload"=>{"value"=>1}}}, "more"=>true} (via streamed from graphql-subscription:95a2d0a0-e2a1-47d2-b9c4-a305e9532f41)
64
- GraphqlChannel#make_trigger({"id"=>"updates-2", "value"=>2})
65
- [ActionCable] Broadcasting to graphql-event::payload:id:updates-2: "{\"__gid__\":\"Z2lkOi8vZHVtbXkvR3JhcGhxbENoYW5uZWw6OkV4YW1wbGVQYXlsb2FkLzI\"}"
66
- [ActionCable] Broadcasting to graphql-subscription:95a2d0a0-e2a1-47d2-b9c4-a305e9532f41: {:result=>{"data"=>{"payload"=>{"value"=>2}}}, :more=>true}
67
- GraphqlChannel transmitting {"result"=>{"data"=>{"payload"=>{"value"=>2}}}, "more"=>true} (via streamed from graphql-subscription:95a2d0a0-e2a1-47d2-b9c4-a305e9532f41)
68
- Unsubscribing from channel: {"channel":"GraphqlChannel","id":"166269a8bd0"}
69
- GraphqlChannel stopped streaming from graphql-subscription:d39b7767-bfcf-487f-9985-a99e0074a99c
70
- GraphqlChannel stopped streaming from graphql-event::payload:id:updates-1
71
- Could not execute command from ({"command"=>"message", "identifier"=>"{\"channel\":\"GraphqlChannel\",\"id\":\"166269a8bd0\"}", "data"=>"{\"id\":\"updates-1\",\"value\":4,\"action\":\"make_trigger\"}"}) [RuntimeError - Unable to find subscription with identifier: {"channel":"GraphqlChannel","id":"166269a8bd0"}]: /Users/rmosolgo/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/actioncable-5.2.1/lib/action_cable/connection/subscriptions.rb:78:in `find' | /Users/rmosolgo/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/actioncable-5.2.1/lib/action_cable/connection/subscriptions.rb:55:in `perform_action' | /Users/rmosolgo/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/actioncable-5.2.1/lib/action_cable/connection/subscriptions.rb:19:in `execute_command' | /Users/rmosolgo/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/actioncable-5.2.1/lib/action_cable/connection/base.rb:87:in `dispatch_websocket_message' | /Users/rmosolgo/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/actioncable-5.2.1/lib/action_cable/server/worker.rb:60:in `block in invoke'
72
- GraphqlChannel#make_trigger({"id"=>"updates-2", "value"=>3})
73
- [ActionCable] Broadcasting to graphql-event::payload:id:updates-2: "{\"__gid__\":\"Z2lkOi8vZHVtbXkvR3JhcGhxbENoYW5uZWw6OkV4YW1wbGVQYXlsb2FkLzM\"}"
74
- [ActionCable] Broadcasting to graphql-subscription:95a2d0a0-e2a1-47d2-b9c4-a305e9532f41: {:result=>{"data"=>{"payload"=>{"value"=>3}}}, :more=>true}
75
- GraphqlChannel transmitting {"result"=>{"data"=>{"payload"=>{"value"=>3}}}, "more"=>true} (via streamed from graphql-subscription:95a2d0a0-e2a1-47d2-b9c4-a305e9532f41)
76
- GraphqlChannel#make_trigger({"id"=>"updates-2", "value"=>4})
77
- [ActionCable] Broadcasting to graphql-event::payload:id:updates-2: "4x"
78
- [ActionCable] Broadcasting to graphql-subscription:95a2d0a0-e2a1-47d2-b9c4-a305e9532f41: {:result=>{"data"=>{"payload"=>{"value"=>400}}}, :more=>true}
79
- GraphqlChannel transmitting {"result"=>{"data"=>{"payload"=>{"value"=>400}}}, "more"=>true} (via streamed from graphql-subscription:95a2d0a0-e2a1-47d2-b9c4-a305e9532f41)
80
- Finished "/cable/" [WebSocket] for 127.0.0.1 at 2018-09-29 14:31:36 -0400
81
- GraphqlChannel stopped streaming from graphql-subscription:95a2d0a0-e2a1-47d2-b9c4-a305e9532f41
82
- GraphqlChannel stopped streaming from graphql-event::payload:id:updates-2
83
- -----------------------------------------------------------
84
- ActionCableSubscriptionsTest: test_it_handles_subscriptions
85
- -----------------------------------------------------------
86
- Started GET "/" for 127.0.0.1 at 2018-09-29 14:31:58 -0400
87
- Processing by PagesController#show as HTML
88
- Rendering pages/show.html within layouts/application
89
- Rendered pages/show.html within layouts/application (1.2ms)
90
- Completed 200 OK in 244ms (Views: 241.4ms)
91
- Started GET "/assets/application-03569c14ba2ebaf689cf2b8eecd6aba17af7402d872a3eca6c4ec8fac4eb31e9.js" for 127.0.0.1 at 2018-09-29 14:31:58 -0400
92
- Started GET "/cable" for 127.0.0.1 at 2018-09-29 14:31:58 -0400
93
- Started GET "/cable/" [WebSocket] for 127.0.0.1 at 2018-09-29 14:31:58 -0400
94
- Successfully upgraded to WebSocket (REQUEST_METHOD: GET, HTTP_CONNECTION: Upgrade, HTTP_UPGRADE: websocket)
95
- GraphqlChannel is transmitting the subscription confirmation
96
- GraphqlChannel is transmitting the subscription confirmation
97
- GraphqlChannel#execute({"query"=>"subscription($id: ID!) { payload(id: $id) { value } }", "variables"=>{"id"=>"updates-1"}})
98
- GraphqlChannel transmitting {:result=>{"data"=>{}}, :more=>true}
99
- GraphqlChannel#execute({"query"=>"subscription($id: ID!) { payload(id: $id) { value } }", "variables"=>{"id"=>"updates-2"}})
100
- GraphqlChannel transmitting {:result=>{"data"=>{}}, :more=>true}
101
- GraphqlChannel is streaming from graphql-subscription:2b19317b-9279-4b20-95fc-adee4a81161b
102
- GraphqlChannel is streaming from graphql-event::payload:id:updates-1
103
- GraphqlChannel is streaming from graphql-subscription:5f944467-ccfa-4765-9b4a-3bccb29b0b6b
104
- GraphqlChannel is streaming from graphql-event::payload:id:updates-2
105
- GraphqlChannel#make_trigger({"id"=>"updates-1", "value"=>1})
106
- [ActionCable] Broadcasting to graphql-event::payload:id:updates-1: "{\"__gid__\":\"Z2lkOi8vZHVtbXkvR3JhcGhxbENoYW5uZWw6OkV4YW1wbGVQYXlsb2FkLzE\"}"
107
- [ActionCable] Broadcasting to graphql-subscription:2b19317b-9279-4b20-95fc-adee4a81161b: {:result=>{"data"=>{"payload"=>{"value"=>1}}}, :more=>true}
108
- GraphqlChannel transmitting {"result"=>{"data"=>{"payload"=>{"value"=>1}}}, "more"=>true} (via streamed from graphql-subscription:2b19317b-9279-4b20-95fc-adee4a81161b)
109
- GraphqlChannel#make_trigger({"id"=>"updates-1", "value"=>2})
110
- [ActionCable] Broadcasting to graphql-event::payload:id:updates-1: "{\"__gid__\":\"Z2lkOi8vZHVtbXkvR3JhcGhxbENoYW5uZWw6OkV4YW1wbGVQYXlsb2FkLzI\"}"
111
- [ActionCable] Broadcasting to graphql-subscription:2b19317b-9279-4b20-95fc-adee4a81161b: {:result=>{"data"=>{"payload"=>{"value"=>2}}}, :more=>true}
112
- GraphqlChannel transmitting {"result"=>{"data"=>{"payload"=>{"value"=>2}}}, "more"=>true} (via streamed from graphql-subscription:2b19317b-9279-4b20-95fc-adee4a81161b)
113
- GraphqlChannel#make_trigger({"id"=>"updates-1", "value"=>3})
114
- [ActionCable] Broadcasting to graphql-event::payload:id:updates-1: "{\"__gid__\":\"Z2lkOi8vZHVtbXkvR3JhcGhxbENoYW5uZWw6OkV4YW1wbGVQYXlsb2FkLzM\"}"
115
- [ActionCable] Broadcasting to graphql-subscription:2b19317b-9279-4b20-95fc-adee4a81161b: {:result=>{"data"=>{"payload"=>{"value"=>3}}}, :more=>true}
116
- GraphqlChannel transmitting {"result"=>{"data"=>{"payload"=>{"value"=>3}}}, "more"=>true} (via streamed from graphql-subscription:2b19317b-9279-4b20-95fc-adee4a81161b)
117
- GraphqlChannel#make_trigger({"id"=>"updates-2", "value"=>1})
118
- [ActionCable] Broadcasting to graphql-event::payload:id:updates-2: "{\"__gid__\":\"Z2lkOi8vZHVtbXkvR3JhcGhxbENoYW5uZWw6OkV4YW1wbGVQYXlsb2FkLzE\"}"
119
- [ActionCable] Broadcasting to graphql-subscription:5f944467-ccfa-4765-9b4a-3bccb29b0b6b: {:result=>{"data"=>{"payload"=>{"value"=>1}}}, :more=>true}
120
- GraphqlChannel transmitting {"result"=>{"data"=>{"payload"=>{"value"=>1}}}, "more"=>true} (via streamed from graphql-subscription:5f944467-ccfa-4765-9b4a-3bccb29b0b6b)
121
- GraphqlChannel#make_trigger({"id"=>"updates-2", "value"=>2})
122
- [ActionCable] Broadcasting to graphql-event::payload:id:updates-2: "{\"__gid__\":\"Z2lkOi8vZHVtbXkvR3JhcGhxbENoYW5uZWw6OkV4YW1wbGVQYXlsb2FkLzI\"}"
123
- [ActionCable] Broadcasting to graphql-subscription:5f944467-ccfa-4765-9b4a-3bccb29b0b6b: {:result=>{"data"=>{"payload"=>{"value"=>2}}}, :more=>true}
124
- GraphqlChannel transmitting {"result"=>{"data"=>{"payload"=>{"value"=>2}}}, "more"=>true} (via streamed from graphql-subscription:5f944467-ccfa-4765-9b4a-3bccb29b0b6b)
125
- Unsubscribing from channel: {"channel":"GraphqlChannel","id":"166269a7cac"}
126
- GraphqlChannel stopped streaming from graphql-subscription:2b19317b-9279-4b20-95fc-adee4a81161b
127
- GraphqlChannel stopped streaming from graphql-event::payload:id:updates-1
128
- Could not execute command from ({"command"=>"message", "identifier"=>"{\"channel\":\"GraphqlChannel\",\"id\":\"166269a7cac\"}", "data"=>"{\"id\":\"updates-1\",\"value\":4,\"action\":\"make_trigger\"}"}) [RuntimeError - Unable to find subscription with identifier: {"channel":"GraphqlChannel","id":"166269a7cac"}]: /Users/rmosolgo/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/actioncable-5.2.1/lib/action_cable/connection/subscriptions.rb:78:in `find' | /Users/rmosolgo/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/actioncable-5.2.1/lib/action_cable/connection/subscriptions.rb:55:in `perform_action' | /Users/rmosolgo/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/actioncable-5.2.1/lib/action_cable/connection/subscriptions.rb:19:in `execute_command' | /Users/rmosolgo/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/actioncable-5.2.1/lib/action_cable/connection/base.rb:87:in `dispatch_websocket_message' | /Users/rmosolgo/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/actioncable-5.2.1/lib/action_cable/server/worker.rb:60:in `block in invoke'
129
- GraphqlChannel#make_trigger({"id"=>"updates-2", "value"=>3})
130
- [ActionCable] Broadcasting to graphql-event::payload:id:updates-2: "{\"__gid__\":\"Z2lkOi8vZHVtbXkvR3JhcGhxbENoYW5uZWw6OkV4YW1wbGVQYXlsb2FkLzM\"}"
131
- [ActionCable] Broadcasting to graphql-subscription:5f944467-ccfa-4765-9b4a-3bccb29b0b6b: {:result=>{"data"=>{"payload"=>{"value"=>3}}}, :more=>true}
132
- GraphqlChannel transmitting {"result"=>{"data"=>{"payload"=>{"value"=>3}}}, "more"=>true} (via streamed from graphql-subscription:5f944467-ccfa-4765-9b4a-3bccb29b0b6b)
133
- GraphqlChannel#make_trigger({"id"=>"updates-2", "value"=>4})
134
- [ActionCable] Broadcasting to graphql-event::payload:id:updates-2: "4x"
135
- [ActionCable] Broadcasting to graphql-subscription:5f944467-ccfa-4765-9b4a-3bccb29b0b6b: {:result=>{"data"=>{"payload"=>{"value"=>400}}}, :more=>true}
136
- GraphqlChannel transmitting {"result"=>{"data"=>{"payload"=>{"value"=>400}}}, "more"=>true} (via streamed from graphql-subscription:5f944467-ccfa-4765-9b4a-3bccb29b0b6b)
137
- Finished "/cable/" [WebSocket] for 127.0.0.1 at 2018-09-29 14:32:00 -0400
138
- GraphqlChannel stopped streaming from graphql-subscription:5f944467-ccfa-4765-9b4a-3bccb29b0b6b
139
- GraphqlChannel stopped streaming from graphql-event::payload:id:updates-2
140
- -----------------------------------------------------------
141
- ActionCableSubscriptionsTest: test_it_handles_subscriptions
142
- -----------------------------------------------------------
143
- Started GET "/" for 127.0.0.1 at 2018-10-05 11:46:22 -0400
144
- Processing by PagesController#show as HTML
145
- Rendering pages/show.html within layouts/application
146
- Rendered pages/show.html within layouts/application (1.7ms)
147
- Completed 200 OK in 254ms (Views: 251.5ms)
148
- Started GET "/assets/application-03569c14ba2ebaf689cf2b8eecd6aba17af7402d872a3eca6c4ec8fac4eb31e9.js" for 127.0.0.1 at 2018-10-05 11:46:22 -0400
149
- Started GET "/cable" for 127.0.0.1 at 2018-10-05 11:46:22 -0400
150
- Started GET "/cable/" [WebSocket] for 127.0.0.1 at 2018-10-05 11:46:22 -0400
151
- Successfully upgraded to WebSocket (REQUEST_METHOD: GET, HTTP_CONNECTION: Upgrade, HTTP_UPGRADE: websocket)
152
- GraphqlChannel is transmitting the subscription confirmation
153
- GraphqlChannel is transmitting the subscription confirmation
154
- GraphqlChannel#execute({"query"=>"subscription($id: ID!) { payload(id: $id) { value } }", "variables"=>{"id"=>"updates-2"}})
155
- GraphqlChannel#execute({"query"=>"subscription($id: ID!) { payload(id: $id) { value } }", "variables"=>{"id"=>"updates-1"}})
156
- GraphqlChannel transmitting {:result=>{"data"=>nil}, :more=>true}
157
- GraphqlChannel transmitting {:result=>{"data"=>nil}, :more=>true}
158
- GraphqlChannel is streaming from graphql-subscription:6da90bd0-cd94-41db-bf3e-760e37b2873f
159
- GraphqlChannel is streaming from graphql-subscription:c781954b-7b9a-4742-9f9c-69b869d85fad
160
- GraphqlChannel is streaming from graphql-event::payload:id:updates-2
161
- GraphqlChannel is streaming from graphql-event::payload:id:updates-1
162
- GraphqlChannel#make_trigger({"id"=>"updates-1", "value"=>1})
163
- [ActionCable] Broadcasting to graphql-event::payload:id:updates-1: "{\"__gid__\":\"Z2lkOi8vZHVtbXkvR3JhcGhxbENoYW5uZWw6OkV4YW1wbGVQYXlsb2FkLzE\"}"
164
- [ActionCable] Broadcasting to graphql-subscription:6da90bd0-cd94-41db-bf3e-760e37b2873f: {:result=>{"data"=>{"payload"=>{"value"=>1}}}, :more=>true}
165
- GraphqlChannel transmitting {"result"=>{"data"=>{"payload"=>{"value"=>1}}}, "more"=>true} (via streamed from graphql-subscription:6da90bd0-cd94-41db-bf3e-760e37b2873f)
166
- GraphqlChannel#make_trigger({"id"=>"updates-1", "value"=>2})
167
- [ActionCable] Broadcasting to graphql-event::payload:id:updates-1: "{\"__gid__\":\"Z2lkOi8vZHVtbXkvR3JhcGhxbENoYW5uZWw6OkV4YW1wbGVQYXlsb2FkLzI\"}"
168
- [ActionCable] Broadcasting to graphql-subscription:6da90bd0-cd94-41db-bf3e-760e37b2873f: {:result=>{"data"=>{"payload"=>{"value"=>2}}}, :more=>true}
169
- GraphqlChannel transmitting {"result"=>{"data"=>{"payload"=>{"value"=>2}}}, "more"=>true} (via streamed from graphql-subscription:6da90bd0-cd94-41db-bf3e-760e37b2873f)
170
- GraphqlChannel#make_trigger({"id"=>"updates-1", "value"=>3})
171
- [ActionCable] Broadcasting to graphql-event::payload:id:updates-1: "{\"__gid__\":\"Z2lkOi8vZHVtbXkvR3JhcGhxbENoYW5uZWw6OkV4YW1wbGVQYXlsb2FkLzM\"}"
172
- [ActionCable] Broadcasting to graphql-subscription:6da90bd0-cd94-41db-bf3e-760e37b2873f: {:result=>{"data"=>{"payload"=>{"value"=>3}}}, :more=>true}
173
- GraphqlChannel transmitting {"result"=>{"data"=>{"payload"=>{"value"=>3}}}, "more"=>true} (via streamed from graphql-subscription:6da90bd0-cd94-41db-bf3e-760e37b2873f)
174
- GraphqlChannel#make_trigger({"id"=>"updates-2", "value"=>1})
175
- [ActionCable] Broadcasting to graphql-event::payload:id:updates-2: "{\"__gid__\":\"Z2lkOi8vZHVtbXkvR3JhcGhxbENoYW5uZWw6OkV4YW1wbGVQYXlsb2FkLzE\"}"
176
- [ActionCable] Broadcasting to graphql-subscription:c781954b-7b9a-4742-9f9c-69b869d85fad: {:result=>{"data"=>{"payload"=>{"value"=>1}}}, :more=>true}
177
- GraphqlChannel transmitting {"result"=>{"data"=>{"payload"=>{"value"=>1}}}, "more"=>true} (via streamed from graphql-subscription:c781954b-7b9a-4742-9f9c-69b869d85fad)
178
- GraphqlChannel#make_trigger({"id"=>"updates-2", "value"=>2})
179
- [ActionCable] Broadcasting to graphql-event::payload:id:updates-2: "{\"__gid__\":\"Z2lkOi8vZHVtbXkvR3JhcGhxbENoYW5uZWw6OkV4YW1wbGVQYXlsb2FkLzI\"}"
180
- [ActionCable] Broadcasting to graphql-subscription:c781954b-7b9a-4742-9f9c-69b869d85fad: {:result=>{"data"=>{"payload"=>{"value"=>2}}}, :more=>true}
181
- GraphqlChannel transmitting {"result"=>{"data"=>{"payload"=>{"value"=>2}}}, "more"=>true} (via streamed from graphql-subscription:c781954b-7b9a-4742-9f9c-69b869d85fad)
182
- Unsubscribing from channel: {"channel":"GraphqlChannel","id":"16644e966c2"}
183
- GraphqlChannel stopped streaming from graphql-subscription:6da90bd0-cd94-41db-bf3e-760e37b2873f
184
- GraphqlChannel stopped streaming from graphql-event::payload:id:updates-1
185
- Could not execute command from ({"command"=>"message", "identifier"=>"{\"channel\":\"GraphqlChannel\",\"id\":\"16644e966c2\"}", "data"=>"{\"id\":\"updates-1\",\"value\":4,\"action\":\"make_trigger\"}"}) [RuntimeError - Unable to find subscription with identifier: {"channel":"GraphqlChannel","id":"16644e966c2"}]: /Users/rmosolgo/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/actioncable-5.2.1/lib/action_cable/connection/subscriptions.rb:78:in `find' | /Users/rmosolgo/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/actioncable-5.2.1/lib/action_cable/connection/subscriptions.rb:55:in `perform_action' | /Users/rmosolgo/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/actioncable-5.2.1/lib/action_cable/connection/subscriptions.rb:19:in `execute_command' | /Users/rmosolgo/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/actioncable-5.2.1/lib/action_cable/connection/base.rb:87:in `dispatch_websocket_message' | /Users/rmosolgo/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/actioncable-5.2.1/lib/action_cable/server/worker.rb:60:in `block in invoke'
186
- GraphqlChannel#make_trigger({"id"=>"updates-2", "value"=>3})
187
- [ActionCable] Broadcasting to graphql-event::payload:id:updates-2: "{\"__gid__\":\"Z2lkOi8vZHVtbXkvR3JhcGhxbENoYW5uZWw6OkV4YW1wbGVQYXlsb2FkLzM\"}"
188
- [ActionCable] Broadcasting to graphql-subscription:c781954b-7b9a-4742-9f9c-69b869d85fad: {:result=>{"data"=>{"payload"=>{"value"=>3}}}, :more=>true}
189
- GraphqlChannel transmitting {"result"=>{"data"=>{"payload"=>{"value"=>3}}}, "more"=>true} (via streamed from graphql-subscription:c781954b-7b9a-4742-9f9c-69b869d85fad)
190
- GraphqlChannel#make_trigger({"id"=>"updates-2", "value"=>4})
191
- [ActionCable] Broadcasting to graphql-event::payload:id:updates-2: "4x"
192
- [ActionCable] Broadcasting to graphql-subscription:c781954b-7b9a-4742-9f9c-69b869d85fad: {:result=>{"data"=>{"payload"=>{"value"=>400}}}, :more=>true}
193
- GraphqlChannel transmitting {"result"=>{"data"=>{"payload"=>{"value"=>400}}}, "more"=>true} (via streamed from graphql-subscription:c781954b-7b9a-4742-9f9c-69b869d85fad)
194
- Finished "/cable/" [WebSocket] for 127.0.0.1 at 2018-10-05 11:46:25 -0400
195
- GraphqlChannel stopped streaming from graphql-subscription:c781954b-7b9a-4742-9f9c-69b869d85fad
196
- GraphqlChannel stopped streaming from graphql-event::payload:id:updates-2
197
- -----------------------------------------------------------
198
- ActionCableSubscriptionsTest: test_it_handles_subscriptions
199
- -----------------------------------------------------------
@@ -1 +0,0 @@
1
- "%A��G �{h t�l�m�V���NE���f���
@@ -1 +0,0 @@
1
- I"�/Users/rmosolgo/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/actionview-5.2.1/lib/assets/compiled/rails-ujs.js?type=application/javascript&pipeline=self&id=796d21c1f660d0727db2c56f43915a7a091f297126acf936c5ffbbeeae910c17:ET
@@ -1,3 +0,0 @@
1
- [o:Set:
2
- @hash}
3
- I"environment-version:ETTI"environment-paths;TTI"rails-env;TTI"Zprocessors:type=application/javascript&file_type=application/javascript&pipeline=self;TTI"~file-digest:///Users/rmosolgo/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/actionview-5.2.1/lib/assets/compiled/rails-ujs.js;TTF
@@ -1,2 +0,0 @@
1
- [o:Set:
2
- @hash}I"environment-version:ETTI"environment-paths;TTI"rails-env;TTI"Zprocessors:type=application/javascript&file_type=application/javascript&pipeline=self;TTI"8file-digest://app/assets/javascripts/application.js;TTI"$file-digest://app/assets/config;TTI".file-digest://app/assets/config/rails-ujs;TTI")file-digest://app/assets/javascripts;TTI"3file-digest://app/assets/javascripts/rails-ujs;TTI"wfile-digest:///Users/rmosolgo/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/actioncable-5.2.1/lib/assets/compiled;TTI"|file-digest:///Users/rmosolgo/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/actioncable-5.2.1/lib/assets/compiled/rails-ujs;TTI"vfile-digest:///Users/rmosolgo/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/actionview-5.2.1/lib/assets/compiled;TTI"{file-digest:///Users/rmosolgo/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/actionview-5.2.1/lib/assets/compiled/rails-ujs;TTI"~file-digest:///Users/rmosolgo/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/actionview-5.2.1/lib/assets/compiled/rails-ujs.js;TTI"1file-digest://app/assets/config/action_cable;TTI"6file-digest://app/assets/javascripts/action_cable;TTI"file-digest:///Users/rmosolgo/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/actioncable-5.2.1/lib/assets/compiled/action_cable;TTI"�file-digest:///Users/rmosolgo/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/actioncable-5.2.1/lib/assets/compiled/action_cable.js;TTF
@@ -1,2 +0,0 @@
1
- [o:Set:
2
- @hash}I"environment-version:ETTI"environment-paths;TTI"rails-env;TTI"Lprocessors:type=application/javascript&file_type=application/javascript;TTI"8file-digest://app/assets/javascripts/application.js;TTI"Zprocessors:type=application/javascript&file_type=application/javascript&pipeline=self;TTI"~file-digest:///Users/rmosolgo/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/actionview-5.2.1/lib/assets/compiled/rails-ujs.js;TTI"�file-digest:///Users/rmosolgo/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/actioncable-5.2.1/lib/assets/compiled/action_cable.js;TTI"$file-digest://app/assets/config;TTI".file-digest://app/assets/config/rails-ujs;TTI")file-digest://app/assets/javascripts;TTI"3file-digest://app/assets/javascripts/rails-ujs;TTI"wfile-digest:///Users/rmosolgo/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/actioncable-5.2.1/lib/assets/compiled;TTI"|file-digest:///Users/rmosolgo/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/actioncable-5.2.1/lib/assets/compiled/rails-ujs;TTI"vfile-digest:///Users/rmosolgo/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/actionview-5.2.1/lib/assets/compiled;TTI"{file-digest:///Users/rmosolgo/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/actionview-5.2.1/lib/assets/compiled/rails-ujs;TTI"1file-digest://app/assets/config/action_cable;TTI"6file-digest://app/assets/javascripts/action_cable;TTI"file-digest:///Users/rmosolgo/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/actioncable-5.2.1/lib/assets/compiled/action_cable;TTF
@@ -1 +0,0 @@
1
- I"�app/assets/javascripts/application.js?type=application/javascript&id=2ee40e48961834681557f3d62ba66cca730386fc65c8e753fcc131c5eb57f691:ET
@@ -1 +0,0 @@
1
- I"�app/assets/javascripts/application.js?type=application/javascript&pipeline=self&id=cc953a7e5d4fae38988cd3dedb6bc5c7d501af2190fe07930d5a3ac7b8f03ad7:ET
@@ -1,3 +0,0 @@
1
- [o:Set:
2
- @hash}
3
- I"environment-version:ETTI"environment-paths;TTI"rails-env;TTI"Zprocessors:type=application/javascript&file_type=application/javascript&pipeline=self;TTI"�file-digest:///Users/rmosolgo/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/actioncable-5.2.1/lib/assets/compiled/action_cable.js;TTF
@@ -1 +0,0 @@
1
- I"�/Users/rmosolgo/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/actioncable-5.2.1/lib/assets/compiled/action_cable.js?type=application/javascript&pipeline=self&id=511553fd80002b90bc2b116eebc32ea1592732ff16395e6f2424f75f0ffc1870:ET
@@ -1 +0,0 @@
1
- "%�d�-�K���`���8Y��3�͹/Y����a~K
@@ -1,5 +0,0 @@
1
- module Types
2
- class PageType < Types::BaseObject
3
- implements GraphQL::Relay::Node.interface
4
- end
5
- end