graphql 0.0.4 → 0.1.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.
Files changed (126) hide show
  1. checksums.yaml +4 -4
  2. data/lib/graph_ql/directive.rb +36 -0
  3. data/lib/graph_ql/directives/directive_chain.rb +33 -0
  4. data/lib/graph_ql/directives/include_directive.rb +15 -0
  5. data/lib/graph_ql/directives/skip_directive.rb +15 -0
  6. data/lib/graph_ql/enum.rb +34 -0
  7. data/lib/graph_ql/fields/abstract_field.rb +37 -0
  8. data/lib/graph_ql/fields/access_field.rb +24 -0
  9. data/lib/graph_ql/fields/field.rb +34 -0
  10. data/lib/graph_ql/interface.rb +14 -0
  11. data/lib/graph_ql/introspection/arguments_field.rb +5 -0
  12. data/lib/graph_ql/introspection/directive_type.rb +12 -0
  13. data/lib/graph_ql/introspection/enum_value_type.rb +10 -0
  14. data/lib/graph_ql/introspection/enum_values_field.rb +15 -0
  15. data/lib/graph_ql/introspection/field_type.rb +11 -0
  16. data/lib/graph_ql/introspection/fields_field.rb +14 -0
  17. data/lib/graph_ql/introspection/input_fields_field.rb +12 -0
  18. data/lib/graph_ql/introspection/input_value_type.rb +10 -0
  19. data/lib/graph_ql/introspection/of_type_field.rb +12 -0
  20. data/lib/graph_ql/introspection/possible_types_field.rb +12 -0
  21. data/lib/graph_ql/introspection/schema_type.rb +32 -0
  22. data/lib/graph_ql/introspection/type_kind_enum.rb +7 -0
  23. data/lib/graph_ql/introspection/type_type.rb +22 -0
  24. data/lib/graph_ql/parser/nodes.rb +72 -0
  25. data/lib/graph_ql/parser/parser.rb +108 -0
  26. data/lib/graph_ql/parser/transform.rb +86 -0
  27. data/lib/graph_ql/parser/visitor.rb +47 -0
  28. data/lib/graph_ql/query.rb +50 -0
  29. data/lib/graph_ql/query/arguments.rb +25 -0
  30. data/lib/graph_ql/query/field_resolution_strategy.rb +83 -0
  31. data/lib/graph_ql/query/fragment_spread_resolution_strategy.rb +16 -0
  32. data/lib/graph_ql/query/inline_fragment_resolution_strategy.rb +14 -0
  33. data/lib/graph_ql/query/operation_resolver.rb +28 -0
  34. data/lib/graph_ql/query/selection_resolver.rb +20 -0
  35. data/lib/graph_ql/query/type_resolver.rb +19 -0
  36. data/lib/graph_ql/repl.rb +27 -0
  37. data/lib/graph_ql/schema.rb +30 -0
  38. data/lib/graph_ql/schema/type_reducer.rb +44 -0
  39. data/lib/graph_ql/type_kinds.rb +15 -0
  40. data/lib/graph_ql/types/abstract_type.rb +14 -0
  41. data/lib/graph_ql/types/boolean_type.rb +6 -0
  42. data/lib/graph_ql/types/float_type.rb +6 -0
  43. data/lib/graph_ql/types/input_object_type.rb +17 -0
  44. data/lib/graph_ql/types/input_value.rb +10 -0
  45. data/lib/graph_ql/types/int_type.rb +6 -0
  46. data/lib/graph_ql/types/list_type.rb +10 -0
  47. data/lib/graph_ql/types/non_null_type.rb +18 -0
  48. data/lib/graph_ql/types/non_null_with_bang.rb +5 -0
  49. data/lib/graph_ql/types/object_type.rb +62 -0
  50. data/lib/graph_ql/types/scalar_type.rb +5 -0
  51. data/lib/graph_ql/types/string_type.rb +6 -0
  52. data/lib/graph_ql/types/type_definer.rb +16 -0
  53. data/lib/graph_ql/union.rb +35 -0
  54. data/lib/graph_ql/validations/fields_are_defined_on_type.rb +44 -0
  55. data/lib/graph_ql/validations/fields_will_merge.rb +80 -0
  56. data/lib/graph_ql/validations/fragments_are_used.rb +24 -0
  57. data/lib/graph_ql/validator.rb +29 -0
  58. data/lib/graph_ql/version.rb +3 -0
  59. data/lib/graphql.rb +92 -99
  60. data/readme.md +17 -177
  61. data/spec/graph_ql/directive_spec.rb +81 -0
  62. data/spec/graph_ql/enum_spec.rb +5 -0
  63. data/spec/graph_ql/fields/field_spec.rb +10 -0
  64. data/spec/graph_ql/interface_spec.rb +13 -0
  65. data/spec/graph_ql/introspection/directive_type_spec.rb +40 -0
  66. data/spec/graph_ql/introspection/schema_type_spec.rb +39 -0
  67. data/spec/graph_ql/introspection/type_type_spec.rb +104 -0
  68. data/spec/graph_ql/parser/parser_spec.rb +120 -0
  69. data/spec/graph_ql/parser/transform_spec.rb +109 -0
  70. data/spec/graph_ql/parser/visitor_spec.rb +31 -0
  71. data/spec/graph_ql/query/operation_resolver_spec.rb +14 -0
  72. data/spec/graph_ql/query_spec.rb +82 -0
  73. data/spec/graph_ql/schema/type_reducer_spec.rb +24 -0
  74. data/spec/graph_ql/types/input_object_type_spec.rb +12 -0
  75. data/spec/graph_ql/types/object_type_spec.rb +35 -0
  76. data/spec/graph_ql/union_spec.rb +27 -0
  77. data/spec/graph_ql/validations/fields_are_defined_on_type_spec.rb +28 -0
  78. data/spec/graph_ql/validations/fields_will_merge_spec.rb +40 -0
  79. data/spec/graph_ql/validations/fragments_are_used_spec.rb +28 -0
  80. data/spec/graph_ql/validator_spec.rb +24 -0
  81. data/spec/spec_helper.rb +2 -2
  82. data/spec/support/dummy_app.rb +123 -63
  83. data/spec/support/dummy_data.rb +11 -0
  84. metadata +107 -59
  85. data/lib/graphql/call.rb +0 -8
  86. data/lib/graphql/connection.rb +0 -65
  87. data/lib/graphql/field.rb +0 -12
  88. data/lib/graphql/field_definer.rb +0 -25
  89. data/lib/graphql/introspection/call_type.rb +0 -13
  90. data/lib/graphql/introspection/connection.rb +0 -9
  91. data/lib/graphql/introspection/field_type.rb +0 -10
  92. data/lib/graphql/introspection/root_call_argument_node.rb +0 -5
  93. data/lib/graphql/introspection/root_call_type.rb +0 -20
  94. data/lib/graphql/introspection/schema_call.rb +0 -8
  95. data/lib/graphql/introspection/schema_type.rb +0 -17
  96. data/lib/graphql/introspection/type_call.rb +0 -8
  97. data/lib/graphql/introspection/type_type.rb +0 -18
  98. data/lib/graphql/node.rb +0 -244
  99. data/lib/graphql/parser/parser.rb +0 -39
  100. data/lib/graphql/parser/transform.rb +0 -22
  101. data/lib/graphql/query.rb +0 -109
  102. data/lib/graphql/root_call.rb +0 -202
  103. data/lib/graphql/root_call_argument.rb +0 -11
  104. data/lib/graphql/root_call_argument_definer.rb +0 -17
  105. data/lib/graphql/schema/all.rb +0 -46
  106. data/lib/graphql/schema/schema.rb +0 -87
  107. data/lib/graphql/schema/schema_validation.rb +0 -32
  108. data/lib/graphql/syntax/call.rb +0 -8
  109. data/lib/graphql/syntax/field.rb +0 -9
  110. data/lib/graphql/syntax/fragment.rb +0 -7
  111. data/lib/graphql/syntax/node.rb +0 -8
  112. data/lib/graphql/syntax/query.rb +0 -8
  113. data/lib/graphql/syntax/variable.rb +0 -7
  114. data/lib/graphql/types/boolean_type.rb +0 -3
  115. data/lib/graphql/types/number_type.rb +0 -3
  116. data/lib/graphql/types/object_type.rb +0 -6
  117. data/lib/graphql/types/string_type.rb +0 -3
  118. data/lib/graphql/version.rb +0 -3
  119. data/spec/graphql/node_spec.rb +0 -69
  120. data/spec/graphql/parser/parser_spec.rb +0 -168
  121. data/spec/graphql/parser/transform_spec.rb +0 -157
  122. data/spec/graphql/query_spec.rb +0 -274
  123. data/spec/graphql/root_call_spec.rb +0 -69
  124. data/spec/graphql/schema/schema_spec.rb +0 -93
  125. data/spec/graphql/schema/schema_validation_spec.rb +0 -48
  126. data/spec/support/nodes.rb +0 -175
@@ -1,157 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe GraphQL::Parser::Transform do
4
- let(:transform) { GraphQL::TRANSFORM }
5
- let(:parser) { GraphQL::PARSER }
6
-
7
- describe '#apply' do
8
- describe 'query' do
9
- it 'parses node and variables' do
10
- tree = parser.query.parse(%{
11
- like_page(<page_info>) { page { $fragment, likes } }
12
-
13
- <page_info>: {
14
- "page" : { "id": 4},
15
- "person" : {"id": 4}
16
- }
17
- <other>: {
18
- "page" : { "id": 4},
19
- "person" : {"id": 4}
20
- }
21
-
22
- $fragment: {
23
- id, name
24
- }
25
- })
26
- res = transform.apply(tree)
27
- assert_equal 1, res.nodes.length
28
- assert_equal "like_page", res.nodes[0].identifier
29
- assert_equal ["<page_info>"], res.nodes[0].arguments
30
- assert_equal ["<page_info>", "<other>"], res.variables.map(&:identifier)
31
- assert_equal ["$fragment"], res.fragments.map(&:identifier)
32
- end
33
- end
34
-
35
- describe 'nodes' do
36
- it 'turns a simple node into a Node' do
37
- tree = parser.node.parse("post(123) { name }")
38
- res = transform.apply(tree)
39
- assert(res.is_a?(GraphQL::Syntax::Node), 'it gets a node')
40
- end
41
-
42
- it 'turns a node into a Node' do
43
- tree = parser.node.parse("person(1) { name, check_ins.last(4) { count, edges { node { id } } } }")
44
- res = transform.apply(tree)
45
- assert(res.is_a?(GraphQL::Syntax::Node), 'it gets a node')
46
- assert(res.identifier == "person")
47
- assert(res.fields.length == 2)
48
- assert(res.fields[0].is_a?(GraphQL::Syntax::Field), 'it gets a field')
49
- assert(res.fields[1].is_a?(GraphQL::Syntax::Field), 'it gets an field with fields')
50
- assert(res.fields[1].calls.first.is_a?(GraphQL::Syntax::Call), 'it gets a call')
51
- end
52
- end
53
-
54
- describe 'fields' do
55
- it 'turns a field into a Field' do
56
- tree = parser.field.parse("friends")
57
- res = transform.apply(tree)
58
- assert(res.is_a?(GraphQL::Syntax::Field))
59
- assert(res.identifier == "friends")
60
- end
61
-
62
- it 'gets aliases' do
63
- tree = parser.field.parse("friends as pals")
64
- res = transform.apply(tree)
65
- assert(res.is_a?(GraphQL::Syntax::Field))
66
- assert(res.identifier == "friends")
67
- assert(res.alias_name == "pals")
68
- end
69
-
70
- it 'gets calls' do
71
- tree = parser.field.parse("friends.orderby(name, birthdate).first(3)")
72
- res = transform.apply(tree)
73
- assert_equal "orderby", res.calls[0].identifier
74
- assert_equal ["name", "birthdate"], res.calls[0].arguments
75
- assert_equal "first", res.calls[1].identifier
76
- assert_equal ["3"], res.calls[1].arguments
77
- end
78
-
79
- describe 'fields that return objects' do
80
- it 'gets them' do
81
- tree = parser.field.parse("friends { count }")
82
- res = transform.apply(tree)
83
- assert_equal "friends", res.identifier
84
- assert_equal 1, res.fields.length
85
- end
86
- it 'gets them with aliases' do
87
- tree = parser.field.parse("friends as pals { count }")
88
- res = transform.apply(tree)
89
- assert_equal "friends", res.identifier
90
- assert_equal "pals", res.alias_name
91
- assert_equal 1, res.fields.length
92
- end
93
- it 'gets them with calls' do
94
- tree = parser.field.parse("friends.orderby(name, birthdate).last(1) { count }")
95
- res = transform.apply(tree)
96
- assert_equal "friends", res.identifier
97
- assert_equal 1, res.fields.length
98
- assert_equal 2, res.calls.length
99
- end
100
- it 'gets them with calls and aliases' do
101
- tree = parser.field.parse("friends.orderby(name, birthdate).last(1) as pals { count }")
102
- res = transform.apply(tree)
103
- assert_equal "friends", res.identifier
104
- assert_equal "pals", res.alias_name
105
- assert_equal 1, res.fields.length
106
- assert_equal 2, res.calls.length
107
- end
108
- end
109
- end
110
-
111
- describe 'calls' do
112
- it 'turns call into a Call' do
113
- tree = parser.call.parse("node(4, 6, tree)")
114
- res = transform.apply(tree)
115
- assert(res.is_a?(GraphQL::Syntax::Call))
116
- assert(res.identifier == "node")
117
- assert(res.arguments == ["4", "6", "tree"])
118
- end
119
-
120
- it 'turns a call without an argument into a Call' do
121
- tree = parser.call.parse("viewer()")
122
- res = transform.apply(tree)
123
- assert(res.is_a?(GraphQL::Syntax::Call))
124
- assert(res.identifier == "viewer")
125
- assert(res.arguments.length == 0)
126
- end
127
-
128
- it 'gets calls with variable identifiers' do
129
- tree = parser.call.parse("like_page(<page_info>)")
130
- res = transform.apply(tree)
131
- assert_equal "<page_info>", res.arguments[0]
132
- end
133
- end
134
-
135
- describe 'variables' do
136
- it 'gets variables' do
137
- tree = parser.variable.parse(%{
138
- <page_info>: {
139
- "page" : { "id": 4},
140
- "person" : {"id": 4}
141
- }
142
- })
143
- res = transform.apply(tree)
144
- assert_equal "<page_info>", res.identifier
145
- end
146
- end
147
-
148
- describe 'fragments' do
149
- it 'gets fragments' do
150
- tree = parser.fragment.parse(%{$frag: { id, name, $otherFrag }})
151
- res = transform.apply(tree)
152
- assert_equal "$frag", res.identifier
153
- assert_equal ["id", "name", "$otherFrag"], res.fields.map(&:identifier)
154
- end
155
- end
156
- end
157
- end
@@ -1,274 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe GraphQL::Query do
4
- let(:query_string) { "post(123) { title, content } "}
5
- let(:context) { Context.new(person_name: "Han Solo") }
6
- let(:query) { GraphQL::Query.new(query_string, context: context) }
7
- let(:result) { query.as_result }
8
-
9
- before do
10
- @post = Post.create(id: 123, content: "So many great things", title: "My great post", published_at: Date.new(2010,1,4))
11
- @comment1 = Comment.create(id: 444, post_id: 123, content: "I agree", rating: 5)
12
- @comment2 = Comment.create(id: 445, post_id: 123, content: "I disagree", rating: 1)
13
- @like1 = Like.create(id: 991, post_id: 123)
14
- @like2 = Like.create(id: 992, post_id: 123)
15
- end
16
-
17
- after do
18
- @post.destroy
19
- @comment1.destroy
20
- @comment2.destroy
21
- @like1.destroy
22
- @like2.destroy
23
- end
24
-
25
- describe '#as_result' do
26
- it 'finds fields that delegate to a target' do
27
- assert_equal result, {"123" => {"title" => "My great post", "content" => "So many great things"}}
28
- end
29
-
30
- describe 'with multiple roots' do
31
- let(:query_string) { "comment(444, 445) { content } "}
32
- it 'adds each as a key-value of the response' do
33
- assert_equal ["444", "445"], result.keys
34
- end
35
- end
36
-
37
- describe 'when accessing fields that return objects' do
38
- describe 'when making calls on the field' do
39
- let(:query_string) { "post(123) { published_at.minus_days(200) { year } }"}
40
- it 'returns the modified value' do
41
- assert_equal 2009, result["123"]["published_at"]["year"]
42
- end
43
- end
44
- describe 'when requesting more fields' do
45
- let(:query_string) { "post(123) { published_at { month, year } }"}
46
- it 'returns those fields' do
47
- assert_equal({"month" => 1, "year" => 2010}, result["123"]["published_at"])
48
- end
49
- end
50
- end
51
-
52
- describe 'when using query fragments' do
53
- let(:query_string) { "post(123) { id, $publishedData } $publishedData: { published_at { month, year } }"}
54
-
55
- it 'can yield the fragment' do
56
- fragment = query.fragments["$publishedData"]
57
- assert_equal "$publishedData", fragment.identifier
58
- assert_equal 1, fragment.fields.length
59
- end
60
-
61
- it 'returns literal fields and fragment fields' do
62
- assert_equal(123, result["123"]['id'])
63
- assert_equal({"month" => 1, "year" => 2010}, result["123"]["published_at"])
64
- end
65
- end
66
- describe 'when aliasing things' do
67
- let(:query_string) { "post(123) { title as headline, content as what_it_says }"}
68
-
69
- it 'applies aliases to fields' do
70
- assert_equal @post.title, result["123"]["headline"]
71
- assert_equal @post.content, result["123"]["what_it_says"]
72
- end
73
-
74
- it 'applies aliases to edges' # dunno the syntax yet
75
- end
76
-
77
- describe 'when requesting fields defined on the node' do
78
- let(:query_string) { "post(123) { length } "}
79
- it 'finds fields defined on the node' do
80
- assert_equal 20, result["123"]["length"]
81
- end
82
- end
83
-
84
- describe 'when accessing custom fields' do
85
- let(:query_string) { "comment(444) { letters }"}
86
-
87
- it 'uses the custom field' do
88
- assert_equal "I agree", result["444"]["letters"]
89
- end
90
-
91
- describe 'when making calls on fields' do
92
- let(:query_string) { "comment(444) {
93
- letters.select(4, 3),
94
- letters.from(3).for(2) as snippet
95
- }"}
96
-
97
- it 'works with aliases' do
98
- assert result["444"]["snippet"].present?
99
- end
100
-
101
- it 'applies calls' do
102
- assert_equal "gr", result["444"]["snippet"]
103
- end
104
-
105
- it 'applies calls with multiple arguments' do
106
- assert_equal "ree", result["444"]["letters"]
107
- end
108
- end
109
-
110
- describe 'when requesting fields overriden on a child class' do
111
- let(:query_string) { 'thumb_up(991) { id }'}
112
- it 'uses the child implementation' do
113
- assert_equal '991991', result["991991"]["id"]
114
- end
115
- end
116
- end
117
-
118
- describe 'when requesting an undefined field' do
119
- let(:query_string) { "post(123) { destroy } "}
120
- it 'raises a FieldNotDefined error' do
121
- assert_raises(GraphQL::FieldNotDefinedError) { query.as_result }
122
- assert(Post.find(123).present?)
123
- end
124
- end
125
-
126
- describe 'when the root call doesnt have an argument' do
127
- let(:query_string) { "context() { person_name, present }"}
128
- it 'calls the node with no arguments' do
129
- assert_equal true, result["context"]["present"]
130
- assert_equal "Han Solo", result["context"]["person_name"]
131
- end
132
- end
133
-
134
- describe 'when requesting a collection' do
135
- let(:query_string) { "post(123) {
136
- title,
137
- comments { count, edges { cursor, node { content } } }
138
- }"}
139
-
140
- it 'returns collection data' do
141
- assert_equal result, {
142
- "123" => {
143
- "title" => "My great post",
144
- "comments" => {
145
- "count" => 2,
146
- "edges" => [
147
- { "cursor" => "444", "node" => {"content" => "I agree"} },
148
- { "cursor" => "445", "node" => {"content" => "I disagree"}}
149
- ]
150
- }}}
151
- end
152
- end
153
-
154
- describe 'when making calls on a collection' do
155
- let(:query_string) { "post(123) { comments.first(1) { edges { cursor, node { content } } } }"}
156
-
157
- it 'executes those calls' do
158
- expected_result = { "123" => {
159
- "comments" => {
160
- "edges" => [
161
- { "cursor" => "444", "node" => { "content" => "I agree"} }
162
- ]
163
- }}}
164
- assert_equal(expected_result, result)
165
- end
166
- end
167
-
168
- describe 'when making DEEP calls on a collection' do
169
- let(:query_string) { "post(123) { comments.after(444).first(1) {
170
- edges { cursor, node { content } }
171
- }}"}
172
-
173
- it 'executes those calls' do
174
- assert_equal result, {
175
- "123" => {
176
- "comments" => {
177
- "edges" => [
178
- {
179
- "cursor" => "445",
180
- "node" => { "content" => "I disagree"}
181
- }
182
- ]
183
- }}}
184
- end
185
- end
186
-
187
- describe 'when requesting fields at collection-level' do
188
- let(:query_string) { "post(123) { comments { average_rating } }"}
189
-
190
- it 'executes those calls' do
191
- assert_equal result, { "123" => { "comments" => { "average_rating" => 3 } } }
192
- end
193
- end
194
-
195
- describe 'when making calls on node fields' do
196
- let(:query_string) { "post(123) { comments { edges { node { letters.from(3).for(3) }} } }"}
197
-
198
- it 'makes calls on the fields' do
199
- assert_equal ["gre", "isa"], result["123"]["comments"]["edges"].map {|e| e["node"]["letters"] }
200
- end
201
- end
202
-
203
- describe 'when requesting collection-level fields that dont exist' do
204
- let(:query_string) { "post(123) { comments { bogus_field } }"}
205
-
206
- it 'raises FieldNotDefined' do
207
- assert_raises(GraphQL::FieldNotDefinedError) { query.as_result }
208
- end
209
- end
210
- end
211
-
212
- describe 'when requesting fields on a related object' do
213
- let(:query_string) { "comment(444) { post { title } }"}
214
-
215
- it 'finds fields on that object' do
216
- assert_equal "My great post", result["444"]["post"]["title"]
217
- end
218
-
219
- describe 'when the object doesnt exist' do
220
- before do
221
- Post.all.map(&:destroy)
222
- end
223
-
224
- it 'blows_up' do # what _should_ this do?
225
- assert_raises(NoMethodError) { result }
226
- end
227
- end
228
- end
229
-
230
- describe 'when edge classes were named explicitly' do
231
- let(:query_string) { "post(123) { likes { any, edges { node { id } } } }"}
232
-
233
- it 'gets node values' do
234
- assert_equal ["991991","992992"], result["123"]["likes"]["edges"].map {|e| e["node"]["id"] }
235
- end
236
-
237
- it 'gets edge values' do
238
- assert_equal true, result["123"]["likes"]["any"]
239
- end
240
- end
241
-
242
- describe '#context' do
243
- let(:query_string) { "context() { person_name }"}
244
-
245
- it 'is accessible inside nodes' do
246
- assert_equal({"context" => {"person_name" => "Han Solo"}}, result)
247
- end
248
-
249
- describe 'inside edges' do
250
- let(:query_string) { "post(123) { comments { viewer_name_length } }"}
251
- it 'is accessible' do
252
- assert_equal 8, result["123"]["comments"]["viewer_name_length"]
253
- end
254
- end
255
- end
256
-
257
- describe 'parsing error' do
258
- let(:query_string) { "\n\n<< bogus >>"}
259
-
260
- it 'raises SyntaxError' do
261
- assert_raises(GraphQL::SyntaxError) { result }
262
- end
263
-
264
- it 'contains line an character number' do
265
- err = assert_raises(GraphQL::SyntaxError) { result }
266
- assert_match(/1, 1/, err.to_s)
267
- end
268
-
269
- it 'contains sample of text' do
270
- err = assert_raises(GraphQL::SyntaxError) { result }
271
- assert_includes(err.to_s, "<< bogus >>")
272
- end
273
- end
274
- end
@@ -1,69 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe GraphQL::RootCall do
4
- let(:query_string) { %{
5
- upvote_post(<post_data>, <person_id>) {
6
- post {
7
- likes { count, any }
8
- }
9
- upvote {
10
- post_id
11
- }
12
- }
13
- <post_data>: { "id" : #{@post_id} }
14
- <person_id>: 888
15
- }}
16
- let(:result) { GraphQL::Query.new(query_string).as_result }
17
-
18
- before do
19
- # make sure tests don't conflict :(
20
- @post_id = "#{Time.now.to_i}#{[1,2,3].sample}".to_i
21
- @post = Post.create(id: @post_id, content: "My great post")
22
- @like = Like.create(post_id: @post_id)
23
- end
24
-
25
- after do
26
- @post.likes.map(&:destroy)
27
- @post.destroy
28
- end
29
-
30
- describe '#as_result' do
31
- it 'operates on the application' do
32
- assert_equal 1, @post.likes.count
33
- result
34
- assert_equal 2, @post.likes.count
35
- end
36
-
37
- it 'returns fields for the node' do
38
- assert_equal @post_id, result["upvote"]["post_id"]
39
- assert_equal 2, result["post"]["likes"]["count"]
40
- assert_equal true, result["post"]["likes"]["any"]
41
- end
42
-
43
- describe 'when the input is the wrong type' do
44
- let(:query_string) { %{upvote_post(bogus_arg, 888) { post { id } } } }
45
- it 'validates the input' do
46
- assert_raises(GraphQL::RootCallArgumentError) { result }
47
- end
48
- end
49
- end
50
-
51
- describe '.argument' do
52
- it 'is reload-safe' do
53
- assert_equal 2, Nodes::LikePostCall.arguments.length, "it starts with 1"
54
- assert_equal "person_id", Nodes::LikePostCall.argument_at_index(1).name
55
- assert_raises(RuntimeError, 'it raises before') { Nodes::LikePostCall.argument_at_index(2) }
56
-
57
- Nodes::LikePostCall.argument.number("person_id")
58
-
59
- assert_equal 2, Nodes::LikePostCall.arguments.length, "it stays at 1"
60
- assert_equal "person_id", Nodes::LikePostCall.argument_at_index(1).name
61
- assert_raises(RuntimeError, 'it raises after') { Nodes::LikePostCall.argument_at_index(2) }
62
- end
63
- end
64
-
65
- describe '#__type__' do
66
- it 'describes the arguments'
67
- it 'describes the response'
68
- end
69
- end