hq-graphql 1.1.1 → 1.1.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,392 +0,0 @@
1
- require 'rails_helper'
2
-
3
- describe ::HQ::GraphQL::Resource do
4
- let(:organization_type) do
5
- Class.new do
6
- include ::HQ::GraphQL::Resource
7
- self.model_name = "Organization"
8
- end
9
- end
10
-
11
- let(:advisor_type) do
12
- Class.new do
13
- include ::HQ::GraphQL::Resource
14
- self.model_name = "Advisor"
15
-
16
- root_query
17
- end
18
- end
19
-
20
- let(:root_query) do
21
- Class.new(::HQ::GraphQL::RootQuery)
22
- end
23
-
24
- let(:root_mutation) do
25
- Class.new(::HQ::GraphQL::RootMutation)
26
- end
27
-
28
- let(:schema) do
29
- Class.new(GraphQL::Schema) do
30
- query(RootQuery)
31
- mutation(RootMutation)
32
- end
33
- end
34
-
35
- before(:each) do
36
- advisor_type
37
- stub_const("RootQuery", root_query)
38
- stub_const("RootMutation", root_mutation)
39
- end
40
-
41
- context "defaults" do
42
- it "builds the query klass" do
43
- expect(::HQ::GraphQL::Types[Advisor]).to eql(advisor_type.query_klass)
44
- end
45
-
46
- it "builds the input klass" do
47
- expect(::HQ::GraphQL::Inputs[Advisor]).to eql(advisor_type.input_klass)
48
- end
49
-
50
- it "creates query fields" do
51
- ::HQ::GraphQL::Types[Advisor].graphql_definition
52
- expected = ["id", "organizationId", "name", "createdAt", "updatedAt"]
53
- expect(::HQ::GraphQL::Types[Advisor].fields.keys).to contain_exactly(*expected)
54
- end
55
-
56
- it "creates query graphql name" do
57
- ::HQ::GraphQL::Types[Advisor].graphql_definition
58
- expect(::HQ::GraphQL::Types[Advisor].graphql_name).to eql("Advisor")
59
- end
60
-
61
- it "creates input arguments" do
62
- ::HQ::GraphQL::Inputs[Advisor].graphql_definition
63
- expected = ["id", "organizationId", "name", "createdAt", "updatedAt"]
64
- expect(::HQ::GraphQL::Inputs[Advisor].arguments.keys).to contain_exactly(*expected)
65
- end
66
-
67
- it "creates input graphql name" do
68
- ::HQ::GraphQL::Inputs[Advisor].graphql_definition
69
- expect(::HQ::GraphQL::Inputs[Advisor].graphql_name).to eql("AdvisorInput")
70
- end
71
-
72
- it "doesn't create mutations" do
73
- expect(advisor_type.mutation_klasses).to be_empty
74
- end
75
-
76
- context "with an association" do
77
- before(:each) do
78
- organization_type
79
- end
80
-
81
- it "adds organization type" do
82
- ::HQ::GraphQL::Types[Advisor].graphql_definition
83
- expected = ["id", "organization", "organizationId", "name", "createdAt", "updatedAt"]
84
- expect(::HQ::GraphQL::Types[Advisor].fields.keys).to contain_exactly(*expected)
85
- end
86
-
87
- it "doesn't add organization type" do
88
- ::HQ::GraphQL::Inputs[Advisor].graphql_definition
89
- expected = ["id", "organizationId", "name", "createdAt", "updatedAt"]
90
- expect(::HQ::GraphQL::Inputs[Advisor].arguments.keys).to contain_exactly(*expected)
91
- end
92
- end
93
- end
94
-
95
- context ".query" do
96
- let(:advisor_type) do
97
- Class.new do
98
- include ::HQ::GraphQL::Resource
99
- self.model_name = "Advisor"
100
-
101
- query associations: false do
102
- graphql_name "CustomAdvisorName"
103
- remove_attr :name
104
- end
105
- end
106
- end
107
-
108
- before(:each) do
109
- organization_type
110
- advisor_type
111
- end
112
-
113
- it "removes name" do
114
- ::HQ::GraphQL::Types[Advisor].graphql_definition
115
- expected = ["id", "organizationId", "createdAt", "updatedAt"]
116
- expect(::HQ::GraphQL::Types[Advisor].fields.keys).to contain_exactly(*expected)
117
- end
118
-
119
- it "customizes graphql name" do
120
- ::HQ::GraphQL::Types[Advisor].graphql_definition
121
- expect(::HQ::GraphQL::Types[Advisor].graphql_name).to eql("CustomAdvisorName")
122
- end
123
- end
124
-
125
- context ".input" do
126
- let(:advisor_type) do
127
- Class.new do
128
- include ::HQ::GraphQL::Resource
129
- self.model_name = "Advisor"
130
-
131
- input do
132
- graphql_name "CustomAdvisorInput"
133
- remove_attr :name
134
- end
135
- end
136
- end
137
-
138
- before(:each) do
139
- organization_type
140
- advisor_type
141
- end
142
-
143
- it "removes name" do
144
- ::HQ::GraphQL::Inputs[Advisor].graphql_definition
145
- expected = ["id", "organizationId", "createdAt", "updatedAt"]
146
- expect(::HQ::GraphQL::Inputs[Advisor].arguments.keys).to contain_exactly(*expected)
147
- end
148
-
149
- it "customizes graphql name" do
150
- ::HQ::GraphQL::Inputs[Advisor].graphql_definition
151
- expect(::HQ::GraphQL::Inputs[Advisor].graphql_name).to eql("CustomAdvisorInput")
152
- end
153
- end
154
-
155
- context ".mutations" do
156
- let(:advisor_type) do
157
- Class.new do
158
- include ::HQ::GraphQL::Resource
159
- self.model_name = "Advisor"
160
-
161
- mutations
162
-
163
- input do
164
- remove_attr :name
165
- add_association :organization
166
- end
167
- end
168
- end
169
-
170
- before(:each) do
171
- organization_type
172
- end
173
-
174
- it "generates the create, update, and destroy mutations by default" do
175
- expect(advisor_type.mutation_klasses.keys).to contain_exactly("create_advisor", "update_advisor", "destroy_advisor")
176
- end
177
-
178
- it "removes name on update" do
179
- update_mutation = advisor_type.mutation_klasses[:update_advisor]
180
- update_mutation.payload_type
181
-
182
- input_object = advisor_type.input_klass
183
- input_object.graphql_definition
184
-
185
- aggregate_failures do
186
- expected_arguments = ["id", "organizationId", "organization", "createdAt", "updatedAt"]
187
- expect(input_object.arguments.keys).to contain_exactly(*expected_arguments)
188
-
189
- expected_arguments = ["id", "attributes"]
190
- expect(update_mutation.arguments.keys).to contain_exactly(*expected_arguments)
191
-
192
- expected_fields = ["errors", "resource"]
193
- expect(update_mutation.fields.keys).to contain_exactly(*expected_fields)
194
- end
195
- end
196
- end
197
-
198
- context "execution" do
199
- let(:find_advisor) {
200
- <<-gql
201
- query findAdvisor($id: UUID!){
202
- advisor(id: $id) {
203
- name
204
- organizationId
205
-
206
- organization {
207
- name
208
- }
209
- }
210
- }
211
- gql
212
- }
213
-
214
- let(:create_mutation) {
215
- <<-gql
216
- mutation createAdvisor($attributes: AdvisorInput!){
217
- createAdvisor(attributes: $attributes) {
218
- errors
219
- resource {
220
- id
221
- name
222
- }
223
- }
224
- }
225
- gql
226
- }
227
-
228
- let(:update_mutation) {
229
- <<-gql
230
- mutation updateAdvisor($id: UUID!, $attributes: AdvisorInput!){
231
- updateAdvisor(id: $id, attributes: $attributes) {
232
- errors
233
- resource {
234
- name
235
- organization {
236
- name
237
- }
238
- }
239
- }
240
- }
241
- gql
242
- }
243
-
244
- let(:destroy_mutation) {
245
- <<-gql
246
- mutation destroyAdvisor($id: UUID!){
247
- destroyAdvisor(id: $id) {
248
- errors
249
- resource {
250
- name
251
- }
252
- }
253
- }
254
- gql
255
- }
256
-
257
- before(:each) do
258
- organization_type
259
-
260
- advisor_type.class_eval do
261
- mutations
262
-
263
- input do
264
- add_association :organization
265
- end
266
- end
267
- end
268
-
269
- it "fetches results" do
270
- advisor = FactoryBot.create(:advisor)
271
- results = schema.execute(find_advisor, variables: { id: advisor.id })
272
- data = results["data"]["advisor"]
273
-
274
- aggregate_failures do
275
- expect(data["name"]).to eql(advisor.name)
276
- expect(data["organizationId"]).to eql(advisor.organization_id)
277
- expect(data["organization"]["name"]).to eql(advisor.organization.name)
278
- end
279
- end
280
-
281
- it "creates" do
282
- organization = FactoryBot.create(:organization)
283
- name = "Bob"
284
- results = schema.execute(create_mutation, variables: { attributes: { name: name, organizationId: organization.id } })
285
-
286
- data = results["data"]
287
- aggregate_failures do
288
- expect(data["errors"]).to be_nil
289
- expect(data["createAdvisor"]["resource"]["name"]).to eql name
290
- expect(Advisor.where(id: data["createAdvisor"]["resource"]["id"]).exists?).to eql true
291
- end
292
- end
293
-
294
- it "updates" do
295
- advisor = FactoryBot.create(:advisor)
296
- name = "Bob"
297
- organization_name = "Foo"
298
-
299
- results = schema.execute(update_mutation, variables: {
300
- id: advisor.id,
301
- attributes: {
302
- name: name,
303
- organization: { id: advisor.organization_id, name: organization_name }
304
- }
305
- })
306
-
307
- data = results["data"]
308
- aggregate_failures do
309
- expect(data["errors"]).to be_nil
310
- expect(data["updateAdvisor"]["resource"]["name"]).to eql name
311
- expect(data["updateAdvisor"]["resource"]["organization"]["name"]).to eql organization_name
312
- expect(Advisor.find(advisor.id).name).to eql name
313
- expect(Organization.find(advisor.organization_id).name).to eql organization_name
314
- end
315
- end
316
-
317
- it "destroys" do
318
- advisor = FactoryBot.create(:advisor)
319
- results = schema.execute(destroy_mutation, variables: { id: advisor.id })
320
-
321
- data = results["data"]
322
- aggregate_failures do
323
- expect(data["errors"]).to be_nil
324
- expect(data["destroyAdvisor"]["resource"]["name"]).to eql advisor.name
325
- expect(Advisor.where(id: advisor.id).exists?).to eql false
326
- end
327
- end
328
-
329
- context "with a global scope" do
330
- before(:each) do
331
- allow(::HQ::GraphQL).to receive(:default_scope) { Advisor.none }
332
- end
333
-
334
- it "returns nothing" do
335
- advisor = FactoryBot.create(:advisor)
336
- results = schema.execute(find_advisor, variables: { id: advisor.id })
337
-
338
- expect(results["data"]["advisor"]).to be_nil
339
- end
340
-
341
- it "returns an error on a mutation" do
342
- advisor = FactoryBot.create(:advisor)
343
- results = schema.execute(update_mutation, variables: {
344
- id: advisor.id,
345
- attributes: {
346
- name: "Bob"
347
- }
348
- })
349
-
350
- data = results["data"]
351
- aggregate_failures do
352
- expect(data["updateAdvisor"]["errors"]).to be_present
353
- expect(data["updateAdvisor"]["resource"]).to be_nil
354
- end
355
- end
356
- end
357
-
358
- context "with a local scope" do
359
- before(:each) do
360
- advisor_type.class_eval do
361
- default_scope do
362
- Advisor.none
363
- end
364
- end
365
- end
366
-
367
- it "returns nothing" do
368
- advisor = FactoryBot.create(:advisor)
369
- results = schema.execute(find_advisor, variables: { id: advisor.id })
370
-
371
- expect(results["data"]["advisor"]).to be_nil
372
- end
373
-
374
- it "returns an error on a mutation" do
375
- advisor = FactoryBot.create(:advisor)
376
- results = schema.execute(update_mutation, variables: {
377
- id: advisor.id,
378
- attributes: {
379
- name: "Bob"
380
- }
381
- })
382
-
383
- data = results["data"]
384
- aggregate_failures do
385
- expect(data["updateAdvisor"]["errors"]).to be_present
386
- expect(data["updateAdvisor"]["resource"]).to be_nil
387
- end
388
- end
389
- end
390
- end
391
-
392
- end
@@ -1,96 +0,0 @@
1
- require 'rails_helper'
2
-
3
- describe ::HQ::GraphQL::Types::Object do
4
- let(:hql_object_klass) do
5
- Class.new(::HQ::GraphQL::Object) do
6
- graphql_name "TestQuery"
7
-
8
- field :valid_object, ::HQ::GraphQL::Types::Object, null: false
9
- field :invalid_object, ::HQ::GraphQL::Types::Object, null: false
10
-
11
- def valid_object
12
- { name: object.name }
13
- end
14
-
15
- def invalid_object
16
- :not_an_object
17
- end
18
- end
19
- end
20
-
21
- let(:query) do
22
- Class.new(::HQ::GraphQL::Object) do
23
- graphql_name "Query"
24
-
25
- field :advisor, AdvisorType, null: false do
26
- argument :filters, ::HQ::GraphQL::Types::Object, required: true
27
- end
28
-
29
- def advisor(filters:)
30
- Advisor.find_by(filters)
31
- end
32
- end
33
- end
34
-
35
- let(:schema) do
36
- Class.new(GraphQL::Schema) do
37
- query(Query)
38
- end
39
- end
40
-
41
- let(:query_str) do
42
- <<-gql
43
- query findAdvisor($filters: Object!){
44
- advisor(filters: $filters) {
45
- validObject
46
- }
47
- }
48
- gql
49
- end
50
-
51
- let(:invalid_query_str) do
52
- <<-gql
53
- query findAdvisor($filters: Object!){
54
- advisor(filters: $filters) {
55
- invalidObject
56
- }
57
- }
58
- gql
59
- end
60
-
61
- let(:advisor) { FactoryBot.create(:advisor) }
62
- let(:advisor_filter) { { name: advisor.name } }
63
-
64
- before(:each) do
65
- stub_const("AdvisorType", hql_object_klass)
66
- stub_const("Query", query)
67
- end
68
-
69
- describe ".coerce_result" do
70
- it "returns an object" do
71
- results = schema.execute(query_str, variables: { filters: advisor_filter })
72
- expect(results["data"]["advisor"]["validObject"]).to eql({ name: advisor.name })
73
- end
74
-
75
- it "raises an error when returning am invalid object " do
76
- expect { schema.execute(invalid_query_str, variables: { filters: advisor_filter }) }.to raise_error(
77
- ::GraphQL::CoercionError, ":not_an_object is not a valid Object"
78
- )
79
- end
80
- end
81
-
82
- describe ".coerce_input" do
83
- it "accepts an object as input" do
84
- result = schema.execute(query_str, variables: { filters: advisor_filter })
85
- expect(result["data"]["advisor"]["validObject"]).to eql({ name: advisor.name })
86
- end
87
-
88
- it "raises an error when an argument is an invalid object" do
89
- result = schema.execute(query_str, variables: { filters: advisor.name })
90
- aggregate_failures do
91
- expect(result["errors"].length).to eql(1)
92
- expect(result["errors"][0]["message"]).to eql("Variable filters of type Object! was provided invalid value")
93
- end
94
- end
95
- end
96
- end
@@ -1,65 +0,0 @@
1
- require 'rails_helper'
2
-
3
- describe ::HQ::GraphQL::Types::UUID do
4
- let(:hql_object_klass) do
5
- Class.new(::HQ::GraphQL::Object) do
6
- graphql_name "TestQuery"
7
-
8
- field :name, ::HQ::GraphQL::Types::UUID, null: false
9
- end
10
- end
11
-
12
- let(:query) do
13
- Class.new(::HQ::GraphQL::Object) do
14
- graphql_name "Query"
15
-
16
- field :advisor, AdvisorType, null: false do
17
- argument :id, ::HQ::GraphQL::Types::UUID, required: true
18
- end
19
-
20
- def advisor(id:)
21
- Advisor.find(id)
22
- end
23
- end
24
- end
25
-
26
- let(:schema) do
27
- Class.new(GraphQL::Schema) do
28
- query(Query)
29
- end
30
- end
31
-
32
- let(:query_str) do
33
- <<-gql
34
- query findAdvisor($id: UUID!){
35
- advisor(id: $id) {
36
- name
37
- }
38
- }
39
- gql
40
- end
41
-
42
- before(:each) do
43
- stub_const("AdvisorType", hql_object_klass)
44
- stub_const("Query", query)
45
- end
46
-
47
- describe ".coerce_result" do
48
- it "raises an error on incorrect type" do
49
- advisor = FactoryBot.create(:advisor)
50
- expect { schema.execute(query_str, variables: { id: advisor.id }) }.to raise_error(
51
- ::GraphQL::CoercionError, "\"#{advisor.name}\" is not a valid UUID"
52
- )
53
- end
54
- end
55
-
56
- describe ".coerce_input" do
57
- it "displays an error message" do
58
- result = schema.execute(query_str, variables: { id: "1" })
59
- aggregate_failures do
60
- expect(result["errors"].length).to eql(1)
61
- expect(result["errors"][0]["message"]).to eql("Variable id of type UUID! was provided invalid value")
62
- end
63
- end
64
- end
65
- end
@@ -1,86 +0,0 @@
1
- require 'rails_helper'
2
-
3
- describe ::HQ::GraphQL::Types do
4
-
5
- describe ".[]" do
6
- let(:graphql_klass) do
7
- Class.new do
8
- include ::HQ::GraphQL::Resource
9
-
10
- self.model_name = "Advisor"
11
-
12
- query(attributes: false, associations: false) do
13
- field :custom_field, String, null: false
14
- end
15
- end
16
- end
17
-
18
- it "finds the type" do
19
- type_object = graphql_klass.query_klass
20
-
21
- aggregate_failures do
22
- expect(type_object.superclass).to eql(::HQ::GraphQL::Object)
23
- expect(type_object).to eql(described_class[Advisor])
24
- expect(type_object.fields.keys).to contain_exactly("customField")
25
- type_object.to_graphql
26
- expect(type_object.fields.keys).to contain_exactly("customField")
27
- end
28
- end
29
-
30
- it "finds the type when lookup is a string" do
31
- type_object = graphql_klass.query_klass
32
- expect(type_object).to eql(described_class["Advisor"])
33
- end
34
-
35
- it "raises an exception for unknown types" do
36
- expect { described_class[Advisor] }.to raise_error(described_class::Error)
37
- end
38
- end
39
-
40
- describe ".type_from_column" do
41
- context "UUID" do
42
- it "matches uuid" do
43
- expect(type_from_column("id")).to eq ::HQ::GraphQL::Types::UUID
44
- end
45
- end
46
-
47
- context "Object" do
48
- it "matches json" do
49
- expect(type_from_column("data_json")).to eq ::HQ::GraphQL::Types::Object
50
- end
51
-
52
- it "matches jsonb" do
53
- expect(type_from_column("data_jsonb")).to eq ::HQ::GraphQL::Types::Object
54
- end
55
- end
56
-
57
- context "Int" do
58
- it "matches integer" do
59
- expect(type_from_column("count")).to eq ::GraphQL::Types::Int
60
- end
61
- end
62
-
63
- context "Float" do
64
- it "matches decimal" do
65
- expect(type_from_column("amount")).to eq ::GraphQL::Types::Float
66
- end
67
- end
68
-
69
- context "Boolean" do
70
- it "matches boolean" do
71
- expect(type_from_column("is_bool")).to eq ::GraphQL::Types::Boolean
72
- end
73
- end
74
-
75
- context "String" do
76
- it "matches string" do
77
- expect(type_from_column("name")).to eq ::GraphQL::Types::String
78
- end
79
- end
80
-
81
- def type_from_column(name)
82
- described_class.type_from_column(TestType.columns_hash[name])
83
- end
84
- end
85
-
86
- end
data/spec/rails_helper.rb DELETED
@@ -1,43 +0,0 @@
1
- require "testhq/coverage" # Needs to be require at the top of this file!
2
- # Coverage must also be enabled in the environment by setting
3
- # environment variables, e.g. `COVERAGE=true` or `CODECLIMATE_REPO_TOKEN=...`.
4
- # See https://github.com/OneHQ/testhq#code-coverage.
5
-
6
- require "bundler/setup"
7
- require "combustion"
8
-
9
- silence_stream(STDOUT) do # Hides a lot of output from Combustion init such as schema loading.
10
- Combustion.initialize! :all do
11
- # Disable strong parameters
12
- config.action_controller.permit_all_parameters = true
13
- end
14
- end
15
-
16
- require "byebug"
17
- require "rspec/rails"
18
- require "testhq"
19
-
20
- RSpec.configure do |config|
21
- config.expect_with :rspec do |c|
22
- c.syntax = [:expect]
23
- end
24
-
25
- config.use_transactional_fixtures = false
26
-
27
- config.include FactoryBot::Syntax::Methods
28
-
29
- config.before(:suite) do
30
- DatabaseCleaner.strategy = :transaction
31
- DatabaseCleaner.clean_with :truncation # Clear everything
32
- end
33
-
34
- config.before(:each) do
35
- ::HQ::GraphQL.reset!
36
- DatabaseCleaner.start
37
- end
38
-
39
- config.after(:each) do
40
- DatabaseCleaner.clean
41
- ::HQ::GraphQL.reset!
42
- end
43
- end
data/spec/spec_helper.rb DELETED
@@ -1,22 +0,0 @@
1
- RSpec.configure do |config|
2
- config.expect_with :rspec do |expectations|
3
- # This option will default to `true` in RSpec 4. It makes the `description`
4
- # and `failure_message` of custom matchers include text for helper methods
5
- # defined using `chain`, e.g.:
6
- # be_bigger_than(2).and_smaller_than(4).description
7
- # # => "be bigger than 2 and smaller than 4"
8
- # ...rather than:
9
- # # => "be bigger than 2"
10
- expectations.include_chain_clauses_in_custom_matcher_descriptions = true
11
- end
12
-
13
- # rspec-mocks config goes here. You can use an alternate test double
14
- # library (such as bogus or mocha) by changing the `mock_with` option here.
15
- config.mock_with :rspec do |mocks|
16
- # Prevents you from mocking or stubbing a method that does not exist on
17
- # a real object. This is generally recommended, and will default to
18
- # `true` in RSpec 4.
19
- mocks.verify_partial_doubles = true
20
- end
21
- config.order = :random
22
- end