active_model_serializers 0.10.0.rc2 → 0.10.0.rc3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (104) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +2 -0
  3. data/.rubocop.yml +82 -0
  4. data/.rubocop_todo.yml +315 -0
  5. data/.simplecov +99 -0
  6. data/.travis.yml +8 -0
  7. data/CHANGELOG.md +9 -3
  8. data/Gemfile +39 -8
  9. data/README.md +55 -31
  10. data/Rakefile +29 -2
  11. data/active_model_serializers.gemspec +37 -13
  12. data/appveyor.yml +25 -0
  13. data/docs/README.md +29 -0
  14. data/docs/general/adapters.md +110 -0
  15. data/docs/general/configuration_options.md +11 -0
  16. data/docs/general/getting_started.md +73 -0
  17. data/docs/howto/add_pagination_links.md +112 -0
  18. data/docs/howto/add_root_key.md +51 -0
  19. data/docs/howto/outside_controller_use.md +42 -0
  20. data/lib/action_controller/serialization.rb +24 -33
  21. data/lib/active_model/serializable_resource.rb +70 -0
  22. data/lib/active_model/serializer.rb +50 -131
  23. data/lib/active_model/serializer/adapter.rb +84 -21
  24. data/lib/active_model/serializer/adapter/flatten_json.rb +9 -9
  25. data/lib/active_model/serializer/adapter/fragment_cache.rb +10 -13
  26. data/lib/active_model/serializer/adapter/json.rb +25 -28
  27. data/lib/active_model/serializer/adapter/json/fragment_cache.rb +2 -12
  28. data/lib/active_model/serializer/adapter/json_api.rb +100 -98
  29. data/lib/active_model/serializer/adapter/json_api/fragment_cache.rb +4 -14
  30. data/lib/active_model/serializer/adapter/json_api/pagination_links.rb +50 -0
  31. data/lib/active_model/serializer/adapter/null.rb +2 -8
  32. data/lib/active_model/serializer/array_serializer.rb +22 -17
  33. data/lib/active_model/serializer/association.rb +20 -0
  34. data/lib/active_model/serializer/associations.rb +97 -0
  35. data/lib/active_model/serializer/belongs_to_reflection.rb +10 -0
  36. data/lib/active_model/serializer/collection_reflection.rb +7 -0
  37. data/lib/active_model/serializer/configuration.rb +1 -0
  38. data/lib/active_model/serializer/fieldset.rb +7 -7
  39. data/lib/active_model/serializer/has_many_reflection.rb +10 -0
  40. data/lib/active_model/serializer/has_one_reflection.rb +10 -0
  41. data/lib/active_model/serializer/lint.rb +129 -0
  42. data/lib/active_model/serializer/railtie.rb +7 -0
  43. data/lib/active_model/serializer/reflection.rb +74 -0
  44. data/lib/active_model/serializer/singular_reflection.rb +7 -0
  45. data/lib/active_model/serializer/utils.rb +35 -0
  46. data/lib/active_model/serializer/version.rb +1 -1
  47. data/lib/active_model_serializers.rb +28 -14
  48. data/lib/generators/serializer/serializer_generator.rb +7 -7
  49. data/lib/generators/serializer/templates/{serializer.rb → serializer.rb.erb} +2 -2
  50. data/lib/tasks/rubocop.rake +0 -0
  51. data/test/action_controller/adapter_selector_test.rb +3 -3
  52. data/test/action_controller/explicit_serializer_test.rb +9 -9
  53. data/test/action_controller/json_api/linked_test.rb +179 -0
  54. data/test/action_controller/json_api/pagination_test.rb +116 -0
  55. data/test/action_controller/serialization_scope_name_test.rb +10 -6
  56. data/test/action_controller/serialization_test.rb +149 -112
  57. data/test/active_record_test.rb +9 -0
  58. data/test/adapter/fragment_cache_test.rb +11 -1
  59. data/test/adapter/json/belongs_to_test.rb +4 -5
  60. data/test/adapter/json/collection_test.rb +30 -21
  61. data/test/adapter/json/has_many_test.rb +20 -9
  62. data/test/adapter/json_api/belongs_to_test.rb +38 -38
  63. data/test/adapter/json_api/collection_test.rb +22 -23
  64. data/test/adapter/json_api/has_many_embed_ids_test.rb +2 -2
  65. data/test/adapter/json_api/has_many_explicit_serializer_test.rb +4 -4
  66. data/test/adapter/json_api/has_many_test.rb +54 -19
  67. data/test/adapter/json_api/has_one_test.rb +28 -8
  68. data/test/adapter/json_api/json_api_test.rb +37 -0
  69. data/test/adapter/json_api/linked_test.rb +75 -75
  70. data/test/adapter/json_api/pagination_links_test.rb +115 -0
  71. data/test/adapter/json_api/resource_type_config_test.rb +59 -0
  72. data/test/adapter/json_test.rb +18 -5
  73. data/test/adapter_test.rb +10 -11
  74. data/test/array_serializer_test.rb +63 -5
  75. data/test/capture_warnings.rb +65 -0
  76. data/test/fixtures/active_record.rb +56 -0
  77. data/test/fixtures/poro.rb +60 -29
  78. data/test/generators/scaffold_controller_generator_test.rb +1 -2
  79. data/test/generators/serializer_generator_test.rb +17 -12
  80. data/test/lint_test.rb +37 -0
  81. data/test/logger_test.rb +18 -0
  82. data/test/poro_test.rb +9 -0
  83. data/test/serializable_resource_test.rb +27 -0
  84. data/test/serializers/adapter_for_test.rb +123 -3
  85. data/test/serializers/association_macros_test.rb +36 -0
  86. data/test/serializers/associations_test.rb +70 -47
  87. data/test/serializers/attribute_test.rb +28 -4
  88. data/test/serializers/attributes_test.rb +8 -14
  89. data/test/serializers/cache_test.rb +58 -31
  90. data/test/serializers/fieldset_test.rb +3 -4
  91. data/test/serializers/meta_test.rb +42 -28
  92. data/test/serializers/root_test.rb +21 -0
  93. data/test/serializers/serializer_for_test.rb +1 -1
  94. data/test/support/rails_app.rb +21 -0
  95. data/test/support/serialization_testing.rb +13 -0
  96. data/test/support/simplecov.rb +6 -0
  97. data/test/support/stream_capture.rb +50 -0
  98. data/test/support/test_case.rb +5 -0
  99. data/test/test_helper.rb +41 -29
  100. data/test/utils/include_args_to_hash_test.rb +79 -0
  101. metadata +123 -17
  102. data/test/action_controller/json_api_linked_test.rb +0 -179
  103. data/test/action_controller/rescue_from_test.rb +0 -32
  104. data/test/serializers/urls_test.rb +0 -26
@@ -0,0 +1,116 @@
1
+ require 'test_helper'
2
+ require 'will_paginate/array'
3
+ require 'kaminari'
4
+ require 'kaminari/hooks'
5
+ ::Kaminari::Hooks.init
6
+
7
+ module ActionController
8
+ module Serialization
9
+ class JsonApi
10
+ class PaginationTest < ActionController::TestCase
11
+ KAMINARI_URI = 'http://test.host/action_controller/serialization/json_api/pagination_test/pagination_test/render_pagination_using_kaminari'
12
+ WILL_PAGINATE_URI = 'http://test.host/action_controller/serialization/json_api/pagination_test/pagination_test/render_pagination_using_will_paginate'
13
+
14
+ class PaginationTestController < ActionController::Base
15
+ def setup
16
+ @array = [
17
+ Profile.new({ name: 'Name 1', description: 'Description 1', comments: 'Comments 1' }),
18
+ Profile.new({ name: 'Name 2', description: 'Description 2', comments: 'Comments 2' }),
19
+ Profile.new({ name: 'Name 3', description: 'Description 3', comments: 'Comments 3' })
20
+ ]
21
+ end
22
+
23
+ def using_kaminari
24
+ setup
25
+ Kaminari.paginate_array(@array).page(params[:page][:number]).per(params[:page][:size])
26
+ end
27
+
28
+ def using_will_paginate
29
+ setup
30
+ @array.paginate(page: params[:page][:number], per_page: params[:page][:size])
31
+ end
32
+
33
+ def render_pagination_using_kaminari
34
+ render json: using_kaminari, adapter: :json_api
35
+ end
36
+
37
+ def render_pagination_using_will_paginate
38
+ render json: using_will_paginate, adapter: :json_api
39
+ end
40
+
41
+ def render_array_without_pagination_links
42
+ setup
43
+ render json: @array, adapter: :json_api
44
+ end
45
+ end
46
+
47
+ tests PaginationTestController
48
+
49
+ def test_render_pagination_links_with_will_paginate
50
+ expected_links = { 'self' => "#{WILL_PAGINATE_URI}?page%5Bnumber%5D=2&page%5Bsize%5D=1",
51
+ 'first' => "#{WILL_PAGINATE_URI}?page%5Bnumber%5D=1&page%5Bsize%5D=1",
52
+ 'prev' => "#{WILL_PAGINATE_URI}?page%5Bnumber%5D=1&page%5Bsize%5D=1",
53
+ 'next' => "#{WILL_PAGINATE_URI}?page%5Bnumber%5D=3&page%5Bsize%5D=1",
54
+ 'last' => "#{WILL_PAGINATE_URI}?page%5Bnumber%5D=3&page%5Bsize%5D=1" }
55
+
56
+ get :render_pagination_using_will_paginate, page: { number: 2, size: 1 }
57
+ response = JSON.parse(@response.body)
58
+ assert_equal expected_links, response['links']
59
+ end
60
+
61
+ def test_render_only_last_and_next_pagination_links
62
+ expected_links = { 'self' => "#{WILL_PAGINATE_URI}?page%5Bnumber%5D=1&page%5Bsize%5D=2",
63
+ 'next' => "#{WILL_PAGINATE_URI}?page%5Bnumber%5D=2&page%5Bsize%5D=2",
64
+ 'last' => "#{WILL_PAGINATE_URI}?page%5Bnumber%5D=2&page%5Bsize%5D=2" }
65
+ get :render_pagination_using_will_paginate, page: { number: 1, size: 2 }
66
+ response = JSON.parse(@response.body)
67
+ assert_equal expected_links, response['links']
68
+ end
69
+
70
+ def test_render_pagination_links_with_kaminari
71
+ expected_links = { 'self' => "#{KAMINARI_URI}?page%5Bnumber%5D=2&page%5Bsize%5D=1",
72
+ 'first' => "#{KAMINARI_URI}?page%5Bnumber%5D=1&page%5Bsize%5D=1",
73
+ 'prev' => "#{KAMINARI_URI}?page%5Bnumber%5D=1&page%5Bsize%5D=1",
74
+ 'next' => "#{KAMINARI_URI}?page%5Bnumber%5D=3&page%5Bsize%5D=1",
75
+ 'last' => "#{KAMINARI_URI}?page%5Bnumber%5D=3&page%5Bsize%5D=1" }
76
+ get :render_pagination_using_kaminari, page: { number: 2, size: 1 }
77
+ response = JSON.parse(@response.body)
78
+ assert_equal expected_links, response['links']
79
+ end
80
+
81
+ def test_render_only_prev_and_first_pagination_links
82
+ expected_links = { 'self' => "#{KAMINARI_URI}?page%5Bnumber%5D=3&page%5Bsize%5D=1",
83
+ 'first' => "#{KAMINARI_URI}?page%5Bnumber%5D=1&page%5Bsize%5D=1",
84
+ 'prev' => "#{KAMINARI_URI}?page%5Bnumber%5D=2&page%5Bsize%5D=1" }
85
+ get :render_pagination_using_kaminari, page: { number: 3, size: 1 }
86
+ response = JSON.parse(@response.body)
87
+ assert_equal expected_links, response['links']
88
+ end
89
+
90
+ def test_render_only_last_and_next_pagination_links_with_additional_params
91
+ expected_links = { 'self' => "#{WILL_PAGINATE_URI}?page%5Bnumber%5D=1&page%5Bsize%5D=2&teste=additional",
92
+ 'next' => "#{WILL_PAGINATE_URI}?page%5Bnumber%5D=2&page%5Bsize%5D=2&teste=additional",
93
+ 'last' => "#{WILL_PAGINATE_URI}?page%5Bnumber%5D=2&page%5Bsize%5D=2&teste=additional" }
94
+ get :render_pagination_using_will_paginate, page: { number: 1, size: 2 }, teste: 'additional'
95
+ response = JSON.parse(@response.body)
96
+ assert_equal expected_links, response['links']
97
+ end
98
+
99
+ def test_render_only_prev_and_first_pagination_links_with_additional_params
100
+ expected_links = { 'self' => "#{KAMINARI_URI}?page%5Bnumber%5D=3&page%5Bsize%5D=1&teste=additional",
101
+ 'first' => "#{KAMINARI_URI}?page%5Bnumber%5D=1&page%5Bsize%5D=1&teste=additional",
102
+ 'prev' => "#{KAMINARI_URI}?page%5Bnumber%5D=2&page%5Bsize%5D=1&teste=additional" }
103
+ get :render_pagination_using_kaminari, page: { number: 3, size: 1 }, teste: 'additional'
104
+ response = JSON.parse(@response.body)
105
+ assert_equal expected_links, response['links']
106
+ end
107
+
108
+ def test_array_without_pagination_links
109
+ get :render_array_without_pagination_links, page: { number: 2, size: 1 }
110
+ response = JSON.parse(@response.body)
111
+ refute response.key? 'links'
112
+ end
113
+ end
114
+ end
115
+ end
116
+ end
@@ -4,8 +4,10 @@ require 'pathname'
4
4
  class DefaultScopeNameTest < ActionController::TestCase
5
5
  class UserSerializer < ActiveModel::Serializer
6
6
  attributes :admin?
7
- def admin?
8
- current_user.admin
7
+ ActiveModelSerializers.silence_warnings do
8
+ def admin?
9
+ current_user.admin
10
+ end
9
11
  end
10
12
  end
11
13
 
@@ -23,7 +25,7 @@ class DefaultScopeNameTest < ActionController::TestCase
23
25
  end
24
26
  end
25
27
 
26
- tests UserTestController
28
+ tests UserTestController
27
29
 
28
30
  def test_default_scope_name
29
31
  get :render_new_user
@@ -34,8 +36,10 @@ end
34
36
  class SerializationScopeNameTest < ActionController::TestCase
35
37
  class AdminUserSerializer < ActiveModel::Serializer
36
38
  attributes :admin?
37
- def admin?
38
- current_admin.admin
39
+ ActiveModelSerializers.silence_warnings do
40
+ def admin?
41
+ current_admin.admin
42
+ end
39
43
  end
40
44
  end
41
45
 
@@ -60,4 +64,4 @@ class SerializationScopeNameTest < ActionController::TestCase
60
64
  get :render_new_user
61
65
  assert_equal '{"data":{"id":"1","type":"users","attributes":{"admin?":true}}}', @response.body
62
66
  end
63
- end
67
+ end
@@ -3,73 +3,51 @@ require 'test_helper'
3
3
  module ActionController
4
4
  module Serialization
5
5
  class ImplicitSerializerTest < ActionController::TestCase
6
+ include ActiveSupport::Testing::Stream
6
7
  class ImplicitSerializationTestController < ActionController::Base
7
8
  def render_using_implicit_serializer
8
- @profile = Profile.new({ name: 'Name 1', description: 'Description 1', comments: 'Comments 1' })
9
+ @profile = Profile.new(name: 'Name 1', description: 'Description 1', comments: 'Comments 1')
9
10
  render json: @profile
10
11
  end
11
12
 
12
- def render_using_custom_root
13
- with_adapter ActiveModel::Serializer::Adapter::Json do
14
- @profile = Profile.new({ name: 'Name 1', description: 'Description 1', comments: 'Comments 1' })
15
- render json: @profile, root: "custom_root"
16
- end
17
- end
18
-
19
- def render_using_custom_root_and_meta
20
- with_adapter ActiveModel::Serializer::Adapter::Json do
21
- @profile = Profile.new({ name: 'Name 1', description: 'Description 1', comments: 'Comments 1' })
22
- render json: @profile, root: "custom_root", meta: { total: 10 }
23
- end
13
+ def render_using_default_adapter_root
14
+ @profile = Profile.new(name: 'Name 1', description: 'Description 1', comments: 'Comments 1')
15
+ render json: @profile
24
16
  end
25
17
 
26
- def render_using_default_adapter_root
27
- with_adapter ActiveModel::Serializer::Adapter::JsonApi do
28
- # JSON-API adapter sets root by default
29
- @profile = Profile.new({ name: 'Name 1', description: 'Description 1', comments: 'Comments 1' })
30
- render json: @profile
31
- end
18
+ def render_array_using_custom_root
19
+ @profile = Profile.new(name: 'Name 1', description: 'Description 1', comments: 'Comments 1')
20
+ render json: [@profile], root: 'custom_root'
32
21
  end
33
22
 
34
- def render_using_custom_root_in_adapter_with_a_default
35
- # JSON-API adapter sets root by default
36
- @profile = Profile.new({ name: 'Name 1', description: 'Description 1', comments: 'Comments 1' })
37
- render json: @profile, root: "profile", adapter: :json_api
23
+ def render_array_that_is_empty_using_custom_root
24
+ render json: [], root: 'custom_root'
38
25
  end
39
26
 
40
- def render_array_using_custom_root_and_meta
41
- with_adapter ActiveModel::Serializer::Adapter::Json do
42
- array = [
43
- Profile.new({ name: 'Name 1', description: 'Description 1', comments: 'Comments 1' }),
44
- Profile.new({ name: 'Name 2', description: 'Description 2', comments: 'Comments 2' })
45
- ]
46
- render json: array, root: "custom_root", meta: { total: 10 }
47
- end
27
+ def render_object_using_custom_root
28
+ @profile = Profile.new(name: 'Name 1', description: 'Description 1', comments: 'Comments 1')
29
+ render json: @profile, root: 'custom_root'
48
30
  end
49
31
 
50
32
  def render_array_using_implicit_serializer
51
33
  array = [
52
- Profile.new({ name: 'Name 1', description: 'Description 1', comments: 'Comments 1' }),
53
- Profile.new({ name: 'Name 2', description: 'Description 2', comments: 'Comments 2' })
34
+ Profile.new(name: 'Name 1', description: 'Description 1', comments: 'Comments 1'),
35
+ Profile.new(name: 'Name 2', description: 'Description 2', comments: 'Comments 2')
54
36
  ]
55
37
  render json: array
56
38
  end
57
39
 
58
40
  def render_array_using_implicit_serializer_and_meta
59
- with_adapter ActiveModel::Serializer::Adapter::JsonApi do
60
-
61
- @profiles = [
62
- Profile.new({ name: 'Name 1', description: 'Description 1', comments: 'Comments 1' })
63
- ]
64
-
65
- render json: @profiles, meta: { total: 10 }
66
- end
41
+ @profiles = [
42
+ Profile.new(name: 'Name 1', description: 'Description 1', comments: 'Comments 1')
43
+ ]
44
+ render json: @profiles, meta: { total: 10 }
67
45
  end
68
46
 
69
47
  def render_object_with_cache_enabled
70
- @comment = Comment.new({ id: 1, body: 'ZOMG A COMMENT' })
48
+ @comment = Comment.new(id: 1, body: 'ZOMG A COMMENT')
71
49
  @author = Author.new(id: 1, name: 'Joao Moura.')
72
- @post = Post.new({ id: 1, title: 'New Post', body: 'Body', comments: [@comment], author: @author })
50
+ @post = Post.new(id: 1, title: 'New Post', body: 'Body', comments: [@comment], author: @author)
73
51
 
74
52
  generate_cached_serializer(@post)
75
53
 
@@ -77,17 +55,25 @@ module ActionController
77
55
  render json: @post
78
56
  end
79
57
 
58
+ def render_json_object_without_serializer
59
+ render json: { error: 'Result is Invalid' }
60
+ end
61
+
62
+ def render_json_array_object_without_serializer
63
+ render json: [{ error: 'Result is Invalid' }]
64
+ end
65
+
80
66
  def update_and_render_object_with_cache_enabled
81
- @post.updated_at = DateTime.now
67
+ @post.updated_at = Time.now
82
68
 
83
69
  generate_cached_serializer(@post)
84
70
  render json: @post
85
71
  end
86
72
 
87
73
  def render_object_expired_with_cache_enabled
88
- comment = Comment.new({ id: 1, body: 'ZOMG A COMMENT' })
74
+ comment = Comment.new(id: 1, body: 'ZOMG A COMMENT')
89
75
  author = Author.new(id: 1, name: 'Joao Moura.')
90
- post = Post.new({ id: 1, title: 'New Post', body: 'Body', comments: [comment], author: author })
76
+ post = Post.new(id: 1, title: 'New Post', body: 'Body', comments: [comment], author: author)
91
77
 
92
78
  generate_cached_serializer(post)
93
79
 
@@ -97,16 +83,16 @@ module ActionController
97
83
  end
98
84
 
99
85
  def render_changed_object_with_cache_enabled
100
- comment = Comment.new({ id: 1, body: 'ZOMG A COMMENT' })
86
+ comment = Comment.new(id: 1, body: 'ZOMG A COMMENT')
101
87
  author = Author.new(id: 1, name: 'Joao Moura.')
102
- post = Post.new({ id: 1, title: 'ZOMG a New Post', body: 'Body', comments: [comment], author: author })
88
+ post = Post.new(id: 1, title: 'ZOMG a New Post', body: 'Body', comments: [comment], author: author)
103
89
 
104
90
  render json: post
105
91
  end
106
92
 
107
93
  def render_fragment_changed_object_with_only_cache_enabled
108
94
  author = Author.new(id: 1, name: 'Joao Moura.')
109
- role = Role.new({ id: 42, name: 'ZOMG A ROLE', description: 'DESCRIPTION HERE', author: author })
95
+ role = Role.new(id: 42, name: 'ZOMG A ROLE', description: 'DESCRIPTION HERE', author: author)
110
96
 
111
97
  generate_cached_serializer(role)
112
98
  role.name = 'lol'
@@ -117,7 +103,7 @@ module ActionController
117
103
 
118
104
  def render_fragment_changed_object_with_except_cache_enabled
119
105
  author = Author.new(id: 1, name: 'Joao Moura.')
120
- bio = Bio.new({ id: 42, content: 'ZOMG A ROLE', rating: 5, author: author })
106
+ bio = Bio.new(id: 42, content: 'ZOMG A ROLE', rating: 5, author: author)
121
107
 
122
108
  generate_cached_serializer(bio)
123
109
  bio.content = 'lol'
@@ -127,25 +113,21 @@ module ActionController
127
113
  end
128
114
 
129
115
  def render_fragment_changed_object_with_relationship
130
- comment = Comment.new({ id: 1, body: 'ZOMG A COMMENT' })
131
- author = Author.new(id: 1, name: 'Joao Moura.')
132
- post = Post.new({ id: 1, title: 'New Post', body: 'Body', comments: [comment], author: author })
133
- post2 = Post.new({ id: 1, title: 'New Post2', body: 'Body2', comments: [comment], author: author })
134
- like = Like.new({ id: 1, post: post, time: 3.days.ago })
116
+ comment = Comment.new(id: 1, body: 'ZOMG A COMMENT')
117
+ comment2 = Comment.new(id: 1, body: 'ZOMG AN UPDATED-BUT-NOT-CACHE-EXPIRED COMMENT')
118
+ like = Like.new(id: 1, likeable: comment, time: 3.days.ago)
135
119
 
136
120
  generate_cached_serializer(like)
137
- like.post = post2
138
- like.time = DateTime.now.to_s
121
+ like.likable = comment2
122
+ like.time = Time.zone.now.to_s
139
123
 
140
124
  render json: like
141
125
  end
142
126
 
143
127
  private
128
+
144
129
  def generate_cached_serializer(obj)
145
- serializer_class = ActiveModel::Serializer.serializer_for(obj)
146
- serializer = serializer_class.new(obj)
147
- adapter = ActiveModel::Serializer.adapter.new(serializer)
148
- adapter.to_json
130
+ ActiveModel::SerializableResource.new(obj).to_json
149
131
  end
150
132
 
151
133
  def with_adapter(adapter)
@@ -165,8 +147,8 @@ module ActionController
165
147
  get :render_using_implicit_serializer
166
148
 
167
149
  expected = {
168
- name: "Name 1",
169
- description: "Description 1"
150
+ name: 'Name 1',
151
+ description: 'Description 1'
170
152
  }
171
153
 
172
154
  assert_equal 'application/json', @response.content_type
@@ -174,15 +156,16 @@ module ActionController
174
156
  end
175
157
 
176
158
  def test_render_using_default_root
177
- get :render_using_default_adapter_root
178
-
159
+ with_adapter :json_api do
160
+ get :render_using_default_adapter_root
161
+ end
179
162
  expected = {
180
163
  data: {
181
164
  id: assigns(:profile).id.to_s,
182
- type: "profiles",
165
+ type: 'profiles',
183
166
  attributes: {
184
- name: "Name 1",
185
- description: "Description 1"
167
+ name: 'Name 1',
168
+ description: 'Description 1'
186
169
  }
187
170
  }
188
171
  }
@@ -191,24 +174,51 @@ module ActionController
191
174
  assert_equal expected.to_json, @response.body
192
175
  end
193
176
 
194
- def test_render_using_custom_root_in_adapter_with_a_default
195
- get :render_using_custom_root_in_adapter_with_a_default
177
+ def test_render_array_using_custom_root
178
+ with_adapter :json do
179
+ get :render_array_using_custom_root
180
+ end
181
+ expected = { custom_roots: [{ name: 'Name 1', description: 'Description 1' }] }
182
+ assert_equal 'application/json', @response.content_type
183
+ assert_equal expected.to_json, @response.body
184
+ end
196
185
 
197
- expected = {
198
- data: {
199
- id: assigns(:profile).id.to_s,
200
- type: "profiles",
201
- attributes: {
202
- name: "Name 1",
203
- description: "Description 1"
204
- }
205
- }
206
- }
186
+ def test_render_array_that_is_empty_using_custom_root
187
+ with_adapter :json do
188
+ get :render_array_that_is_empty_using_custom_root
189
+ end
190
+
191
+ expected = { custom_roots: [] }
192
+ assert_equal 'application/json', @response.content_type
193
+ assert_equal expected.to_json, @response.body
194
+ end
195
+
196
+ def test_render_object_using_custom_root
197
+ with_adapter :json do
198
+ get :render_object_using_custom_root
199
+ end
207
200
 
201
+ expected = { custom_root: { name: 'Name 1', description: 'Description 1' } }
208
202
  assert_equal 'application/json', @response.content_type
209
203
  assert_equal expected.to_json, @response.body
210
204
  end
211
205
 
206
+ def test_render_json_object_without_serializer
207
+ get :render_json_object_without_serializer
208
+
209
+ assert_equal 'application/json', @response.content_type
210
+ expected_body = { error: 'Result is Invalid' }
211
+ assert_equal expected_body.to_json, @response.body
212
+ end
213
+
214
+ def test_render_json_array_object_without_serializer
215
+ get :render_json_array_object_without_serializer
216
+
217
+ assert_equal 'application/json', @response.content_type
218
+ expected_body = [{ error: 'Result is Invalid' }]
219
+ assert_equal expected_body.to_json, @response.body
220
+ end
221
+
212
222
  def test_render_array_using_implicit_serializer
213
223
  get :render_array_using_implicit_serializer
214
224
  assert_equal 'application/json', @response.content_type
@@ -216,11 +226,11 @@ module ActionController
216
226
  expected = [
217
227
  {
218
228
  name: 'Name 1',
219
- description: 'Description 1',
229
+ description: 'Description 1'
220
230
  },
221
231
  {
222
232
  name: 'Name 2',
223
- description: 'Description 2',
233
+ description: 'Description 2'
224
234
  }
225
235
  ]
226
236
 
@@ -228,16 +238,17 @@ module ActionController
228
238
  end
229
239
 
230
240
  def test_render_array_using_implicit_serializer_and_meta
231
- get :render_array_using_implicit_serializer_and_meta
232
-
241
+ with_adapter :json_api do
242
+ get :render_array_using_implicit_serializer_and_meta
243
+ end
233
244
  expected = {
234
245
  data: [
235
246
  {
236
247
  id: assigns(:profiles).first.id.to_s,
237
- type: "profiles",
248
+ type: 'profiles',
238
249
  attributes: {
239
- name: "Name 1",
240
- description: "Description 1"
250
+ name: 'Name 1',
251
+ description: 'Description 1'
241
252
  }
242
253
  }
243
254
  ],
@@ -251,9 +262,6 @@ module ActionController
251
262
  end
252
263
 
253
264
  def test_render_with_cache_enable
254
- ActionController::Base.cache_store.clear
255
- get :render_object_with_cache_enabled
256
-
257
265
  expected = {
258
266
  id: 1,
259
267
  title: 'New Post',
@@ -273,11 +281,16 @@ module ActionController
273
281
  }
274
282
  }
275
283
 
276
- assert_equal 'application/json', @response.content_type
277
- assert_equal expected.to_json, @response.body
284
+ ActionController::Base.cache_store.clear
285
+ Timecop.freeze(Time.zone.now) do
286
+ get :render_object_with_cache_enabled
278
287
 
279
- get :render_changed_object_with_cache_enabled
280
- assert_equal expected.to_json, @response.body
288
+ assert_equal 'application/json', @response.content_type
289
+ assert_equal expected.to_json, @response.body
290
+
291
+ get :render_changed_object_with_cache_enabled
292
+ assert_equal expected.to_json, @response.body
293
+ end
281
294
 
282
295
  ActionController::Base.cache_store.clear
283
296
  get :render_changed_object_with_cache_enabled
@@ -317,8 +330,8 @@ module ActionController
317
330
  response = JSON.parse(@response.body)
318
331
 
319
332
  assert_equal 'application/json', @response.content_type
320
- assert_equal 'ZOMG A ROLE', response["name"]
321
- assert_equal 'HUEHUEBRBR', response["description"]
333
+ assert_equal 'ZOMG A ROLE', response['name']
334
+ assert_equal 'HUEHUEBRBR', response['description']
322
335
  end
323
336
 
324
337
  def test_render_with_fragment_except_cache_enable
@@ -327,27 +340,29 @@ module ActionController
327
340
  response = JSON.parse(@response.body)
328
341
 
329
342
  assert_equal 'application/json', @response.content_type
330
- assert_equal 5, response["rating"]
331
- assert_equal 'lol', response["content"]
343
+ assert_equal 5, response['rating']
344
+ assert_equal 'lol', response['content']
332
345
  end
333
346
 
334
347
  def test_render_fragment_changed_object_with_relationship
335
348
  ActionController::Base.cache_store.clear
336
- get :render_fragment_changed_object_with_relationship
337
- response = JSON.parse(@response.body)
338
349
 
339
- expected_return = {
340
- "id"=>1,
341
- "time"=>DateTime.now.to_s,
342
- "post" => {
343
- "id"=>1,
344
- "title"=>"New Post",
345
- "body"=>"Body"
350
+ Timecop.freeze(Time.zone.now) do
351
+ get :render_fragment_changed_object_with_relationship
352
+ response = JSON.parse(@response.body)
353
+
354
+ expected_return = {
355
+ 'id' => 1,
356
+ 'time' => Time.zone.now.to_s,
357
+ 'likeable' => {
358
+ 'id' => 1,
359
+ 'body' => 'ZOMG A COMMENT'
360
+ }
346
361
  }
347
- }
348
362
 
349
- assert_equal 'application/json', @response.content_type
350
- assert_equal expected_return, response
363
+ assert_equal 'application/json', @response.content_type
364
+ assert_equal expected_return, response
365
+ end
351
366
  end
352
367
 
353
368
  def test_cache_expiration_on_update
@@ -364,8 +379,8 @@ module ActionController
364
379
  body: 'ZOMG A COMMENT' }
365
380
  ],
366
381
  blog: {
367
- id:999,
368
- name: "Custom blog"
382
+ id: 999,
383
+ name: 'Custom blog'
369
384
  },
370
385
  author: {
371
386
  id: 1,
@@ -378,6 +393,28 @@ module ActionController
378
393
  assert_equal 'application/json', @response.content_type
379
394
  assert_equal expected.to_json, @response.body
380
395
  end
396
+
397
+ def test_warn_overridding_use_adapter_as_falsy_on_controller_instance
398
+ controller = Class.new(ImplicitSerializationTestController) {
399
+ def use_adapter?
400
+ false
401
+ end
402
+ }.new
403
+ assert_match(/adapter: false/, (capture(:stderr) {
404
+ controller.get_serializer(Profile.new)
405
+ }))
406
+ end
407
+
408
+ def test_dont_warn_overridding_use_adapter_as_truthy_on_controller_instance
409
+ controller = Class.new(ImplicitSerializationTestController) {
410
+ def use_adapter?
411
+ true
412
+ end
413
+ }.new
414
+ assert_equal '', (capture(:stderr) {
415
+ controller.get_serializer(Profile.new)
416
+ })
417
+ end
381
418
  end
382
419
  end
383
420
  end