hyperclient 0.8.5 → 1.0.1

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.
@@ -14,33 +14,33 @@ module Hyperclient
14
14
  end
15
15
 
16
16
  it 'is a collection' do
17
- LinkCollection.ancestors.must_include Collection
17
+ _(LinkCollection.ancestors).must_include Collection
18
18
  end
19
19
 
20
20
  it 'initializes the collection with links' do
21
- links.must_respond_to :filter
22
- links.must_respond_to :gizmos
21
+ _(links).must_respond_to :search
22
+ _(links).must_respond_to :gizmos
23
23
  end
24
24
 
25
25
  it 'returns link objects for each link' do
26
- links.filter.must_be_kind_of Link
27
- links['self'].must_be_kind_of Link
26
+ _(links.search).must_be_kind_of Link
27
+ _(links['self']).must_be_kind_of Link
28
28
 
29
- links.gizmos.must_be_kind_of Array
30
- links['gizmos'].must_be_kind_of Array
29
+ _(links.gizmos).must_be_kind_of Array
30
+ _(links['gizmos']).must_be_kind_of Array
31
31
  end
32
32
 
33
33
  describe 'plain link' do
34
34
  let(:plain_link) { links.self }
35
35
  it 'must be correct' do
36
- plain_link._url.must_equal '/productions/1'
36
+ _(plain_link._url).must_equal '/productions/1'
37
37
  end
38
38
  end
39
39
 
40
40
  describe 'templated link' do
41
- let(:templated_link) { links.filter }
41
+ let(:templated_link) { links.search }
42
42
  it 'must expand' do
43
- templated_link._expand(filter: 'gizmos')._url.must_equal '/productions/1?categories=gizmos'
43
+ _(templated_link._expand(search: 'gizmos')._url).must_equal '/productions/1?categories=gizmos'
44
44
  end
45
45
  end
46
46
 
@@ -48,10 +48,10 @@ module Hyperclient
48
48
  let(:curied_link) { links['image:thumbnail'] }
49
49
  let(:curie) { links._curies['image'] }
50
50
  it 'must expand' do
51
- curied_link._expand(version: 'small')._url.must_equal '/images/thumbnails/small.jpg'
51
+ _(curied_link._expand(version: 'small')._url).must_equal '/images/thumbnails/small.jpg'
52
52
  end
53
53
  it 'exposes curie' do
54
- curie.expand('thumbnail').must_equal '/docs/images/thumbnail'
54
+ _(curie.expand('thumbnail')).must_equal '/docs/images/thumbnail'
55
55
  end
56
56
  end
57
57
 
@@ -59,12 +59,12 @@ module Hyperclient
59
59
  let(:gizmos) { links.gizmos }
60
60
 
61
61
  it 'should have 2 items' do
62
- gizmos.length.must_equal 2
62
+ _(gizmos.length).must_equal 2
63
63
  end
64
64
 
65
65
  it 'must be an array of Links' do
66
66
  gizmos.each do |link|
67
- link.must_be_kind_of Link
67
+ _(link).must_be_kind_of Link
68
68
  end
69
69
  end
70
70
  end
@@ -72,7 +72,7 @@ module Hyperclient
72
72
  describe 'null link value' do
73
73
  let(:null_link) { links.null_link }
74
74
  it 'must be nil' do
75
- null_link.must_be_nil
75
+ _(null_link).must_be_nil
76
76
  end
77
77
  end
78
78
  end
@@ -7,16 +7,16 @@ module Hyperclient
7
7
  EntryPoint.new('http://api.example.org/')
8
8
  end
9
9
 
10
- %w(type deprecation name profile title hreflang).each do |prop|
10
+ %w[type deprecation name profile title hreflang].each do |prop|
11
11
  describe prop do
12
12
  it 'returns the property value' do
13
13
  link = Link.new('key', { prop => 'value' }, entry_point)
14
- link.send("_#{prop}").must_equal 'value'
14
+ _(link.send("_#{prop}")).must_equal 'value'
15
15
  end
16
16
 
17
17
  it 'returns nil if the property is not present' do
18
18
  link = Link.new('key', {}, entry_point)
19
- link.send("_#{prop}").must_equal nil
19
+ _(link.send("_#{prop}")).must_be_nil
20
20
  end
21
21
  end
22
22
  end
@@ -25,13 +25,13 @@ module Hyperclient
25
25
  it 'returns true if the link is templated' do
26
26
  link = Link.new('key', { 'templated' => true }, entry_point)
27
27
 
28
- link._templated?.must_equal true
28
+ _(link._templated?).must_equal true
29
29
  end
30
30
 
31
31
  it 'returns false if the link is not templated' do
32
32
  link = Link.new('key', {}, entry_point)
33
33
 
34
- link._templated?.must_equal false
34
+ _(link._templated?).must_equal false
35
35
  end
36
36
  end
37
37
 
@@ -39,13 +39,13 @@ module Hyperclient
39
39
  it 'returns a list of required variables' do
40
40
  link = Link.new('key', { 'href' => '/orders{?id,owner}', 'templated' => true }, entry_point)
41
41
 
42
- link._variables.must_equal %w(id owner)
42
+ _(link._variables).must_equal %w[id owner]
43
43
  end
44
44
 
45
45
  it 'returns an empty array for untemplated links' do
46
46
  link = Link.new('key', { 'href' => '/orders' }, entry_point)
47
47
 
48
- link._variables.must_equal []
48
+ _(link._variables).must_equal []
49
49
  end
50
50
  end
51
51
 
@@ -53,41 +53,41 @@ module Hyperclient
53
53
  describe 'required argument' do
54
54
  it 'builds a Link with the templated URI representation' do
55
55
  link = Link.new('key', { 'href' => '/orders/{id}', 'templated' => true }, entry_point)
56
- link._expand(id: '1')._url.must_equal '/orders/1'
56
+ _(link._expand(id: '1')._url).must_equal '/orders/1'
57
57
  end
58
58
 
59
59
  it 'expands an uri template without variables' do
60
60
  link = Link.new('key', { 'href' => '/orders/{id}', 'templated' => true }, entry_point)
61
- link._expand._url.must_equal '/orders/'
62
- link._url.must_equal '/orders/'
61
+ _(link._expand._url).must_equal '/orders/'
62
+ _(link._url).must_equal '/orders/'
63
63
  end
64
64
  end
65
65
 
66
66
  describe 'query string argument' do
67
67
  it 'builds a Link with the templated URI representation' do
68
68
  link = Link.new('key', { 'href' => '/orders{?id}', 'templated' => true }, entry_point)
69
- link._expand(id: '1')._url.must_equal '/orders?id=1'
69
+ _(link._expand(id: '1')._url).must_equal '/orders?id=1'
70
70
  end
71
71
 
72
72
  it 'expands an uri template without variables' do
73
73
  link = Link.new('key', { 'href' => '/orders{?id}', 'templated' => true }, entry_point)
74
- link._expand._url.must_equal '/orders'
75
- link._url.must_equal '/orders'
74
+ _(link._expand._url).must_equal '/orders'
75
+ _(link._url).must_equal '/orders'
76
76
  end
77
77
 
78
78
  it 'does not expand unknown variables' do
79
79
  link = Link.new('key', { 'href' => '/orders{?id}', 'templated' => true }, entry_point)
80
- link._expand(unknown: '1')._url.must_equal '/orders'
80
+ _(link._expand(unknown: '1')._url).must_equal '/orders'
81
81
  end
82
82
 
83
83
  it 'only expands known variables' do
84
84
  link = Link.new('key', { 'href' => '/orders{?id}', 'templated' => true }, entry_point)
85
- link._expand(unknown: '1', id: '2')._url.must_equal '/orders?id=2'
85
+ _(link._expand(unknown: '1', id: '2')._url).must_equal '/orders?id=2'
86
86
  end
87
87
 
88
88
  it 'only expands templated links' do
89
89
  link = Link.new('key', { 'href' => '/orders{?id}', 'templated' => false }, entry_point)
90
- link._expand(id: '1')._url.must_equal '/orders{?id}'
90
+ _(link._expand(id: '1')._url).must_equal '/orders{?id}'
91
91
  end
92
92
  end
93
93
  end
@@ -96,36 +96,36 @@ module Hyperclient
96
96
  it 'expands an uri template without variables' do
97
97
  link = Link.new('key', { 'href' => '/orders{?id}', 'templated' => true }, entry_point)
98
98
 
99
- link._url.must_equal '/orders'
99
+ _(link._url).must_equal '/orders'
100
100
  end
101
101
 
102
102
  it 'expands an uri template with variables' do
103
103
  link = Link.new('key', { 'href' => '/orders{?id}', 'templated' => true }, entry_point, id: 1)
104
104
 
105
- link._url.must_equal '/orders?id=1'
105
+ _(link._url).must_equal '/orders?id=1'
106
106
  end
107
107
 
108
108
  it 'does not expand an uri template with unknown variables' do
109
109
  link = Link.new('key', { 'href' => '/orders{?id}', 'templated' => true }, entry_point, unknown: 1)
110
110
 
111
- link._url.must_equal '/orders'
111
+ _(link._url).must_equal '/orders'
112
112
  end
113
113
 
114
114
  it 'only expands known variables in a uri template' do
115
115
  link = Link.new('key', { 'href' => '/orders{?id}', 'templated' => true }, entry_point, unknown: 1, id: 2)
116
116
 
117
- link._url.must_equal '/orders?id=2'
117
+ _(link._url).must_equal '/orders?id=2'
118
118
  end
119
119
 
120
120
  it 'returns the link when no uri template' do
121
121
  link = Link.new('key', { 'href' => '/orders' }, entry_point)
122
- link._url.must_equal '/orders'
122
+ _(link._url).must_equal '/orders'
123
123
  end
124
124
 
125
125
  it 'aliases to_s to _url' do
126
126
  link = Link.new('key', { 'href' => '/orders{?id}', 'templated' => true }, entry_point, id: 1)
127
127
 
128
- link.to_s.must_equal '/orders?id=1'
128
+ _(link.to_s).must_equal '/orders?id=1'
129
129
  end
130
130
  end
131
131
 
@@ -151,7 +151,7 @@ module Hyperclient
151
151
  stub.get('http://api.example.org/productions/1') { [200, {}, nil] }
152
152
  end
153
153
 
154
- link._get.must_be_kind_of Resource
154
+ _(link._get).must_be_kind_of Resource
155
155
  end
156
156
 
157
157
  it 'raises exceptions by default' do
@@ -161,35 +161,7 @@ module Hyperclient
161
161
  stub.get('http://api.example.org/productions/1') { [400, {}, nil] }
162
162
  end
163
163
 
164
- lambda { link._get }.must_raise Faraday::ClientError
165
- end
166
-
167
- it 'executes requests asynchronously using futuroscope' do
168
- link = Link.new('key', { 'href' => '/productions/1' }, entry_point)
169
-
170
- stub_request(entry_point.connection) do |stub|
171
- stub.get('http://api.example.org/productions/1') { [200, {}, nil] }
172
- end
173
-
174
- Futuroscope::Future.expects(:new).returns(stub(body: nil))
175
-
176
- link._get
177
- end
178
-
179
- describe 'when entry_point.options is set to { async: false }' do
180
- it 'executes requests synchronously without futuroscope' do
181
- entry_point.options = { async: false }
182
-
183
- link = Link.new('key', { 'href' => '/productions/1' }, entry_point)
184
-
185
- stub_request(entry_point.connection) do |stub|
186
- stub.get('http://api.example.org/productions/1') { [200, {}, nil] }
187
- end
188
-
189
- Futuroscope::Future.expects(:new).never
190
-
191
- link._get
192
- end
164
+ _(-> { link._get }).must_raise Faraday::ClientError
193
165
  end
194
166
  end
195
167
 
@@ -201,35 +173,7 @@ module Hyperclient
201
173
  stub.options('http://api.example.org/productions/1') { [200, {}, nil] }
202
174
  end
203
175
 
204
- link._options.must_be_kind_of Resource
205
- end
206
-
207
- it 'executes requests asynchronously using futuroscope' do
208
- link = Link.new('key', { 'href' => '/productions/1' }, entry_point)
209
-
210
- stub_request(entry_point.connection) do |stub|
211
- stub.options('http://api.example.org/productions/1') { [200, {}, nil] }
212
- end
213
-
214
- Futuroscope::Future.expects(:new).returns(stub(body: nil))
215
-
216
- link._options
217
- end
218
-
219
- describe 'when entry_point.options is set to { async: false }' do
220
- it 'executes requests synchronously without futuroscope' do
221
- entry_point.options = { async: false }
222
-
223
- link = Link.new('key', { 'href' => '/productions/1' }, entry_point)
224
-
225
- stub_request(entry_point.connection) do |stub|
226
- stub.options('http://api.example.org/productions/1') { [200, {}, nil] }
227
- end
228
-
229
- Futuroscope::Future.expects(:new).never
230
-
231
- link._options
232
- end
176
+ _(link._options).must_be_kind_of Resource
233
177
  end
234
178
  end
235
179
 
@@ -241,35 +185,7 @@ module Hyperclient
241
185
  stub.head('http://api.example.org/productions/1') { [200, {}, nil] }
242
186
  end
243
187
 
244
- link._head.must_be_kind_of Resource
245
- end
246
-
247
- it 'executes requests asynchronously using futuroscope' do
248
- link = Link.new('key', { 'href' => '/productions/1' }, entry_point)
249
-
250
- stub_request(entry_point.connection) do |stub|
251
- stub.head('http://api.example.org/productions/1') { [200, {}, nil] }
252
- end
253
-
254
- Futuroscope::Future.expects(:new).returns(stub(body: nil))
255
-
256
- link._head
257
- end
258
-
259
- describe 'when entry_point.options is set to { async: false }' do
260
- it 'executes requests synchronously without futuroscope' do
261
- entry_point.options = { async: false }
262
-
263
- link = Link.new('key', { 'href' => '/productions/1' }, entry_point)
264
-
265
- stub_request(entry_point.connection) do |stub|
266
- stub.head('http://api.example.org/productions/1') { [200, {}, nil] }
267
- end
268
-
269
- Futuroscope::Future.expects(:new).never
270
-
271
- link._head
272
- end
188
+ _(link._head).must_be_kind_of Resource
273
189
  end
274
190
  end
275
191
 
@@ -281,35 +197,7 @@ module Hyperclient
281
197
  stub.delete('http://api.example.org/productions/1') { [200, {}, nil] }
282
198
  end
283
199
 
284
- link._delete.must_be_kind_of Resource
285
- end
286
-
287
- it 'executes requests asynchronously using futuroscope' do
288
- link = Link.new('key', { 'href' => '/productions/1' }, entry_point)
289
-
290
- stub_request(entry_point.connection) do |stub|
291
- stub.delete('http://api.example.org/productions/1') { [200, {}, nil] }
292
- end
293
-
294
- Futuroscope::Future.expects(:new).returns(stub(body: nil))
295
-
296
- link._delete
297
- end
298
-
299
- describe 'when entry_point.options is set to { async: false }' do
300
- it 'executes requests synchronously without futuroscope' do
301
- entry_point.options = { async: false }
302
-
303
- link = Link.new('key', { 'href' => '/productions/1' }, entry_point)
304
-
305
- stub_request(entry_point.connection) do |stub|
306
- stub.delete('http://api.example.org/productions/1') { [200, {}, nil] }
307
- end
308
-
309
- Futuroscope::Future.expects(:new).never
310
-
311
- link._delete
312
- end
200
+ _(link._delete).must_be_kind_of Resource
313
201
  end
314
202
  end
315
203
 
@@ -321,7 +209,7 @@ module Hyperclient
321
209
  stub.post('http://api.example.org/productions/1') { [200, {}, nil] }
322
210
  end
323
211
 
324
- link._post('foo' => 'bar').must_be_kind_of Resource
212
+ _(link._post('foo' => 'bar')).must_be_kind_of Resource
325
213
  end
326
214
 
327
215
  it 'defaults params to an empty hash' do
@@ -329,35 +217,7 @@ module Hyperclient
329
217
  stub.post('http://api.example.org/productions/1') { [200, {}, nil] }
330
218
  end
331
219
 
332
- link._post.must_be_kind_of Resource
333
- end
334
-
335
- it 'executes requests asynchronously using futuroscope' do
336
- link = Link.new('key', { 'href' => '/productions/1' }, entry_point)
337
-
338
- stub_request(entry_point.connection) do |stub|
339
- stub.post('http://api.example.org/productions/1') { [200, {}, nil] }
340
- end
341
-
342
- Futuroscope::Future.expects(:new).returns(stub(body: nil))
343
-
344
- link._post
345
- end
346
-
347
- describe 'when entry_point.options is set to { async: false }' do
348
- it 'executes requests synchronously without futuroscope' do
349
- entry_point.options = { async: false }
350
-
351
- link = Link.new('key', { 'href' => '/productions/1' }, entry_point)
352
-
353
- stub_request(entry_point.connection) do |stub|
354
- stub.post('http://api.example.org/productions/1') { [200, {}, nil] }
355
- end
356
-
357
- Futuroscope::Future.expects(:new).never
358
-
359
- link._post
360
- end
220
+ _(link._post).must_be_kind_of Resource
361
221
  end
362
222
  end
363
223
 
@@ -369,7 +229,7 @@ module Hyperclient
369
229
  stub.put('http://api.example.org/productions/1', '{"foo":"bar"}') { [200, {}, nil] }
370
230
  end
371
231
 
372
- link._put('foo' => 'bar').must_be_kind_of Resource
232
+ _(link._put('foo' => 'bar')).must_be_kind_of Resource
373
233
  end
374
234
 
375
235
  it 'defaults params to an empty hash' do
@@ -377,35 +237,7 @@ module Hyperclient
377
237
  stub.put('http://api.example.org/productions/1') { [200, {}, nil] }
378
238
  end
379
239
 
380
- link._put.must_be_kind_of Resource
381
- end
382
-
383
- it 'executes requests asynchronously using futuroscope' do
384
- link = Link.new('key', { 'href' => '/productions/1' }, entry_point)
385
-
386
- stub_request(entry_point.connection) do |stub|
387
- stub.put('http://api.example.org/productions/1') { [200, {}, nil] }
388
- end
389
-
390
- Futuroscope::Future.expects(:new).returns(stub(body: nil))
391
-
392
- link._put
393
- end
394
-
395
- describe 'when entry_point.options is set to { async: false }' do
396
- it 'executes requests synchronously without futuroscope' do
397
- entry_point.options = { async: false }
398
-
399
- link = Link.new('key', { 'href' => '/productions/1' }, entry_point)
400
-
401
- stub_request(entry_point.connection) do |stub|
402
- stub.put('http://api.example.org/productions/1') { [200, {}, nil] }
403
- end
404
-
405
- Futuroscope::Future.expects(:new).never
406
-
407
- link._put
408
- end
240
+ _(link._put).must_be_kind_of Resource
409
241
  end
410
242
  end
411
243
 
@@ -417,7 +249,7 @@ module Hyperclient
417
249
  stub.patch('http://api.example.org/productions/1', '{"foo":"bar"}') { [200, {}, nil] }
418
250
  end
419
251
 
420
- link._patch('foo' => 'bar').must_be_kind_of Resource
252
+ _(link._patch('foo' => 'bar')).must_be_kind_of Resource
421
253
  end
422
254
 
423
255
  it 'defaults params to an empty hash' do
@@ -425,35 +257,7 @@ module Hyperclient
425
257
  stub.patch('http://api.example.org/productions/1') { [200, {}, nil] }
426
258
  end
427
259
 
428
- link._patch.must_be_kind_of Resource
429
- end
430
-
431
- it 'executes requests asynchronously using futuroscope' do
432
- link = Link.new('key', { 'href' => '/productions/1' }, entry_point)
433
-
434
- stub_request(entry_point.connection) do |stub|
435
- stub.patch('http://api.example.org/productions/1') { [200, {}, nil] }
436
- end
437
-
438
- Futuroscope::Future.expects(:new).returns(stub(body: nil))
439
-
440
- link._patch
441
- end
442
-
443
- describe 'when entry_point.options is set to { async: false }' do
444
- it 'executes requests synchronously without futuroscope' do
445
- entry_point.options = { async: false }
446
-
447
- link = Link.new('key', { 'href' => '/productions/1' }, entry_point)
448
-
449
- stub_request(entry_point.connection) do |stub|
450
- stub.patch('http://api.example.org/productions/1') { [200, {}, nil] }
451
- end
452
-
453
- Futuroscope::Future.expects(:new).never
454
-
455
- link._patch
456
- end
260
+ _(link._patch).must_be_kind_of Resource
457
261
  end
458
262
  end
459
263
 
@@ -461,8 +265,8 @@ module Hyperclient
461
265
  it 'outputs a custom-friendly output' do
462
266
  link = Link.new('key', { 'href' => '/productions/1' }, 'foo')
463
267
 
464
- link.inspect.must_include 'Link'
465
- link.inspect.must_include '"href"=>"/productions/1"'
268
+ _(link.inspect).must_include 'Link'
269
+ _(link.inspect).must_include '"href"=>"/productions/1"'
466
270
  end
467
271
  end
468
272
 
@@ -475,8 +279,18 @@ module Hyperclient
475
279
  stub.get('http://api.example.org/orders') { [200, {}, { '_embedded' => { 'orders' => [{ 'id' => 1 }] } }] }
476
280
  end
477
281
 
478
- resource.orders._embedded.orders.first.id.must_equal 1
479
- resource.orders.first.id.must_equal 1
282
+ _(resource.orders._embedded.orders.first.id).must_equal 1
283
+ _(resource.orders.first.id).must_equal 1
284
+ end
285
+
286
+ it 'can handle false values in the response' do
287
+ resource = Resource.new({ '_links' => { 'orders' => { 'href' => '/orders' } } }, entry_point)
288
+
289
+ stub_request(entry_point.connection) do |stub|
290
+ stub.get('http://api.example.org/orders') { [200, {}, { 'any' => false }] }
291
+ end
292
+
293
+ _(resource.orders.any).must_equal false
480
294
  end
481
295
 
482
296
  it "doesn't delegate when link key doesn't match" do
@@ -486,8 +300,8 @@ module Hyperclient
486
300
  stub.get('http://api.example.org/orders') { [200, {}, { '_embedded' => { 'orders' => [{ 'id' => 1 }] } }] }
487
301
  end
488
302
 
489
- resource.foos._embedded.orders.first.id.must_equal 1
490
- resource.foos.first.must_equal nil
303
+ _(resource.foos._embedded.orders.first.id).must_equal 1
304
+ _(resource.foos.first).must_be_nil
491
305
  end
492
306
 
493
307
  it 'backtracks when navigating links' do
@@ -497,7 +311,7 @@ module Hyperclient
497
311
  stub.get('http://api.example.org/page2') { [200, {}, { '_links' => { 'next' => { 'href' => 'http://api.example.org/page3' } } }] }
498
312
  end
499
313
 
500
- resource.next._links.next._url.must_equal 'http://api.example.org/page3'
314
+ _(resource.next._links.next._url).must_equal 'http://api.example.org/page3'
501
315
  end
502
316
  end
503
317
 
@@ -521,18 +335,18 @@ module Hyperclient
521
335
  end
522
336
 
523
337
  it 'raises an error when the method does not exist in the resource' do
524
- lambda { link.this_method_does_not_exist }.must_raise NoMethodError
338
+ _(-> { link.this_method_does_not_exist }).must_raise NoMethodError
525
339
  end
526
340
 
527
341
  it 'responds to missing methods' do
528
342
  resource.expects(:respond_to?).with('orders').returns(false)
529
343
  resource.expects(:respond_to?).with('embedded').returns(true)
530
- link.respond_to?(:embedded).must_equal true
344
+ _(link.respond_to?(:embedded)).must_equal true
531
345
  end
532
346
 
533
347
  it 'does not delegate to_ary to resource' do
534
348
  resource.expects(:to_ary).never
535
- [[link, link]].flatten.must_equal [link, link]
349
+ _([[link, link]].flatten).must_equal [link, link]
536
350
  end
537
351
  end
538
352
  end