graphql 0.0.4 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
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