Skip to content

Commit 31ad393

Browse files
authored
Merge pull request #4108 from rmosolgo/subscription-inheritance
Fix subscription inheritance/override
2 parents 5d0ec8e + 4df01f6 commit 31ad393

File tree

3 files changed

+20
-5
lines changed

3 files changed

+20
-5
lines changed

lib/graphql/schema.rb

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,13 @@ def deprecated_graphql_definition
132132
end
133133

134134
# @return [GraphQL::Subscriptions]
135-
attr_accessor :subscriptions
135+
def subscriptions(inherited: true)
136+
defined?(@subscriptions) ? @subscriptions : (inherited ? find_inherited_value(:subscriptions, nil) : nil)
137+
end
138+
139+
def subscriptions=(new_implementation)
140+
@subscriptions = new_implementation
141+
end
136142

137143
# Returns the JSON response of {Introspection::INTROSPECTION_QUERY}.
138144
# @see {#as_json}

lib/graphql/subscriptions.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ class SubscriptionScopeMissingError < GraphQL::Error
2626
def self.use(defn, options = {})
2727
schema = defn.is_a?(Class) ? defn : defn.target
2828

29-
if schema.subscriptions
29+
if schema.subscriptions(inherited: false)
3030
raise ArgumentError, "Can't reinstall subscriptions. #{schema} is using #{schema.subscriptions}, can't also add #{self}"
3131
end
3232

spec/graphql/schema_spec.rb

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,9 @@ class Subscription < GraphQL::Schema::Object
2323
field :some_field, String
2424
end
2525

26+
class CustomSubscriptions < GraphQL::Subscriptions::ActionCableSubscriptions
27+
end
28+
2629
let(:base_schema) do
2730
Class.new(GraphQL::Schema) do
2831
query Query
@@ -47,6 +50,7 @@ class Subscription < GraphQL::Schema::Object
4750
multiplex_analyzer Object.new
4851
rescue_from(StandardError) { }
4952
use GraphQL::Backtrace
53+
use GraphQL::Subscriptions::ActionCableSubscriptions, action_cable: nil, action_cable_coder: JSON
5054
end
5155
end
5256

@@ -73,11 +77,15 @@ class Subscription < GraphQL::Schema::Object
7377
assert_equal base_schema.query_analyzers, schema.query_analyzers
7478
assert_equal base_schema.multiplex_analyzers, schema.multiplex_analyzers
7579
assert_equal base_schema.disable_introspection_entry_points?, schema.disable_introspection_entry_points?
76-
assert_equal [GraphQL::Backtrace], schema.plugins.map(&:first)
80+
assert_equal [GraphQL::Backtrace, GraphQL::Subscriptions::ActionCableSubscriptions], schema.plugins.map(&:first)
81+
assert_instance_of GraphQL::Subscriptions::ActionCableSubscriptions, schema.subscriptions
7782
end
7883

7984
it "can override configuration from its superclass" do
80-
schema = Class.new(base_schema)
85+
schema = Class.new(base_schema) do
86+
use CustomSubscriptions, action_cable: nil, action_cable_coder: JSON
87+
end
88+
8189
query = Class.new(GraphQL::Schema::Object) do
8290
graphql_name 'Query'
8391
field :some_field, String
@@ -141,9 +149,10 @@ class Subscription < GraphQL::Schema::Object
141149
assert_equal schema.directives, GraphQL::Schema.default_directives.merge(DummyFeature1.graphql_name => DummyFeature1, DummyFeature2.graphql_name => DummyFeature2)
142150
assert_equal base_schema.query_analyzers + [query_analyzer], schema.query_analyzers
143151
assert_equal base_schema.multiplex_analyzers + [multiplex_analyzer], schema.multiplex_analyzers
144-
assert_equal [GraphQL::Backtrace], schema.plugins.map(&:first)
152+
assert_equal [GraphQL::Backtrace, GraphQL::Subscriptions::ActionCableSubscriptions, CustomSubscriptions], schema.plugins.map(&:first)
145153
assert_equal [GraphQL::Tracing::DataDogTracing, GraphQL::Backtrace::Tracer], base_schema.tracers
146154
assert_equal [GraphQL::Tracing::DataDogTracing, GraphQL::Backtrace::Tracer, GraphQL::Tracing::NewRelicTracing], schema.tracers
155+
assert_instance_of CustomSubscriptions, schema.subscriptions
147156
end
148157
end
149158

0 commit comments

Comments
 (0)