graphql 1.6.4 → 1.6.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/generators/graphql/core.rb +47 -0
- data/lib/generators/graphql/install_generator.rb +15 -20
- data/lib/generators/graphql/mutation_generator.rb +31 -1
- data/lib/generators/graphql/templates/mutation.erb +2 -2
- data/lib/generators/graphql/templates/mutation_type.erb +5 -0
- data/lib/generators/graphql/templates/schema.erb +0 -1
- data/lib/graphql/argument.rb +6 -5
- data/lib/graphql/backwards_compatibility.rb +18 -4
- data/lib/graphql/base_type.rb +1 -1
- data/lib/graphql/compatibility/execution_specification/counter_schema.rb +1 -1
- data/lib/graphql/compatibility/execution_specification/specification_schema.rb +1 -1
- data/lib/graphql/compatibility/lazy_execution_specification.rb +9 -2
- data/lib/graphql/define.rb +1 -0
- data/lib/graphql/define/defined_object_proxy.rb +1 -1
- data/lib/graphql/define/no_definition_error.rb +7 -0
- data/lib/graphql/enum_type.rb +4 -0
- data/lib/graphql/execution/execute.rb +3 -3
- data/lib/graphql/execution/field_result.rb +1 -1
- data/lib/graphql/execution/lazy/resolve.rb +10 -9
- data/lib/graphql/execution/multiplex.rb +6 -5
- data/lib/graphql/input_object_type.rb +5 -1
- data/lib/graphql/interface_type.rb +12 -3
- data/lib/graphql/query.rb +21 -5
- data/lib/graphql/query/context.rb +11 -0
- data/lib/graphql/schema.rb +48 -27
- data/lib/graphql/schema/build_from_definition.rb +1 -1
- data/lib/graphql/schema/build_from_definition/resolve_map.rb +2 -2
- data/lib/graphql/schema/loader.rb +1 -1
- data/lib/graphql/schema/traversal.rb +91 -0
- data/lib/graphql/schema/validation.rb +1 -1
- data/lib/graphql/static_validation/rules/variable_usages_are_allowed.rb +41 -7
- data/lib/graphql/union_type.rb +13 -2
- data/lib/graphql/version.rb +1 -1
- data/readme.md +1 -3
- data/spec/generators/graphql/install_generator_spec.rb +3 -1
- data/spec/generators/graphql/mutation_generator_spec.rb +14 -0
- data/spec/graphql/analysis/max_query_complexity_spec.rb +12 -1
- data/spec/graphql/analysis/query_complexity_spec.rb +1 -1
- data/spec/graphql/argument_spec.rb +29 -0
- data/spec/graphql/define/assign_argument_spec.rb +4 -4
- data/spec/graphql/define/instance_definable_spec.rb +1 -1
- data/spec/graphql/enum_type_spec.rb +8 -0
- data/spec/graphql/execution/lazy_spec.rb +30 -3
- data/spec/graphql/interface_type_spec.rb +44 -0
- data/spec/graphql/introspection/schema_type_spec.rb +3 -0
- data/spec/graphql/introspection/type_type_spec.rb +1 -0
- data/spec/graphql/object_type_spec.rb +8 -3
- data/spec/graphql/query/context_spec.rb +18 -0
- data/spec/graphql/query/executor_spec.rb +1 -1
- data/spec/graphql/query/literal_input_spec.rb +31 -15
- data/spec/graphql/query/serial_execution/value_resolution_spec.rb +1 -1
- data/spec/graphql/query/variables_spec.rb +25 -1
- data/spec/graphql/query_spec.rb +24 -9
- data/spec/graphql/relay/mutation_spec.rb +1 -1
- data/spec/graphql/schema/build_from_definition_spec.rb +1 -1
- data/spec/graphql/schema/loader_spec.rb +1 -1
- data/spec/graphql/schema/printer_spec.rb +1 -1
- data/spec/graphql/schema/{reduce_types_spec.rb → traversal_spec.rb} +21 -4
- data/spec/graphql/schema/warden_spec.rb +1 -1
- data/spec/graphql/schema_spec.rb +23 -2
- data/spec/graphql/static_validation/rules/variable_usages_are_allowed_spec.rb +133 -0
- data/spec/graphql/union_type_spec.rb +53 -0
- data/spec/spec_helper.rb +9 -0
- data/spec/support/dummy/data.rb +14 -5
- data/spec/support/dummy/schema.rb +46 -5
- data/spec/support/star_wars/data.rb +10 -6
- data/spec/support/star_wars/schema.rb +5 -2
- metadata +8 -7
- data/lib/graphql/schema/instrumented_field_map.rb +0 -40
- data/lib/graphql/schema/reduce_types.rb +0 -69
- data/lib/graphql/schema/type_map.rb +0 -31
@@ -274,10 +274,10 @@ module GraphQL
|
|
274
274
|
Rules::FIELDS_ARE_VALID,
|
275
275
|
],
|
276
276
|
GraphQL::Schema => [
|
277
|
+
Rules::SCHEMA_INSTRUMENTERS_ARE_VALID,
|
277
278
|
Rules::SCHEMA_CAN_RESOLVE_TYPES,
|
278
279
|
Rules::SCHEMA_CAN_FETCH_IDS,
|
279
280
|
Rules::SCHEMA_CAN_GENERATE_IDS,
|
280
|
-
Rules::SCHEMA_INSTRUMENTERS_ARE_VALID,
|
281
281
|
],
|
282
282
|
}
|
283
283
|
end
|
@@ -7,15 +7,15 @@ module GraphQL
|
|
7
7
|
def validate(context)
|
8
8
|
# holds { name => ast_node } pairs
|
9
9
|
declared_variables = {}
|
10
|
-
|
11
10
|
context.visitor[GraphQL::Language::Nodes::OperationDefinition] << ->(node, parent) {
|
12
11
|
declared_variables = node.variables.each_with_object({}) { |var, memo| memo[var.name] = var }
|
13
12
|
}
|
14
13
|
|
15
14
|
context.visitor[GraphQL::Language::Nodes::Argument] << ->(node, parent) {
|
16
|
-
|
17
|
-
|
15
|
+
node_values = Array.wrap(node.value).select { |value| value.is_a? GraphQL::Language::Nodes::VariableIdentifier }
|
16
|
+
return if node_values.none?
|
18
17
|
|
18
|
+
arguments = nil
|
19
19
|
case parent
|
20
20
|
when GraphQL::Language::Nodes::Field
|
21
21
|
arguments = context.field_definition.arguments
|
@@ -29,10 +29,13 @@ module GraphQL
|
|
29
29
|
else
|
30
30
|
raise("Unexpected argument parent: #{parent}")
|
31
31
|
end
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
32
|
+
|
33
|
+
node_values.each do |node_value|
|
34
|
+
var_defn_ast = declared_variables[node_value.name]
|
35
|
+
# Might be undefined :(
|
36
|
+
# VariablesAreUsedAndDefined can't finalize its search until the end of the document.
|
37
|
+
var_defn_ast && arguments && validate_usage(arguments, node, var_defn_ast, context)
|
38
|
+
end
|
36
39
|
}
|
37
40
|
end
|
38
41
|
|
@@ -53,6 +56,8 @@ module GraphQL
|
|
53
56
|
var_inner_type = var_type.unwrap
|
54
57
|
arg_inner_type = arg_defn_type.unwrap
|
55
58
|
|
59
|
+
var_type = wrap_var_type_with_depth_of_arg(var_type, arg_node)
|
60
|
+
|
56
61
|
if var_inner_type != arg_inner_type
|
57
62
|
context.errors << create_error("Type mismatch", var_type, ast_var, arg_defn, arg_node, context)
|
58
63
|
elsif list_dimension(var_type) != list_dimension(arg_defn_type)
|
@@ -66,6 +71,35 @@ module GraphQL
|
|
66
71
|
message("#{error_message} on variable $#{ast_var.name} and argument #{arg_node.name} (#{var_type.to_s} / #{arg_defn.type.to_s})", arg_node, context: context)
|
67
72
|
end
|
68
73
|
|
74
|
+
def wrap_var_type_with_depth_of_arg(var_type, arg_node)
|
75
|
+
arg_node_value = arg_node.value
|
76
|
+
return var_type unless arg_node_value.is_a?(Array)
|
77
|
+
new_var_type = var_type
|
78
|
+
|
79
|
+
depth_of_array(arg_node_value).times do
|
80
|
+
new_var_type = GraphQL::ListType.new(of_type: new_var_type)
|
81
|
+
end
|
82
|
+
|
83
|
+
new_var_type
|
84
|
+
end
|
85
|
+
|
86
|
+
# @return [Integer] Returns the max depth of `array`, or `0` if it isn't an array at all
|
87
|
+
def depth_of_array(array)
|
88
|
+
case array
|
89
|
+
when Array
|
90
|
+
max_child_depth = 0
|
91
|
+
array.each do |item|
|
92
|
+
item_depth = depth_of_array(item)
|
93
|
+
if item_depth > max_child_depth
|
94
|
+
max_child_depth = item_depth
|
95
|
+
end
|
96
|
+
end
|
97
|
+
1 + max_child_depth
|
98
|
+
else
|
99
|
+
0
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
69
103
|
def list_dimension(type)
|
70
104
|
if type.kind.list?
|
71
105
|
1 + list_dimension(type.of_type)
|
data/lib/graphql/union_type.rb
CHANGED
@@ -24,13 +24,16 @@ module GraphQL
|
|
24
24
|
# }
|
25
25
|
#
|
26
26
|
class UnionType < GraphQL::BaseType
|
27
|
-
accepts_definitions :possible_types
|
28
|
-
ensure_defined :possible_types
|
27
|
+
accepts_definitions :possible_types, :resolve_type
|
28
|
+
ensure_defined :possible_types, :resolve_type, :resolve_type_proc
|
29
|
+
|
30
|
+
attr_accessor :resolve_type_proc
|
29
31
|
|
30
32
|
def initialize
|
31
33
|
super
|
32
34
|
@dirty_possible_types = []
|
33
35
|
@clean_possible_types = nil
|
36
|
+
@resolve_type_proc = nil
|
34
37
|
end
|
35
38
|
|
36
39
|
def initialize_copy(other)
|
@@ -64,6 +67,14 @@ module GraphQL
|
|
64
67
|
end
|
65
68
|
end
|
66
69
|
|
70
|
+
def resolve_type(value, ctx)
|
71
|
+
ctx.query.resolve_type(self, value)
|
72
|
+
end
|
73
|
+
|
74
|
+
def resolve_type=(new_resolve_type_proc)
|
75
|
+
@resolve_type_proc = new_resolve_type_proc
|
76
|
+
end
|
77
|
+
|
67
78
|
protected
|
68
79
|
|
69
80
|
attr_reader :dirty_possible_types
|
data/lib/graphql/version.rb
CHANGED
data/readme.md
CHANGED
@@ -49,6 +49,4 @@ I also sell [GraphQL::Pro](http://graphql.pro) which provides several features o
|
|
49
49
|
|
50
50
|
- __Say hi & ask questions__ in the [#ruby channel on Slack](https://graphql-slack.herokuapp.com/) or [on Twitter](https://twitter.com/rmosolgo)!
|
51
51
|
- __Report bugs__ by posting a description, full stack trace, and all relevant code in a [GitHub issue](https://github.com/rmosolgo/graphql-ruby/issues).
|
52
|
-
-
|
53
|
-
- __Run the tests__ with `rake test` or start up guard with `bundle exec guard`.
|
54
|
-
- __Build the site__ with `rake site:serve`, then visit `http://localhost:4000/graphql-ruby/`.
|
52
|
+
- __Start hacking__ with the [Development guide](http://graphql-ruby.org/development).
|
@@ -37,6 +37,7 @@ class GraphQLGeneratorsInstallGeneratorTest < Rails::Generators::TestCase
|
|
37
37
|
|
38
38
|
expected_schema = <<-RUBY
|
39
39
|
DummySchema = GraphQL::Schema.define do
|
40
|
+
mutation(Types::MutationType)
|
40
41
|
query(Types::QueryType)
|
41
42
|
end
|
42
43
|
RUBY
|
@@ -160,8 +161,9 @@ RUBY
|
|
160
161
|
|
161
162
|
EXPECTED_RELAY_BATCH_SCHEMA = <<-RUBY
|
162
163
|
DummySchema = GraphQL::Schema.define do
|
163
|
-
query(Types::QueryType)
|
164
164
|
|
165
|
+
mutation(Types::MutationType)
|
166
|
+
query(Types::QueryType)
|
165
167
|
# Relay Object Identification:
|
166
168
|
|
167
169
|
# Return a string UUID for `object`
|
@@ -5,6 +5,20 @@ require "generators/graphql/mutation_generator"
|
|
5
5
|
class GraphQLGeneratorsMutationGeneratorTest < BaseGeneratorTest
|
6
6
|
tests Graphql::Generators::MutationGenerator
|
7
7
|
|
8
|
+
destination File.expand_path("../../../tmp/dummy", File.dirname(__FILE__))
|
9
|
+
|
10
|
+
setup do
|
11
|
+
prepare_destination
|
12
|
+
FileUtils.cd(File.expand_path("../../../tmp", File.dirname(__FILE__))) do
|
13
|
+
`rm -rf dummy`
|
14
|
+
`rails new dummy --skip-active-record --skip-test-unit --skip-spring --skip-bundle`
|
15
|
+
end
|
16
|
+
|
17
|
+
FileUtils.cd(destination_root) do
|
18
|
+
`rails g graphql:install`
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
8
22
|
test "it generates an empty resolver by name" do
|
9
23
|
run_generator(["UpdateName"])
|
10
24
|
|
@@ -50,7 +50,7 @@ describe GraphQL::Analysis::MaxQueryComplexity do
|
|
50
50
|
end
|
51
51
|
end
|
52
52
|
|
53
|
-
describe "when
|
53
|
+
describe "when max_complexity is decreased at query-level" do
|
54
54
|
before do
|
55
55
|
Dummy::Schema.max_complexity = 100
|
56
56
|
end
|
@@ -61,6 +61,17 @@ describe GraphQL::Analysis::MaxQueryComplexity do
|
|
61
61
|
end
|
62
62
|
end
|
63
63
|
|
64
|
+
describe "when max_complexity is increased at query-level" do
|
65
|
+
before do
|
66
|
+
Dummy::Schema.max_complexity = 1
|
67
|
+
end
|
68
|
+
let(:result) { Dummy::Schema.execute(query_string, max_complexity: 10) }
|
69
|
+
|
70
|
+
it "doesn't error" do
|
71
|
+
assert_equal nil, result["errors"]
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
64
75
|
describe "across a multiplex" do
|
65
76
|
before do
|
66
77
|
Dummy::Schema.max_complexity = 9
|
@@ -19,6 +19,18 @@ describe GraphQL::Argument do
|
|
19
19
|
assert_includes err.message, expected_error
|
20
20
|
end
|
21
21
|
|
22
|
+
it "accepts custom keywords" do
|
23
|
+
type = GraphQL::ObjectType.define do
|
24
|
+
name "Something"
|
25
|
+
field :something, types.String do
|
26
|
+
argument "flagged", types.Int, metadata_flag: :flag_1
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
arg = type.fields["something"].arguments["flagged"]
|
31
|
+
assert_equal true, arg.metadata[:flag_1]
|
32
|
+
end
|
33
|
+
|
22
34
|
it "accepts proc type" do
|
23
35
|
argument = GraphQL::Argument.define(name: :favoriteFood, type: -> { GraphQL::STRING_TYPE })
|
24
36
|
assert_equal GraphQL::STRING_TYPE, argument.type
|
@@ -56,6 +68,14 @@ describe GraphQL::Argument do
|
|
56
68
|
arg_3 = arg_2.redefine { as :ff }
|
57
69
|
assert_equal arg_3.expose_as, "ff"
|
58
70
|
end
|
71
|
+
|
72
|
+
it "can be set in the passed block" do
|
73
|
+
argument = GraphQL::Argument.define do
|
74
|
+
name "arg"
|
75
|
+
as "arg_name"
|
76
|
+
end
|
77
|
+
assert_equal "arg_name", argument.as
|
78
|
+
end
|
59
79
|
end
|
60
80
|
|
61
81
|
describe "prepare" do
|
@@ -69,5 +89,14 @@ describe GraphQL::Argument do
|
|
69
89
|
argument = GraphQL::Argument.define(name: :someNumber, type: GraphQL::INT_TYPE)
|
70
90
|
assert_equal argument.prepare(1, nil), 1
|
71
91
|
end
|
92
|
+
|
93
|
+
it "can be set in the passed block" do
|
94
|
+
prepare_proc = Proc.new { |arg, ctx| arg + ctx[:val] }
|
95
|
+
argument = GraphQL::Argument.define do
|
96
|
+
name "arg"
|
97
|
+
prepare prepare_proc
|
98
|
+
end
|
99
|
+
assert_equal argument.prepare(1, {val: 1}), 2
|
100
|
+
end
|
72
101
|
end
|
73
102
|
end
|
@@ -24,17 +24,17 @@ describe GraphQL::Define::AssignArgument do
|
|
24
24
|
end
|
25
25
|
|
26
26
|
it "passing unknown keyword arguments will raise" do
|
27
|
-
err = assert_raises
|
27
|
+
err = assert_raises GraphQL::Define::NoDefinitionError do
|
28
28
|
define_argument(:a, GraphQL::STRING_TYPE, blah: nil)
|
29
29
|
end
|
30
30
|
|
31
|
-
assert_equal '
|
31
|
+
assert_equal "GraphQL::Argument can't define 'blah'", err.message
|
32
32
|
|
33
|
-
err = assert_raises
|
33
|
+
err = assert_raises GraphQL::Define::NoDefinitionError do
|
34
34
|
define_argument(:a, GraphQL::STRING_TYPE, blah: nil, blah2: nil)
|
35
35
|
end
|
36
36
|
|
37
|
-
assert_equal '
|
37
|
+
assert_equal "GraphQL::Argument can't define 'blah'", err.message
|
38
38
|
end
|
39
39
|
|
40
40
|
def define_argument(*args)
|
@@ -185,7 +185,7 @@ describe GraphQL::Define::InstanceDefinable do
|
|
185
185
|
|
186
186
|
describe "typos" do
|
187
187
|
it "provides the right class name, method name and line number" do
|
188
|
-
err = assert_raises(
|
188
|
+
err = assert_raises(GraphQL::Define::NoDefinitionError) {
|
189
189
|
beet = Garden::Vegetable.define {
|
190
190
|
name "Beet"
|
191
191
|
nonsense :Blah
|
@@ -110,4 +110,12 @@ describe GraphQL::EnumType do
|
|
110
110
|
assert_equal(7, enum_2.values.size)
|
111
111
|
end
|
112
112
|
end
|
113
|
+
|
114
|
+
describe "validates enum value name uniqueness" do
|
115
|
+
it "raises an exception when adding a duplicate enum value name" do
|
116
|
+
assert_raises "Enum value names must be unique. `COW` already exists." do
|
117
|
+
enum.add_value(GraphQL::EnumType::EnumValue.define(name: "COW"))
|
118
|
+
end
|
119
|
+
end
|
120
|
+
end
|
113
121
|
end
|
@@ -17,12 +17,24 @@ describe GraphQL::Execution::Lazy do
|
|
17
17
|
value
|
18
18
|
nestedSum(value: 7) {
|
19
19
|
value
|
20
|
+
nestedSum(value: 1) {
|
21
|
+
value
|
22
|
+
nestedSum(value: -50) {
|
23
|
+
value
|
24
|
+
}
|
25
|
+
}
|
20
26
|
}
|
21
27
|
}
|
22
28
|
b: nestedSum(value: 2) {
|
23
29
|
value
|
24
30
|
nestedSum(value: 11) {
|
25
31
|
value
|
32
|
+
nestedSum(value: 2) {
|
33
|
+
value
|
34
|
+
nestedSum(value: -50) {
|
35
|
+
value
|
36
|
+
}
|
37
|
+
}
|
26
38
|
}
|
27
39
|
}
|
28
40
|
|
@@ -35,9 +47,24 @@ describe GraphQL::Execution::Lazy do
|
|
35
47
|
|
|
36
48
|
|
37
49
|
expected_data = {
|
38
|
-
"a"=>{"value"=>14, "nestedSum"=>{
|
39
|
-
|
40
|
-
|
50
|
+
"a"=>{"value"=>14, "nestedSum"=>{
|
51
|
+
"value"=>46,
|
52
|
+
"nestedSum"=>{
|
53
|
+
"value"=>95,
|
54
|
+
"nestedSum"=>{"value"=>90}
|
55
|
+
}
|
56
|
+
}},
|
57
|
+
"b"=>{"value"=>14, "nestedSum"=>{
|
58
|
+
"value"=>46,
|
59
|
+
"nestedSum"=>{
|
60
|
+
"value"=>95,
|
61
|
+
"nestedSum"=>{"value"=>90}
|
62
|
+
}
|
63
|
+
}},
|
64
|
+
"c"=>[
|
65
|
+
{"nestedSum"=>{"value"=>14}},
|
66
|
+
{"nestedSum"=>{"value"=>14}}
|
67
|
+
],
|
41
68
|
}
|
42
69
|
|
43
70
|
assert_equal expected_data, res["data"]
|
@@ -93,4 +93,48 @@ describe GraphQL::InterfaceType do
|
|
93
93
|
assert_equal 4, interface_2.fields.size
|
94
94
|
end
|
95
95
|
end
|
96
|
+
|
97
|
+
describe "#resolve_type" do
|
98
|
+
let(:result) { Dummy::Schema.execute(query_string) }
|
99
|
+
let(:query_string) {%|
|
100
|
+
{
|
101
|
+
allEdible {
|
102
|
+
__typename
|
103
|
+
... on Milk {
|
104
|
+
milkFatContent: fatContent
|
105
|
+
}
|
106
|
+
... on Cheese {
|
107
|
+
cheeseFatContent: fatContent
|
108
|
+
}
|
109
|
+
}
|
110
|
+
|
111
|
+
allEdibleAsMilk {
|
112
|
+
__typename
|
113
|
+
... on Milk {
|
114
|
+
fatContent
|
115
|
+
}
|
116
|
+
}
|
117
|
+
}
|
118
|
+
|}
|
119
|
+
|
120
|
+
it 'returns correct types for general schema and specific interface' do
|
121
|
+
expected_result = {
|
122
|
+
# Uses schema-level resolve_type
|
123
|
+
"allEdible"=>[
|
124
|
+
{"__typename"=>"Cheese", "cheeseFatContent"=>0.19},
|
125
|
+
{"__typename"=>"Cheese", "cheeseFatContent"=>0.3},
|
126
|
+
{"__typename"=>"Cheese", "cheeseFatContent"=>0.065},
|
127
|
+
{"__typename"=>"Milk", "milkFatContent"=>0.04}
|
128
|
+
],
|
129
|
+
# Uses type-level resolve_type
|
130
|
+
"allEdibleAsMilk"=>[
|
131
|
+
{"__typename"=>"Milk", "fatContent"=>0.19},
|
132
|
+
{"__typename"=>"Milk", "fatContent"=>0.3},
|
133
|
+
{"__typename"=>"Milk", "fatContent"=>0.065},
|
134
|
+
{"__typename"=>"Milk", "fatContent"=>0.04}
|
135
|
+
]
|
136
|
+
}
|
137
|
+
assert_equal expected_result, result["data"]
|
138
|
+
end
|
139
|
+
end
|
96
140
|
end
|
@@ -19,8 +19,11 @@ describe GraphQL::Introspection::SchemaType do
|
|
19
19
|
"types" => Dummy::Schema.types.values.map { |t| t.name.nil? ? (p t; raise("no name for #{t}")) : {"name" => t.name} },
|
20
20
|
"queryType"=>{
|
21
21
|
"fields"=>[
|
22
|
+
{"name"=>"allAnimal"},
|
23
|
+
{"name"=>"allAnimalAsCow"},
|
22
24
|
{"name"=>"allDairy"},
|
23
25
|
{"name"=>"allEdible"},
|
26
|
+
{"name"=>"allEdibleAsMilk"},
|
24
27
|
{"name"=>"cheese"},
|
25
28
|
{"name"=>"cow"},
|
26
29
|
{"name"=>"dairy"},
|
@@ -17,7 +17,12 @@ describe GraphQL::ObjectType do
|
|
17
17
|
|
18
18
|
describe "interfaces" do
|
19
19
|
it "may have interfaces" do
|
20
|
-
assert_equal([
|
20
|
+
assert_equal([
|
21
|
+
Dummy::EdibleInterface,
|
22
|
+
Dummy::EdibleAsMilkInterface,
|
23
|
+
Dummy::AnimalProductInterface,
|
24
|
+
Dummy::LocalProductInterface
|
25
|
+
], type.interfaces)
|
21
26
|
end
|
22
27
|
|
23
28
|
it "raises if the interfaces arent an array" do
|
@@ -129,8 +134,8 @@ describe GraphQL::ObjectType do
|
|
129
134
|
|
130
135
|
type_2.fields["nonsense"] = GraphQL::Field.define(name: "nonsense", type: type)
|
131
136
|
|
132
|
-
assert_equal
|
133
|
-
assert_equal
|
137
|
+
assert_equal 4, type.interfaces.size
|
138
|
+
assert_equal 5, type_2.interfaces.size
|
134
139
|
assert_equal 8, type.fields.size
|
135
140
|
assert_equal 9, type_2.fields.size
|
136
141
|
end
|