graphql 0.12.1 → 0.13.0
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.rb +31 -41
- data/lib/graphql/argument.rb +23 -21
- data/lib/graphql/base_type.rb +5 -8
- data/lib/graphql/define/assign_argument.rb +5 -2
- data/lib/graphql/define/type_definer.rb +2 -1
- data/lib/graphql/directive.rb +34 -36
- data/lib/graphql/directive/include_directive.rb +3 -7
- data/lib/graphql/directive/skip_directive.rb +3 -7
- data/lib/graphql/enum_type.rb +78 -76
- data/lib/graphql/execution_error.rb +1 -3
- data/lib/graphql/field.rb +99 -95
- data/lib/graphql/input_object_type.rb +49 -47
- data/lib/graphql/interface_type.rb +31 -34
- data/lib/graphql/introspection.rb +19 -18
- data/lib/graphql/introspection/directive_location_enum.rb +8 -0
- data/lib/graphql/introspection/directive_type.rb +1 -3
- data/lib/graphql/introspection/field_type.rb +1 -1
- data/lib/graphql/introspection/fields_field.rb +1 -1
- data/lib/graphql/introspection/introspection_query.rb +1 -3
- data/lib/graphql/introspection/possible_types_field.rb +7 -1
- data/lib/graphql/introspection/schema_field.rb +13 -9
- data/lib/graphql/introspection/type_by_name_field.rb +13 -17
- data/lib/graphql/introspection/typename_field.rb +12 -8
- data/lib/graphql/language.rb +5 -9
- data/lib/graphql/language/lexer.rb +668 -0
- data/lib/graphql/language/lexer.rl +149 -0
- data/lib/graphql/language/parser.rb +842 -116
- data/lib/graphql/language/parser.y +264 -0
- data/lib/graphql/language/token.rb +21 -0
- data/lib/graphql/list_type.rb +33 -31
- data/lib/graphql/non_null_type.rb +33 -31
- data/lib/graphql/object_type.rb +52 -55
- data/lib/graphql/query.rb +83 -80
- data/lib/graphql/query/context.rb +5 -1
- data/lib/graphql/query/directive_resolution.rb +16 -0
- data/lib/graphql/query/executor.rb +3 -3
- data/lib/graphql/query/input_validation_result.rb +17 -15
- data/lib/graphql/query/serial_execution.rb +5 -5
- data/lib/graphql/query/serial_execution/execution_context.rb +4 -3
- data/lib/graphql/query/serial_execution/selection_resolution.rb +19 -21
- data/lib/graphql/query/serial_execution/value_resolution.rb +1 -1
- data/lib/graphql/query/type_resolver.rb +22 -18
- data/lib/graphql/query/variable_validation_error.rb +14 -12
- data/lib/graphql/schema.rb +87 -77
- data/lib/graphql/schema/each_item_validator.rb +16 -12
- data/lib/graphql/schema/field_validator.rb +14 -10
- data/lib/graphql/schema/implementation_validator.rb +26 -22
- data/lib/graphql/schema/middleware_chain.rb +2 -1
- data/lib/graphql/schema/possible_types.rb +34 -0
- data/lib/graphql/schema/printer.rb +122 -120
- data/lib/graphql/schema/type_expression.rb +1 -0
- data/lib/graphql/schema/type_map.rb +3 -10
- data/lib/graphql/schema/type_reducer.rb +65 -81
- data/lib/graphql/schema/type_validator.rb +45 -41
- data/lib/graphql/static_validation.rb +7 -9
- data/lib/graphql/static_validation/all_rules.rb +29 -24
- data/lib/graphql/static_validation/arguments_validator.rb +39 -35
- data/lib/graphql/static_validation/literal_validator.rb +44 -40
- data/lib/graphql/static_validation/message.rb +30 -26
- data/lib/graphql/static_validation/rules/argument_literals_are_compatible.rb +15 -11
- data/lib/graphql/static_validation/rules/arguments_are_defined.rb +14 -10
- data/lib/graphql/static_validation/rules/directives_are_defined.rb +16 -12
- data/lib/graphql/static_validation/rules/directives_are_in_valid_locations.rb +59 -0
- data/lib/graphql/static_validation/rules/fields_are_defined_on_type.rb +25 -21
- data/lib/graphql/static_validation/rules/fields_have_appropriate_selections.rb +28 -24
- data/lib/graphql/static_validation/rules/fields_will_merge.rb +84 -80
- data/lib/graphql/static_validation/rules/fragment_spreads_are_possible.rb +49 -43
- data/lib/graphql/static_validation/rules/fragment_types_exist.rb +22 -17
- data/lib/graphql/static_validation/rules/fragments_are_finite.rb +19 -15
- data/lib/graphql/static_validation/rules/fragments_are_on_composite_types.rb +25 -20
- data/lib/graphql/static_validation/rules/fragments_are_used.rb +36 -23
- data/lib/graphql/static_validation/rules/required_arguments_are_present.rb +29 -25
- data/lib/graphql/static_validation/rules/variable_default_values_are_correctly_typed.rb +21 -17
- data/lib/graphql/static_validation/rules/variable_usages_are_allowed.rb +79 -70
- data/lib/graphql/static_validation/rules/variables_are_input_types.rb +24 -20
- data/lib/graphql/static_validation/rules/variables_are_used_and_defined.rb +122 -119
- data/lib/graphql/static_validation/type_stack.rb +138 -129
- data/lib/graphql/static_validation/validator.rb +29 -25
- data/lib/graphql/type_kinds.rb +42 -40
- data/lib/graphql/union_type.rb +22 -16
- data/lib/graphql/version.rb +1 -1
- data/readme.md +12 -27
- data/spec/graphql/base_type_spec.rb +3 -3
- data/spec/graphql/directive_spec.rb +10 -18
- data/spec/graphql/enum_type_spec.rb +7 -7
- data/spec/graphql/execution_error_spec.rb +1 -1
- data/spec/graphql/field_spec.rb +14 -13
- data/spec/graphql/id_type_spec.rb +6 -6
- data/spec/graphql/input_object_type_spec.rb +39 -39
- data/spec/graphql/interface_type_spec.rb +16 -32
- data/spec/graphql/introspection/directive_type_spec.rb +5 -9
- data/spec/graphql/introspection/input_value_type_spec.rb +10 -4
- data/spec/graphql/introspection/introspection_query_spec.rb +2 -2
- data/spec/graphql/introspection/schema_type_spec.rb +2 -2
- data/spec/graphql/introspection/type_type_spec.rb +34 -6
- data/spec/graphql/language/parser_spec.rb +299 -105
- data/spec/graphql/language/visitor_spec.rb +4 -4
- data/spec/graphql/list_type_spec.rb +11 -11
- data/spec/graphql/object_type_spec.rb +10 -10
- data/spec/graphql/query/arguments_spec.rb +7 -7
- data/spec/graphql/query/context_spec.rb +11 -3
- data/spec/graphql/query/executor_spec.rb +26 -19
- data/spec/graphql/query/serial_execution/execution_context_spec.rb +6 -6
- data/spec/graphql/query/serial_execution/value_resolution_spec.rb +2 -2
- data/spec/graphql/query/type_resolver_spec.rb +3 -3
- data/spec/graphql/query_spec.rb +6 -38
- data/spec/graphql/scalar_type_spec.rb +28 -19
- data/spec/graphql/schema/field_validator_spec.rb +1 -1
- data/spec/graphql/schema/middleware_chain_spec.rb +12 -1
- data/spec/graphql/schema/printer_spec.rb +12 -4
- data/spec/graphql/schema/rescue_middleware_spec.rb +1 -1
- data/spec/graphql/schema/type_expression_spec.rb +2 -2
- data/spec/graphql/schema/type_reducer_spec.rb +21 -36
- data/spec/graphql/schema/type_validator_spec.rb +9 -9
- data/spec/graphql/schema_spec.rb +1 -1
- data/spec/graphql/static_validation/rules/argument_literals_are_compatible_spec.rb +4 -4
- data/spec/graphql/static_validation/rules/arguments_are_defined_spec.rb +4 -4
- data/spec/graphql/static_validation/rules/directives_are_defined_spec.rb +5 -5
- data/spec/graphql/static_validation/rules/directives_are_in_valid_locations_spec.rb +39 -0
- data/spec/graphql/static_validation/rules/fields_are_defined_on_type_spec.rb +5 -5
- data/spec/graphql/static_validation/rules/fields_have_appropriate_selections_spec.rb +4 -4
- data/spec/graphql/static_validation/rules/fields_will_merge_spec.rb +2 -2
- data/spec/graphql/static_validation/rules/fragment_spreads_are_possible_spec.rb +1 -1
- data/spec/graphql/static_validation/rules/fragment_types_exist_spec.rb +2 -2
- data/spec/graphql/static_validation/rules/fragments_are_finite_spec.rb +2 -2
- data/spec/graphql/static_validation/rules/fragments_are_on_composite_types_spec.rb +2 -2
- data/spec/graphql/static_validation/rules/fragments_are_used_spec.rb +3 -3
- data/spec/graphql/static_validation/rules/required_arguments_are_present_spec.rb +3 -3
- data/spec/graphql/static_validation/rules/variable_default_values_are_correctly_typed_spec.rb +5 -5
- data/spec/graphql/static_validation/rules/variable_usages_are_allowed_spec.rb +3 -1
- data/spec/graphql/static_validation/rules/variables_are_input_types_spec.rb +4 -4
- data/spec/graphql/static_validation/rules/variables_are_used_and_defined_spec.rb +3 -3
- data/spec/graphql/static_validation/type_stack_spec.rb +3 -2
- data/spec/graphql/static_validation/validator_spec.rb +26 -6
- data/spec/graphql/union_type_spec.rb +5 -4
- data/spec/spec_helper.rb +2 -5
- data/spec/support/dairy_app.rb +30 -9
- data/spec/support/dairy_data.rb +1 -1
- data/spec/support/star_wars_data.rb +26 -26
- data/spec/support/star_wars_schema.rb +1 -1
- metadata +40 -21
- data/lib/graphql/language/transform.rb +0 -113
- data/lib/graphql/query/directive_chain.rb +0 -44
- data/lib/graphql/repl.rb +0 -27
- data/spec/graphql/language/transform_spec.rb +0 -156
@@ -1,29 +1,33 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
#
|
4
|
-
#
|
5
|
-
#
|
6
|
-
#
|
7
|
-
#
|
8
|
-
#
|
9
|
-
#
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
1
|
+
module GraphQL
|
2
|
+
module StaticValidation
|
3
|
+
# Initialized with a {GraphQL::Schema}, then it can validate {GraphQL::Language::Nodes::Documents}s based on that schema.
|
4
|
+
#
|
5
|
+
# By default, it's used by {GraphQL::Query}
|
6
|
+
#
|
7
|
+
# @example Validate a query
|
8
|
+
# validator = GraphQL::StaticValidation::Validator.new(schema: MySchema)
|
9
|
+
# document = GraphQL.parse(query_string)
|
10
|
+
# errors = validator.validate(document)
|
11
|
+
#
|
12
|
+
class Validator
|
13
|
+
# @param schema [GraphQL::Schema]
|
14
|
+
# @param rule [Array<#validate(context)>] a list of rules to use when validating
|
15
|
+
def initialize(schema:, rules: GraphQL::StaticValidation::ALL_RULES)
|
16
|
+
@schema = schema
|
17
|
+
@rules = rules
|
18
|
+
end
|
17
19
|
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
20
|
+
# Validate `document` against the schema. Returns an array of message hashes.
|
21
|
+
# @param document [GraphQL::Language::Nodes::Document]
|
22
|
+
# @return [Array<Hash>]
|
23
|
+
def validate(query)
|
24
|
+
context = GraphQL::StaticValidation::ValidationContext.new(query)
|
25
|
+
@rules.each do |rules|
|
26
|
+
rules.new.validate(context)
|
27
|
+
end
|
28
|
+
context.visitor.visit(query.document)
|
29
|
+
context.errors.map(&:to_h)
|
30
|
+
end
|
25
31
|
end
|
26
|
-
context.visitor.visit(query.document)
|
27
|
-
context.errors.map(&:to_h)
|
28
32
|
end
|
29
33
|
end
|
data/lib/graphql/type_kinds.rb
CHANGED
@@ -1,46 +1,48 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
1
|
+
module GraphQL
|
2
|
+
# Type kinds are the basic categories which a type may belong to (`Object`, `Scalar`, `Union`...)
|
3
|
+
module TypeKinds
|
4
|
+
# These objects are singletons, eg `GraphQL::TypeKinds::UNION`, `GraphQL::TypeKinds::SCALAR`.
|
5
|
+
class TypeKind
|
6
|
+
attr_reader :name
|
7
|
+
def initialize(name, resolves: false, fields: false, wraps: false, input: false)
|
8
|
+
@name = name
|
9
|
+
@resolves = resolves
|
10
|
+
@fields = fields
|
11
|
+
@wraps = wraps
|
12
|
+
@input = input
|
13
|
+
@composite = fields? || resolves?
|
14
|
+
end
|
14
15
|
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
16
|
+
# Does this TypeKind have multiple possible implementors?
|
17
|
+
def resolves?; @resolves; end
|
18
|
+
# Does this TypeKind have queryable fields?
|
19
|
+
def fields?; @fields; end
|
20
|
+
# Does this TypeKind modify another type?
|
21
|
+
def wraps?; @wraps; end
|
22
|
+
# Is this TypeKind a valid query input?
|
23
|
+
def input?; @input; end
|
24
|
+
def to_s; @name; end
|
25
|
+
# Is this TypeKind composed of many values?
|
26
|
+
def composite?; @composite; end
|
27
|
+
end
|
27
28
|
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
29
|
+
TYPE_KINDS = [
|
30
|
+
SCALAR = TypeKind.new("SCALAR", input: true),
|
31
|
+
OBJECT = TypeKind.new("OBJECT", fields: true),
|
32
|
+
INTERFACE = TypeKind.new("INTERFACE", resolves: true, fields: true),
|
33
|
+
UNION = TypeKind.new("UNION", resolves: true),
|
34
|
+
ENUM = TypeKind.new("ENUM", input: true),
|
35
|
+
INPUT_OBJECT = TypeKind.new("INPUT_OBJECT", input: true),
|
36
|
+
LIST = TypeKind.new("LIST", wraps: true),
|
37
|
+
NON_NULL = TypeKind.new("NON_NULL", wraps: true),
|
38
|
+
]
|
38
39
|
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
40
|
+
KIND_NAMES = TYPE_KINDS.map(&:name)
|
41
|
+
class TypeKind
|
42
|
+
KIND_NAMES.each do |kind_name|
|
43
|
+
define_method("#{kind_name.downcase}?") do
|
44
|
+
self.name == kind_name
|
45
|
+
end
|
44
46
|
end
|
45
47
|
end
|
46
48
|
end
|
data/lib/graphql/union_type.rb
CHANGED
@@ -1,19 +1,25 @@
|
|
1
|
-
|
2
|
-
#
|
3
|
-
#
|
4
|
-
#
|
5
|
-
#
|
6
|
-
#
|
7
|
-
#
|
8
|
-
#
|
9
|
-
#
|
10
|
-
#
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
1
|
+
module GraphQL
|
2
|
+
# A collection of {ObjectType}s
|
3
|
+
#
|
4
|
+
# @example a union of types
|
5
|
+
#
|
6
|
+
# PetUnion = GraphQL::UnionType.define do
|
7
|
+
# name "Pet"
|
8
|
+
# description "Animals that live in your house"
|
9
|
+
# possible_types [DogType, CatType, FishType]
|
10
|
+
# end
|
11
|
+
#
|
12
|
+
class UnionType < GraphQL::BaseType
|
13
|
+
include GraphQL::BaseType::HasPossibleTypes
|
14
|
+
attr_accessor :name, :description, :possible_types
|
15
|
+
accepts_definitions :possible_types, :resolve_type
|
15
16
|
|
16
|
-
|
17
|
-
|
17
|
+
def kind
|
18
|
+
GraphQL::TypeKinds::UNION
|
19
|
+
end
|
20
|
+
|
21
|
+
def include?(child_type_defn)
|
22
|
+
possible_types.include?(child_type_defn)
|
23
|
+
end
|
18
24
|
end
|
19
25
|
end
|
data/lib/graphql/version.rb
CHANGED
data/readme.md
CHANGED
@@ -64,10 +64,6 @@ Schema = GraphQL::Schema.new(
|
|
64
64
|
)
|
65
65
|
```
|
66
66
|
|
67
|
-
See also:
|
68
|
-
- the [test schema](https://github.com/rmosolgo/graphql-ruby/blob/master/spec/support/dairy_app.rb)
|
69
|
-
- [`graphql-ruby-demo`](https://github.com/rmosolgo/graphql-ruby-demo) for an example schema on Rails
|
70
|
-
|
71
67
|
#### Execute queries
|
72
68
|
|
73
69
|
Execute GraphQL queries on a given schema, from a query string.
|
@@ -84,11 +80,6 @@ result_hash = Schema.execute(query_string)
|
|
84
80
|
# }
|
85
81
|
```
|
86
82
|
|
87
|
-
See also:
|
88
|
-
- [query_spec.rb](https://github.com/rmosolgo/graphql-ruby/blob/master/spec/graphql/query_spec.rb) for an example of query execution.
|
89
|
-
- [`queries_controller.rb`](https://github.com/rmosolgo/graphql-ruby-demo/blob/master/app/controllers/queries_controller.rb) for a Rails example
|
90
|
-
- Try it on [heroku](http://graphql-ruby-demo.herokuapp.com)
|
91
|
-
|
92
83
|
#### Use with Relay
|
93
84
|
|
94
85
|
If you're building a backend for [Relay](http://facebook.github.io/relay/), you'll need:
|
@@ -96,21 +87,6 @@ If you're building a backend for [Relay](http://facebook.github.io/relay/), you'
|
|
96
87
|
- A JSON dump of the schema, which you can get by sending [`GraphQL::Introspection::INTROSPECTION_QUERY`](https://github.com/rmosolgo/graphql-ruby/blob/master/lib/graphql/introspection/introspection_query.rb)
|
97
88
|
- Relay-specific helpers for GraphQL like Connections, node fields, and global ids. Here's one example of those: [`graphql-relay`](https://github.com/rmosolgo/graphql-relay-ruby)
|
98
89
|
|
99
|
-
## Getting Started Tutorials
|
100
|
-
|
101
|
-
#### Series: Building a blog in GraphQL and Relay on Rails
|
102
|
-
1. **Introduction:** https://medium.com/@gauravtiwari/graphql-and-relay-on-rails-getting-started-955a49d251de
|
103
|
-
2. **Part1:** https://medium.com/@gauravtiwari/graphql-and-relay-on-rails-creating-types-and-schema-b3f9b232ccfc
|
104
|
-
3. **Part2:**
|
105
|
-
https://medium.com/@gauravtiwari/graphql-and-relay-on-rails-first-relay-powered-react-component-cb3f9ee95eca
|
106
|
-
|
107
|
-
#### Tutorials
|
108
|
-
|
109
|
-
1. https://medium.com/@khor/relay-facebook-on-rails-8b4af2057152
|
110
|
-
2. https://blog.jacobwgillespie.com/from-rest-to-graphql-b4e95e94c26b#.4cjtklrwt
|
111
|
-
3. http://mgiroux.me/2015/getting-started-with-rails-graphql-relay/
|
112
|
-
4. http://mgiroux.me/2015/uploading-files-using-relay-with-rails/
|
113
|
-
|
114
90
|
## Goals
|
115
91
|
|
116
92
|
- Implement the GraphQL spec & support a Relay front end
|
@@ -126,20 +102,29 @@ https://medium.com/@gauravtiwari/graphql-and-relay-on-rails-first-relay-powered-
|
|
126
102
|
|
127
103
|
## Related Projects
|
128
104
|
|
105
|
+
### Code
|
106
|
+
|
129
107
|
- `graphql-ruby` + Rails demo ([src](https://github.com/rmosolgo/graphql-ruby-demo) / [heroku](http://graphql-ruby-demo.herokuapp.com))
|
130
108
|
- [`graphql-batch`](https://github.com/shopify/graphql-batch), a batched query execution strategy
|
131
|
-
- [`graphql-parallel`](https://github.com/rmosolgo/graphql-parallel), an asynchronous query execution strategy
|
132
109
|
- [Example Relay support](https://github.com/rmosolgo/graphql-relay-ruby) in Ruby
|
133
110
|
- [`graphql-libgraphqlparser`](https://github.com/rmosolgo/graphql-libgraphqlparser), bindings to [libgraphqlparser](https://github.com/graphql/libgraphqlparser), a C-level parser.
|
134
111
|
|
112
|
+
### Blog Posts
|
113
|
+
|
114
|
+
- Building a blog in GraphQL and Relay on Rails [Introduction](https://medium.com/@gauravtiwari/graphql-and-relay-on-rails-getting-started-955a49d251de), [Part 1]( https://medium.com/@gauravtiwari/graphql-and-relay-on-rails-creating-types-and-schema-b3f9b232ccfc), [Part 2](https://medium.com/@gauravtiwari/graphql-and-relay-on-rails-first-relay-powered-react-component-cb3f9ee95eca)
|
115
|
+
- https://medium.com/@khor/relay-facebook-on-rails-8b4af2057152
|
116
|
+
- https://blog.jacobwgillespie.com/from-rest-to-graphql-b4e95e94c26b#.4cjtklrwt
|
117
|
+
- http://mgiroux.me/2015/getting-started-with-rails-graphql-relay/
|
118
|
+
- http://mgiroux.me/2015/uploading-files-using-relay-with-rails/
|
119
|
+
|
135
120
|
## To Do
|
136
121
|
|
137
|
-
- Interface's possible types should be a property of the schema, not the interface
|
138
122
|
- Type lookup should be by type name (to support reloaded constants in Rails code)
|
139
123
|
- Add a complexity validator (reject queries if they're too big)
|
140
124
|
- Add docs for shared behaviors & DRY code
|
141
|
-
- Optimize the pure-Ruby parser (hand-write, RACC?!)
|
142
125
|
- Revamp the fixture Schema to be more useful (better names, more extensible)
|
126
|
+
- Fix when a field's type is left out `field :name, "This is the name field"`
|
127
|
+
- Revisit error handling & `debug:` option
|
143
128
|
- __Subscriptions__
|
144
129
|
- This is a good chance to make an `Operation` abstraction of which `query`, `mutation` and `subscription` are members
|
145
130
|
- For a subscription, `graphql` would send an outbound message to the system (allow the host application to manage its own subscriptions via Pusher, ActionCable, whatever)
|
@@ -1,7 +1,7 @@
|
|
1
|
-
require
|
1
|
+
require "spec_helper"
|
2
2
|
|
3
3
|
describe GraphQL::BaseType do
|
4
|
-
it
|
4
|
+
it "becomes non-null with !" do
|
5
5
|
type = GraphQL::EnumType.new
|
6
6
|
non_null_type = !type
|
7
7
|
assert_equal(GraphQL::TypeKinds::NON_NULL, non_null_type.kind)
|
@@ -9,7 +9,7 @@ describe GraphQL::BaseType do
|
|
9
9
|
assert_equal(GraphQL::TypeKinds::NON_NULL, (!GraphQL::STRING_TYPE).kind)
|
10
10
|
end
|
11
11
|
|
12
|
-
it
|
12
|
+
it "can be compared" do
|
13
13
|
assert_equal(!GraphQL::INT_TYPE, !GraphQL::INT_TYPE)
|
14
14
|
refute_equal(!GraphQL::FLOAT_TYPE, GraphQL::FLOAT_TYPE)
|
15
15
|
assert_equal(
|
@@ -1,8 +1,8 @@
|
|
1
|
-
require
|
1
|
+
require "spec_helper"
|
2
2
|
|
3
3
|
describe GraphQL::Directive do
|
4
4
|
let(:result) { DummySchema.execute(query_string, variables: {"t" => true, "f" => false}) }
|
5
|
-
describe
|
5
|
+
describe "on fields" do
|
6
6
|
let(:query_string) { %|query directives($t: Boolean!, $f: Boolean!) {
|
7
7
|
cheese(id: 1) {
|
8
8
|
# plain fields:
|
@@ -23,11 +23,11 @@ describe GraphQL::Directive do
|
|
23
23
|
fragment dontIncludeIdField on Cheese { dontIncludeId: id @include(if: false) }
|
24
24
|
fragment skipIdField on Cheese { skipId: id @skip(if: true) }
|
25
25
|
fragment dontSkipIdField on Cheese { dontSkipId: id @skip(if: false) }
|
26
|
-
|
|
27
|
-
|
26
|
+
|
|
27
|
+
}
|
28
|
+
it "intercepts fields" do
|
28
29
|
expected = { "data" =>{
|
29
30
|
"cheese" => {
|
30
|
-
"dontSkipDontIncludeFlavor" => "Brie", #skip has precedence over include
|
31
31
|
"dontSkipFlavor" => "Brie",
|
32
32
|
"includeFlavor" => "Brie",
|
33
33
|
"includeId" => 1,
|
@@ -37,7 +37,7 @@ describe GraphQL::Directive do
|
|
37
37
|
assert_equal(expected, result)
|
38
38
|
end
|
39
39
|
end
|
40
|
-
describe
|
40
|
+
describe "on fragments spreads and inline fragments" do
|
41
41
|
let(:query_string) { %|query directives {
|
42
42
|
cheese(id: 1) {
|
43
43
|
... skipFlavorField @skip(if: true)
|
@@ -45,37 +45,29 @@ describe GraphQL::Directive do
|
|
45
45
|
... includeFlavorField @include(if: true)
|
46
46
|
... dontIncludeFlavorField @include(if: false)
|
47
47
|
|
48
|
-
... includeIdField
|
49
|
-
... dontIncludeIdField
|
50
|
-
... skipIdField
|
51
|
-
... dontSkipIdField
|
52
48
|
|
53
49
|
... on Cheese @skip(if: true) { skipInlineId: id }
|
54
50
|
... on Cheese @skip(if: false) { dontSkipInlineId: id }
|
55
51
|
... on Cheese @include(if: true) { includeInlineId: id }
|
56
52
|
... on Cheese @include(if: false) { dontIncludeInlineId: id }
|
53
|
+
... @skip(if: true) { skipNoType: id }
|
54
|
+
... @skip(if: false) { dontSkipNoType: id }
|
57
55
|
}
|
58
56
|
}
|
59
57
|
fragment includeFlavorField on Cheese { includeFlavor: flavor }
|
60
58
|
fragment dontIncludeFlavorField on Cheese { dontIncludeFlavor: flavor }
|
61
59
|
fragment skipFlavorField on Cheese { skipFlavor: flavor }
|
62
60
|
fragment dontSkipFlavorField on Cheese { dontSkipFlavor: flavor }
|
63
|
-
|
64
|
-
fragment includeIdField on Cheese @include(if: true) { includeId: id }
|
65
|
-
fragment dontIncludeIdField on Cheese @include(if: false) { dontIncludeId: id }
|
66
|
-
fragment skipIdField on Cheese @skip(if: true) { skipId: id }
|
67
|
-
fragment dontSkipIdField on Cheese @skip(if: false) { dontSkipId: id }
|
68
61
|
|}
|
69
62
|
|
70
|
-
it
|
63
|
+
it "intercepts fragment spreads" do
|
71
64
|
expected = { "data" => {
|
72
65
|
"cheese" => {
|
73
66
|
"dontSkipFlavor" => "Brie",
|
74
67
|
"includeFlavor" => "Brie",
|
75
|
-
"includeId" => 1,
|
76
|
-
"dontSkipId" => 1,
|
77
68
|
"dontSkipInlineId" => 1,
|
78
69
|
"includeInlineId" => 1,
|
70
|
+
"dontSkipNoType" => 1,
|
79
71
|
},
|
80
72
|
}}
|
81
73
|
assert_equal(expected, result)
|
@@ -1,9 +1,9 @@
|
|
1
|
-
require
|
1
|
+
require "spec_helper"
|
2
2
|
|
3
3
|
describe GraphQL::EnumType do
|
4
4
|
let(:enum) { DairyAnimalEnum }
|
5
5
|
|
6
|
-
it
|
6
|
+
it "coerces names to underlying values" do
|
7
7
|
assert_equal("YAK", enum.coerce_input("YAK"))
|
8
8
|
assert_equal(1, enum.coerce_input("COW"))
|
9
9
|
end
|
@@ -13,14 +13,14 @@ describe GraphQL::EnumType do
|
|
13
13
|
assert_equal("COW", enum.coerce_result(1))
|
14
14
|
end
|
15
15
|
|
16
|
-
it
|
17
|
-
assert_equal("Animal with horns", enum.values[
|
16
|
+
it "has value description" do
|
17
|
+
assert_equal("Animal with horns", enum.values["GOAT"].description)
|
18
18
|
end
|
19
19
|
|
20
|
-
describe
|
21
|
-
let(:result) { DairyAnimalEnum.validate_input(
|
20
|
+
describe "validate_input with bad input" do
|
21
|
+
let(:result) { DairyAnimalEnum.validate_input("bad enum") }
|
22
22
|
|
23
|
-
it
|
23
|
+
it "returns an invalid result" do
|
24
24
|
assert(!result.valid?)
|
25
25
|
end
|
26
26
|
end
|
data/spec/graphql/field_spec.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
|
-
require
|
1
|
+
require "spec_helper"
|
2
2
|
|
3
3
|
describe GraphQL::Field do
|
4
|
-
it
|
4
|
+
it "accepts a proc as type" do
|
5
5
|
field = GraphQL::Field.define do
|
6
6
|
type(-> { DairyProductUnion })
|
7
7
|
end
|
@@ -18,27 +18,28 @@ describe GraphQL::Field do
|
|
18
18
|
end
|
19
19
|
|
20
20
|
|
21
|
-
describe
|
21
|
+
describe ".property " do
|
22
22
|
let(:field) do
|
23
23
|
GraphQL::Field.define do
|
24
|
-
name
|
24
|
+
name "field_name"
|
25
25
|
# satisfies 'can define by config' below
|
26
26
|
property :internal_prop
|
27
27
|
end
|
28
28
|
end
|
29
29
|
|
30
|
-
it
|
30
|
+
it "can define by config" do
|
31
31
|
assert_equal(field.property, :internal_prop)
|
32
32
|
end
|
33
33
|
|
34
|
-
it
|
34
|
+
it "has nil property if not defined" do
|
35
35
|
no_prop_field = GraphQL::Field.define { }
|
36
36
|
assert_equal(no_prop_field.property, nil)
|
37
37
|
end
|
38
38
|
|
39
|
-
describe
|
39
|
+
describe "default resolver" do
|
40
40
|
def acts_like_default_resolver(field, old_prop, new_prop)
|
41
|
-
object = OpenStruct.new(old_prop =>
|
41
|
+
object = OpenStruct.new(old_prop => "old value", new_prop => "new value", field.name.to_sym => "unset value")
|
42
|
+
|
42
43
|
|
43
44
|
old_result = field.resolve(object, nil, nil)
|
44
45
|
field.property = new_prop
|
@@ -46,16 +47,16 @@ describe GraphQL::Field do
|
|
46
47
|
field.property = nil
|
47
48
|
unset_result = field.resolve(object, nil, nil)
|
48
49
|
|
49
|
-
assert_equal(old_result,
|
50
|
-
assert_equal(new_result,
|
51
|
-
assert_equal(unset_result,
|
50
|
+
assert_equal(old_result, "old value")
|
51
|
+
assert_equal(new_result, "new value")
|
52
|
+
assert_equal(unset_result, "unset value")
|
52
53
|
end
|
53
54
|
|
54
|
-
it
|
55
|
+
it "responds to changes in property" do
|
55
56
|
acts_like_default_resolver(field, :internal_prop, :new_prop)
|
56
57
|
end
|
57
58
|
|
58
|
-
it
|
59
|
+
it "is reassigned if resolve is set to nil" do
|
59
60
|
field.resolve = nil
|
60
61
|
acts_like_default_resolver(field, :internal_prop, :new_prop)
|
61
62
|
end
|