active_model_serializers 0.1.0 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -15,15 +15,20 @@ class RenderJsonTest < ActionController::TestCase
15
15
  end
16
16
 
17
17
  class JsonSerializer
18
- def initialize(object, scope, options={})
19
- @object, @scope, @options = object, scope, options
18
+ def initialize(object, options={})
19
+ @object, @options = object, options
20
20
  end
21
21
 
22
22
  def as_json(*)
23
- hash = { :object => @object.as_json, :scope => @scope.as_json }
23
+ hash = { :object => serializable_hash, :scope => @options[:scope].as_json }
24
24
  hash.merge!(:options => true) if @options[:options]
25
+ hash.merge!(:check_defaults => true) if @options[:check_defaults]
25
26
  hash
26
27
  end
28
+
29
+ def serializable_hash
30
+ @object.as_json
31
+ end
27
32
  end
28
33
 
29
34
  class JsonSerializable
@@ -40,6 +45,15 @@ class RenderJsonTest < ActionController::TestCase
40
45
  end
41
46
  end
42
47
 
48
+ class CustomSerializer
49
+ def initialize(*)
50
+ end
51
+
52
+ def as_json(*)
53
+ { :hello => true }
54
+ end
55
+ end
56
+
43
57
  class TestController < ActionController::Base
44
58
  protect_from_forgery
45
59
 
@@ -91,6 +105,11 @@ class RenderJsonTest < ActionController::TestCase
91
105
  render :json => JsonSerializable.new
92
106
  end
93
107
 
108
+ def render_json_with_serializer_and_implicit_root
109
+ @current_user = Struct.new(:as_json).new(:current_user => true)
110
+ render :json => [JsonSerializable.new]
111
+ end
112
+
94
113
  def render_json_with_serializer_and_options
95
114
  @current_user = Struct.new(:as_json).new(:current_user => true)
96
115
  render :json => JsonSerializable.new, :options => true
@@ -100,6 +119,17 @@ class RenderJsonTest < ActionController::TestCase
100
119
  @current_user = Struct.new(:as_json).new(:current_user => true)
101
120
  render :json => JsonSerializable.new(true)
102
121
  end
122
+
123
+ def render_json_with_custom_serializer
124
+ render :json => [], :serializer => CustomSerializer
125
+ end
126
+
127
+ private
128
+ def default_serializer_options
129
+ if params[:check_defaults]
130
+ { :check_defaults => true }
131
+ end
132
+ end
103
133
  end
104
134
 
105
135
  tests TestController
@@ -124,7 +154,6 @@ class RenderJsonTest < ActionController::TestCase
124
154
  assert_equal '[]', @response.body
125
155
  end
126
156
 
127
-
128
157
  def test_render_json
129
158
  get :render_json_hello_world
130
159
  assert_equal '{"hello":"world"}', @response.body
@@ -172,6 +201,18 @@ class RenderJsonTest < ActionController::TestCase
172
201
  assert_match '"object":{"serializable_object":true}', @response.body
173
202
  end
174
203
 
204
+ def test_render_json_with_serializer
205
+ get :render_json_with_serializer, :check_defaults => true
206
+ assert_match '"scope":{"current_user":true}', @response.body
207
+ assert_match '"object":{"serializable_object":true}', @response.body
208
+ assert_match '"check_defaults":true', @response.body
209
+ end
210
+
211
+ def test_render_json_with_serializer_and_implicit_root
212
+ get :render_json_with_serializer_and_implicit_root
213
+ assert_match '"test":[{"serializable_object":true}]', @response.body
214
+ end
215
+
175
216
  def test_render_json_with_serializer_and_options
176
217
  get :render_json_with_serializer_and_options
177
218
  assert_match '"scope":{"current_user":true}', @response.body
@@ -183,4 +224,9 @@ class RenderJsonTest < ActionController::TestCase
183
224
  get :render_json_with_serializer_api_but_without_serializer
184
225
  assert_match '{"serializable_object":true}', @response.body
185
226
  end
227
+
228
+ def test_render_json_with_custom_serializer
229
+ get :render_json_with_custom_serializer
230
+ assert_match '{"hello":true}', @response.body
231
+ end
186
232
  end
@@ -37,9 +37,10 @@ class SerializerTest < ActiveModel::TestCase
37
37
  def initialize(attributes)
38
38
  super(attributes)
39
39
  self.comments ||= []
40
+ self.author = nil
40
41
  end
41
42
 
42
- attr_accessor :comments
43
+ attr_accessor :comments, :author
43
44
  def active_model_serializer; PostSerializer; end
44
45
  end
45
46
 
@@ -51,7 +52,7 @@ class SerializerTest < ActiveModel::TestCase
51
52
  attributes :first_name, :last_name
52
53
 
53
54
  def serializable_hash
54
- attributes.merge(:ok => true).merge(scope)
55
+ attributes.merge(:ok => true).merge(options[:scope])
55
56
  end
56
57
  end
57
58
 
@@ -106,7 +107,7 @@ class SerializerTest < ActiveModel::TestCase
106
107
 
107
108
  def test_attributes_method
108
109
  user = User.new
109
- user_serializer = UserSerializer.new(user, {})
110
+ user_serializer = UserSerializer.new(user, :scope => {})
110
111
 
111
112
  hash = user_serializer.as_json
112
113
 
@@ -117,7 +118,7 @@ class SerializerTest < ActiveModel::TestCase
117
118
 
118
119
  def test_serializer_receives_scope
119
120
  user = User.new
120
- user_serializer = UserSerializer.new(user, {:scope => true})
121
+ user_serializer = UserSerializer.new(user, :scope => {:scope => true})
121
122
 
122
123
  hash = user_serializer.as_json
123
124
 
@@ -134,7 +135,7 @@ class SerializerTest < ActiveModel::TestCase
134
135
  def test_pretty_accessors
135
136
  user = User.new
136
137
  user.superuser = true
137
- user_serializer = MyUserSerializer.new(user, nil)
138
+ user_serializer = MyUserSerializer.new(user)
138
139
 
139
140
  hash = user_serializer.as_json
140
141
 
@@ -152,7 +153,7 @@ class SerializerTest < ActiveModel::TestCase
152
153
  comments = [Comment.new(:title => "Comment1"), Comment.new(:title => "Comment2")]
153
154
  post.comments = comments
154
155
 
155
- post_serializer = PostSerializer.new(post, user)
156
+ post_serializer = PostSerializer.new(post, :scope => user)
156
157
 
157
158
  assert_equal({
158
159
  :post => {
@@ -183,7 +184,7 @@ class SerializerTest < ActiveModel::TestCase
183
184
  blog = Blog.new
184
185
  blog.author = user
185
186
 
186
- json = BlogSerializer.new(blog, user).as_json
187
+ json = BlogSerializer.new(blog, :scope => user).as_json
187
188
  assert_equal({
188
189
  :blog => {
189
190
  :author => {
@@ -211,7 +212,7 @@ class SerializerTest < ActiveModel::TestCase
211
212
  blog = Blog.new
212
213
  blog.author = user
213
214
 
214
- json = blog_serializer.new(blog, user).as_json
215
+ json = blog_serializer.new(blog, :scope => user).as_json
215
216
  assert_equal({
216
217
  :person => {
217
218
  :first_name => "Jose"
@@ -219,84 +220,28 @@ class SerializerTest < ActiveModel::TestCase
219
220
  }, json)
220
221
  end
221
222
 
222
- def post_serializer(type)
223
+ def post_serializer
223
224
  Class.new(ActiveModel::Serializer) do
224
225
  attributes :title, :body
225
226
  has_many :comments, :serializer => CommentSerializer
226
-
227
- if type != :super
228
- define_method :serializable_hash do
229
- post_hash = attributes
230
- post_hash.merge!(send(type))
231
- post_hash
232
- end
233
- end
227
+ has_one :author, :serializer => DefaultUserSerializer
234
228
  end
235
229
  end
236
230
 
237
- def test_associations
238
- post = Post.new(:title => "New Post", :body => "Body of new post", :email => "tenderlove@tenderlove.com")
239
- comments = [Comment.new(:title => "Comment1"), Comment.new(:title => "Comment2")]
240
- post.comments = comments
241
-
242
- serializer = post_serializer(:associations).new(post, nil)
243
-
244
- assert_equal({
245
- :title => "New Post",
246
- :body => "Body of new post",
247
- :comments => [
248
- { :title => "Comment1" },
249
- { :title => "Comment2" }
250
- ]
251
- }, serializer.as_json)
252
- end
253
-
254
- def test_association_ids
255
- serializer = post_serializer(:association_ids)
256
-
257
- serializer.class_eval do
258
- def as_json(*)
259
- { :post => serializable_hash }.merge(associations)
260
- end
261
- end
262
-
263
- post = Post.new(:title => "New Post", :body => "Body of new post", :email => "tenderlove@tenderlove.com")
264
- comments = [Comment.new(:title => "Comment1", :id => 1), Comment.new(:title => "Comment2", :id => 2)]
265
- post.comments = comments
266
-
267
- serializer = serializer.new(post, nil)
268
-
269
- assert_equal({
270
- :post => {
271
- :title => "New Post",
272
- :body => "Body of new post",
273
- :comments => [1, 2]
274
- },
275
- :comments => [
276
- { :title => "Comment1" },
277
- { :title => "Comment2" }
278
- ]
279
- }, serializer.as_json)
280
- end
281
-
282
231
  def test_associations_with_nil_association
283
232
  user = User.new
284
233
  blog = Blog.new
285
234
 
286
- json = BlogSerializer.new(blog, user).as_json
235
+ json = BlogSerializer.new(blog, :scope => user).as_json
287
236
  assert_equal({
288
237
  :blog => { :author => nil }
289
238
  }, json)
290
239
 
291
240
  serializer = Class.new(BlogSerializer) do
292
241
  root :blog
293
-
294
- def serializable_hash
295
- attributes.merge(association_ids)
296
- end
297
242
  end
298
243
 
299
- json = serializer.new(blog, user).as_json
244
+ json = serializer.new(blog, :scope => user).as_json
300
245
  assert_equal({ :blog => { :author => nil } }, json)
301
246
  end
302
247
 
@@ -308,7 +253,7 @@ class SerializerTest < ActiveModel::TestCase
308
253
  root :my_blog
309
254
  end
310
255
 
311
- assert_equal({ :my_blog => { :author => nil } }, serializer.new(blog, user).as_json)
256
+ assert_equal({ :my_blog => { :author => nil } }, serializer.new(blog, :scope => user).as_json)
312
257
  end
313
258
 
314
259
  def test_false_root
@@ -319,15 +264,15 @@ class SerializerTest < ActiveModel::TestCase
319
264
  root false
320
265
  end
321
266
 
322
- assert_equal({ :author => nil }, serializer.new(blog, user).as_json)
267
+ assert_equal({ :author => nil }, serializer.new(blog, :scope => user).as_json)
323
268
 
324
269
  # test inherited false root
325
270
  serializer = Class.new(serializer)
326
- assert_equal({ :author => nil }, serializer.new(blog, user).as_json)
271
+ assert_equal({ :author => nil }, serializer.new(blog, :scope => user).as_json)
327
272
  end
328
273
 
329
274
  def test_embed_ids
330
- serializer = post_serializer(:super)
275
+ serializer = post_serializer
331
276
 
332
277
  serializer.class_eval do
333
278
  root :post
@@ -338,21 +283,22 @@ class SerializerTest < ActiveModel::TestCase
338
283
  comments = [Comment.new(:title => "Comment1", :id => 1), Comment.new(:title => "Comment2", :id => 2)]
339
284
  post.comments = comments
340
285
 
341
- serializer = serializer.new(post, nil)
286
+ serializer = serializer.new(post)
342
287
 
343
288
  assert_equal({
344
289
  :post => {
345
290
  :title => "New Post",
346
291
  :body => "Body of new post",
347
- :comments => [1, 2]
292
+ :comments => [1, 2],
293
+ :author => nil
348
294
  }
349
295
  }, serializer.as_json)
350
296
  end
351
297
 
352
298
  def test_embed_ids_include_true
353
- serializer = post_serializer(:super)
299
+ serializer_class = post_serializer
354
300
 
355
- serializer.class_eval do
301
+ serializer_class.class_eval do
356
302
  root :post
357
303
  embed :ids, :include => true
358
304
  end
@@ -361,23 +307,43 @@ class SerializerTest < ActiveModel::TestCase
361
307
  comments = [Comment.new(:title => "Comment1", :id => 1), Comment.new(:title => "Comment2", :id => 2)]
362
308
  post.comments = comments
363
309
 
364
- serializer = serializer.new(post, nil)
310
+ serializer = serializer_class.new(post)
365
311
 
366
312
  assert_equal({
367
313
  :post => {
368
314
  :title => "New Post",
369
315
  :body => "Body of new post",
370
- :comments => [1, 2]
316
+ :comments => [1, 2],
317
+ :author => nil
371
318
  },
372
319
  :comments => [
373
320
  { :title => "Comment1" },
374
321
  { :title => "Comment2" }
375
- ]
322
+ ],
323
+ :authors => []
324
+ }, serializer.as_json)
325
+
326
+ post.author = User.new(:id => 1)
327
+
328
+ serializer = serializer_class.new(post)
329
+
330
+ assert_equal({
331
+ :post => {
332
+ :title => "New Post",
333
+ :body => "Body of new post",
334
+ :comments => [1, 2],
335
+ :author => 1
336
+ },
337
+ :comments => [
338
+ { :title => "Comment1" },
339
+ { :title => "Comment2" }
340
+ ],
341
+ :authors => [{ :first_name => "Jose", :last_name => "Valim" }]
376
342
  }, serializer.as_json)
377
343
  end
378
344
 
379
345
  def test_embed_objects
380
- serializer = post_serializer(:super)
346
+ serializer = post_serializer
381
347
 
382
348
  serializer.class_eval do
383
349
  root :post
@@ -388,12 +354,13 @@ class SerializerTest < ActiveModel::TestCase
388
354
  comments = [Comment.new(:title => "Comment1", :id => 1), Comment.new(:title => "Comment2", :id => 2)]
389
355
  post.comments = comments
390
356
 
391
- serializer = serializer.new(post, nil)
357
+ serializer = serializer.new(post)
392
358
 
393
359
  assert_equal({
394
360
  :post => {
395
361
  :title => "New Post",
396
362
  :body => "Body of new post",
363
+ :author => nil,
397
364
  :comments => [
398
365
  { :title => "Comment1" },
399
366
  { :title => "Comment2" }
@@ -416,6 +383,20 @@ class SerializerTest < ActiveModel::TestCase
416
383
  ], serializer.as_json)
417
384
  end
418
385
 
386
+ def test_array_serializer
387
+ comment1 = Comment.new(:title => "Comment1", :id => 1)
388
+ comment2 = Comment.new(:title => "Comment2", :id => 2)
389
+
390
+ array = [ comment1, comment2 ]
391
+
392
+ serializer = array.active_model_serializer.new(array, :root => :comments)
393
+
394
+ assert_equal({ :comments => [
395
+ { :title => "Comment1" },
396
+ { :title => "Comment2" }
397
+ ]}, serializer.as_json)
398
+ end
399
+
419
400
  class CustomBlog < Blog
420
401
  attr_accessor :public_posts, :public_user
421
402
  end
@@ -436,7 +417,7 @@ class SerializerTest < ActiveModel::TestCase
436
417
  custom_blog.public_posts = posts
437
418
  custom_blog.public_user = user
438
419
 
439
- serializer = CustomBlogSerializer.new(custom_blog, :scope => true)
420
+ serializer = CustomBlogSerializer.new(custom_blog, :scope => { :scope => true })
440
421
 
441
422
  assert_equal({
442
423
  :custom_blog => {
@@ -473,7 +454,7 @@ class SerializerTest < ActiveModel::TestCase
473
454
  custom_blog.public_posts = posts
474
455
  custom_blog.public_user = user
475
456
 
476
- serializer = implicit_serializer.new(custom_blog, :scope => true)
457
+ serializer = implicit_serializer.new(custom_blog, :scope => { :scope => true })
477
458
 
478
459
  assert_equal({
479
460
  :custom_blog => {
@@ -499,7 +480,7 @@ class SerializerTest < ActiveModel::TestCase
499
480
  attribute :password
500
481
  end
501
482
 
502
- serializer = serializer_class.new(User.new, nil)
483
+ serializer = serializer_class.new(User.new)
503
484
 
504
485
  assert_equal({
505
486
  :user => {
@@ -594,7 +575,7 @@ class SerializerTest < ActiveModel::TestCase
594
575
  author = author_class.new(:id => 5)
595
576
  post.author = author
596
577
 
597
- hash = serializer_class.new(post, nil)
578
+ hash = serializer_class.new(post)
598
579
 
599
580
  assert_equal({
600
581
  :post => {
@@ -627,7 +608,7 @@ class SerializerTest < ActiveModel::TestCase
627
608
  author = author_class.new(:id => 5, :name => "Tom Dale")
628
609
  post.author = author
629
610
 
630
- hash = serializer_class.new(post, nil)
611
+ hash = serializer_class.new(post)
631
612
 
632
613
  assert_equal({
633
614
  :post => {
@@ -666,13 +647,13 @@ class SerializerTest < ActiveModel::TestCase
666
647
  :body => "It's a new post!",
667
648
  :author => { :id => 5, :name => "Tom Dale" }
668
649
  }
669
- }, serializer_class.new(post, nil, :root => :blog_post).as_json)
650
+ }, serializer_class.new(post, :root => :blog_post).as_json)
670
651
 
671
652
  assert_equal({
672
653
  :title => "New Post",
673
654
  :body => "It's a new post!",
674
655
  :author => { :id => 5, :name => "Tom Dale" }
675
- }, serializer_class.new(post, nil, :root => false).as_json)
656
+ }, serializer_class.new(post, :root => false).as_json)
676
657
 
677
658
  assert_equal({
678
659
  :blog_post => {
@@ -680,13 +661,13 @@ class SerializerTest < ActiveModel::TestCase
680
661
  :body => "It's a new post!",
681
662
  :author => { :id => 5, :name => "Tom Dale" }
682
663
  }
683
- }, serializer_class.new(post, nil).as_json(:root => :blog_post))
664
+ }, serializer_class.new(post).as_json(:root => :blog_post))
684
665
 
685
666
  assert_equal({
686
667
  :title => "New Post",
687
668
  :body => "It's a new post!",
688
669
  :author => { :id => 5, :name => "Tom Dale" }
689
- }, serializer_class.new(post, nil).as_json(:root => false))
670
+ }, serializer_class.new(post).as_json(:root => false))
690
671
  end
691
672
 
692
673
  def test_serializer_has_access_to_root_object
@@ -696,7 +677,7 @@ class SerializerTest < ActiveModel::TestCase
696
677
  attributes :id, :name
697
678
 
698
679
  define_method :serializable_hash do
699
- hash_object = @hash
680
+ hash_object = @options[:hash]
700
681
  super()
701
682
  end
702
683
  end
@@ -718,10 +699,59 @@ class SerializerTest < ActiveModel::TestCase
718
699
  author = author_class.new(:id => 5, :name => "Tom Dale")
719
700
  post.author = author
720
701
 
721
- expected = serializer_class.new(post, nil).as_json
702
+ expected = serializer_class.new(post).as_json
722
703
  assert_equal expected, hash_object
723
704
  end
705
+
706
+ def test_embed_ids_include_true_with_root
707
+ serializer_class = post_serializer
724
708
 
709
+ serializer_class.class_eval do
710
+ root :post
711
+ embed :ids, :include => true
712
+ has_many :comments, :key => :comment_ids, :root => :comments
713
+ has_one :author, :serializer => DefaultUserSerializer, :key => :author_id, :root => :author
714
+ end
715
+
716
+ post = Post.new(:title => "New Post", :body => "Body of new post", :email => "tenderlove@tenderlove.com")
717
+ comments = [Comment.new(:title => "Comment1", :id => 1), Comment.new(:title => "Comment2", :id => 2)]
718
+ post.comments = comments
719
+
720
+ serializer = serializer_class.new(post)
721
+
722
+ assert_equal({
723
+ :post => {
724
+ :title => "New Post",
725
+ :body => "Body of new post",
726
+ :comment_ids => [1, 2],
727
+ :author_id => nil
728
+ },
729
+ :comments => [
730
+ { :title => "Comment1" },
731
+ { :title => "Comment2" }
732
+ ],
733
+ :author => []
734
+ }, serializer.as_json)
735
+
736
+ post.author = User.new(:id => 1)
737
+
738
+ serializer = serializer_class.new(post)
739
+
740
+ assert_equal({
741
+ :post => {
742
+ :title => "New Post",
743
+ :body => "Body of new post",
744
+ :comment_ids => [1, 2],
745
+ :author_id => 1
746
+ },
747
+ :comments => [
748
+ { :title => "Comment1" },
749
+ { :title => "Comment2" }
750
+ ],
751
+ :author => [{ :first_name => "Jose", :last_name => "Valim" }]
752
+ }, serializer.as_json)
753
+ end
754
+
725
755
  # the point of this test is to illustrate that deeply nested serializers
726
756
  # still side-load at the root.
727
757
  def test_embed_with_include_inserts_at_root
@@ -766,7 +796,7 @@ class SerializerTest < ActiveModel::TestCase
766
796
  comment1.tags = [tag1, tag3]
767
797
  comment2.tags = [tag1, tag2]
768
798
 
769
- actual = ActiveModel::ArraySerializer.new([post], nil, :root => :posts).as_json
799
+ actual = ActiveModel::ArraySerializer.new([post], :root => :posts).as_json
770
800
  assert_equal({
771
801
  :posts => [
772
802
  { :title => "New Post", :body => "NEW POST", :id => 1, :comments => [1,2] }