desk_api 0.5.8 → 0.6.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/LICENSE +2 -2
- data/README.md +274 -120
- data/lib/desk_api.rb +2 -2
- data/lib/desk_api/client.rb +6 -1
- data/lib/desk_api/configuration.rb +34 -26
- data/lib/desk_api/request/encode_json.rb +11 -0
- data/lib/desk_api/request/oauth.rb +20 -0
- data/lib/desk_api/request/retry.rb +37 -42
- data/lib/desk_api/resource.rb +86 -22
- data/lib/desk_api/response/parse_dates.rb +28 -0
- data/lib/desk_api/response/parse_json.rb +9 -0
- data/lib/desk_api/response/raise_error.rb +11 -16
- data/lib/desk_api/version.rb +1 -1
- data/spec/cassettes/DeskApi_Resource/_all/iterates_over_each_resource_on_each_page.yml +1953 -0
- data/spec/cassettes/DeskApi_Resource/_each_page/iterates_over_each_page.yml +1953 -0
- data/spec/cassettes/DeskApi_Resource/_each_page/raises_NoMethodError_is_called_on_non-page_resources.yml +207 -0
- data/spec/cassettes/DeskApi_Resource/_each_page/uses_a_default_per_page_of_1000.yml +1953 -0
- data/spec/cassettes/DeskApi_Resource/_load/loads_the_resource_if_not_already_loaded.yml +205 -0
- data/spec/cassettes/DeskApi_Resource/_loaded_/returns_true_if_the_resource_is_loaded.yml +205 -0
- data/spec/cassettes/DeskApi_Resource/_next_/changes__definition_to_next_page.yml +407 -0
- data/spec/cassettes/DeskApi_Resource/_next_/returns_nil_on_the_last_page.yml +315 -0
- data/spec/cassettes/DeskApi_Resource/_request/sends_request_through_a_client_and_returns_Faraday_Response.yml +207 -0
- data/spec/cassettes/DeskApi_Resource/_reset_/sets__links__embedded__changed_and__loaded_to_default_values.yml +253 -0
- data/spec/cassettes/DeskApi_Resource/_to_hash/converts_embedded_resources_to_hashes.yml +251 -0
- data/spec/cassettes/DeskApi_Resource/_to_hash/returns_a_hash_for_a_desk_resource.yml +66 -0
- data/spec/cassettes/DeskApi_Resource/_update/can_handle_action_params.yml +427 -0
- data/spec/desk_api/client_spec.rb +23 -17
- data/spec/desk_api/configuration_spec.rb +49 -41
- data/spec/desk_api/default_spec.rb +3 -3
- data/spec/desk_api/error_spec.rb +9 -7
- data/spec/desk_api/rate_limit_spec.rb +1 -1
- data/spec/desk_api/request/encode_json_spec.rb +33 -0
- data/spec/desk_api/request/oauth_spec.rb +31 -0
- data/spec/desk_api/request/retry_spec.rb +4 -4
- data/spec/desk_api/resource_spec.rb +247 -71
- data/spec/desk_api/response/parse_dates_spec.rb +34 -0
- data/spec/desk_api/response/parse_json_spec.rb +34 -0
- data/spec/desk_api/response/raise_error_spec.rb +31 -0
- data/spec/desk_api_spec.rb +6 -6
- data/spec/spec_helper.rb +2 -2
- data/spec/stubs/article.json +51 -0
- data/spec/stubs/to_hash_embed.json +1 -0
- metadata +78 -28
- data/.coveralls.yml +0 -1
- data/.gitignore +0 -23
- data/.rspec +0 -1
- data/.travis.yml +0 -4
- data/.yardopts +0 -3
- data/Gemfile +0 -10
- data/Guardfile +0 -5
- data/Rakefile +0 -32
- data/desk_api.gemspec +0 -32
@@ -7,43 +7,43 @@ describe DeskApi::Resource do
|
|
7
7
|
|
8
8
|
context '#initialize' do
|
9
9
|
it 'stores the client' do
|
10
|
-
subject.articles.instance_variable_get(:@_client).
|
10
|
+
expect(subject.articles.instance_variable_get(:@_client)).to eq(subject)
|
11
11
|
end
|
12
12
|
|
13
13
|
it 'is not loaded initially' do
|
14
|
-
subject.articles.instance_variable_get(:@_loaded).
|
14
|
+
expect(subject.articles.instance_variable_get(:@_loaded)).to be_false
|
15
15
|
end
|
16
16
|
|
17
17
|
it 'sets up the link to self' do
|
18
|
-
subject.articles.href.
|
18
|
+
expect(subject.articles.href).not_to be_nil
|
19
19
|
end
|
20
20
|
|
21
21
|
context 'additional options' do
|
22
22
|
it 'allows for sorting options' do
|
23
23
|
cases = subject.cases(sort_field: :updated_at, sort_direction: :asc)
|
24
|
-
cases.href.
|
24
|
+
expect(cases.href).to eq('/api/v2/cases?sort_direction=asc&sort_field=updated_at')
|
25
25
|
end
|
26
26
|
|
27
27
|
it 'allows to specify arbitrary params' do
|
28
|
-
subject.cases(company_id: 1).href.
|
29
|
-
subject.cases(customer_id: 1).href.
|
30
|
-
subject.cases(filter_id: 1).href.
|
28
|
+
expect(subject.cases(company_id: 1).href).to eq('/api/v2/cases?company_id=1')
|
29
|
+
expect(subject.cases(customer_id: 1).href).to eq('/api/v2/cases?customer_id=1')
|
30
|
+
expect(subject.cases(filter_id: 1).href).to eq('/api/v2/cases?filter_id=1')
|
31
31
|
end
|
32
32
|
|
33
33
|
it 'allows to specify embeddables' do
|
34
|
-
subject.cases(embed: :customer).href.
|
35
|
-
subject.cases(embed: [:customer, :assigned_user]).href.
|
34
|
+
expect(subject.cases(embed: :customer).href).to eq('/api/v2/cases?embed=customer')
|
35
|
+
expect(subject.cases(embed: [:customer, :assigned_user]).href).to eq('/api/v2/cases?embed=customer%2Cassigned_user')
|
36
36
|
end
|
37
37
|
|
38
38
|
it 'does not automatically load the resource' do
|
39
|
-
subject.cases(company_id: 1).instance_variable_get(:@_loaded).
|
39
|
+
expect(subject.cases(company_id: 1).instance_variable_get(:@_loaded)).to be_false
|
40
40
|
end
|
41
41
|
end
|
42
42
|
end
|
43
43
|
|
44
44
|
context '#exec!', :vcr do
|
45
45
|
it 'loads the current resource' do
|
46
|
-
subject.articles.send(:exec!).instance_variable_get(:@_loaded).
|
46
|
+
expect(subject.articles.send(:exec!).instance_variable_get(:@_loaded)).to be_true
|
47
47
|
end
|
48
48
|
|
49
49
|
it 'can be forced to reload' do
|
@@ -62,7 +62,7 @@ describe DeskApi::Resource do
|
|
62
62
|
end
|
63
63
|
|
64
64
|
it 'raises an error if method does not exist' do
|
65
|
-
lambda { subject.articles.some_other_method }.
|
65
|
+
expect(lambda { subject.articles.some_other_method }).to raise_error(NoMethodError)
|
66
66
|
end
|
67
67
|
end
|
68
68
|
|
@@ -81,23 +81,23 @@ describe DeskApi::Resource do
|
|
81
81
|
end
|
82
82
|
|
83
83
|
it 'returns true if method found in definition' do
|
84
|
-
@company.respond_to?(:name).
|
84
|
+
expect(@company.respond_to?(:name)).to be_true
|
85
85
|
end
|
86
86
|
|
87
87
|
it 'returns false if method does not exist' do
|
88
|
-
@company.respond_to?(:no_method_here).
|
88
|
+
expect(@company.respond_to?(:no_method_here)).to be_false
|
89
89
|
end
|
90
90
|
end
|
91
91
|
|
92
92
|
context '#by_url', :vcr do
|
93
93
|
it 'finds resources by url' do
|
94
|
-
subject.articles.by_url('/api/v2/articles/1295677').
|
94
|
+
expect(subject.articles.by_url('/api/v2/articles/1295677')).to be_an_instance_of(DeskApi::Resource)
|
95
95
|
end
|
96
96
|
end
|
97
97
|
|
98
98
|
context '#get_self' do
|
99
99
|
it 'returns the hash for self' do
|
100
|
-
subject.articles.get_self.
|
100
|
+
expect(subject.articles.get_self).to eq({
|
101
101
|
"href" => "/api/v2/articles"
|
102
102
|
})
|
103
103
|
end
|
@@ -105,7 +105,7 @@ describe DeskApi::Resource do
|
|
105
105
|
|
106
106
|
context '#href' do
|
107
107
|
it 'returns the href for self' do
|
108
|
-
subject.articles.href.
|
108
|
+
expect(subject.articles.href).to eq('/api/v2/articles')
|
109
109
|
end
|
110
110
|
|
111
111
|
it 'sets the href' do
|
@@ -113,9 +113,9 @@ describe DeskApi::Resource do
|
|
113
113
|
'_links'=>{'self'=>{'href'=>'/api/v2/cases'}}
|
114
114
|
}, true)
|
115
115
|
|
116
|
-
res.href.
|
116
|
+
expect(res.href).to eq('/api/v2/cases')
|
117
117
|
res.href = '/api/v2/articles'
|
118
|
-
res.href.
|
118
|
+
expect(res.href).to eq('/api/v2/articles')
|
119
119
|
end
|
120
120
|
end
|
121
121
|
|
@@ -124,25 +124,27 @@ describe DeskApi::Resource do
|
|
124
124
|
res = DeskApi::Resource.new(subject, {
|
125
125
|
'_links'=>{'self'=>{'href'=>'/api/v2/cases','class'=>'page'}}
|
126
126
|
}, true)
|
127
|
-
res.resource_type.
|
127
|
+
expect(res.resource_type).to eq('page')
|
128
128
|
end
|
129
129
|
end
|
130
130
|
|
131
131
|
context '#search' do
|
132
132
|
it 'allows searching on search enabled resources', :vcr do
|
133
|
-
subject.articles.search(text: 'Lorem Ipsum').total_entries.
|
133
|
+
expect(subject.articles.search(text: 'Lorem Ipsum').total_entries).to eq(0)
|
134
134
|
end
|
135
135
|
end
|
136
136
|
|
137
137
|
context '#create' do
|
138
138
|
it 'creates a new topic', :vcr do
|
139
|
-
|
140
|
-
|
141
|
-
|
139
|
+
expect(
|
140
|
+
topic = subject.topics.create({
|
141
|
+
name: 'My new topic'
|
142
|
+
}).name
|
143
|
+
).to eq('My new topic')
|
142
144
|
end
|
143
145
|
|
144
146
|
it 'throws an error creating a user', :vcr do
|
145
|
-
lambda { subject.users.create(name: 'Some User') }.
|
147
|
+
expect(lambda { subject.users.create(name: 'Some User') }).to raise_error(DeskApi::Error::MethodNotAllowed)
|
146
148
|
end
|
147
149
|
end
|
148
150
|
|
@@ -155,20 +157,20 @@ describe DeskApi::Resource do
|
|
155
157
|
name: 'Updated topic name'
|
156
158
|
})
|
157
159
|
|
158
|
-
topic.name.
|
159
|
-
topic.description.
|
160
|
+
expect(topic.name).to eq('Updated topic name')
|
161
|
+
expect(topic.description).to eq('Some new description')
|
160
162
|
end
|
161
163
|
|
162
164
|
it 'throws an error updating a user', :vcr do
|
163
165
|
user = subject.users.entries.first
|
164
|
-
lambda { user.update(name: 'Some User') }.
|
166
|
+
expect(lambda { user.update(name: 'Some User') }).to raise_error(DeskApi::Error::MethodNotAllowed)
|
165
167
|
end
|
166
168
|
|
167
169
|
it 'can update without a hash', :vcr do
|
168
170
|
topic = subject.topics.entries.first
|
169
171
|
topic.description = 'Another description update.'
|
170
172
|
topic.update
|
171
|
-
subject.topics.entries.first.description.
|
173
|
+
expect(subject.topics.entries.first.description).to eq('Another description update.')
|
172
174
|
end
|
173
175
|
|
174
176
|
it 'can handle update action params', :vcr do
|
@@ -181,14 +183,34 @@ describe DeskApi::Resource do
|
|
181
183
|
phone_numbers_update_action: 'append'
|
182
184
|
})
|
183
185
|
|
184
|
-
customer.reload!.phone_numbers.size.
|
186
|
+
expect(customer.reload!.phone_numbers.size).to eq(num_count + 1)
|
185
187
|
|
186
188
|
customer.update({
|
187
189
|
phone_numbers: [phone],
|
188
190
|
phone_numbers_update_action: 'append'
|
189
191
|
})
|
190
192
|
|
191
|
-
customer.reload!.phone_numbers.size.
|
193
|
+
expect(customer.reload!.phone_numbers.size).to eq(num_count + 2)
|
194
|
+
end
|
195
|
+
|
196
|
+
it 'can handle action params', :vcr do
|
197
|
+
ticket = subject.cases.entries.first
|
198
|
+
num_count = ticket.to_hash['labels'].count
|
199
|
+
labels = ['client_spam', 'client_test']
|
200
|
+
|
201
|
+
ticket.update({
|
202
|
+
labels: labels,
|
203
|
+
label_action: 'append'
|
204
|
+
})
|
205
|
+
|
206
|
+
expect(ticket.labels.reload!.total_entries).to eq(num_count + 2)
|
207
|
+
|
208
|
+
ticket.update({
|
209
|
+
labels: labels,
|
210
|
+
label_action: 'replace'
|
211
|
+
})
|
212
|
+
|
213
|
+
expect(ticket.labels.reload!.total_entries).to eq(2)
|
192
214
|
end
|
193
215
|
|
194
216
|
it 'can replace instead of append', :vcr do
|
@@ -206,35 +228,37 @@ describe DeskApi::Resource do
|
|
206
228
|
phone_numbers_update_action: 'replace'
|
207
229
|
})
|
208
230
|
|
209
|
-
customer.reload!.phone_numbers.size.
|
210
|
-
num_count.
|
231
|
+
expect(customer.reload!.phone_numbers.size).to eq(1)
|
232
|
+
expect(num_count).not_to eq(customer.phone_numbers.size)
|
211
233
|
end
|
212
234
|
end
|
213
235
|
|
214
236
|
context '#delete' do
|
215
237
|
it 'deletes a resource', :vcr do
|
216
|
-
|
217
|
-
subject
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
238
|
+
expect {
|
239
|
+
subject.articles.create({
|
240
|
+
subject: 'My subject',
|
241
|
+
body: 'Some text for this new article',
|
242
|
+
_links: {
|
243
|
+
topic: subject.topics.entries.first.get_self
|
244
|
+
}
|
245
|
+
}).delete
|
246
|
+
}.to be_true
|
223
247
|
end
|
224
248
|
|
225
249
|
it 'throws an error deleting a non deletalbe resource', :vcr do
|
226
250
|
user = subject.users.entries.first
|
227
|
-
lambda { user.delete }.
|
251
|
+
expect(lambda { user.delete }).to raise_error(DeskApi::Error::MethodNotAllowed)
|
228
252
|
end
|
229
253
|
end
|
230
254
|
|
231
255
|
describe 'embeddable' do
|
232
256
|
it 'allows to declare embedds' do
|
233
|
-
lambda { subject.cases.embed(:assigned_user) }.
|
257
|
+
expect(lambda { subject.cases.embed(:assigned_user) }).not_to raise_error
|
234
258
|
end
|
235
259
|
|
236
260
|
it 'changes the url' do
|
237
|
-
subject.cases.embed(:assigned_user).href.
|
261
|
+
expect(subject.cases.embed(:assigned_user).href).to eq('/api/v2/cases?embed=assigned_user')
|
238
262
|
end
|
239
263
|
|
240
264
|
context 'if you use embed' do
|
@@ -244,13 +268,9 @@ describe DeskApi::Resource do
|
|
244
268
|
@stubs ||= Faraday::Adapter::Test::Stubs.new
|
245
269
|
@client ||= DeskApi::Client.new(DeskApi::CONFIG).tap do |client|
|
246
270
|
client.middleware = Proc.new do |builder|
|
247
|
-
|
248
|
-
|
249
|
-
|
250
|
-
else
|
251
|
-
builder.use FaradayMiddleware::ParseDates
|
252
|
-
builder.use FaradayMiddleware::ParseJson, content_type: /application\/json/
|
253
|
-
end
|
271
|
+
builder.response :desk_parse_dates
|
272
|
+
builder.response :desk_parse_json
|
273
|
+
|
254
274
|
builder.adapter :test, @stubs
|
255
275
|
end
|
256
276
|
end
|
@@ -272,9 +292,9 @@ describe DeskApi::Resource do
|
|
272
292
|
end
|
273
293
|
|
274
294
|
first_case = @client.cases.embed(:assigned_user).entries.first
|
275
|
-
first_case.assigned_user.name.
|
276
|
-
first_case.assigned_user.instance_variable_get(:@_loaded).
|
277
|
-
times_called.
|
295
|
+
expect(first_case.assigned_user.name).to eq('Thomas Stachl')
|
296
|
+
expect(first_case.assigned_user.instance_variable_get(:@_loaded)).to be_true
|
297
|
+
expect(times_called).to eq(1)
|
278
298
|
end
|
279
299
|
|
280
300
|
it 'can be used in finder' do
|
@@ -287,9 +307,9 @@ describe DeskApi::Resource do
|
|
287
307
|
end
|
288
308
|
|
289
309
|
customer = @client.cases.find(3011, embed: :customer).customer
|
290
|
-
customer.first_name.
|
310
|
+
expect(customer.first_name).to eq('Thomas')
|
291
311
|
customer = @client.cases.find(3011, embed: [:customer]).customer
|
292
|
-
customer.first_name.
|
312
|
+
expect(customer.first_name).to eq('Thomas')
|
293
313
|
end
|
294
314
|
end
|
295
315
|
end
|
@@ -302,12 +322,12 @@ describe DeskApi::Resource do
|
|
302
322
|
end
|
303
323
|
|
304
324
|
it 'allows to get query params from the current resource' do
|
305
|
-
@page.send(:query_params_include?, 'page').
|
306
|
-
@page.send(:query_params_include?, 'per_page').
|
325
|
+
expect(@page.send(:query_params_include?, 'page')).to eq('2')
|
326
|
+
expect(@page.send(:query_params_include?, 'per_page')).to eq('50')
|
307
327
|
end
|
308
328
|
|
309
329
|
it 'returns nil if param not found' do
|
310
|
-
@page.send(:query_params_include?, 'blup').
|
330
|
+
expect(@page.send(:query_params_include?, 'blup')).to be_nil
|
311
331
|
end
|
312
332
|
end
|
313
333
|
|
@@ -320,67 +340,223 @@ describe DeskApi::Resource do
|
|
320
340
|
|
321
341
|
it 'sets query params on the current url' do
|
322
342
|
@page.send(:query_params=, { page: 5, per_page: 50 })
|
323
|
-
@page.instance_variable_get(:@_definition)['_links']['self']['href'].
|
343
|
+
expect(@page.instance_variable_get(:@_definition)['_links']['self']['href']).to eq('/api/v2/cases?page=5&per_page=50')
|
324
344
|
end
|
325
345
|
end
|
326
346
|
|
327
347
|
context '#get_linked_resource' do
|
328
348
|
it 'returns linked resources', :vcr do
|
329
|
-
subject.cases.entries.first.customer.
|
349
|
+
expect(subject.cases.entries.first.customer).to be_an_instance_of(DeskApi::Resource)
|
330
350
|
end
|
331
351
|
|
332
352
|
it 'returns nil if link is nil', :vcr do
|
333
|
-
subject.articles.next.
|
353
|
+
expect(subject.articles.next).to be_nil
|
334
354
|
end
|
335
355
|
|
336
356
|
it 'saves the linked resource instead of the url', :vcr do
|
337
357
|
first_case = subject.cases.entries.first
|
338
|
-
first_case.customer.
|
339
|
-
first_case.instance_variable_get(:@
|
358
|
+
expect(first_case.customer).to be_an_instance_of(DeskApi::Resource)
|
359
|
+
expect(first_case.instance_variable_get(:@_links)['customer']).to be_an_instance_of(DeskApi::Resource)
|
340
360
|
end
|
341
361
|
end
|
342
362
|
|
343
363
|
context '#page' do
|
344
364
|
it 'returns the current page and loads if page not defined', :vcr do
|
345
|
-
subject.articles.page.
|
365
|
+
expect(subject.articles.page).to eq(1)
|
346
366
|
end
|
347
367
|
|
348
368
|
it 'sets the page' do
|
349
|
-
subject.cases.page(5).page.
|
369
|
+
expect(subject.cases.page(5).page).to eq(5)
|
350
370
|
end
|
351
371
|
|
352
372
|
it 'sets the resource to not loaded', :vcr do
|
353
373
|
cases = subject.cases.send(:exec!)
|
354
|
-
cases.page(5).instance_variable_get(:@_loaded).
|
374
|
+
expect(cases.page(5).instance_variable_get(:@_loaded)).to be_false
|
355
375
|
end
|
356
376
|
|
357
377
|
it 'keeps the resource as loaded', :vcr do
|
358
378
|
cases = subject.cases.send(:exec!)
|
359
|
-
cases.page(1).instance_variable_get(:@_loaded).
|
379
|
+
expect(cases.page(1).instance_variable_get(:@_loaded)).to be_true
|
360
380
|
end
|
361
381
|
end
|
362
382
|
|
363
383
|
context '#find' do
|
364
384
|
it 'loads the requested resource', :vcr do
|
365
|
-
subject.cases.find(3065).subject.
|
385
|
+
expect(subject.cases.find(3065).subject).to eq('Testing the Tank again')
|
366
386
|
end
|
367
387
|
|
368
388
|
it 'has an alias by_id', :vcr do
|
369
|
-
subject.cases.find(3065).subject.
|
389
|
+
expect(subject.cases.find(3065).subject).to eq('Testing the Tank again')
|
390
|
+
end
|
391
|
+
end
|
392
|
+
|
393
|
+
context '#to_hash' do
|
394
|
+
it 'returns a hash for a desk resource', :vcr do
|
395
|
+
expect(subject.topics.entries.first.to_hash).to eq({
|
396
|
+
"name" => "Updated topic name",
|
397
|
+
"description" => "Another description update.",
|
398
|
+
"position" => 1,
|
399
|
+
"allow_questions" => true,
|
400
|
+
"in_support_center" => true,
|
401
|
+
"created_at" => Time.parse("2013-04-22T23:46:42Z"),
|
402
|
+
"updated_at" => Time.parse("2014-03-06T17:59:33Z"),
|
403
|
+
"_links" => {
|
404
|
+
"self" => {
|
405
|
+
"href" => "/api/v2/topics/498301",
|
406
|
+
"class" => "topic"
|
407
|
+
},
|
408
|
+
"articles" => {
|
409
|
+
"href" => "/api/v2/topics/498301/articles",
|
410
|
+
"class" => "article"
|
411
|
+
},
|
412
|
+
"translations" => {
|
413
|
+
"href" => "/api/v2/topics/498301/translations",
|
414
|
+
"class" => "topic_translation"
|
415
|
+
}
|
416
|
+
}
|
417
|
+
})
|
418
|
+
end
|
419
|
+
|
420
|
+
it 'converts embedded resources to hashes', :vcr do
|
421
|
+
path = File.join(
|
422
|
+
RSpec.configuration.root_path,
|
423
|
+
'stubs',
|
424
|
+
'to_hash_embed.json'
|
425
|
+
)
|
426
|
+
|
427
|
+
expect(subject.cases(embed: :customer).to_hash.to_json).to eq(
|
428
|
+
File.open(path).read
|
429
|
+
)
|
430
|
+
end
|
431
|
+
end
|
432
|
+
|
433
|
+
context '#next!' do
|
434
|
+
it 'changes @_definition to next page', :vcr do
|
435
|
+
page = subject.cases.first
|
436
|
+
next_page = page.next
|
437
|
+
expect(
|
438
|
+
page.
|
439
|
+
next!.
|
440
|
+
instance_variables.
|
441
|
+
count { |v| page.instance_variable_get(v) != next_page.instance_variable_get(v) }
|
442
|
+
).to eq(0)
|
443
|
+
end
|
444
|
+
|
445
|
+
it 'returns nil on the last page', :vcr do
|
446
|
+
expect(subject.cases.last.next!).to eq(nil)
|
370
447
|
end
|
448
|
+
|
371
449
|
end
|
372
450
|
|
451
|
+
context '#each_page' do
|
452
|
+
it 'iterates over each page', :vcr do
|
453
|
+
subject.cases.each_page do |page, page_number|
|
454
|
+
expect(page).to be_an_instance_of(DeskApi::Resource)
|
455
|
+
expect(page.resource_type).to eq('page')
|
456
|
+
expect(page_number).to be_an_instance_of(Fixnum)
|
457
|
+
end
|
458
|
+
end
|
459
|
+
|
460
|
+
it 'uses a default per_page of 1000', :vcr do
|
461
|
+
subject.cases.each_page do |page, page_number|
|
462
|
+
expect((page.query_params['per_page'].to_i % 10)).to eq(0)
|
463
|
+
end
|
464
|
+
end
|
465
|
+
|
466
|
+
it 'uses per_page from query_params if present' do
|
467
|
+
subject.cases.per_page(25) do |page, page_number|
|
468
|
+
expect(page.query_params['per_page']).to eq(25)
|
469
|
+
end
|
470
|
+
end
|
471
|
+
|
472
|
+
it 'raises ArgumentError if no block is given' do
|
473
|
+
expect { subject.cases.each_page }.to raise_error(ArgumentError)
|
474
|
+
end
|
475
|
+
|
476
|
+
it 'raises NoMethodError is called on non-page resources', :vcr do
|
477
|
+
expect { subject.cases.entries.first.each_page { |x| x } }.to raise_error(NoMethodError)
|
478
|
+
end
|
479
|
+
end
|
480
|
+
|
481
|
+
context '#all' do
|
482
|
+
it 'iterates over each resource on each page', :vcr do
|
483
|
+
subject.cases.all do |resource, page_num|
|
484
|
+
expect(resource).to be_an_instance_of(DeskApi::Resource)
|
485
|
+
expect(resource.resource_type).to eq('case')
|
486
|
+
expect(page_num).to be_an_instance_of(Fixnum)
|
487
|
+
end
|
488
|
+
end
|
489
|
+
|
490
|
+
it 'raises an argument error if no block is given' do
|
491
|
+
expect { subject.cases.all }.to raise_error(ArgumentError)
|
492
|
+
end
|
493
|
+
end
|
494
|
+
|
495
|
+
context '#reset!' do
|
496
|
+
it 'sets @_links, @_embedded, @_changed, and @_loaded to default values', :vcr do
|
497
|
+
ticket = subject.cases.embed(:customer).entries.first
|
498
|
+
|
499
|
+
ticket.customer
|
500
|
+
ticket.message
|
501
|
+
ticket.send(:reset!)
|
502
|
+
|
503
|
+
expect(ticket.instance_variable_get(:@_links)).to eq({})
|
504
|
+
expect(ticket.instance_variable_get(:@_embedded)).to eq({})
|
505
|
+
expect(ticket.instance_variable_get(:@_changed)).to eq({})
|
506
|
+
expect(ticket.instance_variable_get(:@_loaded)).to eq(false)
|
507
|
+
end
|
508
|
+
end
|
509
|
+
|
510
|
+
context '#load' do
|
511
|
+
it 'loads the resource if not already loaded', :vcr do
|
512
|
+
tickets = subject.cases
|
513
|
+
expect(tickets.instance_variable_get(:@_loaded)).to eq(false)
|
514
|
+
tickets.send(:load)
|
515
|
+
expect(tickets.instance_variable_get(:@_loaded)).to eq(true)
|
516
|
+
end
|
517
|
+
end
|
518
|
+
|
519
|
+
context '#loaded?' do
|
520
|
+
it 'returns true if the resource is loaded', :vcr do
|
521
|
+
tickets = subject.cases
|
522
|
+
expect(tickets.send(:loaded?)).to eq(false)
|
523
|
+
tickets.send(:load!)
|
524
|
+
expect(tickets.send(:loaded?)).to eq(true)
|
525
|
+
end
|
526
|
+
end
|
527
|
+
|
528
|
+
context '#new_resource' do
|
529
|
+
it 'returns a new desk resource from a hash definition' do
|
530
|
+
expect(
|
531
|
+
subject.
|
532
|
+
cases.
|
533
|
+
send(:new_resource, DeskApi::Resource.build_self_link('/api/v2/customers'))
|
534
|
+
).to be_an_instance_of(DeskApi::Resource)
|
535
|
+
end
|
536
|
+
end
|
537
|
+
|
538
|
+
context '#request' do
|
539
|
+
it 'sends request through a client and returns Faraday::Response', :vcr do
|
540
|
+
expect(
|
541
|
+
subject.cases.send(
|
542
|
+
:request,
|
543
|
+
:get,
|
544
|
+
'/api/v2/cases'
|
545
|
+
)
|
546
|
+
).to be_an_instance_of(Faraday::Response)
|
547
|
+
end
|
548
|
+
end
|
373
549
|
describe 'prioritize links and embeds' do
|
374
550
|
before do
|
375
551
|
@company = subject.customers.entries.first.company
|
376
552
|
end
|
377
553
|
|
378
554
|
it 'returns a desk resource', :vcr do
|
379
|
-
@company.
|
555
|
+
expect(@company).to be_an_instance_of(DeskApi::Resource)
|
380
556
|
end
|
381
557
|
|
382
558
|
it 'loads the resource and returns the name', :vcr do
|
383
|
-
@company.name.
|
559
|
+
expect(@company.name).to eq('Desk.com')
|
384
560
|
end
|
385
561
|
end
|
386
562
|
end
|