jsonapi-resources 0.1.1 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -27,11 +27,6 @@ class RoutesTest < ActionDispatch::IntegrationTest
27
27
  {controller: 'posts', action: 'destroy_association', post_id: '1', association: 'author'})
28
28
  end
29
29
 
30
- def test_routing_posts_links_author_create
31
- assert_routing({path: '/posts/1/links/author', method: :post},
32
- {controller: 'posts', action: 'create_association', post_id: '1', association: 'author'})
33
- end
34
-
35
30
  def test_routing_posts_links_author_update
36
31
  assert_routing({path: '/posts/1/links/author', method: :put},
37
32
  {controller: 'posts', action: 'update_association', post_id: '1', association: 'author'})
data/test/test_helper.rb CHANGED
@@ -36,12 +36,14 @@ class TestApp < Rails::Application
36
36
 
37
37
  #Raise errors on unsupported parameters
38
38
  config.action_controller.action_on_unpermitted_parameters = :raise
39
+
40
+ config.active_record.schema_format = :none
39
41
  end
40
42
 
41
43
  TestApp.initialize!
42
44
 
43
45
  require File.expand_path('../fixtures/active_record', __FILE__)
44
-
46
+ JSONAPI.configuration.route_format = :underscored_route
45
47
  TestApp.routes.draw do
46
48
  jsonapi_resources :authors
47
49
  jsonapi_resources :people
@@ -76,10 +78,19 @@ TestApp.routes.draw do
76
78
  jsonapi_resources :likes
77
79
  end
78
80
 
81
+ JSONAPI.configuration.route_format = :underscored_route
79
82
  namespace :v2 do
80
- jsonapi_resources :authors
81
- jsonapi_resources :posts
83
+ jsonapi_resources :authors do
84
+ end
85
+
86
+ jsonapi_resources :posts do
87
+ jsonapi_link :author, except: [:destroy]
88
+ end
89
+
82
90
  jsonapi_resource :preferences
91
+
92
+ jsonapi_resources :books
93
+ jsonapi_resources :book_comments
83
94
  end
84
95
 
85
96
  namespace :v3 do
@@ -95,15 +106,28 @@ TestApp.routes.draw do
95
106
 
96
107
  JSONAPI.configuration.route_format = :camelized_route
97
108
  namespace :v4 do
98
- jsonapi_resources :posts
99
- jsonapi_resources :expense_entries
100
- jsonapi_resources :iso_currencies
109
+ jsonapi_resources :posts do
110
+ end
111
+
112
+ jsonapi_resources :expense_entries do
113
+ jsonapi_link :iso_currency
114
+ jsonapi_related_resource :iso_currency
115
+ end
116
+
117
+ jsonapi_resources :iso_currencies do
118
+ end
101
119
  end
120
+
102
121
  JSONAPI.configuration.route_format = :dasherized_route
103
122
  namespace :v5 do
104
- jsonapi_resources :posts
123
+ jsonapi_resources :posts do
124
+ end
125
+
105
126
  jsonapi_resources :expense_entries
106
127
  jsonapi_resources :iso_currencies
128
+
129
+ jsonapi_resources :employees
130
+
107
131
  end
108
132
  JSONAPI.configuration.route_format = :underscored_route
109
133
  end
@@ -113,7 +113,6 @@ class OperationsProcessorTest < MiniTest::Unit::TestCase
113
113
  planetoid = PlanetType.find(2)
114
114
  assert_equal(saturn.planet_type_id, planetoid.id)
115
115
 
116
-
117
116
  operations = [
118
117
  JSONAPI::ReplaceHasOneAssociationOperation.new(PlanetResource, saturn.id, :planet_type, gas_giant.id)
119
118
  ]
@@ -129,6 +128,18 @@ class OperationsProcessorTest < MiniTest::Unit::TestCase
129
128
 
130
129
  saturn.reload
131
130
  assert_equal(saturn.planet_type_id, gas_giant.id)
131
+
132
+ # Reset
133
+ operations = [
134
+ JSONAPI::ReplaceHasOneAssociationOperation.new(PlanetResource, saturn.id, :planet_type, 5)
135
+ ]
136
+
137
+ request = JSONAPI::Request.new
138
+ request.operations = operations
139
+
140
+ results = op.process(request)
141
+ saturn.reload
142
+ assert_equal(saturn.planet_type_id, 5)
132
143
  end
133
144
 
134
145
  def test_create_has_many_association
@@ -162,6 +173,14 @@ class OperationsProcessorTest < MiniTest::Unit::TestCase
162
173
  assert_equal(betax.planet_type_id, gas_giant.id)
163
174
  assert_equal(betay.planet_type_id, gas_giant.id)
164
175
  assert_equal(betaz.planet_type_id, gas_giant.id)
176
+
177
+ # Reset
178
+ betax.planet_type_id = unknown.id
179
+ betay.planet_type_id = unknown.id
180
+ betaz.planet_type_id = unknown.id
181
+ betax.save!
182
+ betay.save!
183
+ betaz.save!
165
184
  end
166
185
 
167
186
  def test_replace_has_many_association
@@ -195,6 +214,14 @@ class OperationsProcessorTest < MiniTest::Unit::TestCase
195
214
  assert_equal(betax.planet_type_id, gas_giant.id)
196
215
  assert_equal(betay.planet_type_id, gas_giant.id)
197
216
  assert_equal(betaz.planet_type_id, gas_giant.id)
217
+
218
+ # Reset
219
+ betax.planet_type_id = unknown.id
220
+ betay.planet_type_id = unknown.id
221
+ betaz.planet_type_id = unknown.id
222
+ betax.save!
223
+ betay.save!
224
+ betaz.save!
198
225
  end
199
226
 
200
227
  def test_replace_attributes
@@ -76,4 +76,8 @@ class ResourceTest < MiniTest::Unit::TestCase
76
76
  ArticleResource.find_by_keys([1, 3], context: author).model
77
77
  end
78
78
  end
79
+
80
+ def test_updateable_fields_does_not_include_id
81
+ assert(!CatResource.updateable_fields.include?(:id))
82
+ end
79
83
  end
@@ -21,311 +21,574 @@ class SerializerTest < MiniTest::Unit::TestCase
21
21
 
22
22
  assert_hash_equals(
23
23
  {
24
- posts: {
24
+ data: {
25
+ type: 'posts',
25
26
  id: '1',
26
27
  title: 'New post',
27
28
  body: 'A body!!!',
28
29
  subject: 'New post',
29
30
  links: {
30
- section: nil,
31
- author: '1',
32
- tags: ['1', '2', '3'],
33
- comments: ['1', '2']
31
+ self: 'http://example.com/posts/1',
32
+ section: {
33
+ self: 'http://example.com/posts/1/links/section',
34
+ resource: 'http://example.com/posts/1/section',
35
+ type: 'sections',
36
+ id: nil
37
+ },
38
+ author: {
39
+ self: 'http://example.com/posts/1/links/author',
40
+ resource: 'http://example.com/posts/1/author',
41
+ type: 'people',
42
+ id: '1'
43
+ },
44
+ tags: {
45
+ self: 'http://example.com/posts/1/links/tags',
46
+ resource: 'http://example.com/posts/1/tags'
47
+ },
48
+ comments: {
49
+ self: 'http://example.com/posts/1/links/comments',
50
+ resource: 'http://example.com/posts/1/comments'
51
+ }
34
52
  }
35
53
  }
36
54
  },
37
- JSONAPI::ResourceSerializer.new(PostResource).serialize_to_hash(
38
- PostResource.new(@post)))
55
+ JSONAPI::ResourceSerializer.new(PostResource,
56
+ base_url: 'http://example.com').serialize_to_hash(PostResource.new(@post))
57
+ )
39
58
  end
40
59
 
41
60
  def test_serializer_namespaced_resource
42
61
  assert_hash_equals(
43
62
  {
44
- posts: {
63
+ data: {
64
+ type: 'posts',
45
65
  id: '1',
46
66
  title: 'New post',
47
67
  body: 'A body!!!',
48
68
  subject: 'New post',
49
69
  links: {
50
- section: nil,
51
- writer: '1',
52
- comments: ['1', '2']
70
+ self: 'http://example.com/api/v1/posts/1',
71
+ section: {
72
+ self: 'http://example.com/api/v1/posts/1/links/section',
73
+ resource: 'http://example.com/api/v1/posts/1/section',
74
+ type: 'sections',
75
+ id: nil
76
+ },
77
+ writer: {
78
+ self: 'http://example.com/api/v1/posts/1/links/writer',
79
+ resource: 'http://example.com/api/v1/posts/1/writer',
80
+ type: 'writers',
81
+ id: '1'
82
+ },
83
+ comments: {
84
+ self: 'http://example.com/api/v1/posts/1/links/comments',
85
+ resource: 'http://example.com/api/v1/posts/1/comments'
86
+ }
53
87
  }
54
88
  }
55
89
  },
56
- JSONAPI::ResourceSerializer.new(Api::V1::PostResource).serialize_to_hash(
57
- Api::V1::PostResource.new(@post)))
90
+ JSONAPI::ResourceSerializer.new(Api::V1::PostResource,
91
+ base_url: 'http://example.com').serialize_to_hash(
92
+ Api::V1::PostResource.new(@post))
93
+ )
58
94
  end
59
95
 
60
96
  def test_serializer_limited_fieldset
61
97
 
62
98
  assert_hash_equals(
63
99
  {
64
- posts: {
100
+ data: {
101
+ type: 'posts',
65
102
  id: '1',
66
103
  title: 'New post',
67
104
  links: {
68
- author: '1'
105
+ self: '/posts/1',
106
+ author: {
107
+ self: '/posts/1/links/author',
108
+ resource: '/posts/1/author',
109
+ type: 'people',
110
+ id: '1'
111
+ }
69
112
  }
70
113
  }
71
114
  },
72
- JSONAPI::ResourceSerializer.new(PostResource).serialize_to_hash(
73
- PostResource.new(@post),
74
- fields: {posts: [:id, :title, :author]}))
115
+ JSONAPI::ResourceSerializer.new(PostResource,
116
+ fields: {posts: [:id, :title, :author]}).serialize_to_hash(PostResource.new(@post))
117
+ )
75
118
  end
76
119
 
77
120
  def test_serializer_include
78
121
 
79
122
  assert_hash_equals(
80
123
  {
81
- posts: {
124
+ data: {
125
+ type: 'posts',
82
126
  id: '1',
83
127
  title: 'New post',
84
128
  body: 'A body!!!',
85
129
  subject: 'New post',
86
130
  links: {
87
- author: '1',
88
- tags: ['1', '2', '3'],
89
- comments: ['1', '2'],
90
- section: nil
131
+ self: '/posts/1',
132
+ section: {
133
+ self: '/posts/1/links/section',
134
+ resource: '/posts/1/section',
135
+ type: 'sections',
136
+ id: nil
137
+ },
138
+ author: {
139
+ self: '/posts/1/links/author',
140
+ resource: '/posts/1/author',
141
+ type: 'people',
142
+ id: '1'
143
+ },
144
+ tags: {
145
+ self: '/posts/1/links/tags',
146
+ resource: '/posts/1/tags'
147
+ },
148
+ comments: {
149
+ self: '/posts/1/links/comments',
150
+ resource: '/posts/1/comments'
151
+ }
91
152
  }
92
153
  },
93
- linked: {
94
- people: [{
95
- id: '1',
96
- name: 'Joe Author',
97
- email: 'joe@xyz.fake',
98
- dateJoined: '2013-08-07 16:25:00 -0400',
99
- links: {
100
- comments: ['1'],
101
- posts: ['1', '2', '11']
102
- }
103
- }]
104
- }
154
+ linked: [
155
+ {
156
+ type: 'people',
157
+ id: '1',
158
+ name: 'Joe Author',
159
+ email: 'joe@xyz.fake',
160
+ dateJoined: '2013-08-07 16:25:00 -0400',
161
+ links: {
162
+ self: '/people/1',
163
+ comments: {
164
+ self: '/people/1/links/comments',
165
+ resource: '/people/1/comments'
166
+ },
167
+ posts: {
168
+ self: '/people/1/links/posts',
169
+ resource: '/people/1/posts'
170
+ }
171
+ }
172
+ }
173
+ ]
105
174
  },
106
- JSONAPI::ResourceSerializer.new(PostResource).serialize_to_hash(
107
- PostResource.new(@post), include: [:author]))
175
+ JSONAPI::ResourceSerializer.new(PostResource, include: [:author]).serialize_to_hash(
176
+ PostResource.new(@post)))
108
177
  end
109
178
 
110
179
  def test_serializer_key_format
111
180
 
112
181
  assert_hash_equals(
113
182
  {
114
- posts: {
183
+ data: {
184
+ type: 'posts',
115
185
  id: '1',
116
186
  title: 'New post',
117
187
  body: 'A body!!!',
118
188
  subject: 'New post',
119
189
  links: {
120
- author: '1',
121
- tags: ['1', '2', '3'],
122
- comments: ['1', '2'],
123
- section: nil
190
+ self: '/posts/1',
191
+ section: {
192
+ self: '/posts/1/links/section',
193
+ resource: '/posts/1/section',
194
+ type: 'sections',
195
+ id: nil
196
+ },
197
+ author: {
198
+ self: '/posts/1/links/author',
199
+ resource: '/posts/1/author',
200
+ type: 'people',
201
+ id: '1'
202
+ },
203
+ tags: {
204
+ self: '/posts/1/links/tags',
205
+ resource: '/posts/1/tags'
206
+ },
207
+ comments: {
208
+ self: '/posts/1/links/comments',
209
+ resource: '/posts/1/comments'
210
+ }
124
211
  }
125
212
  },
126
- linked: {
127
- people: [{
128
- id: '1',
129
- name: 'Joe Author',
130
- email: 'joe@xyz.fake',
131
- date_joined: '2013-08-07 16:25:00 -0400',
132
- links: {
133
- comments: ['1'],
134
- posts: ['1', '2', '11']
135
- }
136
- }]
137
- }
213
+ linked: [
214
+ {
215
+ type: 'people',
216
+ id: '1',
217
+ name: 'Joe Author',
218
+ email: 'joe@xyz.fake',
219
+ date_joined: '2013-08-07 16:25:00 -0400',
220
+ links: {
221
+ self: '/people/1',
222
+ comments: {
223
+ self: '/people/1/links/comments',
224
+ resource: '/people/1/comments'
225
+ },
226
+ posts: {
227
+ self: '/people/1/links/posts',
228
+ resource: '/people/1/posts'
229
+ }
230
+ }
231
+ }
232
+ ]
138
233
  },
139
- JSONAPI::ResourceSerializer.new(PostResource).serialize_to_hash(
140
- PostResource.new(@post),
141
- include: [:author],
142
- key_formatter: UnderscoredKeyFormatter))
234
+ JSONAPI::ResourceSerializer.new(PostResource,
235
+ include: [:author],
236
+ key_formatter: UnderscoredKeyFormatter).serialize_to_hash(PostResource.new(@post))
237
+ )
143
238
  end
144
239
 
145
240
  def test_serializer_include_sub_objects
146
241
 
147
242
  assert_hash_equals(
148
243
  {
149
- posts: {
244
+ data: {
245
+ type: 'posts',
150
246
  id: '1',
151
247
  title: 'New post',
152
248
  body: 'A body!!!',
153
249
  subject: 'New post',
154
250
  links: {
155
- author: '1',
156
- tags: ['1', '2', '3'],
157
- comments: ['1', '2'],
158
- section: nil
251
+ self: '/posts/1',
252
+ section: {
253
+ self: '/posts/1/links/section',
254
+ resource: '/posts/1/section',
255
+ type: 'sections',
256
+ id: nil
257
+ },
258
+ author: {
259
+ self: '/posts/1/links/author',
260
+ resource: '/posts/1/author',
261
+ type: 'people',
262
+ id: '1'
263
+ },
264
+ tags: {
265
+ self: '/posts/1/links/tags',
266
+ resource: '/posts/1/tags'
267
+ },
268
+ comments: {
269
+ self: '/posts/1/links/comments',
270
+ resource: '/posts/1/comments',
271
+ type: 'comments',
272
+ ids: ['1', '2']
273
+ }
159
274
  }
160
275
  },
161
- linked: {
162
- tags: [
276
+ linked: [
163
277
  {
278
+ type: 'tags',
164
279
  id: '1',
165
280
  name: 'short',
166
281
  links: {
167
- posts: :not_nil
282
+ self: '/tags/1',
283
+ posts: {
284
+ self: '/tags/1/links/posts',
285
+ resource: '/tags/1/posts'
286
+ }
168
287
  }
169
288
  },
170
289
  {
290
+ type: 'tags',
171
291
  id: '2',
172
292
  name: 'whiny',
173
293
  links: {
174
- posts: :not_nil
294
+ self: '/tags/2',
295
+ posts: {
296
+ self: '/tags/2/links/posts',
297
+ resource: '/tags/2/posts'
298
+ }
175
299
  }
176
300
  },
177
301
  {
302
+ type: 'tags',
178
303
  id: '4',
179
304
  name: 'happy',
180
305
  links: {
181
- posts: :not_nil
306
+ self: '/tags/4',
307
+ posts: {
308
+ self: '/tags/4/links/posts',
309
+ resource: '/tags/4/posts',
310
+ }
182
311
  }
183
- }
184
- ],
185
- comments: [
312
+ },
186
313
  {
314
+ type: 'comments',
187
315
  id: '1',
188
316
  body: 'what a dumb post',
189
317
  links: {
190
- author: '1',
191
- post: '1',
192
- tags: ['2', '1']
318
+ self: '/comments/1',
319
+ author: {
320
+ self: '/comments/1/links/author',
321
+ resource: '/comments/1/author',
322
+ type: 'people',
323
+ id: '1'
324
+ },
325
+ post: {
326
+ self: '/comments/1/links/post',
327
+ resource: '/comments/1/post',
328
+ type: 'posts',
329
+ id: '1'
330
+ },
331
+ tags: {
332
+ self: '/comments/1/links/tags',
333
+ resource: '/comments/1/tags',
334
+ type: 'tags',
335
+ ids: ['1', '2']
336
+ }
193
337
  }
194
338
  },
195
339
  {
340
+ type: 'comments',
196
341
  id: '2',
197
342
  body: 'i liked it',
198
343
  links: {
199
- author: '2',
200
- post: '1',
201
- tags: ['4', '1']
344
+ self: '/comments/2',
345
+ author: {
346
+ self: '/comments/2/links/author',
347
+ resource: '/comments/2/author',
348
+ type: 'people',
349
+ id: '2'
350
+ },
351
+ post: {
352
+ self: '/comments/2/links/post',
353
+ resource: '/comments/2/post',
354
+ type: 'posts',
355
+ id: '1'
356
+ },
357
+ tags: {
358
+ self: '/comments/2/links/tags',
359
+ resource: '/comments/2/tags',
360
+ type: 'tags',
361
+ ids: ['4', '1']
362
+ }
202
363
  }
203
364
  }
204
365
  ]
205
- }
206
366
  },
207
- JSONAPI::ResourceSerializer.new(PostResource).serialize_to_hash(
208
- PostResource.new(@post), include: [:comments, 'comments.tags']))
367
+ JSONAPI::ResourceSerializer.new(PostResource,
368
+ include: [:comments, 'comments.tags']).serialize_to_hash(PostResource.new(@post))
369
+ )
209
370
  end
210
371
 
211
372
  def test_serializer_include_has_many_sub_objects_only
212
373
 
213
374
  assert_hash_equals(
214
375
  {
215
- posts: {
376
+ data: {
377
+ type: 'posts',
216
378
  id: '1',
217
379
  title: 'New post',
218
380
  body: 'A body!!!',
219
381
  subject: 'New post',
220
382
  links: {
221
- author: '1',
222
- tags: ['1', '2', '3'],
223
- comments: ['1', '2'],
224
- section: nil
383
+ self: '/posts/1',
384
+ section: {
385
+ self: '/posts/1/links/section',
386
+ resource: '/posts/1/section',
387
+ type: 'sections',
388
+ id: nil
389
+ },
390
+ author: {
391
+ self: '/posts/1/links/author',
392
+ resource: '/posts/1/author',
393
+ type: 'people',
394
+ id: '1'
395
+ },
396
+ tags: {
397
+ self: '/posts/1/links/tags',
398
+ resource: '/posts/1/tags'
399
+ },
400
+ comments: {
401
+ self: '/posts/1/links/comments',
402
+ resource: '/posts/1/comments'
403
+ }
225
404
  }
226
405
  },
227
- linked: {
228
- tags: [
229
- {
230
- id: '1',
231
- name: 'short',
232
- links: {
233
- posts: :not_nil
406
+ linked: [
407
+ {
408
+ type: 'tags',
409
+ id: '1',
410
+ name: 'short',
411
+ links: {
412
+ self: '/tags/1',
413
+ posts: {
414
+ self: '/tags/1/links/posts',
415
+ resource: '/tags/1/posts'
234
416
  }
235
- },
236
- {
237
- id: '2',
238
- name: 'whiny',
239
- links: {
240
- posts: :not_nil
417
+ }
418
+ },
419
+ {
420
+ type: 'tags',
421
+ id: '2',
422
+ name: 'whiny',
423
+ links: {
424
+ self: '/tags/2',
425
+ posts: {
426
+ self: '/tags/2/links/posts',
427
+ resource: '/tags/2/posts'
241
428
  }
242
- },
243
- {
244
- id: '4',
245
- name: 'happy',
246
- links: {
247
- posts: :not_nil
429
+ }
430
+ },
431
+ {
432
+ type: 'tags',
433
+ id: '4',
434
+ name: 'happy',
435
+ links: {
436
+ self: '/tags/4',
437
+ posts: {
438
+ self: '/tags/4/links/posts',
439
+ resource: '/tags/4/posts',
248
440
  }
249
441
  }
250
- ]
251
- }
442
+ }
443
+ ]
252
444
  },
253
- JSONAPI::ResourceSerializer.new(PostResource).serialize_to_hash(
254
- PostResource.new(@post), include: ['comments.tags']))
445
+ JSONAPI::ResourceSerializer.new(PostResource, include: ['comments.tags']).serialize_to_hash(PostResource.new(@post))
446
+ )
255
447
  end
256
448
 
257
449
  def test_serializer_include_has_one_sub_objects_only
258
450
 
259
451
  assert_hash_equals(
260
452
  {
261
- posts: {
453
+ data: {
454
+ type: 'posts',
262
455
  id: '1',
263
456
  title: 'New post',
264
457
  body: 'A body!!!',
265
458
  subject: 'New post',
266
459
  links: {
267
- author: '1',
268
- tags: ['1', '2', '3'],
269
- comments: ['1', '2'],
270
- section: nil
460
+ self: '/posts/1',
461
+ section: {
462
+ self: '/posts/1/links/section',
463
+ resource: '/posts/1/section',
464
+ type: 'sections',
465
+ id: nil
466
+ },
467
+ author: {
468
+ self: '/posts/1/links/author',
469
+ resource: '/posts/1/author',
470
+ type: 'people',
471
+ id: '1'
472
+ },
473
+ tags: {
474
+ self: '/posts/1/links/tags',
475
+ resource: '/posts/1/tags'
476
+ },
477
+ comments: {
478
+ self: '/posts/1/links/comments',
479
+ resource: '/posts/1/comments'
480
+ }
271
481
  }
272
482
  },
273
- linked: {
274
- comments: [
275
- {
276
- id: '1',
277
- body: 'what a dumb post',
278
- links: {
279
- author: '1',
280
- post: '1',
281
- tags: ['2', '1']
483
+ linked: [
484
+ {
485
+ type: 'comments',
486
+ id: '1',
487
+ body: 'what a dumb post',
488
+ links: {
489
+ self: '/comments/1',
490
+ author: {
491
+ self: '/comments/1/links/author',
492
+ resource: '/comments/1/author',
493
+ type: 'people',
494
+ id: '1'
495
+ },
496
+ post: {
497
+ self: '/comments/1/links/post',
498
+ resource: '/comments/1/post',
499
+ type: 'posts',
500
+ id: '1'
501
+ },
502
+ tags: {
503
+ self: '/comments/1/links/tags',
504
+ resource: '/comments/1/tags'
282
505
  }
283
506
  }
284
- ]
285
- }
507
+ }
508
+ ]
286
509
  },
287
- JSONAPI::ResourceSerializer.new(PostResource).serialize_to_hash(
288
- PostResource.new(@post), include: ['author.comments']))
510
+ JSONAPI::ResourceSerializer.new(PostResource,
511
+ include: ['author.comments']).serialize_to_hash(PostResource.new(@post))
512
+ )
289
513
  end
290
514
 
291
515
  def test_serializer_different_foreign_key
292
516
 
293
517
  assert_hash_equals(
294
518
  {
295
- people: {
519
+ data: {
520
+ type: 'people',
296
521
  id: '2',
297
522
  name: 'Fred Reader',
298
523
  email: 'fred@xyz.fake',
299
524
  dateJoined: '2013-10-31 16:25:00 -0400',
300
525
  links: {
301
- posts: [],
302
- comments: ['2', '3']
526
+ self: '/people/2',
527
+ posts: {
528
+ self: '/people/2/links/posts',
529
+ resource: '/people/2/posts'
530
+ },
531
+ comments: {
532
+ self: '/people/2/links/comments',
533
+ resource: '/people/2/comments',
534
+ type: 'comments',
535
+ ids: ['2', '3']
536
+ }
303
537
  }
304
538
  },
305
- linked: {
306
- comments: [{
307
- id: '2',
308
- body: 'i liked it',
309
- links: {
310
- author: '2',
311
- post: '1',
312
- tags: ['4', '1']
313
- }
314
- },
315
- {
316
- id: '3',
317
- body: 'Thanks man. Great post. But what is JR?',
318
- links: {
319
- author: '2',
320
- post: '2',
321
- tags: ['5']
322
- }
323
- }
324
- ]
325
- }
539
+ linked: [
540
+ {
541
+ type: 'comments',
542
+ id: '2',
543
+ body: 'i liked it',
544
+ links: {
545
+ self: '/comments/2',
546
+ author: {
547
+ self: '/comments/2/links/author',
548
+ resource: '/comments/2/author',
549
+ type: 'people',
550
+ id: '2'
551
+ },
552
+ post: {
553
+ self: '/comments/2/links/post',
554
+ resource: '/comments/2/post',
555
+ type: 'posts',
556
+ id: '1'
557
+ },
558
+ tags: {
559
+ self: '/comments/2/links/tags',
560
+ resource: '/comments/2/tags'
561
+ }
562
+ }
563
+ },
564
+ {
565
+ type: 'comments',
566
+ id: '3',
567
+ body: 'Thanks man. Great post. But what is JR?',
568
+ links: {
569
+ self: '/comments/3',
570
+ author: {
571
+ self: '/comments/3/links/author',
572
+ resource: '/comments/3/author',
573
+ type: 'people',
574
+ id: '2'
575
+ },
576
+ post: {
577
+ self: '/comments/3/links/post',
578
+ resource: '/comments/3/post',
579
+ type: 'posts',
580
+ id: '2'
581
+ },
582
+ tags: {
583
+ self: '/comments/3/links/tags',
584
+ resource: '/comments/3/tags'
585
+ }
586
+ }
587
+ }
588
+ ]
326
589
  },
327
- JSONAPI::ResourceSerializer.new(PersonResource).serialize_to_hash(
328
- PersonResource.new(@fred), include: ['comments']))
590
+ JSONAPI::ResourceSerializer.new(PersonResource, include: ['comments']).serialize_to_hash(PersonResource.new(@fred))
591
+ )
329
592
  end
330
593
 
331
594
  def test_serializer_array_of_resources
@@ -337,94 +600,204 @@ class SerializerTest < MiniTest::Unit::TestCase
337
600
 
338
601
  assert_hash_equals(
339
602
  {
340
- posts: [{
341
- id: '1',
342
- title: 'New post',
343
- body: 'A body!!!',
344
- subject: 'New post',
345
- links: {
346
- author: '1',
347
- tags: ['1', '2', '3'],
348
- comments: ['1', '2'],
349
- section: nil
350
- }
351
- },
352
- {
353
- id: '2',
354
- title: 'JR Solves your serialization woes!',
355
- body: 'Use JR',
356
- subject: 'JR Solves your serialization woes!',
357
- links: {
358
- author: '1',
359
- tags: ['5'],
360
- comments: ['3'],
361
- section: '3'
362
- }
363
- }],
364
- linked: {
365
- tags: [
366
- {
367
- id: '1',
368
- name: 'short',
369
- links: {
370
- posts: :not_nil
603
+ data: [
604
+ {
605
+ type: 'posts',
606
+ id: '1',
607
+ title: 'New post',
608
+ body: 'A body!!!',
609
+ subject: 'New post',
610
+ links: {
611
+ self: '/posts/1',
612
+ section: {
613
+ self: '/posts/1/links/section',
614
+ resource: '/posts/1/section',
615
+ type: 'sections',
616
+ id: nil
617
+ },
618
+ author: {
619
+ self: '/posts/1/links/author',
620
+ resource: '/posts/1/author',
621
+ type: 'people',
622
+ id: '1'
623
+ },
624
+ tags: {
625
+ self: '/posts/1/links/tags',
626
+ resource: '/posts/1/tags'
627
+ },
628
+ comments: {
629
+ self: '/posts/1/links/comments',
630
+ resource: '/posts/1/comments',
631
+ type: 'comments',
632
+ ids: ['1', '2']
371
633
  }
372
- },
373
- {
374
- id: '2',
375
- name: 'whiny',
376
- links: {
377
- posts: :not_nil
634
+ }
635
+ },
636
+ {
637
+ type: 'posts',
638
+ id: '2',
639
+ title: 'JR Solves your serialization woes!',
640
+ body: 'Use JR',
641
+ subject: 'JR Solves your serialization woes!',
642
+ links: {
643
+ self: '/posts/2',
644
+ section: {
645
+ self: '/posts/2/links/section',
646
+ resource: '/posts/2/section',
647
+ type: 'sections',
648
+ id: '3'
649
+ },
650
+ author: {
651
+ self: '/posts/2/links/author',
652
+ resource: '/posts/2/author',
653
+ type: 'people',
654
+ id: '1'
655
+ },
656
+ tags: {
657
+ self: '/posts/2/links/tags',
658
+ resource: '/posts/2/tags'
659
+ },
660
+ comments: {
661
+ self: '/posts/2/links/comments',
662
+ resource: '/posts/2/comments',
663
+ type: 'comments',
664
+ ids: ['3']
378
665
  }
379
- },
380
- {
381
- id: '4',
382
- name: 'happy',
383
- links: {
384
- posts: :not_nil
666
+ }
667
+ }
668
+ ],
669
+ linked: [
670
+ {
671
+ type: 'tags',
672
+ id: '1',
673
+ name: 'short',
674
+ links: {
675
+ self: '/tags/1',
676
+ posts: {
677
+ self: '/tags/1/links/posts',
678
+ resource: '/tags/1/posts'
385
679
  }
386
- },
387
- {
388
- id: '5',
389
- name: 'JR',
390
- links: {
391
- posts: ['2', '11']
680
+ }
681
+ },
682
+ {
683
+ type: 'tags',
684
+ id: '2',
685
+ name: 'whiny',
686
+ links: {
687
+ self: '/tags/2',
688
+ posts: {
689
+ self: '/tags/2/links/posts',
690
+ resource: '/tags/2/posts'
392
691
  }
393
692
  }
394
- ],
395
- comments: [
396
- {
397
- id: '1',
398
- body: 'what a dumb post',
399
- links: {
400
- author: '1',
401
- post: '1',
402
- tags: ['2', '1']
693
+ },
694
+ {
695
+ type: 'tags',
696
+ id: '4',
697
+ name: 'happy',
698
+ links: {
699
+ self: '/tags/4',
700
+ posts: {
701
+ self: '/tags/4/links/posts',
702
+ resource: '/tags/4/posts',
403
703
  }
404
- },
405
- {
406
- id: '2',
407
- body: 'i liked it',
408
- links: {
409
- author: '2',
410
- post: '1',
411
- tags: ['4', '1']
704
+ }
705
+ },
706
+ {
707
+ type: 'tags',
708
+ id: '5',
709
+ name: 'JR',
710
+ links: {
711
+ self: '/tags/5',
712
+ posts: {
713
+ self: '/tags/5/links/posts',
714
+ resource: '/tags/5/posts',
412
715
  }
413
- },
414
- {
415
- id: '3',
416
- body: 'Thanks man. Great post. But what is JR?',
417
- links: {
418
- author: '2',
419
- post: '2',
420
- tags: ['5']
716
+ }
717
+ },
718
+ {
719
+ type: 'comments',
720
+ id: '1',
721
+ body: 'what a dumb post',
722
+ links: {
723
+ self: '/comments/1',
724
+ author: {
725
+ self: '/comments/1/links/author',
726
+ resource: '/comments/1/author',
727
+ type: 'people',
728
+ id: '1'
729
+ },
730
+ post: {
731
+ self: '/comments/1/links/post',
732
+ resource: '/comments/1/post',
733
+ type: 'posts',
734
+ id: '1'
735
+ },
736
+ tags: {
737
+ self: '/comments/1/links/tags',
738
+ resource: '/comments/1/tags',
739
+ type: 'tags',
740
+ ids: ['1', '2']
421
741
  }
422
742
  }
423
- ]
424
- }
743
+ },
744
+ {
745
+ type: 'comments',
746
+ id: '2',
747
+ body: 'i liked it',
748
+ links: {
749
+ self: '/comments/2',
750
+ author: {
751
+ self: '/comments/2/links/author',
752
+ resource: '/comments/2/author',
753
+ type: 'people',
754
+ id: '2'
755
+ },
756
+ post: {
757
+ self: '/comments/2/links/post',
758
+ resource: '/comments/2/post',
759
+ type: 'posts',
760
+ id: '1'
761
+ },
762
+ tags: {
763
+ self: '/comments/2/links/tags',
764
+ resource: '/comments/2/tags',
765
+ type: 'tags',
766
+ ids: ['4', '1']
767
+ }
768
+ }
769
+ },
770
+ {
771
+ type: 'comments',
772
+ id: '3',
773
+ body: 'Thanks man. Great post. But what is JR?',
774
+ links: {
775
+ self: '/comments/3',
776
+ author: {
777
+ self: '/comments/3/links/author',
778
+ resource: '/comments/3/author',
779
+ type: 'people',
780
+ id: '2'
781
+ },
782
+ post: {
783
+ self: '/comments/3/links/post',
784
+ resource: '/comments/3/post',
785
+ type: 'posts',
786
+ id: '2'
787
+ },
788
+ tags: {
789
+ self: '/comments/3/links/tags',
790
+ resource: '/comments/3/tags',
791
+ type: 'tags',
792
+ ids: ['5']
793
+ }
794
+ }
795
+ }
796
+ ]
425
797
  },
426
- JSONAPI::ResourceSerializer.new(PostResource).serialize_to_hash(
427
- posts, include: ['comments', 'comments.tags']))
798
+ JSONAPI::ResourceSerializer.new(PostResource,
799
+ include: ['comments', 'comments.tags']).serialize_to_hash(posts)
800
+ )
428
801
  end
429
802
 
430
803
  def test_serializer_array_of_resources_limited_fields
@@ -436,120 +809,201 @@ class SerializerTest < MiniTest::Unit::TestCase
436
809
 
437
810
  assert_hash_equals(
438
811
  {
439
- posts: [{
440
- id: '1',
441
- title: 'New post',
442
- links: {
443
- author: '1'
444
- }
445
- },
446
- {
447
- id: '2',
448
- title: 'JR Solves your serialization woes!',
449
- links: {
450
- author: '1'
451
- }
452
- }],
453
- linked: {
454
- tags: [
455
- {
456
- name: 'short'
457
- },
458
- {
459
- name: 'whiny'
460
- },
461
- {
462
- name: 'happy'
463
- },
464
- {
465
- name: 'JR'
812
+ data: [
813
+ {
814
+ type: 'posts',
815
+ id: '1',
816
+ title: 'New post',
817
+ links: {
818
+ self: '/posts/1',
819
+ author: {
820
+ self: '/posts/1/links/author',
821
+ resource: '/posts/1/author',
822
+ type: 'people',
823
+ id: '1'
824
+ }
466
825
  }
467
- ],
468
- comments: [
469
- {
470
- id: '1',
471
- body: 'what a dumb post',
472
- links: {
473
- post: '1'
826
+ },
827
+ {
828
+ type: 'posts',
829
+ id: '2',
830
+ title: 'JR Solves your serialization woes!',
831
+ links: {
832
+ self: '/posts/2',
833
+ author: {
834
+ self: '/posts/2/links/author',
835
+ resource: '/posts/2/author',
836
+ type: 'people',
837
+ id: '1'
474
838
  }
475
- },
476
- {
477
- id: '2',
478
- body: 'i liked it',
479
- links: {
480
- post: '1'
839
+ }
840
+ }
841
+ ],
842
+ linked: [
843
+ {
844
+ type: 'posts',
845
+ id: '11',
846
+ title: 'JR How To',
847
+ links: {
848
+ self: '/posts/11',
849
+ author: {
850
+ self: '/posts/11/links/author',
851
+ resource: '/posts/11/author',
852
+ type: 'people',
853
+ id: '1'
481
854
  }
482
- },
483
- {
484
- id: '3',
485
- body: 'Thanks man. Great post. But what is JR?',
486
- links: {
487
- post: '2'
855
+ }
856
+ },
857
+ {
858
+ type: 'people',
859
+ id: '1',
860
+ email: 'joe@xyz.fake',
861
+ links: {
862
+ self: '/people/1',
863
+ comments: {
864
+ self: '/people/1/links/comments',
865
+ resource: '/people/1/comments'
488
866
  }
489
867
  }
490
- ],
491
- posts: [
492
- {
493
- id: '11',
494
- title: 'JR How To',
495
- links: {
496
- author: '1'
868
+ },
869
+ {
870
+ id: '1',
871
+ type: 'tags',
872
+ name: 'short',
873
+ links: {
874
+ self: '/tags/1'
875
+ }
876
+ },
877
+ {
878
+ id: '2',
879
+ type: 'tags',
880
+ name: 'whiny',
881
+ links: {
882
+ self: '/tags/2'
883
+ }
884
+ },
885
+ {
886
+ id: '4',
887
+ type: 'tags',
888
+ name: 'happy',
889
+ links: {
890
+ self: '/tags/4'
891
+ }
892
+ },
893
+ {
894
+ id: '5',
895
+ type: 'tags',
896
+ name: 'JR',
897
+ links: {
898
+ self: '/tags/5'
899
+ }
900
+ },
901
+ {
902
+ type: 'comments',
903
+ id: '1',
904
+ body: 'what a dumb post',
905
+ links: {
906
+ self: '/comments/1',
907
+ post: {
908
+ self: '/comments/1/links/post',
909
+ resource: '/comments/1/post',
910
+ type: 'posts',
911
+ id: '1'
497
912
  }
498
913
  }
499
- ],
500
- people: [
501
- {
502
- id: '1',
503
- email: 'joe@xyz.fake',
504
- links: {
505
- comments: ['1']
914
+ },
915
+ {
916
+ type: 'comments',
917
+ id: '2',
918
+ body: 'i liked it',
919
+ links: {
920
+ self: '/comments/2',
921
+ post: {
922
+ self: '/comments/2/links/post',
923
+ resource: '/comments/2/post',
924
+ type: 'posts',
925
+ id: '1'
506
926
  }
507
- }]
508
- }
927
+ }
928
+ },
929
+ {
930
+ type: 'comments',
931
+ id: '3',
932
+ body: 'Thanks man. Great post. But what is JR?',
933
+ links: {
934
+ self: '/comments/3',
935
+ post: {
936
+ self: '/comments/3/links/post',
937
+ resource: '/comments/3/post',
938
+ type: 'posts',
939
+ id: '2'
940
+ }
941
+ }
942
+ }
943
+ ]
509
944
  },
510
- JSONAPI::ResourceSerializer.new(PostResource).serialize_to_hash(
511
- posts,
512
- include: ['comments', 'author', 'comments.tags', 'author.posts'],
513
- fields: {
514
- people: [:id, :email, :comments],
515
- posts: [:id, :title, :author],
516
- tags: [:name],
517
- comments: [:id, :body, :post]
518
- }))
945
+ JSONAPI::ResourceSerializer.new(PostResource,
946
+ include: ['comments', 'author', 'comments.tags', 'author.posts'],
947
+ fields: {
948
+ people: [:id, :email, :comments],
949
+ posts: [:id, :title, :author],
950
+ tags: [:name],
951
+ comments: [:id, :body, :post]
952
+ }).serialize_to_hash(posts)
953
+ )
519
954
  end
520
955
 
521
956
  def test_serializer_camelized_with_value_formatters
522
957
  assert_hash_equals(
523
958
  {
524
- expenseEntries: {
959
+ data: {
960
+ type: 'expense_entries',
525
961
  id: '1',
526
962
  transactionDate: '04/15/2014',
527
963
  cost: 12.05,
528
964
  links: {
529
- isoCurrency: 'USD',
530
- employee: '3'
965
+ self: '/expense_entries/1',
966
+ isoCurrency: {
967
+ self: '/expense_entries/1/links/iso_currency',
968
+ resource: '/expense_entries/1/iso_currency',
969
+ type: 'iso_currencies',
970
+ id: 'USD'
971
+ },
972
+ employee: {
973
+ self: '/expense_entries/1/links/employee',
974
+ resource: '/expense_entries/1/employee',
975
+ type: 'people',
976
+ id: '3'
977
+ }
531
978
  }
532
979
  },
533
- linked: {
534
- isoCurrencies: [{
535
- id: 'USD',
536
- countryName: 'United States',
537
- name: 'United States Dollar',
538
- minorUnit: 'cent'
539
- }],
540
- people: [{
541
- id: '3',
542
- name: 'Lazy Author',
543
- email: 'lazy@xyz.fake',
544
- dateJoined: '2013-10-31 17:25:00 -0400',
545
- }]
546
- }
980
+ linked: [
981
+ {
982
+ type: 'iso_currencies',
983
+ id: 'USD',
984
+ countryName: 'United States',
985
+ name: 'United States Dollar',
986
+ minorUnit: 'cent',
987
+ links: {
988
+ self: '/iso_currencies/USD'
989
+ }
990
+ },
991
+ {
992
+ type: 'people',
993
+ id: '3',
994
+ email: 'lazy@xyz.fake',
995
+ name: 'Lazy Author',
996
+ dateJoined: '2013-10-31 17:25:00 -0400',
997
+ links: {
998
+ self: '/people/3',
999
+ }
1000
+ }
1001
+ ]
547
1002
  },
548
- JSONAPI::ResourceSerializer.new(ExpenseEntryResource).serialize_to_hash(
549
- ExpenseEntryResource.new(@expense_entry),
550
- include: ['iso_currency', 'employee'],
551
- fields: {people: [:id, :name, :email, :date_joined]}
552
- )
1003
+ JSONAPI::ResourceSerializer.new(ExpenseEntryResource,
1004
+ include: ['iso_currency', 'employee'],
1005
+ fields: {people: [:id, :name, :email, :date_joined]}).serialize_to_hash(
1006
+ ExpenseEntryResource.new(@expense_entry))
553
1007
  )
554
1008
  end
555
1009
 
@@ -559,21 +1013,30 @@ class SerializerTest < MiniTest::Unit::TestCase
559
1013
 
560
1014
  assert_hash_equals(
561
1015
  {
562
- planets: {
1016
+ data: {
1017
+ type: 'planets',
563
1018
  id: '8',
564
1019
  name: 'Beta W',
565
1020
  description: 'Newly discovered Planet W',
566
1021
  links: {
567
- planetType: nil,
568
- tags: [],
569
- moons: []
1022
+ self: '/planets/8',
1023
+ planetType: {
1024
+ self: '/planets/8/links/planet_type',
1025
+ resource: '/planets/8/planet_type',
1026
+ type: 'planet_types',
1027
+ id: nil
1028
+ },
1029
+ tags: {
1030
+ self: '/planets/8/links/tags',
1031
+ resource: '/planets/8/tags'
1032
+ },
1033
+ moons: {
1034
+ self: '/planets/8/links/moons',
1035
+ resource: '/planets/8/moons'
1036
+ }
570
1037
  }
571
1038
  }
572
1039
  }, planet_hash)
573
-
574
- json = planet_hash.to_json
575
- assert_match /\"planetType\":null/, json
576
- assert_match /\"moons\":\[\]/, json
577
1040
  end
578
1041
 
579
1042
  def test_serializer_include_with_empty_links_null_and_array
@@ -582,44 +1045,70 @@ class SerializerTest < MiniTest::Unit::TestCase
582
1045
  planets.push PlanetResource.new(planet)
583
1046
  end
584
1047
 
585
- planet_hash = JSONAPI::ResourceSerializer.new(PlanetResource).serialize_to_hash(
586
- planets,
587
- include: ['planet_type'],
588
- fields: { planet_types: [:id, :name] }
589
- )
1048
+ planet_hash = JSONAPI::ResourceSerializer.new(PlanetResource,
1049
+ include: ['planet_type'],
1050
+ fields: { planet_types: [:id, :name] }).serialize_to_hash(planets)
590
1051
 
591
1052
  assert_hash_equals(
592
1053
  {
593
- planets: [{
594
- id: '7',
595
- name: 'Beta X',
596
- description: 'Newly discovered Planet Z',
597
- links: {
598
- planetType: '1',
599
- tags: [],
600
- moons: []
601
- }
602
- },
603
- {
604
- id: '8',
605
- name: 'Beta W',
606
- description: 'Newly discovered Planet W',
607
- links: {
608
- planetType: nil,
609
- tags: [],
610
- moons: []
611
- }
612
- }],
613
- linked: {
614
- planetTypes: [
615
- { id: '1', name: "Gas Giant" }
616
- ]
1054
+ data: [{
1055
+ type: 'planets',
1056
+ id: '7',
1057
+ name: 'Beta X',
1058
+ description: 'Newly discovered Planet Z',
1059
+ links: {
1060
+ self: '/planets/7',
1061
+ planetType: {
1062
+ self: '/planets/7/links/planet_type',
1063
+ resource: '/planets/7/planet_type',
1064
+ type: 'planet_types',
1065
+ id: '5'
1066
+ },
1067
+ tags: {
1068
+ self: '/planets/7/links/tags',
1069
+ resource: '/planets/7/tags'
1070
+ },
1071
+ moons: {
1072
+ self: '/planets/7/links/moons',
1073
+ resource: '/planets/7/moons'
1074
+ }
1075
+ }
1076
+ },
1077
+ {
1078
+ type: 'planets',
1079
+ id: '8',
1080
+ name: 'Beta W',
1081
+ description: 'Newly discovered Planet W',
1082
+ links: {
1083
+ self: '/planets/8',
1084
+ planetType: {
1085
+ self: '/planets/8/links/planet_type',
1086
+ resource: '/planets/8/planet_type',
1087
+ type: 'planet_types',
1088
+ id: nil
1089
+ },
1090
+ tags: {
1091
+ self: '/planets/8/links/tags',
1092
+ resource: '/planets/8/tags'
1093
+ },
1094
+ moons: {
1095
+ self: '/planets/8/links/moons',
1096
+ resource: '/planets/8/moons'
1097
+ }
1098
+ }
617
1099
  }
618
- }, planet_hash)
619
-
620
- json = planet_hash.to_json
621
- assert_match /\"planetType\":null/, json
622
- assert_match /\"moons\":\[\]/, json
1100
+ ],
1101
+ linked: [
1102
+ {
1103
+ type: 'planet_types',
1104
+ id: '5',
1105
+ name: 'unknown',
1106
+ links: {
1107
+ self: '/planet_types/5'
1108
+ }
1109
+ }
1110
+ ]
1111
+ }, planet_hash)
623
1112
  end
624
1113
 
625
1114
  def test_serializer_booleans
@@ -629,16 +1118,27 @@ class SerializerTest < MiniTest::Unit::TestCase
629
1118
 
630
1119
  assert_hash_equals(
631
1120
  {
632
- preferences: {
633
- id: '1',
634
- advanced_mode: false,
635
- links: {
636
- author: nil,
637
- friends: []
638
- }
639
- }
1121
+ data: {
1122
+ type: 'preferences',
1123
+ id: '1',
1124
+ advanced_mode: false,
1125
+ links: {
1126
+ self: '/preferences/1',
1127
+ author: {
1128
+ self: '/preferences/1/links/author',
1129
+ resource: '/preferences/1/author',
1130
+ type: 'authors',
1131
+ id: nil
1132
+ },
1133
+ friends: {
1134
+ self: '/preferences/1/links/friends',
1135
+ resource: '/preferences/1/friends'
1136
+ }
1137
+ }
1138
+ }
640
1139
  },
641
- JSONAPI::ResourceSerializer.new(PreferencesResource).serialize_to_hash(preferences))
1140
+ JSONAPI::ResourceSerializer.new(PreferencesResource).serialize_to_hash(preferences)
1141
+ )
642
1142
  end
643
1143
 
644
1144
  def test_serializer_data_types
@@ -648,7 +1148,8 @@ class SerializerTest < MiniTest::Unit::TestCase
648
1148
 
649
1149
  assert_hash_equals(
650
1150
  {
651
- facts: {
1151
+ data: {
1152
+ type: 'facts',
652
1153
  id: '1',
653
1154
  spouse_name: 'Jane Author',
654
1155
  bio: 'First man to run across Antartica.',
@@ -658,9 +1159,13 @@ class SerializerTest < MiniTest::Unit::TestCase
658
1159
  birthday: Date.parse('1965-06-30'),
659
1160
  bedtime: Time.parse('2000-01-01 20:00:00 UTC +00:00'), #DB seems to set the date to 2001-01-01 for time types
660
1161
  photo: "abc",
661
- cool: false
1162
+ cool: false,
1163
+ links: {
1164
+ self: '/facts/1'
1165
+ }
662
1166
  }
663
1167
  },
664
- JSONAPI::ResourceSerializer.new(FactResource).serialize_to_hash(facts))
1168
+ JSONAPI::ResourceSerializer.new(FactResource).serialize_to_hash(facts)
1169
+ )
665
1170
  end
666
1171
  end