graphql 0.0.4 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/graph_ql/directive.rb +36 -0
- data/lib/graph_ql/directives/directive_chain.rb +33 -0
- data/lib/graph_ql/directives/include_directive.rb +15 -0
- data/lib/graph_ql/directives/skip_directive.rb +15 -0
- data/lib/graph_ql/enum.rb +34 -0
- data/lib/graph_ql/fields/abstract_field.rb +37 -0
- data/lib/graph_ql/fields/access_field.rb +24 -0
- data/lib/graph_ql/fields/field.rb +34 -0
- data/lib/graph_ql/interface.rb +14 -0
- data/lib/graph_ql/introspection/arguments_field.rb +5 -0
- data/lib/graph_ql/introspection/directive_type.rb +12 -0
- data/lib/graph_ql/introspection/enum_value_type.rb +10 -0
- data/lib/graph_ql/introspection/enum_values_field.rb +15 -0
- data/lib/graph_ql/introspection/field_type.rb +11 -0
- data/lib/graph_ql/introspection/fields_field.rb +14 -0
- data/lib/graph_ql/introspection/input_fields_field.rb +12 -0
- data/lib/graph_ql/introspection/input_value_type.rb +10 -0
- data/lib/graph_ql/introspection/of_type_field.rb +12 -0
- data/lib/graph_ql/introspection/possible_types_field.rb +12 -0
- data/lib/graph_ql/introspection/schema_type.rb +32 -0
- data/lib/graph_ql/introspection/type_kind_enum.rb +7 -0
- data/lib/graph_ql/introspection/type_type.rb +22 -0
- data/lib/graph_ql/parser/nodes.rb +72 -0
- data/lib/graph_ql/parser/parser.rb +108 -0
- data/lib/graph_ql/parser/transform.rb +86 -0
- data/lib/graph_ql/parser/visitor.rb +47 -0
- data/lib/graph_ql/query.rb +50 -0
- data/lib/graph_ql/query/arguments.rb +25 -0
- data/lib/graph_ql/query/field_resolution_strategy.rb +83 -0
- data/lib/graph_ql/query/fragment_spread_resolution_strategy.rb +16 -0
- data/lib/graph_ql/query/inline_fragment_resolution_strategy.rb +14 -0
- data/lib/graph_ql/query/operation_resolver.rb +28 -0
- data/lib/graph_ql/query/selection_resolver.rb +20 -0
- data/lib/graph_ql/query/type_resolver.rb +19 -0
- data/lib/graph_ql/repl.rb +27 -0
- data/lib/graph_ql/schema.rb +30 -0
- data/lib/graph_ql/schema/type_reducer.rb +44 -0
- data/lib/graph_ql/type_kinds.rb +15 -0
- data/lib/graph_ql/types/abstract_type.rb +14 -0
- data/lib/graph_ql/types/boolean_type.rb +6 -0
- data/lib/graph_ql/types/float_type.rb +6 -0
- data/lib/graph_ql/types/input_object_type.rb +17 -0
- data/lib/graph_ql/types/input_value.rb +10 -0
- data/lib/graph_ql/types/int_type.rb +6 -0
- data/lib/graph_ql/types/list_type.rb +10 -0
- data/lib/graph_ql/types/non_null_type.rb +18 -0
- data/lib/graph_ql/types/non_null_with_bang.rb +5 -0
- data/lib/graph_ql/types/object_type.rb +62 -0
- data/lib/graph_ql/types/scalar_type.rb +5 -0
- data/lib/graph_ql/types/string_type.rb +6 -0
- data/lib/graph_ql/types/type_definer.rb +16 -0
- data/lib/graph_ql/union.rb +35 -0
- data/lib/graph_ql/validations/fields_are_defined_on_type.rb +44 -0
- data/lib/graph_ql/validations/fields_will_merge.rb +80 -0
- data/lib/graph_ql/validations/fragments_are_used.rb +24 -0
- data/lib/graph_ql/validator.rb +29 -0
- data/lib/graph_ql/version.rb +3 -0
- data/lib/graphql.rb +92 -99
- data/readme.md +17 -177
- data/spec/graph_ql/directive_spec.rb +81 -0
- data/spec/graph_ql/enum_spec.rb +5 -0
- data/spec/graph_ql/fields/field_spec.rb +10 -0
- data/spec/graph_ql/interface_spec.rb +13 -0
- data/spec/graph_ql/introspection/directive_type_spec.rb +40 -0
- data/spec/graph_ql/introspection/schema_type_spec.rb +39 -0
- data/spec/graph_ql/introspection/type_type_spec.rb +104 -0
- data/spec/graph_ql/parser/parser_spec.rb +120 -0
- data/spec/graph_ql/parser/transform_spec.rb +109 -0
- data/spec/graph_ql/parser/visitor_spec.rb +31 -0
- data/spec/graph_ql/query/operation_resolver_spec.rb +14 -0
- data/spec/graph_ql/query_spec.rb +82 -0
- data/spec/graph_ql/schema/type_reducer_spec.rb +24 -0
- data/spec/graph_ql/types/input_object_type_spec.rb +12 -0
- data/spec/graph_ql/types/object_type_spec.rb +35 -0
- data/spec/graph_ql/union_spec.rb +27 -0
- data/spec/graph_ql/validations/fields_are_defined_on_type_spec.rb +28 -0
- data/spec/graph_ql/validations/fields_will_merge_spec.rb +40 -0
- data/spec/graph_ql/validations/fragments_are_used_spec.rb +28 -0
- data/spec/graph_ql/validator_spec.rb +24 -0
- data/spec/spec_helper.rb +2 -2
- data/spec/support/dummy_app.rb +123 -63
- data/spec/support/dummy_data.rb +11 -0
- metadata +107 -59
- data/lib/graphql/call.rb +0 -8
- data/lib/graphql/connection.rb +0 -65
- data/lib/graphql/field.rb +0 -12
- data/lib/graphql/field_definer.rb +0 -25
- data/lib/graphql/introspection/call_type.rb +0 -13
- data/lib/graphql/introspection/connection.rb +0 -9
- data/lib/graphql/introspection/field_type.rb +0 -10
- data/lib/graphql/introspection/root_call_argument_node.rb +0 -5
- data/lib/graphql/introspection/root_call_type.rb +0 -20
- data/lib/graphql/introspection/schema_call.rb +0 -8
- data/lib/graphql/introspection/schema_type.rb +0 -17
- data/lib/graphql/introspection/type_call.rb +0 -8
- data/lib/graphql/introspection/type_type.rb +0 -18
- data/lib/graphql/node.rb +0 -244
- data/lib/graphql/parser/parser.rb +0 -39
- data/lib/graphql/parser/transform.rb +0 -22
- data/lib/graphql/query.rb +0 -109
- data/lib/graphql/root_call.rb +0 -202
- data/lib/graphql/root_call_argument.rb +0 -11
- data/lib/graphql/root_call_argument_definer.rb +0 -17
- data/lib/graphql/schema/all.rb +0 -46
- data/lib/graphql/schema/schema.rb +0 -87
- data/lib/graphql/schema/schema_validation.rb +0 -32
- data/lib/graphql/syntax/call.rb +0 -8
- data/lib/graphql/syntax/field.rb +0 -9
- data/lib/graphql/syntax/fragment.rb +0 -7
- data/lib/graphql/syntax/node.rb +0 -8
- data/lib/graphql/syntax/query.rb +0 -8
- data/lib/graphql/syntax/variable.rb +0 -7
- data/lib/graphql/types/boolean_type.rb +0 -3
- data/lib/graphql/types/number_type.rb +0 -3
- data/lib/graphql/types/object_type.rb +0 -6
- data/lib/graphql/types/string_type.rb +0 -3
- data/lib/graphql/version.rb +0 -3
- data/spec/graphql/node_spec.rb +0 -69
- data/spec/graphql/parser/parser_spec.rb +0 -168
- data/spec/graphql/parser/transform_spec.rb +0 -157
- data/spec/graphql/query_spec.rb +0 -274
- data/spec/graphql/root_call_spec.rb +0 -69
- data/spec/graphql/schema/schema_spec.rb +0 -93
- data/spec/graphql/schema/schema_validation_spec.rb +0 -48
- data/spec/support/nodes.rb +0 -175
@@ -1,11 +0,0 @@
|
|
1
|
-
# Created by {RootCall.argument}, used internally by GraphQL
|
2
|
-
class GraphQL::RootCallArgument
|
3
|
-
attr_reader :type, :name, :any_number
|
4
|
-
attr_accessor :index
|
5
|
-
def initialize(type:, name:, any_number: false, index: nil)
|
6
|
-
@type = type
|
7
|
-
@name = name
|
8
|
-
@any_number = any_number
|
9
|
-
@index = index
|
10
|
-
end
|
11
|
-
end
|
@@ -1,17 +0,0 @@
|
|
1
|
-
# Enables the {RootCall.argument} API, used internall by GraphQL
|
2
|
-
class GraphQL::RootCallArgumentDefiner
|
3
|
-
ARGUMENT_TYPES = [:string, :object, :number]
|
4
|
-
|
5
|
-
def initialize(owner)
|
6
|
-
@owner = owner
|
7
|
-
end
|
8
|
-
|
9
|
-
def none
|
10
|
-
end
|
11
|
-
|
12
|
-
ARGUMENT_TYPES.each do |arg_type|
|
13
|
-
define_method arg_type do |name, any_number: false|
|
14
|
-
@owner.add_argument(GraphQL::RootCallArgument.new(type: arg_type.to_s, name: name.to_s, any_number: any_number))
|
15
|
-
end
|
16
|
-
end
|
17
|
-
end
|
data/lib/graphql/schema/all.rb
DELETED
@@ -1,46 +0,0 @@
|
|
1
|
-
# This query string yields the whole schema. Access it from {GraphQL::Schema::Schema#all}
|
2
|
-
GraphQL::Schema::ALL = "
|
3
|
-
schema() {
|
4
|
-
calls {
|
5
|
-
count,
|
6
|
-
edges {
|
7
|
-
node {
|
8
|
-
name,
|
9
|
-
returns,
|
10
|
-
arguments {
|
11
|
-
edges {
|
12
|
-
node {
|
13
|
-
name, type
|
14
|
-
}
|
15
|
-
}
|
16
|
-
}
|
17
|
-
}
|
18
|
-
}
|
19
|
-
},
|
20
|
-
types {
|
21
|
-
count,
|
22
|
-
edges {
|
23
|
-
node {
|
24
|
-
name,
|
25
|
-
fields {
|
26
|
-
count,
|
27
|
-
edges {
|
28
|
-
node {
|
29
|
-
name,
|
30
|
-
type,
|
31
|
-
calls {
|
32
|
-
count,
|
33
|
-
edges {
|
34
|
-
node {
|
35
|
-
name,
|
36
|
-
arguments
|
37
|
-
}
|
38
|
-
}
|
39
|
-
}
|
40
|
-
}
|
41
|
-
}
|
42
|
-
}
|
43
|
-
}
|
44
|
-
}
|
45
|
-
}
|
46
|
-
}"
|
@@ -1,87 +0,0 @@
|
|
1
|
-
# {GraphQL::SCHEMA} keeps track of defined nodes, fields and calls.
|
2
|
-
#
|
3
|
-
# Although you don't interact with it directly, it responds to queries for `schema()` and `__type__` info.
|
4
|
-
#
|
5
|
-
# You can validate it at runtime with {#validate}
|
6
|
-
# @example
|
7
|
-
# # validate the schema
|
8
|
-
# GraphQL::SCHEMA.validate
|
9
|
-
#
|
10
|
-
require "singleton"
|
11
|
-
|
12
|
-
class GraphQL::Schema::Schema
|
13
|
-
include Singleton
|
14
|
-
attr_reader :types, :calls, :class_names
|
15
|
-
def initialize
|
16
|
-
@types = {}
|
17
|
-
@class_names = {}
|
18
|
-
@calls = {}
|
19
|
-
end
|
20
|
-
|
21
|
-
# Queries the whole schema and returns the result
|
22
|
-
def all
|
23
|
-
GraphQL::Query.new(GraphQL::Schema::ALL).as_result
|
24
|
-
end
|
25
|
-
|
26
|
-
def validate
|
27
|
-
validation = GraphQL::Schema::SchemaValidation.new
|
28
|
-
validation.validate(self)
|
29
|
-
end
|
30
|
-
|
31
|
-
def add_call(call_class)
|
32
|
-
remove_call(call_class)
|
33
|
-
raise "You can't make #{call_class.name}'s type '#{call_class.schema_name}'" if call_class.schema_name.blank?
|
34
|
-
@calls[call_class.schema_name] = call_class
|
35
|
-
end
|
36
|
-
|
37
|
-
def get_call(identifier)
|
38
|
-
@calls[identifier.to_s] || raise(GraphQL::RootCallNotDefinedError.new(identifier))
|
39
|
-
end
|
40
|
-
|
41
|
-
def remove_call(call_class)
|
42
|
-
existing_name = @calls.key(call_class)
|
43
|
-
if existing_name
|
44
|
-
@calls.delete(existing_name)
|
45
|
-
end
|
46
|
-
end
|
47
|
-
|
48
|
-
def call_names
|
49
|
-
@calls.keys
|
50
|
-
end
|
51
|
-
|
52
|
-
def add_type(node_class)
|
53
|
-
existing_name = @types.key(node_class)
|
54
|
-
if existing_name
|
55
|
-
@types.delete(existing_name)
|
56
|
-
end
|
57
|
-
|
58
|
-
node_class.exposes_class_names.each do |exposes_class_name|
|
59
|
-
@class_names[exposes_class_name] = node_class
|
60
|
-
end
|
61
|
-
|
62
|
-
@types[node_class.schema_name] = node_class
|
63
|
-
end
|
64
|
-
|
65
|
-
def get_type(identifier)
|
66
|
-
@types[identifier.to_s] || raise(GraphQL::NodeNotDefinedError.new(identifier))
|
67
|
-
end
|
68
|
-
|
69
|
-
def type_names
|
70
|
-
@types.keys.sort
|
71
|
-
end
|
72
|
-
|
73
|
-
def type_for_object(app_object)
|
74
|
-
registered_class_names = @class_names.keys
|
75
|
-
if app_object.is_a?(Class)
|
76
|
-
app_class = app_object
|
77
|
-
else
|
78
|
-
app_class = app_object.class
|
79
|
-
end
|
80
|
-
app_class.ancestors.map(&:name).each do |class_name|
|
81
|
-
if registered_class_names.include?(class_name)
|
82
|
-
return @class_names[class_name]
|
83
|
-
end
|
84
|
-
end
|
85
|
-
raise "Couldn't find node for class #{app_class} \"#{app_object}\" (ancestors: #{app_class.ancestors.map(&:name)}, defined: #{registered_class_names})"
|
86
|
-
end
|
87
|
-
end
|
@@ -1,32 +0,0 @@
|
|
1
|
-
# Validates a schema (specifically, {GraphQL::SCHEMA}).
|
2
|
-
#
|
3
|
-
# It checks:
|
4
|
-
# - All classes exposed by nodes actually exist
|
5
|
-
# - Field types requested by nodes actually exist
|
6
|
-
# - Fields' corresponding methods actually exist
|
7
|
-
#
|
8
|
-
# To validate a schema, use {GraphQL::Schema::Schema#validate}.
|
9
|
-
class GraphQL::Schema::SchemaValidation
|
10
|
-
# Validates the schema
|
11
|
-
def validate(schema)
|
12
|
-
schema.types.each do |type_name, type_class|
|
13
|
-
|
14
|
-
type_class.exposes_class_names.each do |exposes_class_name|
|
15
|
-
begin
|
16
|
-
Object.const_get(exposes_class_name)
|
17
|
-
rescue NameError
|
18
|
-
raise GraphQL::ExposesClassMissingError.new(type_class)
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
|
-
type_class.all_fields.each do |field_name, field_mapping|
|
23
|
-
# Make sure the type exists
|
24
|
-
field_mapping.type_class
|
25
|
-
# Make sure the node can handle it
|
26
|
-
if !type_class.respond_to_field?(field_mapping.name)
|
27
|
-
raise GraphQL::FieldNotDefinedError.new(type_class, field_mapping.name)
|
28
|
-
end
|
29
|
-
end
|
30
|
-
end
|
31
|
-
end
|
32
|
-
end
|
data/lib/graphql/syntax/call.rb
DELETED
data/lib/graphql/syntax/field.rb
DELETED
data/lib/graphql/syntax/node.rb
DELETED
data/lib/graphql/syntax/query.rb
DELETED
data/lib/graphql/version.rb
DELETED
data/spec/graphql/node_spec.rb
DELETED
@@ -1,69 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe GraphQL::Node do
|
4
|
-
let(:query_string) { "type(post) { name, description, fields { count, edges { node { name, type }}} }"}
|
5
|
-
let(:result) { GraphQL::Query.new(query_string).as_result}
|
6
|
-
|
7
|
-
describe '__type__' do
|
8
|
-
let(:title_field) { result["post"]["fields"]["edges"].find {|e| e["node"]["name"] == "title"}["node"] }
|
9
|
-
|
10
|
-
it 'has name' do
|
11
|
-
assert_equal "post", result["post"]["name"]
|
12
|
-
end
|
13
|
-
|
14
|
-
it 'has description' do
|
15
|
-
assert_equal "A blog post entry", result["post"]["description"]
|
16
|
-
end
|
17
|
-
|
18
|
-
it 'has fields' do
|
19
|
-
assert_equal 8, result["post"]["fields"]["count"]
|
20
|
-
assert_equal({ "name" => "title", "type" => "string"}, title_field)
|
21
|
-
end
|
22
|
-
|
23
|
-
describe 'getting the __type__ field' do
|
24
|
-
before do
|
25
|
-
@post = Post.create(id: 155, content: "Hello world")
|
26
|
-
end
|
27
|
-
|
28
|
-
after do
|
29
|
-
@post.destroy
|
30
|
-
end
|
31
|
-
|
32
|
-
let(:query_string) { "post(155) { __type__ { name, fields { count } } }"}
|
33
|
-
|
34
|
-
it 'exposes the type' do
|
35
|
-
assert_equal "post", result["155"]["__type__"]["name"]
|
36
|
-
assert_equal 8, result["155"]["__type__"]["fields"]["count"]
|
37
|
-
end
|
38
|
-
end
|
39
|
-
end
|
40
|
-
|
41
|
-
describe '.node_name' do
|
42
|
-
let(:query_string) { "type(upvote) { name }"}
|
43
|
-
|
44
|
-
it 'overrides __type__.name' do
|
45
|
-
assert_equal "upvote", result["upvote"]["name"]
|
46
|
-
end
|
47
|
-
end
|
48
|
-
|
49
|
-
describe '.field' do
|
50
|
-
it 'doesnt add the field twice if you call it twice' do
|
51
|
-
assert_equal 5, Nodes::CommentNode.all_fields.size
|
52
|
-
Nodes::CommentNode.field.number(:id)
|
53
|
-
Nodes::CommentNode.field.number(:id)
|
54
|
-
assert_equal 5, Nodes::CommentNode.all_fields.size
|
55
|
-
Nodes::CommentNode.remove_field(:id)
|
56
|
-
end
|
57
|
-
|
58
|
-
describe 'type:' do
|
59
|
-
it 'uses symbols to find built-ins' do
|
60
|
-
field_mapping = Nodes::CommentNode.all_fields["id"]
|
61
|
-
assert_equal GraphQL::Types::NumberType, field_mapping.type_class
|
62
|
-
end
|
63
|
-
it 'uses the provided class as a superclass' do
|
64
|
-
letters_field = Nodes::CommentNode.all_fields["letters"]
|
65
|
-
assert_equal Nodes::LetterSelectionType, letters_field.type_class
|
66
|
-
end
|
67
|
-
end
|
68
|
-
end
|
69
|
-
end
|
@@ -1,168 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe GraphQL::Parser::Parser do
|
4
|
-
let(:parser) { GraphQL::PARSER }
|
5
|
-
|
6
|
-
describe 'query' do
|
7
|
-
let(:query) { parser.query }
|
8
|
-
it 'parses node-only' do
|
9
|
-
assert query.parse_with_debug("node(4) { id, name } ")
|
10
|
-
end
|
11
|
-
it 'parses node and variables' do
|
12
|
-
assert query.parse_with_debug(%{
|
13
|
-
like_page(<page>) {
|
14
|
-
$pageFragment
|
15
|
-
}
|
16
|
-
<page>: {
|
17
|
-
"page": {"id": 1},
|
18
|
-
"person" : { "id", 4}
|
19
|
-
}
|
20
|
-
<other>: {
|
21
|
-
"page": {"id": 1},
|
22
|
-
"person" : { "id", 4}
|
23
|
-
}
|
24
|
-
|
25
|
-
$pageFragment: {
|
26
|
-
page { id }
|
27
|
-
}
|
28
|
-
})
|
29
|
-
end
|
30
|
-
end
|
31
|
-
|
32
|
-
describe 'field' do
|
33
|
-
let(:field) { parser.field }
|
34
|
-
it 'finds words' do
|
35
|
-
assert field.parse_with_debug("date_of_birth")
|
36
|
-
end
|
37
|
-
|
38
|
-
it 'finds aliases' do
|
39
|
-
assert field.parse_with_debug("name as moniker")
|
40
|
-
end
|
41
|
-
|
42
|
-
it 'finds calls on fields' do
|
43
|
-
assert field.parse_with_debug("url.site(www).upcase()")
|
44
|
-
end
|
45
|
-
|
46
|
-
describe 'fields that return objects' do
|
47
|
-
it 'finds them' do
|
48
|
-
assert field.parse_with_debug("birthdate { month, year }")
|
49
|
-
end
|
50
|
-
|
51
|
-
it 'finds them with aliases' do
|
52
|
-
assert field.parse_with_debug("birthdate as d_o_b { month, year }")
|
53
|
-
end
|
54
|
-
|
55
|
-
it 'finds them with calls' do
|
56
|
-
assert field.parse_with_debug("friends.after(123) { count { edges { node { id } } } }")
|
57
|
-
end
|
58
|
-
|
59
|
-
it 'finds them with calls and aliases' do
|
60
|
-
assert field.parse_with_debug("friends.after(123) as pals { count { edges { node { id } } } }")
|
61
|
-
end
|
62
|
-
end
|
63
|
-
end
|
64
|
-
|
65
|
-
describe 'call' do
|
66
|
-
let(:call) { parser.call }
|
67
|
-
it 'finds bare calls' do
|
68
|
-
assert call.parse_with_debug("node(123)")
|
69
|
-
assert call.parse_with_debug("viewer()")
|
70
|
-
end
|
71
|
-
|
72
|
-
it 'finds calls with multiple arguments' do
|
73
|
-
assert call.parse_with_debug("node(4, 6)")
|
74
|
-
end
|
75
|
-
|
76
|
-
it 'finds calls with variables' do
|
77
|
-
assert call.parse_with_debug("like_page(<page>)")
|
78
|
-
end
|
79
|
-
end
|
80
|
-
|
81
|
-
describe 'fields' do
|
82
|
-
let(:fields) { parser.fields }
|
83
|
-
|
84
|
-
it 'finds fields' do
|
85
|
-
assert fields.parse_with_debug("{id,name}")
|
86
|
-
assert fields.parse_with_debug("{ id, name, favorite_food }")
|
87
|
-
assert fields.parse_with_debug("{\n id,\n name,\n favorite_food\n}")
|
88
|
-
end
|
89
|
-
|
90
|
-
it 'finds nested field list' do
|
91
|
-
assert fields.parse_with_debug("{id,date_of_birth{month, year}}")
|
92
|
-
end
|
93
|
-
end
|
94
|
-
|
95
|
-
describe 'node' do
|
96
|
-
let(:node) { parser.node }
|
97
|
-
|
98
|
-
it 'parses root calls' do
|
99
|
-
assert node.parse_with_debug("viewer() {id}")
|
100
|
-
end
|
101
|
-
|
102
|
-
it 'parses query fragments' do
|
103
|
-
assert node.parse_with_debug("viewer() { id, $someFrag }")
|
104
|
-
end
|
105
|
-
|
106
|
-
it 'parses nested nodes' do
|
107
|
-
assert node.parse_with_debug("
|
108
|
-
node(someone)
|
109
|
-
{
|
110
|
-
id,
|
111
|
-
name,
|
112
|
-
friends.after(12345).first(3) {
|
113
|
-
cursor,
|
114
|
-
node {
|
115
|
-
id,
|
116
|
-
name
|
117
|
-
}
|
118
|
-
}
|
119
|
-
}
|
120
|
-
")
|
121
|
-
end
|
122
|
-
end
|
123
|
-
|
124
|
-
describe 'variable' do
|
125
|
-
let(:variable) { parser.variable }
|
126
|
-
|
127
|
-
it 'gets scalar variables' do
|
128
|
-
assert variable.parse_with_debug(%{<some_number>: 888})
|
129
|
-
assert variable.parse_with_debug(%{<some_string>: my_string})
|
130
|
-
end
|
131
|
-
it 'gets json variables' do
|
132
|
-
assert variable.parse_with_debug(%{<my_input>: {"key": "value"}})
|
133
|
-
end
|
134
|
-
|
135
|
-
it 'gets variables with nesting' do
|
136
|
-
assert variable.parse_with_debug(%{
|
137
|
-
<my_input>: {
|
138
|
-
"key": "value",
|
139
|
-
"1": 2,
|
140
|
-
"true": false,
|
141
|
-
"nested": {
|
142
|
-
"key" : "value"
|
143
|
-
}
|
144
|
-
}
|
145
|
-
})
|
146
|
-
end
|
147
|
-
end
|
148
|
-
|
149
|
-
describe 'fragment' do
|
150
|
-
let(:fragment) { parser.fragment }
|
151
|
-
|
152
|
-
it 'gets parts of queries' do
|
153
|
-
assert fragment.parse_with_debug(%{ $frag: { id } })
|
154
|
-
end
|
155
|
-
|
156
|
-
it 'gets nested parts of queries' do
|
157
|
-
assert fragment.parse_with_debug(%{
|
158
|
-
$frag: {
|
159
|
-
item {
|
160
|
-
name,
|
161
|
-
price
|
162
|
-
},
|
163
|
-
$qtyFragment
|
164
|
-
}
|
165
|
-
})
|
166
|
-
end
|
167
|
-
end
|
168
|
-
end
|