graphql 1.4.0 → 1.4.1
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.
- checksums.yaml +4 -4
- data/lib/graphql/introspection/schema_type.rb +3 -3
- data/lib/graphql/language/nodes.rb +1 -1
- data/lib/graphql/query.rb +39 -27
- data/lib/graphql/query/executor.rb +1 -1
- data/lib/graphql/query/variables.rb +21 -28
- data/lib/graphql/relay/connection_type.rb +2 -0
- data/lib/graphql/relay/relation_connection.rb +8 -2
- data/lib/graphql/schema.rb +3 -0
- data/lib/graphql/schema/warden.rb +9 -0
- data/lib/graphql/static_validation/rules/mutation_root_exists.rb +1 -1
- data/lib/graphql/static_validation/rules/subscription_root_exists.rb +1 -1
- data/lib/graphql/version.rb +1 -1
- data/spec/graphql/analysis/analyze_query_spec.rb +15 -15
- data/spec/graphql/analysis/field_usage_spec.rb +1 -1
- data/spec/graphql/analysis/max_query_complexity_spec.rb +8 -8
- data/spec/graphql/analysis/max_query_depth_spec.rb +7 -7
- data/spec/graphql/analysis/query_complexity_spec.rb +2 -2
- data/spec/graphql/analysis/query_depth_spec.rb +1 -1
- data/spec/graphql/base_type_spec.rb +19 -11
- data/spec/graphql/directive_spec.rb +1 -1
- data/spec/graphql/enum_type_spec.rb +2 -2
- data/spec/graphql/execution/typecast_spec.rb +19 -19
- data/spec/graphql/execution_error_spec.rb +1 -1
- data/spec/graphql/field_spec.rb +15 -7
- data/spec/graphql/id_type_spec.rb +1 -1
- data/spec/graphql/input_object_type_spec.rb +16 -16
- data/spec/graphql/interface_type_spec.rb +6 -6
- data/spec/graphql/internal_representation/rewrite_spec.rb +34 -34
- data/spec/graphql/introspection/directive_type_spec.rb +1 -1
- data/spec/graphql/introspection/input_value_type_spec.rb +2 -2
- data/spec/graphql/introspection/introspection_query_spec.rb +1 -1
- data/spec/graphql/introspection/schema_type_spec.rb +2 -2
- data/spec/graphql/introspection/type_type_spec.rb +1 -1
- data/spec/graphql/language/parser_spec.rb +1 -1
- data/spec/graphql/non_null_type_spec.rb +3 -3
- data/spec/graphql/object_type_spec.rb +8 -8
- data/spec/graphql/query/executor_spec.rb +4 -4
- data/spec/graphql/query/variables_spec.rb +20 -4
- data/spec/graphql/query_spec.rb +20 -2
- data/spec/graphql/relay/connection_type_spec.rb +1 -1
- data/spec/graphql/relay/mutation_spec.rb +9 -9
- data/spec/graphql/relay/node_spec.rb +8 -8
- data/spec/graphql/relay/relation_connection_spec.rb +24 -6
- data/spec/graphql/schema/catchall_middleware_spec.rb +3 -3
- data/spec/graphql/schema/reduce_types_spec.rb +9 -9
- data/spec/graphql/schema/type_expression_spec.rb +3 -3
- data/spec/graphql/schema/validation_spec.rb +1 -1
- data/spec/graphql/schema/warden_spec.rb +79 -0
- data/spec/graphql/schema_spec.rb +2 -2
- data/spec/graphql/static_validation/rules/fragments_are_used_spec.rb +1 -1
- data/spec/graphql/static_validation/type_stack_spec.rb +2 -2
- data/spec/graphql/static_validation/validator_spec.rb +2 -2
- data/spec/graphql/union_type_spec.rb +2 -2
- data/spec/spec_helper.rb +1 -1
- data/spec/support/dummy/data.rb +27 -0
- data/spec/support/dummy/schema.rb +369 -0
- data/spec/support/star_wars/data.rb +81 -0
- data/spec/support/star_wars/schema.rb +250 -0
- data/spec/support/static_validation_helpers.rb +2 -2
- metadata +10 -10
- data/spec/support/dairy_app.rb +0 -369
- data/spec/support/dairy_data.rb +0 -26
- data/spec/support/star_wars_data.rb +0 -80
- data/spec/support/star_wars_schema.rb +0 -242
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5e3922b4ba691948512f6936a9ebf5438e468698
|
4
|
+
data.tar.gz: 9162e5e2f437fc323e733a7682dd44dae9bb8cc8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1c3763c608645843eaffaa81d95e29d019008209b1af2f91a06d35431403114a4b60feebfec3e7659db45b05695e7a4ce3c67012f573ca4e4283ecc12a2186c3
|
7
|
+
data.tar.gz: 08e82e3316840ebaeeb63aee2e73d8909ae863634c00d6eec38e03ba8a2a2038239f1e4ef694af70f952599aafc6d6bd3f1623741ebb0b7d61e3d8f43765c21e
|
@@ -10,15 +10,15 @@ GraphQL::Introspection::SchemaType = GraphQL::ObjectType.define do
|
|
10
10
|
end
|
11
11
|
|
12
12
|
field :queryType, !GraphQL::Introspection::TypeType, "The type that query operations will be rooted at." do
|
13
|
-
resolve ->(obj, arg, ctx) {
|
13
|
+
resolve ->(obj, arg, ctx) { ctx.warden.root_type_for_operation("query") }
|
14
14
|
end
|
15
15
|
|
16
16
|
field :mutationType, GraphQL::Introspection::TypeType, "If this server supports mutation, the type that mutation operations will be rooted at." do
|
17
|
-
resolve ->(obj, arg, ctx) {
|
17
|
+
resolve ->(obj, arg, ctx) { ctx.warden.root_type_for_operation("mutation") }
|
18
18
|
end
|
19
19
|
|
20
20
|
field :subscriptionType, GraphQL::Introspection::TypeType, "If this server support subscription, the type that subscription operations will be rooted at." do
|
21
|
-
resolve ->(obj, arg, ctx) {
|
21
|
+
resolve ->(obj, arg, ctx) { ctx.warden.root_type_for_operation("subscription") }
|
22
22
|
end
|
23
23
|
|
24
24
|
field :directives, !types[!GraphQL::Introspection::DirectiveType], "A list of all directives supported by this server." do
|
@@ -319,7 +319,7 @@ module GraphQL
|
|
319
319
|
scalar_attributes :name, :type, :default_value
|
320
320
|
|
321
321
|
# @!attribute default_value
|
322
|
-
# @return [String, Integer, Float, Boolean, Array] A Ruby value to use if no other value is provided
|
322
|
+
# @return [String, Integer, Float, Boolean, Array, NullValue] A Ruby value to use if no other value is provided
|
323
323
|
|
324
324
|
# @!attribute type
|
325
325
|
# @return [TypeName, NonNullType, ListType] The expected type of this value
|
data/lib/graphql/query.rb
CHANGED
@@ -11,6 +11,8 @@ require "graphql/query/variable_validation_error"
|
|
11
11
|
module GraphQL
|
12
12
|
# A combination of query string and {Schema} instance which can be reduced to a {#result}.
|
13
13
|
class Query
|
14
|
+
extend Forwardable
|
15
|
+
|
14
16
|
class OperationNameMissingError < GraphQL::ExecutionError
|
15
17
|
def initialize(names)
|
16
18
|
msg = "You must provide an operation name from: #{names.join(", ")}"
|
@@ -34,13 +36,7 @@ module GraphQL
|
|
34
36
|
fail ArgumentError, "a query string or document is required" unless query_string || document
|
35
37
|
|
36
38
|
@schema = schema
|
37
|
-
mask =
|
38
|
-
wrap_if_legacy_mask(except)
|
39
|
-
elsif only
|
40
|
-
InvertedMask.new(wrap_if_legacy_mask(only))
|
41
|
-
else
|
42
|
-
schema.default_mask
|
43
|
-
end
|
39
|
+
mask = MergedMask.combine(schema.default_mask, except: except, only: only)
|
44
40
|
@context = Context.new(query: self, values: context)
|
45
41
|
@warden = GraphQL::Schema::Warden.new(mask, schema: @schema, context: @context)
|
46
42
|
@max_depth = max_depth || schema.max_depth
|
@@ -202,18 +198,8 @@ module GraphQL
|
|
202
198
|
@valid
|
203
199
|
end
|
204
200
|
|
205
|
-
|
206
|
-
@warden.get_type(type_name)
|
207
|
-
end
|
201
|
+
def_delegators :@warden, :get_type, :get_field, :possible_types, :root_type_for_operation
|
208
202
|
|
209
|
-
def get_field(type, name)
|
210
|
-
@fields ||= Hash.new { |h, k| h[k] = Hash.new { |h2, k2| h2[k2] = @warden.get_field(k, k2) } }
|
211
|
-
@fields[type][name]
|
212
|
-
end
|
213
|
-
|
214
|
-
def possible_types(type)
|
215
|
-
@warden.possible_types(type)
|
216
|
-
end
|
217
203
|
|
218
204
|
# @param value [Object] Any runtime value
|
219
205
|
# @return [GraphQL::ObjectType, nil] The runtime type of `value` from {Schema#resolve_type}
|
@@ -262,15 +248,6 @@ module GraphQL
|
|
262
248
|
end
|
263
249
|
end
|
264
250
|
|
265
|
-
def wrap_if_legacy_mask(mask)
|
266
|
-
if (mask.is_a?(Proc) && mask.arity == 1) || mask.method(:call).arity == 1
|
267
|
-
warn("Schema.execute(..., except:) filters now accept two arguments, `(member, ctx)`. One-argument filters are deprecated.")
|
268
|
-
LegacyMaskWrap.new(mask)
|
269
|
-
else
|
270
|
-
mask
|
271
|
-
end
|
272
|
-
end
|
273
|
-
|
274
251
|
# @api private
|
275
252
|
class InvertedMask
|
276
253
|
def initialize(inner_mask)
|
@@ -294,5 +271,40 @@ module GraphQL
|
|
294
271
|
@inner_mask.call(member)
|
295
272
|
end
|
296
273
|
end
|
274
|
+
|
275
|
+
# @api private
|
276
|
+
class MergedMask
|
277
|
+
def initialize(first_mask, second_mask)
|
278
|
+
@first_mask = first_mask
|
279
|
+
@second_mask = second_mask
|
280
|
+
end
|
281
|
+
|
282
|
+
def call(member, ctx)
|
283
|
+
@first_mask.call(member, ctx) || @second_mask.call(member, ctx)
|
284
|
+
end
|
285
|
+
|
286
|
+
def self.combine(default_mask, except:, only:)
|
287
|
+
query_mask = if except
|
288
|
+
wrap_if_legacy_mask(except)
|
289
|
+
elsif only
|
290
|
+
InvertedMask.new(wrap_if_legacy_mask(only))
|
291
|
+
end
|
292
|
+
|
293
|
+
if query_mask && (default_mask != GraphQL::Schema::NullMask)
|
294
|
+
self.new(default_mask, query_mask)
|
295
|
+
else
|
296
|
+
query_mask || default_mask
|
297
|
+
end
|
298
|
+
end
|
299
|
+
|
300
|
+
def self.wrap_if_legacy_mask(mask)
|
301
|
+
if (mask.is_a?(Proc) && mask.arity == 1) || mask.method(:call).arity == 1
|
302
|
+
warn("Schema.execute(..., except:) filters now accept two arguments, `(member, ctx)`. One-argument filters are deprecated.")
|
303
|
+
LegacyMaskWrap.new(mask)
|
304
|
+
else
|
305
|
+
mask
|
306
|
+
end
|
307
|
+
end
|
308
|
+
end
|
297
309
|
end
|
298
310
|
end
|
@@ -28,7 +28,7 @@ module GraphQL
|
|
28
28
|
return {} if operation.nil?
|
29
29
|
|
30
30
|
op_type = operation.operation_type
|
31
|
-
root_type = query.
|
31
|
+
root_type = query.root_type_for_operation(op_type)
|
32
32
|
execution_strategy_class = query.schema.execution_strategy_for_operation(op_type)
|
33
33
|
execution_strategy = execution_strategy_class.new
|
34
34
|
|
@@ -14,38 +14,31 @@ module GraphQL
|
|
14
14
|
@provided_variables = provided_variables
|
15
15
|
@errors = []
|
16
16
|
@storage = ast_variables.each_with_object({}) do |ast_variable, memo|
|
17
|
+
# Find the right value for this variable:
|
18
|
+
# - First, use the value provided at runtime
|
19
|
+
# - Then, fall back to the default value from the query string
|
20
|
+
# If it's still nil, raise an error if it's required.
|
21
|
+
variable_type = @schema.type_from_ast(ast_variable.type)
|
17
22
|
variable_name = ast_variable.name
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
def [](key)
|
23
|
-
@storage.fetch(key)
|
24
|
-
end
|
23
|
+
default_value = ast_variable.default_value
|
24
|
+
provided_value = @provided_variables[variable_name]
|
25
|
+
value_was_provided = @provided_variables.key?(variable_name)
|
25
26
|
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
default_value = ast_variable.default_value
|
38
|
-
provided_value = @provided_variables[variable_name]
|
39
|
-
|
40
|
-
validation_result = variable_type.validate_input(provided_value, @warden)
|
41
|
-
if !validation_result.valid?
|
42
|
-
@errors << GraphQL::Query::VariableValidationError.new(ast_variable, variable_type, provided_value, validation_result)
|
43
|
-
elsif !@provided_variables.key?(variable_name) && provided_value.nil?
|
44
|
-
GraphQL::Query::LiteralInput.coerce(variable_type, default_value, {})
|
45
|
-
else
|
46
|
-
variable_type.coerce_input(provided_value)
|
27
|
+
validation_result = variable_type.validate_input(provided_value, @warden)
|
28
|
+
if !validation_result.valid?
|
29
|
+
# This finds variables that were required but not provided
|
30
|
+
@errors << GraphQL::Query::VariableValidationError.new(ast_variable, variable_type, provided_value, validation_result)
|
31
|
+
elsif value_was_provided
|
32
|
+
# Add the variable if a value was provided
|
33
|
+
memo[variable_name] = variable_type.coerce_input(provided_value)
|
34
|
+
elsif default_value
|
35
|
+
# Add the variable if it wasn't provided but it has a default value (including `null`)
|
36
|
+
memo[variable_name] = GraphQL::Query::LiteralInput.coerce(variable_type, default_value, {})
|
37
|
+
end
|
47
38
|
end
|
48
39
|
end
|
40
|
+
|
41
|
+
def_delegators :@storage, :length, :key?, :[], :fetch
|
49
42
|
end
|
50
43
|
end
|
51
44
|
end
|
@@ -13,9 +13,11 @@ module GraphQL
|
|
13
13
|
edge_type ||= wrapped_type.edge_type
|
14
14
|
edge_class ||= GraphQL::Relay::Edge
|
15
15
|
connection_type_name = "#{wrapped_type.name}Connection"
|
16
|
+
connection_type_description = "The connection type for #{wrapped_type.name}."
|
16
17
|
|
17
18
|
connection_type = ObjectType.define do
|
18
19
|
name(connection_type_name)
|
20
|
+
description(connection_type_description)
|
19
21
|
field :edges, types[edge_type] do
|
20
22
|
description "A list of edges."
|
21
23
|
resolve ->(obj, args, ctx) {
|
@@ -17,7 +17,7 @@ module GraphQL
|
|
17
17
|
end
|
18
18
|
|
19
19
|
def has_next_page
|
20
|
-
!!(first && sliced_nodes.limit(limit + 1)
|
20
|
+
!!(first && count(sliced_nodes.limit(limit + 1)) > limit)
|
21
21
|
end
|
22
22
|
|
23
23
|
def has_previous_page
|
@@ -26,6 +26,12 @@ module GraphQL
|
|
26
26
|
|
27
27
|
private
|
28
28
|
|
29
|
+
# If a relation contains a `.group` clause, a `.count` will return a Hash.
|
30
|
+
def count(nodes)
|
31
|
+
count_or_hash = nodes.count
|
32
|
+
count_or_hash.is_a?(Integer) ? count_or_hash : count_or_hash.length
|
33
|
+
end
|
34
|
+
|
29
35
|
# apply first / last limit results
|
30
36
|
def paged_nodes
|
31
37
|
@paged_nodes ||= sliced_nodes.limit(limit)
|
@@ -45,7 +51,7 @@ module GraphQL
|
|
45
51
|
if before
|
46
52
|
[previous_offset, 0].max
|
47
53
|
elsif last
|
48
|
-
nodes
|
54
|
+
count(nodes) - last
|
49
55
|
else
|
50
56
|
previous_offset
|
51
57
|
end
|
data/lib/graphql/schema.rb
CHANGED
@@ -215,6 +215,9 @@ module GraphQL
|
|
215
215
|
@possible_types.possible_types(type_defn)
|
216
216
|
end
|
217
217
|
|
218
|
+
|
219
|
+
# @see [GraphQL::Schema::Warden] Resticted access to root types
|
220
|
+
# @return [GraphQL::ObjectType, nil]
|
218
221
|
def root_type_for_operation(operation)
|
219
222
|
case operation
|
220
223
|
when "query"
|
@@ -120,6 +120,15 @@ module GraphQL
|
|
120
120
|
@schema.directives.each_value.select { |d| visible?(d) }
|
121
121
|
end
|
122
122
|
|
123
|
+
def root_type_for_operation(op_name)
|
124
|
+
root_type = @schema.root_type_for_operation(op_name)
|
125
|
+
if root_type && visible?(root_type)
|
126
|
+
root_type
|
127
|
+
else
|
128
|
+
nil
|
129
|
+
end
|
130
|
+
end
|
131
|
+
|
123
132
|
private
|
124
133
|
|
125
134
|
def visible_field?(field_defn)
|
data/lib/graphql/version.rb
CHANGED
@@ -28,7 +28,7 @@ describe GraphQL::Analysis do
|
|
28
28
|
let(:analyzers) { [type_collector, node_counter] }
|
29
29
|
let(:reduce_result) { GraphQL::Analysis.analyze_query(query, analyzers) }
|
30
30
|
let(:variables) { {} }
|
31
|
-
let(:query) { GraphQL::Query.new(
|
31
|
+
let(:query) { GraphQL::Query.new(Dummy::Schema, query_string, variables: variables) }
|
32
32
|
let(:query_string) {%|
|
33
33
|
{
|
34
34
|
cheese(id: 1) {
|
@@ -40,7 +40,7 @@ describe GraphQL::Analysis do
|
|
40
40
|
|
41
41
|
it "calls the defined analyzers" do
|
42
42
|
collected_types, node_counts = reduce_result
|
43
|
-
expected_visited_types = [DairyAppQueryType, CheeseType, GraphQL::INT_TYPE, GraphQL::STRING_TYPE]
|
43
|
+
expected_visited_types = [Dummy::DairyAppQueryType, Dummy::CheeseType, GraphQL::INT_TYPE, GraphQL::STRING_TYPE]
|
44
44
|
assert_equal expected_visited_types, collected_types
|
45
45
|
expected_node_counts = {
|
46
46
|
GraphQL::Language::Nodes::OperationDefinition => 1,
|
@@ -61,14 +61,14 @@ describe GraphQL::Analysis do
|
|
61
61
|
let(:variable_accessor) { ->(memo, visit_type, irep_node) { query.variables["cheeseId"] } }
|
62
62
|
|
63
63
|
before do
|
64
|
-
@previous_query_analyzers =
|
65
|
-
|
66
|
-
|
64
|
+
@previous_query_analyzers = Dummy::Schema.query_analyzers.dup
|
65
|
+
Dummy::Schema.query_analyzers.clear
|
66
|
+
Dummy::Schema.query_analyzers << variable_accessor
|
67
67
|
end
|
68
68
|
|
69
69
|
after do
|
70
|
-
|
71
|
-
|
70
|
+
Dummy::Schema.query_analyzers.clear
|
71
|
+
Dummy::Schema.query_analyzers.push(*@previous_query_analyzers)
|
72
72
|
end
|
73
73
|
|
74
74
|
it "returns an error" do
|
@@ -97,7 +97,7 @@ describe GraphQL::Analysis do
|
|
97
97
|
}
|
98
98
|
let(:analyzers) { [connection_counter] }
|
99
99
|
let(:reduce_result) { GraphQL::Analysis.analyze_query(query, analyzers) }
|
100
|
-
let(:query) { GraphQL::Query.new(
|
100
|
+
let(:query) { GraphQL::Query.new(StarWars::Schema, query_string, variables: variables) }
|
101
101
|
let(:query_string) {%|
|
102
102
|
query getBases {
|
103
103
|
empire {
|
@@ -155,7 +155,7 @@ describe GraphQL::Analysis do
|
|
155
155
|
let(:flavor_catcher) { FlavorCatcher.new }
|
156
156
|
let(:analyzers) { [id_catcher, flavor_catcher] }
|
157
157
|
let(:reduce_result) { GraphQL::Analysis.analyze_query(query, analyzers) }
|
158
|
-
let(:query) { GraphQL::Query.new(
|
158
|
+
let(:query) { GraphQL::Query.new(Dummy::Schema, query_string) }
|
159
159
|
let(:query_string) {%|
|
160
160
|
{
|
161
161
|
cheese(id: 1) {
|
@@ -164,7 +164,7 @@ describe GraphQL::Analysis do
|
|
164
164
|
}
|
165
165
|
}
|
166
166
|
|}
|
167
|
-
let(:schema) {
|
167
|
+
let(:schema) { Dummy::Schema }
|
168
168
|
let(:result) { schema.execute(query_string) }
|
169
169
|
let(:query_string) {%|
|
170
170
|
{
|
@@ -176,14 +176,14 @@ describe GraphQL::Analysis do
|
|
176
176
|
|}
|
177
177
|
|
178
178
|
before do
|
179
|
-
@previous_query_analyzers =
|
180
|
-
|
181
|
-
|
179
|
+
@previous_query_analyzers = Dummy::Schema.query_analyzers.dup
|
180
|
+
Dummy::Schema.query_analyzers.clear
|
181
|
+
Dummy::Schema.query_analyzers << id_catcher << flavor_catcher
|
182
182
|
end
|
183
183
|
|
184
184
|
after do
|
185
|
-
|
186
|
-
|
185
|
+
Dummy::Schema.query_analyzers.clear
|
186
|
+
Dummy::Schema.query_analyzers.push(*@previous_query_analyzers)
|
187
187
|
end
|
188
188
|
|
189
189
|
it "groups all errors together" do
|
@@ -5,7 +5,7 @@ describe GraphQL::Analysis::FieldUsage do
|
|
5
5
|
let(:result) { [] }
|
6
6
|
let(:field_usage_analyzer) { GraphQL::Analysis::FieldUsage.new { |query, used_fields, used_deprecated_fields| result << query << used_fields << used_deprecated_fields } }
|
7
7
|
let(:reduce_result) { GraphQL::Analysis.analyze_query(query, [field_usage_analyzer]) }
|
8
|
-
let(:query) { GraphQL::Query.new(
|
8
|
+
let(:query) { GraphQL::Query.new(Dummy::Schema, query_string, variables: variables) }
|
9
9
|
let(:variables) { {} }
|
10
10
|
|
11
11
|
describe "query with deprecated fields" do
|
@@ -3,15 +3,15 @@ require "spec_helper"
|
|
3
3
|
|
4
4
|
describe GraphQL::Analysis::MaxQueryComplexity do
|
5
5
|
before do
|
6
|
-
@prev_max_complexity =
|
6
|
+
@prev_max_complexity = Dummy::Schema.max_complexity
|
7
7
|
end
|
8
8
|
|
9
9
|
after do
|
10
|
-
|
10
|
+
Dummy::Schema.max_complexity = @prev_max_complexity
|
11
11
|
end
|
12
12
|
|
13
13
|
|
14
|
-
let(:result) {
|
14
|
+
let(:result) { Dummy::Schema.execute(query_string) }
|
15
15
|
let(:query_string) {%|
|
16
16
|
{
|
17
17
|
a: cheese(id: 1) { id }
|
@@ -24,7 +24,7 @@ describe GraphQL::Analysis::MaxQueryComplexity do
|
|
24
24
|
|
25
25
|
describe "when a query goes over max complexity" do
|
26
26
|
before do
|
27
|
-
|
27
|
+
Dummy::Schema.max_complexity = 9
|
28
28
|
end
|
29
29
|
|
30
30
|
it "returns an error" do
|
@@ -34,7 +34,7 @@ describe GraphQL::Analysis::MaxQueryComplexity do
|
|
34
34
|
|
35
35
|
describe "when there is no max complexity" do
|
36
36
|
before do
|
37
|
-
|
37
|
+
Dummy::Schema.max_complexity = nil
|
38
38
|
end
|
39
39
|
it "doesn't error" do
|
40
40
|
assert_equal nil, result["errors"]
|
@@ -43,7 +43,7 @@ describe GraphQL::Analysis::MaxQueryComplexity do
|
|
43
43
|
|
44
44
|
describe "when the query is less than the max complexity" do
|
45
45
|
before do
|
46
|
-
|
46
|
+
Dummy::Schema.max_complexity = 99
|
47
47
|
end
|
48
48
|
it "doesn't error" do
|
49
49
|
assert_equal nil, result["errors"]
|
@@ -52,9 +52,9 @@ describe GraphQL::Analysis::MaxQueryComplexity do
|
|
52
52
|
|
53
53
|
describe "when complexity is overriden at query-level" do
|
54
54
|
before do
|
55
|
-
|
55
|
+
Dummy::Schema.max_complexity = 100
|
56
56
|
end
|
57
|
-
let(:result) {
|
57
|
+
let(:result) { Dummy::Schema.execute(query_string, max_complexity: 7) }
|
58
58
|
|
59
59
|
it "is applied" do
|
60
60
|
assert_equal "Query has complexity of 10, which exceeds max complexity of 7", result["errors"][0]["message"]
|