jsonapi-resources 0.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.
- checksums.yaml +7 -0
- data/.gitignore +20 -0
- data/Gemfile +22 -0
- data/LICENSE.txt +22 -0
- data/README.md +451 -0
- data/Rakefile +24 -0
- data/jsonapi-resources.gemspec +29 -0
- data/lib/jsonapi-resources.rb +2 -0
- data/lib/jsonapi/active_record_operations_processor.rb +17 -0
- data/lib/jsonapi/association.rb +45 -0
- data/lib/jsonapi/error.rb +17 -0
- data/lib/jsonapi/error_codes.rb +16 -0
- data/lib/jsonapi/exceptions.rb +177 -0
- data/lib/jsonapi/operation.rb +151 -0
- data/lib/jsonapi/operation_result.rb +15 -0
- data/lib/jsonapi/operations_processor.rb +47 -0
- data/lib/jsonapi/request.rb +254 -0
- data/lib/jsonapi/resource.rb +417 -0
- data/lib/jsonapi/resource_controller.rb +169 -0
- data/lib/jsonapi/resource_for.rb +25 -0
- data/lib/jsonapi/resource_serializer.rb +209 -0
- data/lib/jsonapi/resources/version.rb +5 -0
- data/lib/jsonapi/routing_ext.rb +104 -0
- data/test/config/database.yml +5 -0
- data/test/controllers/controller_test.rb +940 -0
- data/test/fixtures/active_record.rb +585 -0
- data/test/helpers/functional_helpers.rb +59 -0
- data/test/helpers/hash_helpers.rb +13 -0
- data/test/helpers/value_matchers.rb +60 -0
- data/test/helpers/value_matchers_test.rb +40 -0
- data/test/integration/requests/request_test.rb +39 -0
- data/test/integration/routes/routes_test.rb +85 -0
- data/test/test_helper.rb +98 -0
- data/test/unit/operation/operations_processor_test.rb +188 -0
- data/test/unit/resource/resource_test.rb +45 -0
- data/test/unit/serializer/serializer_test.rb +429 -0
- metadata +193 -0
@@ -0,0 +1,45 @@
|
|
1
|
+
require File.expand_path('../../../test_helper', __FILE__)
|
2
|
+
require File.expand_path('../../../fixtures/active_record', __FILE__)
|
3
|
+
|
4
|
+
class ArticleResource < JSONAPI::Resource
|
5
|
+
model_name 'Post'
|
6
|
+
end
|
7
|
+
|
8
|
+
class CatResource < JSONAPI::Resource
|
9
|
+
attribute :id
|
10
|
+
attribute :name
|
11
|
+
attribute :breed
|
12
|
+
|
13
|
+
has_one :mother, class_name: 'Cat'
|
14
|
+
has_one :father, class_name: 'Cat'
|
15
|
+
end
|
16
|
+
|
17
|
+
class ResourceTest < MiniTest::Unit::TestCase
|
18
|
+
def setup
|
19
|
+
@post = Post.first
|
20
|
+
end
|
21
|
+
|
22
|
+
def test_model_name
|
23
|
+
assert_equal(PostResource._model_name, 'Post')
|
24
|
+
end
|
25
|
+
|
26
|
+
def test_model
|
27
|
+
assert_equal(PostResource._model_class, Post)
|
28
|
+
end
|
29
|
+
|
30
|
+
def test_model_alternate
|
31
|
+
assert_equal(ArticleResource._model_class, Post)
|
32
|
+
end
|
33
|
+
|
34
|
+
def test_class_attributes
|
35
|
+
attrs = CatResource._attributes
|
36
|
+
assert_kind_of(Set, attrs)
|
37
|
+
assert_equal(attrs.size, 3)
|
38
|
+
end
|
39
|
+
|
40
|
+
def test_class_assosications
|
41
|
+
associations = CatResource._associations
|
42
|
+
assert_kind_of(Hash, associations)
|
43
|
+
assert_equal(associations.size, 2)
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,429 @@
|
|
1
|
+
require File.expand_path('../../../test_helper', __FILE__)
|
2
|
+
require File.expand_path('../../../fixtures/active_record', __FILE__)
|
3
|
+
require 'jsonapi/resource_serializer'
|
4
|
+
|
5
|
+
|
6
|
+
class SerializerTest < MiniTest::Unit::TestCase
|
7
|
+
def setup
|
8
|
+
@post = Post.find(1)
|
9
|
+
@fred = Person.find_by(name: 'Fred Reader')
|
10
|
+
end
|
11
|
+
|
12
|
+
def test_serializer
|
13
|
+
assert_hash_equals({
|
14
|
+
posts: [{
|
15
|
+
id: 1,
|
16
|
+
title: 'New post',
|
17
|
+
body: 'A body!!!',
|
18
|
+
subject: 'New post',
|
19
|
+
links: {
|
20
|
+
section: nil,
|
21
|
+
author: 1,
|
22
|
+
tags: [1,2,3],
|
23
|
+
comments: [1,2]
|
24
|
+
}
|
25
|
+
}]
|
26
|
+
}, JSONAPI::ResourceSerializer.new.serialize(PostResource.new(@post), nil, nil))
|
27
|
+
end
|
28
|
+
|
29
|
+
def test_serializer_limited_fieldset
|
30
|
+
assert_hash_equals({
|
31
|
+
posts: [{
|
32
|
+
id: 1,
|
33
|
+
title: 'New post',
|
34
|
+
links: {
|
35
|
+
author: 1
|
36
|
+
}
|
37
|
+
}]
|
38
|
+
}, JSONAPI::ResourceSerializer.new.serialize(PostResource.new(@post), nil,
|
39
|
+
{posts: [:id, :title, :author]}))
|
40
|
+
end
|
41
|
+
|
42
|
+
def test_serializer_include
|
43
|
+
assert_hash_equals({
|
44
|
+
posts: [{
|
45
|
+
id: 1,
|
46
|
+
title: 'New post',
|
47
|
+
body: 'A body!!!',
|
48
|
+
subject: 'New post',
|
49
|
+
links: {
|
50
|
+
author: 1,
|
51
|
+
tags: [1,2,3],
|
52
|
+
comments: [1,2],
|
53
|
+
section: nil
|
54
|
+
}
|
55
|
+
}],
|
56
|
+
linked: {
|
57
|
+
people: [{
|
58
|
+
id: 1,
|
59
|
+
name: 'Joe Author',
|
60
|
+
email: 'joe@xyz.fake',
|
61
|
+
date_joined: DateTime.parse('2013-08-07 20:25:00 UTC +00:00'),
|
62
|
+
links: {
|
63
|
+
comments: [1],
|
64
|
+
posts: [1,2,11]
|
65
|
+
}
|
66
|
+
}]
|
67
|
+
}
|
68
|
+
}, JSONAPI::ResourceSerializer.new.serialize(PostResource.new(@post), [:author], nil))
|
69
|
+
end
|
70
|
+
|
71
|
+
def test_serializer_include_sub_objects
|
72
|
+
assert_hash_equals(
|
73
|
+
{
|
74
|
+
posts: [{
|
75
|
+
id: 1,
|
76
|
+
title: 'New post',
|
77
|
+
body: 'A body!!!',
|
78
|
+
subject: 'New post',
|
79
|
+
links: {
|
80
|
+
author: 1,
|
81
|
+
tags: [1,2,3],
|
82
|
+
comments: [1,2],
|
83
|
+
section: nil
|
84
|
+
}
|
85
|
+
}],
|
86
|
+
linked: {
|
87
|
+
tags: [
|
88
|
+
{
|
89
|
+
id: 1,
|
90
|
+
name: 'short',
|
91
|
+
links: {
|
92
|
+
posts: :not_nil
|
93
|
+
}
|
94
|
+
},
|
95
|
+
{
|
96
|
+
id: 2,
|
97
|
+
name: 'whiny',
|
98
|
+
links: {
|
99
|
+
posts: :not_nil
|
100
|
+
}
|
101
|
+
},
|
102
|
+
{
|
103
|
+
id: 4,
|
104
|
+
name: 'happy',
|
105
|
+
links: {
|
106
|
+
posts: :not_nil
|
107
|
+
}
|
108
|
+
}
|
109
|
+
],
|
110
|
+
comments: [
|
111
|
+
{
|
112
|
+
id: 1,
|
113
|
+
body: 'what a dumb post',
|
114
|
+
links: {
|
115
|
+
author: 1,
|
116
|
+
post: 1,
|
117
|
+
tags: [2, 1]
|
118
|
+
}
|
119
|
+
},
|
120
|
+
{
|
121
|
+
id: 2,
|
122
|
+
body: 'i liked it',
|
123
|
+
links: {
|
124
|
+
author: 2,
|
125
|
+
post: 1,
|
126
|
+
tags: [4, 1]
|
127
|
+
}
|
128
|
+
}
|
129
|
+
]
|
130
|
+
}
|
131
|
+
}, JSONAPI::ResourceSerializer.new.serialize(PostResource.new(@post), [:comments,'comments.tags'], nil))
|
132
|
+
end
|
133
|
+
|
134
|
+
def test_serializer_include_has_many_sub_objects_only
|
135
|
+
assert_hash_equals(
|
136
|
+
{
|
137
|
+
posts: [{
|
138
|
+
id: 1,
|
139
|
+
title: 'New post',
|
140
|
+
body: 'A body!!!',
|
141
|
+
subject: 'New post',
|
142
|
+
links: {
|
143
|
+
author: 1,
|
144
|
+
tags: [1,2,3],
|
145
|
+
comments: [1,2],
|
146
|
+
section: nil
|
147
|
+
}
|
148
|
+
}],
|
149
|
+
linked: {
|
150
|
+
tags: [
|
151
|
+
{
|
152
|
+
id: 1,
|
153
|
+
name: 'short',
|
154
|
+
links: {
|
155
|
+
posts: :not_nil
|
156
|
+
}
|
157
|
+
},
|
158
|
+
{
|
159
|
+
id: 2,
|
160
|
+
name: 'whiny',
|
161
|
+
links: {
|
162
|
+
posts: :not_nil
|
163
|
+
}
|
164
|
+
},
|
165
|
+
{
|
166
|
+
id: 4,
|
167
|
+
name: 'happy',
|
168
|
+
links: {
|
169
|
+
posts: :not_nil
|
170
|
+
}
|
171
|
+
}
|
172
|
+
]
|
173
|
+
}
|
174
|
+
}, JSONAPI::ResourceSerializer.new.serialize(PostResource.new(@post), ['comments.tags'], nil))
|
175
|
+
end
|
176
|
+
|
177
|
+
def test_serializer_include_has_one_sub_objects_only
|
178
|
+
assert_hash_equals(
|
179
|
+
{
|
180
|
+
posts: [{
|
181
|
+
id: 1,
|
182
|
+
title: 'New post',
|
183
|
+
body: 'A body!!!',
|
184
|
+
subject: 'New post',
|
185
|
+
links: {
|
186
|
+
author: 1,
|
187
|
+
tags: [1,2,3],
|
188
|
+
comments: [1,2],
|
189
|
+
section: nil
|
190
|
+
}
|
191
|
+
}],
|
192
|
+
linked: {
|
193
|
+
comments: [
|
194
|
+
{
|
195
|
+
id: 1,
|
196
|
+
body: 'what a dumb post',
|
197
|
+
links: {
|
198
|
+
author: 1,
|
199
|
+
post: 1,
|
200
|
+
tags: [2, 1]
|
201
|
+
}
|
202
|
+
}
|
203
|
+
]
|
204
|
+
}
|
205
|
+
}, JSONAPI::ResourceSerializer.new.serialize(PostResource.new(@post), ['author.comments'], nil))
|
206
|
+
end
|
207
|
+
|
208
|
+
def test_serializer_different_foreign_key
|
209
|
+
assert_hash_equals(
|
210
|
+
{
|
211
|
+
people: [{
|
212
|
+
id: 2,
|
213
|
+
name: 'Fred Reader',
|
214
|
+
email: 'fred@xyz.fake',
|
215
|
+
date_joined: DateTime.parse('2013-10-31 20:25:00 UTC +00:00'),
|
216
|
+
links: {
|
217
|
+
posts: [],
|
218
|
+
comments: [2,3]
|
219
|
+
}
|
220
|
+
}],
|
221
|
+
linked: {
|
222
|
+
comments: [{
|
223
|
+
id: 2,
|
224
|
+
body: 'i liked it',
|
225
|
+
links: {
|
226
|
+
author: 2,
|
227
|
+
post: 1,
|
228
|
+
tags: [4, 1]
|
229
|
+
}
|
230
|
+
},
|
231
|
+
{
|
232
|
+
id: 3,
|
233
|
+
body: 'Thanks man. Great post. But what is JR?',
|
234
|
+
links: {
|
235
|
+
author: 2,
|
236
|
+
post: 2,
|
237
|
+
tags: [5]
|
238
|
+
}
|
239
|
+
}
|
240
|
+
]
|
241
|
+
}
|
242
|
+
}, JSONAPI::ResourceSerializer.new.serialize(PersonResource.new(@fred), ['comments'], nil))
|
243
|
+
end
|
244
|
+
|
245
|
+
def test_serializer_array_of_resources
|
246
|
+
|
247
|
+
posts = []
|
248
|
+
Post.find(1,2).each do |post|
|
249
|
+
posts.push PostResource.new(post)
|
250
|
+
end
|
251
|
+
|
252
|
+
assert_hash_equals(
|
253
|
+
{
|
254
|
+
posts: [{
|
255
|
+
id: 1,
|
256
|
+
title: 'New post',
|
257
|
+
body: 'A body!!!',
|
258
|
+
subject: 'New post',
|
259
|
+
links: {
|
260
|
+
author: 1,
|
261
|
+
tags: [1,2,3],
|
262
|
+
comments: [1,2],
|
263
|
+
section: nil
|
264
|
+
}
|
265
|
+
},
|
266
|
+
{
|
267
|
+
id: 2,
|
268
|
+
title: 'JR Solves your serialization woes!',
|
269
|
+
body: 'Use JR',
|
270
|
+
subject: 'JR Solves your serialization woes!',
|
271
|
+
links: {
|
272
|
+
author: 1,
|
273
|
+
tags: [5],
|
274
|
+
comments: [3],
|
275
|
+
section: 3
|
276
|
+
}
|
277
|
+
}],
|
278
|
+
linked: {
|
279
|
+
tags: [
|
280
|
+
{
|
281
|
+
id: 1,
|
282
|
+
name: 'short',
|
283
|
+
links: {
|
284
|
+
posts: :not_nil
|
285
|
+
}
|
286
|
+
},
|
287
|
+
{
|
288
|
+
id: 2,
|
289
|
+
name: 'whiny',
|
290
|
+
links: {
|
291
|
+
posts: :not_nil
|
292
|
+
}
|
293
|
+
},
|
294
|
+
{
|
295
|
+
id: 4,
|
296
|
+
name: 'happy',
|
297
|
+
links: {
|
298
|
+
posts: :not_nil
|
299
|
+
}
|
300
|
+
},
|
301
|
+
{
|
302
|
+
id: 5,
|
303
|
+
name: 'JR',
|
304
|
+
links: {
|
305
|
+
posts: [2,11]
|
306
|
+
}
|
307
|
+
}
|
308
|
+
],
|
309
|
+
comments: [
|
310
|
+
{
|
311
|
+
id: 1,
|
312
|
+
body: 'what a dumb post',
|
313
|
+
links: {
|
314
|
+
author: 1,
|
315
|
+
post: 1,
|
316
|
+
tags: [2, 1]
|
317
|
+
}
|
318
|
+
},
|
319
|
+
{
|
320
|
+
id: 2,
|
321
|
+
body: 'i liked it',
|
322
|
+
links: {
|
323
|
+
author: 2,
|
324
|
+
post: 1,
|
325
|
+
tags: [4, 1]
|
326
|
+
}
|
327
|
+
},
|
328
|
+
{
|
329
|
+
id: 3,
|
330
|
+
body: 'Thanks man. Great post. But what is JR?',
|
331
|
+
links: {
|
332
|
+
author: 2,
|
333
|
+
post: 2,
|
334
|
+
tags: [5]
|
335
|
+
}
|
336
|
+
}
|
337
|
+
]
|
338
|
+
}
|
339
|
+
}, JSONAPI::ResourceSerializer.new.serialize(posts, ['comments','comments.tags'], nil))
|
340
|
+
end
|
341
|
+
|
342
|
+
def test_serializer_array_of_resources_limited_fields
|
343
|
+
|
344
|
+
posts = []
|
345
|
+
Post.find(1,2).each do |post|
|
346
|
+
posts.push PostResource.new(post)
|
347
|
+
end
|
348
|
+
|
349
|
+
assert_hash_equals(
|
350
|
+
{
|
351
|
+
posts: [{
|
352
|
+
id: 1,
|
353
|
+
title: 'New post',
|
354
|
+
links: {
|
355
|
+
author: 1
|
356
|
+
}
|
357
|
+
},
|
358
|
+
{
|
359
|
+
id: 2,
|
360
|
+
title: 'JR Solves your serialization woes!',
|
361
|
+
links: {
|
362
|
+
author: 1
|
363
|
+
}
|
364
|
+
}],
|
365
|
+
linked: {
|
366
|
+
tags: [
|
367
|
+
{
|
368
|
+
name: 'short'
|
369
|
+
},
|
370
|
+
{
|
371
|
+
name: 'whiny'
|
372
|
+
},
|
373
|
+
{
|
374
|
+
name: 'happy'
|
375
|
+
},
|
376
|
+
{
|
377
|
+
name: 'JR'
|
378
|
+
}
|
379
|
+
],
|
380
|
+
comments: [
|
381
|
+
{
|
382
|
+
id: 1,
|
383
|
+
body: 'what a dumb post',
|
384
|
+
links: {
|
385
|
+
post: 1
|
386
|
+
}
|
387
|
+
},
|
388
|
+
{
|
389
|
+
id: 2,
|
390
|
+
body: 'i liked it',
|
391
|
+
links: {
|
392
|
+
post: 1
|
393
|
+
}
|
394
|
+
},
|
395
|
+
{
|
396
|
+
id: 3,
|
397
|
+
body: 'Thanks man. Great post. But what is JR?',
|
398
|
+
links: {
|
399
|
+
post: 2
|
400
|
+
}
|
401
|
+
}
|
402
|
+
],
|
403
|
+
posts: [
|
404
|
+
{
|
405
|
+
id: 11,
|
406
|
+
title: 'JR How To',
|
407
|
+
links: {
|
408
|
+
author: 1
|
409
|
+
}
|
410
|
+
}
|
411
|
+
],
|
412
|
+
people: [
|
413
|
+
{
|
414
|
+
id: 1,
|
415
|
+
email: 'joe@xyz.fake',
|
416
|
+
links: {
|
417
|
+
comments: [1]
|
418
|
+
}
|
419
|
+
}]
|
420
|
+
}
|
421
|
+
}, JSONAPI::ResourceSerializer.new.serialize(posts, ['comments','author','comments.tags','author.posts'],
|
422
|
+
{
|
423
|
+
people: [:id, :email, :comments],
|
424
|
+
posts: [:id, :title, :author],
|
425
|
+
tags: [:name],
|
426
|
+
comments: [:id, :body, :post]
|
427
|
+
}))
|
428
|
+
end
|
429
|
+
end
|