graphql 1.9.10 → 1.9.11

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 (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