active_model_serializers 0.10.3 → 0.10.12

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.
Files changed (224) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +154 -2
  3. data/README.md +153 -15
  4. data/lib/action_controller/serialization.rb +11 -1
  5. data/lib/active_model/serializable_resource.rb +2 -0
  6. data/lib/active_model/serializer.rb +275 -81
  7. data/lib/active_model/serializer/adapter.rb +2 -0
  8. data/lib/active_model/serializer/adapter/attributes.rb +2 -0
  9. data/lib/active_model/serializer/adapter/base.rb +2 -0
  10. data/lib/active_model/serializer/adapter/json.rb +2 -0
  11. data/lib/active_model/serializer/adapter/json_api.rb +2 -0
  12. data/lib/active_model/serializer/adapter/null.rb +2 -0
  13. data/lib/active_model/serializer/array_serializer.rb +2 -0
  14. data/lib/active_model/serializer/association.rb +53 -14
  15. data/lib/active_model/serializer/attribute.rb +2 -0
  16. data/lib/active_model/serializer/belongs_to_reflection.rb +7 -1
  17. data/lib/active_model/serializer/collection_serializer.rb +8 -5
  18. data/lib/active_model/serializer/concerns/caching.rb +36 -23
  19. data/lib/active_model/serializer/error_serializer.rb +2 -0
  20. data/lib/active_model/serializer/errors_serializer.rb +2 -0
  21. data/lib/active_model/serializer/field.rb +2 -0
  22. data/lib/active_model/serializer/fieldset.rb +3 -1
  23. data/lib/active_model/serializer/has_many_reflection.rb +6 -1
  24. data/lib/active_model/serializer/has_one_reflection.rb +3 -1
  25. data/lib/active_model/serializer/lazy_association.rb +99 -0
  26. data/lib/active_model/serializer/link.rb +23 -0
  27. data/lib/active_model/serializer/lint.rb +2 -0
  28. data/lib/active_model/serializer/null.rb +2 -0
  29. data/lib/active_model/serializer/reflection.rb +122 -73
  30. data/lib/active_model/serializer/version.rb +3 -1
  31. data/lib/active_model_serializers.rb +29 -11
  32. data/lib/active_model_serializers/adapter.rb +3 -1
  33. data/lib/active_model_serializers/adapter/attributes.rb +23 -0
  34. data/lib/active_model_serializers/adapter/base.rb +4 -2
  35. data/lib/active_model_serializers/adapter/json.rb +2 -0
  36. data/lib/active_model_serializers/adapter/json_api.rb +44 -26
  37. data/lib/active_model_serializers/adapter/json_api/deserialization.rb +4 -2
  38. data/lib/active_model_serializers/adapter/json_api/error.rb +2 -0
  39. data/lib/active_model_serializers/adapter/json_api/jsonapi.rb +2 -0
  40. data/lib/active_model_serializers/adapter/json_api/link.rb +2 -0
  41. data/lib/active_model_serializers/adapter/json_api/meta.rb +2 -0
  42. data/lib/active_model_serializers/adapter/json_api/pagination_links.rb +42 -21
  43. data/lib/active_model_serializers/adapter/json_api/relationship.rb +52 -9
  44. data/lib/active_model_serializers/adapter/json_api/resource_identifier.rb +35 -18
  45. data/lib/active_model_serializers/adapter/null.rb +2 -0
  46. data/lib/active_model_serializers/callbacks.rb +2 -0
  47. data/lib/active_model_serializers/deprecate.rb +2 -0
  48. data/lib/active_model_serializers/deserialization.rb +2 -0
  49. data/lib/active_model_serializers/json_pointer.rb +2 -0
  50. data/lib/active_model_serializers/logging.rb +2 -0
  51. data/lib/active_model_serializers/lookup_chain.rb +2 -0
  52. data/lib/active_model_serializers/model.rb +111 -30
  53. data/lib/active_model_serializers/model/caching.rb +25 -0
  54. data/lib/active_model_serializers/railtie.rb +4 -0
  55. data/lib/active_model_serializers/register_jsonapi_renderer.rb +2 -0
  56. data/lib/active_model_serializers/serializable_resource.rb +4 -2
  57. data/lib/active_model_serializers/serialization_context.rb +2 -0
  58. data/lib/active_model_serializers/test.rb +2 -0
  59. data/lib/active_model_serializers/test/schema.rb +4 -2
  60. data/lib/active_model_serializers/test/serializer.rb +2 -0
  61. data/lib/generators/rails/resource_override.rb +3 -1
  62. data/lib/generators/rails/serializer_generator.rb +2 -0
  63. data/lib/grape/active_model_serializers.rb +2 -0
  64. data/lib/grape/formatters/active_model_serializers.rb +2 -0
  65. data/lib/grape/helpers/active_model_serializers.rb +2 -0
  66. data/lib/tasks/rubocop.rake +55 -0
  67. metadata +74 -291
  68. data/.github/ISSUE_TEMPLATE.md +0 -29
  69. data/.github/PULL_REQUEST_TEMPLATE.md +0 -15
  70. data/.gitignore +0 -35
  71. data/.rubocop.yml +0 -102
  72. data/.simplecov +0 -110
  73. data/.travis.yml +0 -51
  74. data/CODE_OF_CONDUCT.md +0 -74
  75. data/CONTRIBUTING.md +0 -105
  76. data/Gemfile +0 -56
  77. data/Rakefile +0 -103
  78. data/active_model_serializers.gemspec +0 -62
  79. data/appveyor.yml +0 -24
  80. data/bin/bench +0 -171
  81. data/bin/bench_regression +0 -316
  82. data/bin/serve_benchmark +0 -39
  83. data/docs/ARCHITECTURE.md +0 -125
  84. data/docs/README.md +0 -42
  85. data/docs/STYLE.md +0 -58
  86. data/docs/general/adapters.md +0 -247
  87. data/docs/general/caching.md +0 -58
  88. data/docs/general/configuration_options.md +0 -169
  89. data/docs/general/deserialization.md +0 -100
  90. data/docs/general/fields.md +0 -31
  91. data/docs/general/getting_started.md +0 -133
  92. data/docs/general/instrumentation.md +0 -40
  93. data/docs/general/key_transforms.md +0 -40
  94. data/docs/general/logging.md +0 -14
  95. data/docs/general/rendering.md +0 -294
  96. data/docs/general/serializers.md +0 -461
  97. data/docs/how-open-source-maintained.jpg +0 -0
  98. data/docs/howto/add_pagination_links.md +0 -138
  99. data/docs/howto/add_relationship_links.md +0 -137
  100. data/docs/howto/add_root_key.md +0 -55
  101. data/docs/howto/grape_integration.md +0 -42
  102. data/docs/howto/outside_controller_use.md +0 -65
  103. data/docs/howto/passing_arbitrary_options.md +0 -27
  104. data/docs/howto/serialize_poro.md +0 -32
  105. data/docs/howto/test.md +0 -154
  106. data/docs/howto/upgrade_from_0_8_to_0_10.md +0 -265
  107. data/docs/integrations/ember-and-json-api.md +0 -144
  108. data/docs/integrations/grape.md +0 -19
  109. data/docs/jsonapi/errors.md +0 -56
  110. data/docs/jsonapi/schema.md +0 -151
  111. data/docs/jsonapi/schema/schema.json +0 -366
  112. data/docs/rfcs/0000-namespace.md +0 -106
  113. data/docs/rfcs/template.md +0 -15
  114. data/lib/active_model/serializer/collection_reflection.rb +0 -7
  115. data/lib/active_model/serializer/concerns/associations.rb +0 -102
  116. data/lib/active_model/serializer/concerns/attributes.rb +0 -82
  117. data/lib/active_model/serializer/concerns/configuration.rb +0 -59
  118. data/lib/active_model/serializer/concerns/links.rb +0 -35
  119. data/lib/active_model/serializer/concerns/meta.rb +0 -29
  120. data/lib/active_model/serializer/concerns/type.rb +0 -25
  121. data/lib/active_model/serializer/singular_reflection.rb +0 -7
  122. data/lib/active_model_serializers/key_transform.rb +0 -74
  123. data/test/action_controller/adapter_selector_test.rb +0 -53
  124. data/test/action_controller/explicit_serializer_test.rb +0 -135
  125. data/test/action_controller/json/include_test.rb +0 -246
  126. data/test/action_controller/json_api/deserialization_test.rb +0 -112
  127. data/test/action_controller/json_api/errors_test.rb +0 -40
  128. data/test/action_controller/json_api/fields_test.rb +0 -57
  129. data/test/action_controller/json_api/linked_test.rb +0 -202
  130. data/test/action_controller/json_api/pagination_test.rb +0 -116
  131. data/test/action_controller/json_api/transform_test.rb +0 -181
  132. data/test/action_controller/lookup_proc_test.rb +0 -49
  133. data/test/action_controller/namespace_lookup_test.rb +0 -226
  134. data/test/action_controller/serialization_scope_name_test.rb +0 -229
  135. data/test/action_controller/serialization_test.rb +0 -472
  136. data/test/active_model_serializers/adapter_for_test.rb +0 -208
  137. data/test/active_model_serializers/json_pointer_test.rb +0 -22
  138. data/test/active_model_serializers/key_transform_test.rb +0 -297
  139. data/test/active_model_serializers/logging_test.rb +0 -77
  140. data/test/active_model_serializers/model_test.rb +0 -22
  141. data/test/active_model_serializers/railtie_test_isolated.rb +0 -63
  142. data/test/active_model_serializers/register_jsonapi_renderer_test_isolated.rb +0 -143
  143. data/test/active_model_serializers/serialization_context_test_isolated.rb +0 -71
  144. data/test/active_model_serializers/test/schema_test.rb +0 -130
  145. data/test/active_model_serializers/test/serializer_test.rb +0 -62
  146. data/test/active_record_test.rb +0 -9
  147. data/test/adapter/attributes_test.rb +0 -43
  148. data/test/adapter/deprecation_test.rb +0 -100
  149. data/test/adapter/json/belongs_to_test.rb +0 -45
  150. data/test/adapter/json/collection_test.rb +0 -104
  151. data/test/adapter/json/has_many_test.rb +0 -45
  152. data/test/adapter/json/transform_test.rb +0 -93
  153. data/test/adapter/json_api/belongs_to_test.rb +0 -155
  154. data/test/adapter/json_api/collection_test.rb +0 -96
  155. data/test/adapter/json_api/errors_test.rb +0 -76
  156. data/test/adapter/json_api/fields_test.rb +0 -88
  157. data/test/adapter/json_api/has_many_embed_ids_test.rb +0 -43
  158. data/test/adapter/json_api/has_many_explicit_serializer_test.rb +0 -96
  159. data/test/adapter/json_api/has_many_test.rb +0 -165
  160. data/test/adapter/json_api/has_one_test.rb +0 -80
  161. data/test/adapter/json_api/include_data_if_sideloaded_test.rb +0 -166
  162. data/test/adapter/json_api/json_api_test.rb +0 -33
  163. data/test/adapter/json_api/linked_test.rb +0 -413
  164. data/test/adapter/json_api/links_test.rb +0 -95
  165. data/test/adapter/json_api/pagination_links_test.rb +0 -193
  166. data/test/adapter/json_api/parse_test.rb +0 -137
  167. data/test/adapter/json_api/relationship_test.rb +0 -397
  168. data/test/adapter/json_api/resource_identifier_test.rb +0 -110
  169. data/test/adapter/json_api/resource_meta_test.rb +0 -100
  170. data/test/adapter/json_api/toplevel_jsonapi_test.rb +0 -82
  171. data/test/adapter/json_api/transform_test.rb +0 -504
  172. data/test/adapter/json_api/type_test.rb +0 -61
  173. data/test/adapter/json_test.rb +0 -46
  174. data/test/adapter/null_test.rb +0 -22
  175. data/test/adapter/polymorphic_test.rb +0 -171
  176. data/test/adapter_test.rb +0 -67
  177. data/test/array_serializer_test.rb +0 -22
  178. data/test/benchmark/app.rb +0 -65
  179. data/test/benchmark/benchmarking_support.rb +0 -67
  180. data/test/benchmark/bm_active_record.rb +0 -81
  181. data/test/benchmark/bm_adapter.rb +0 -38
  182. data/test/benchmark/bm_caching.rb +0 -119
  183. data/test/benchmark/bm_lookup_chain.rb +0 -83
  184. data/test/benchmark/bm_transform.rb +0 -45
  185. data/test/benchmark/config.ru +0 -3
  186. data/test/benchmark/controllers.rb +0 -83
  187. data/test/benchmark/fixtures.rb +0 -219
  188. data/test/cache_test.rb +0 -579
  189. data/test/collection_serializer_test.rb +0 -110
  190. data/test/fixtures/active_record.rb +0 -78
  191. data/test/fixtures/poro.rb +0 -286
  192. data/test/generators/scaffold_controller_generator_test.rb +0 -24
  193. data/test/generators/serializer_generator_test.rb +0 -74
  194. data/test/grape_test.rb +0 -178
  195. data/test/lint_test.rb +0 -49
  196. data/test/logger_test.rb +0 -20
  197. data/test/poro_test.rb +0 -9
  198. data/test/serializable_resource_test.rb +0 -79
  199. data/test/serializers/association_macros_test.rb +0 -37
  200. data/test/serializers/associations_test.rb +0 -370
  201. data/test/serializers/attribute_test.rb +0 -151
  202. data/test/serializers/attributes_test.rb +0 -52
  203. data/test/serializers/caching_configuration_test_isolated.rb +0 -170
  204. data/test/serializers/configuration_test.rb +0 -32
  205. data/test/serializers/fieldset_test.rb +0 -14
  206. data/test/serializers/meta_test.rb +0 -202
  207. data/test/serializers/options_test.rb +0 -21
  208. data/test/serializers/read_attribute_for_serialization_test.rb +0 -79
  209. data/test/serializers/root_test.rb +0 -21
  210. data/test/serializers/serialization_test.rb +0 -55
  211. data/test/serializers/serializer_for_test.rb +0 -136
  212. data/test/serializers/serializer_for_with_namespace_test.rb +0 -87
  213. data/test/support/custom_schemas/active_model_serializers/test/schema_test/my/index.json +0 -6
  214. data/test/support/isolated_unit.rb +0 -82
  215. data/test/support/rails5_shims.rb +0 -53
  216. data/test/support/rails_app.rb +0 -36
  217. data/test/support/schemas/active_model_serializers/test/schema_test/my/index.json +0 -6
  218. data/test/support/schemas/active_model_serializers/test/schema_test/my/show.json +0 -6
  219. data/test/support/schemas/custom/show.json +0 -7
  220. data/test/support/schemas/hyper_schema.json +0 -93
  221. data/test/support/schemas/render_using_json_api.json +0 -43
  222. data/test/support/schemas/simple_json_pointers.json +0 -10
  223. data/test/support/serialization_testing.rb +0 -71
  224. data/test/test_helper.rb +0 -58
@@ -1,229 +0,0 @@
1
- require 'test_helper'
2
-
3
- module SerializationScopeTesting
4
- class User < ActiveModelSerializers::Model
5
- attr_accessor :id, :name, :admin
6
- def admin?
7
- admin
8
- end
9
- end
10
- class Comment < ActiveModelSerializers::Model
11
- attr_accessor :id, :body
12
- end
13
- class Post < ActiveModelSerializers::Model
14
- attr_accessor :id, :title, :body, :comments
15
- end
16
- class PostSerializer < ActiveModel::Serializer
17
- attributes :id, :title, :body, :comments
18
-
19
- def body
20
- "The 'scope' is the 'current_user': #{scope == current_user}"
21
- end
22
-
23
- def comments
24
- if current_user.admin?
25
- [Comment.new(id: 1, body: 'Admin')]
26
- else
27
- [Comment.new(id: 2, body: 'Scoped')]
28
- end
29
- end
30
-
31
- def json_key
32
- 'post'
33
- end
34
- end
35
- class PostTestController < ActionController::Base
36
- attr_accessor :current_user
37
- def render_post_by_non_admin
38
- self.current_user = User.new(id: 3, name: 'Pete', admin: false)
39
- render json: new_post, serializer: serializer, adapter: :json
40
- end
41
-
42
- def render_post_by_admin
43
- self.current_user = User.new(id: 3, name: 'Pete', admin: true)
44
- render json: new_post, serializer: serializer, adapter: :json
45
- end
46
-
47
- private
48
-
49
- def new_post
50
- Post.new(id: 4, title: 'Title')
51
- end
52
-
53
- def serializer
54
- PostSerializer
55
- end
56
- end
57
- class PostViewContextSerializer < PostSerializer
58
- def body
59
- "The 'scope' is the 'view_context': #{scope == view_context}"
60
- end
61
-
62
- def comments
63
- if view_context.controller.current_user.admin?
64
- [Comment.new(id: 1, body: 'Admin')]
65
- else
66
- [Comment.new(id: 2, body: 'Scoped')]
67
- end
68
- end
69
- end
70
- class DefaultScopeTest < ActionController::TestCase
71
- tests PostTestController
72
-
73
- def test_default_serialization_scope
74
- assert_equal :current_user, @controller._serialization_scope
75
- end
76
-
77
- def test_default_serialization_scope_object
78
- assert_equal @controller.current_user, @controller.serialization_scope
79
- end
80
-
81
- def test_default_scope_non_admin
82
- get :render_post_by_non_admin
83
- expected_json = {
84
- post: {
85
- id: 4,
86
- title: 'Title',
87
- body: "The 'scope' is the 'current_user': true",
88
- comments: [
89
- { id: 2, body: 'Scoped' }
90
- ]
91
- }
92
- }.to_json
93
- assert_equal expected_json, @response.body
94
- end
95
-
96
- def test_default_scope_admin
97
- get :render_post_by_admin
98
- expected_json = {
99
- post: {
100
- id: 4,
101
- title: 'Title',
102
- body: "The 'scope' is the 'current_user': true",
103
- comments: [
104
- { id: 1, body: 'Admin' }
105
- ]
106
- }
107
- }.to_json
108
- assert_equal expected_json, @response.body
109
- end
110
- end
111
- class SerializationScopeTest < ActionController::TestCase
112
- class PostViewContextTestController < PostTestController
113
- serialization_scope :view_context
114
-
115
- private
116
-
117
- def serializer
118
- PostViewContextSerializer
119
- end
120
- end
121
- tests PostViewContextTestController
122
-
123
- def test_defined_serialization_scope
124
- assert_equal :view_context, @controller._serialization_scope
125
- end
126
-
127
- def test_defined_serialization_scope_object
128
- assert_equal @controller.view_context.class, @controller.serialization_scope.class
129
- end
130
-
131
- def test_serialization_scope_non_admin
132
- get :render_post_by_non_admin
133
- expected_json = {
134
- post: {
135
- id: 4,
136
- title: 'Title',
137
- body: "The 'scope' is the 'view_context': true",
138
- comments: [
139
- { id: 2, body: 'Scoped' }
140
- ]
141
- }
142
- }.to_json
143
- assert_equal expected_json, @response.body
144
- end
145
-
146
- def test_serialization_scope_admin
147
- get :render_post_by_admin
148
- expected_json = {
149
- post: {
150
- id: 4,
151
- title: 'Title',
152
- body: "The 'scope' is the 'view_context': true",
153
- comments: [
154
- { id: 1, body: 'Admin' }
155
- ]
156
- }
157
- }.to_json
158
- assert_equal expected_json, @response.body
159
- end
160
- end
161
- class NilSerializationScopeTest < ActionController::TestCase
162
- class PostViewContextTestController < ActionController::Base
163
- serialization_scope nil
164
-
165
- attr_accessor :current_user
166
-
167
- def render_post_with_no_scope
168
- self.current_user = User.new(id: 3, name: 'Pete', admin: false)
169
- render json: new_post, serializer: PostSerializer, adapter: :json
170
- end
171
-
172
- def render_post_with_passed_in_scope
173
- self.current_user = User.new(id: 3, name: 'Pete', admin: false)
174
- render json: new_post, serializer: PostSerializer, adapter: :json, scope: current_user, scope_name: :current_user
175
- end
176
-
177
- def render_post_with_passed_in_scope_without_scope_name
178
- self.current_user = User.new(id: 3, name: 'Pete', admin: false)
179
- render json: new_post, serializer: PostSerializer, adapter: :json, scope: current_user
180
- end
181
-
182
- private
183
-
184
- def new_post
185
- Post.new(id: 4, title: 'Title')
186
- end
187
- end
188
- tests PostViewContextTestController
189
-
190
- def test_nil_serialization_scope
191
- assert_nil @controller._serialization_scope
192
- end
193
-
194
- def test_nil_serialization_scope_object
195
- assert_nil @controller.serialization_scope
196
- end
197
-
198
- def test_nil_scope
199
- exception_matcher = /current_user/
200
- exception = assert_raises(NameError) do
201
- get :render_post_with_no_scope
202
- end
203
- assert_match exception_matcher, exception.message
204
- end
205
-
206
- def test_serialization_scope_is_and_nil_scope_passed_in_current_user
207
- get :render_post_with_passed_in_scope
208
- expected_json = {
209
- post: {
210
- id: 4,
211
- title: 'Title',
212
- body: "The 'scope' is the 'current_user': true",
213
- comments: [
214
- { id: 2, body: 'Scoped' }
215
- ]
216
- }
217
- }.to_json
218
- assert_equal expected_json, @response.body
219
- end
220
-
221
- def test_serialization_scope_is_nil_and_scope_passed_in_current_user_without_scope_name
222
- exception_matcher = /current_user/
223
- exception = assert_raises(NameError) do
224
- get :render_post_with_passed_in_scope_without_scope_name
225
- end
226
- assert_match exception_matcher, exception.message
227
- end
228
- end
229
- end
@@ -1,472 +0,0 @@
1
- require 'test_helper'
2
-
3
- module ActionController
4
- module Serialization
5
- class ImplicitSerializerTest < ActionController::TestCase
6
- class ImplicitSerializationTestController < ActionController::Base
7
- include SerializationTesting
8
- def render_using_implicit_serializer
9
- @profile = Profile.new(name: 'Name 1', description: 'Description 1', comments: 'Comments 1')
10
- render json: @profile
11
- end
12
-
13
- def render_using_default_adapter_root
14
- @profile = Profile.new(name: 'Name 1', description: 'Description 1', comments: 'Comments 1')
15
- render json: @profile
16
- end
17
-
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'
21
- end
22
-
23
- def render_array_that_is_empty_using_custom_root
24
- render json: [], root: 'custom_root'
25
- end
26
-
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'
30
- end
31
-
32
- def render_array_using_implicit_serializer
33
- array = [
34
- Profile.new(name: 'Name 1', description: 'Description 1', comments: 'Comments 1'),
35
- Profile.new(name: 'Name 2', description: 'Description 2', comments: 'Comments 2')
36
- ]
37
- render json: array
38
- end
39
-
40
- def render_array_using_implicit_serializer_and_meta
41
- @profiles = [
42
- Profile.new(name: 'Name 1', description: 'Description 1', comments: 'Comments 1')
43
- ]
44
- render json: @profiles, meta: { total: 10 }
45
- end
46
-
47
- def render_array_using_implicit_serializer_and_links
48
- with_adapter ActiveModelSerializers::Adapter::JsonApi do
49
- @profiles = [
50
- Profile.new(name: 'Name 1', description: 'Description 1', comments: 'Comments 1')
51
- ]
52
-
53
- render json: @profiles, links: { self: 'http://example.com/api/profiles/1' }
54
- end
55
- end
56
-
57
- def render_object_with_cache_enabled
58
- @comment = Comment.new(id: 1, body: 'ZOMG A COMMENT')
59
- @author = Author.new(id: 1, name: 'Joao Moura.')
60
- @post = Post.new(id: 1, title: 'New Post', body: 'Body', comments: [@comment], author: @author)
61
-
62
- generate_cached_serializer(@post)
63
-
64
- @post.title = 'ZOMG a New Post'
65
- render json: @post
66
- end
67
-
68
- def render_json_object_without_serializer
69
- render json: { error: 'Result is Invalid' }
70
- end
71
-
72
- def render_json_array_object_without_serializer
73
- render json: [{ error: 'Result is Invalid' }]
74
- end
75
-
76
- def update_and_render_object_with_cache_enabled
77
- @post.updated_at = Time.zone.now
78
-
79
- generate_cached_serializer(@post)
80
- render json: @post
81
- end
82
-
83
- def render_object_expired_with_cache_enabled
84
- comment = Comment.new(id: 1, body: 'ZOMG A COMMENT')
85
- author = Author.new(id: 1, name: 'Joao Moura.')
86
- post = Post.new(id: 1, title: 'New Post', body: 'Body', comments: [comment], author: author)
87
-
88
- generate_cached_serializer(post)
89
-
90
- post.title = 'ZOMG a New Post'
91
-
92
- expires_in = [
93
- PostSerializer._cache_options[:expires_in],
94
- CommentSerializer._cache_options[:expires_in]
95
- ].max + 200
96
-
97
- Timecop.travel(Time.zone.now + expires_in) do
98
- render json: post
99
- end
100
- end
101
-
102
- def render_changed_object_with_cache_enabled
103
- comment = Comment.new(id: 1, body: 'ZOMG A COMMENT')
104
- author = Author.new(id: 1, name: 'Joao Moura.')
105
- post = Post.new(id: 1, title: 'ZOMG a New Post', body: 'Body', comments: [comment], author: author)
106
-
107
- render json: post
108
- end
109
-
110
- def render_fragment_changed_object_with_only_cache_enabled
111
- author = Author.new(id: 1, name: 'Joao Moura.')
112
- role = Role.new(id: 42, name: 'ZOMG A ROLE', description: 'DESCRIPTION HERE', author: author)
113
-
114
- generate_cached_serializer(role)
115
- role.name = 'lol'
116
- role.description = 'HUEHUEBRBR'
117
-
118
- render json: role
119
- end
120
-
121
- def render_fragment_changed_object_with_except_cache_enabled
122
- author = Author.new(id: 1, name: 'Joao Moura.')
123
- bio = Bio.new(id: 42, content: 'ZOMG A ROLE', rating: 5, author: author)
124
-
125
- generate_cached_serializer(bio)
126
- bio.content = 'lol'
127
- bio.rating = 0
128
-
129
- render json: bio
130
- end
131
-
132
- def render_fragment_changed_object_with_relationship
133
- comment = Comment.new(id: 1, body: 'ZOMG A COMMENT')
134
- comment2 = Comment.new(id: 1, body: 'ZOMG AN UPDATED-BUT-NOT-CACHE-EXPIRED COMMENT')
135
- like = Like.new(id: 1, likeable: comment, time: 3.days.ago)
136
-
137
- generate_cached_serializer(like)
138
- like.likable = comment2
139
- like.time = Time.zone.now.to_s
140
-
141
- render json: like
142
- end
143
- end
144
-
145
- tests ImplicitSerializationTestController
146
-
147
- # We just have Null for now, this will change
148
- def test_render_using_implicit_serializer
149
- get :render_using_implicit_serializer
150
-
151
- expected = {
152
- name: 'Name 1',
153
- description: 'Description 1'
154
- }
155
-
156
- assert_equal 'application/json', @response.content_type
157
- assert_equal expected.to_json, @response.body
158
- end
159
-
160
- def test_render_using_default_root
161
- with_adapter :json_api do
162
- get :render_using_default_adapter_root
163
- end
164
- expected = {
165
- data: {
166
- id: @controller.instance_variable_get(:@profile).id.to_s,
167
- type: 'profiles',
168
- attributes: {
169
- name: 'Name 1',
170
- description: 'Description 1'
171
- }
172
- }
173
- }
174
-
175
- assert_equal 'application/json', @response.content_type
176
- assert_equal expected.to_json, @response.body
177
- end
178
-
179
- def test_render_array_using_custom_root
180
- with_adapter :json do
181
- get :render_array_using_custom_root
182
- end
183
- expected = { custom_root: [{ name: 'Name 1', description: 'Description 1' }] }
184
- assert_equal 'application/json', @response.content_type
185
- assert_equal expected.to_json, @response.body
186
- end
187
-
188
- def test_render_array_that_is_empty_using_custom_root
189
- with_adapter :json do
190
- get :render_array_that_is_empty_using_custom_root
191
- end
192
-
193
- expected = { custom_root: [] }
194
- assert_equal 'application/json', @response.content_type
195
- assert_equal expected.to_json, @response.body
196
- end
197
-
198
- def test_render_object_using_custom_root
199
- with_adapter :json do
200
- get :render_object_using_custom_root
201
- end
202
-
203
- expected = { custom_root: { name: 'Name 1', description: 'Description 1' } }
204
- assert_equal 'application/json', @response.content_type
205
- assert_equal expected.to_json, @response.body
206
- end
207
-
208
- def test_render_json_object_without_serializer
209
- get :render_json_object_without_serializer
210
-
211
- assert_equal 'application/json', @response.content_type
212
- expected_body = { error: 'Result is Invalid' }
213
- assert_equal expected_body.to_json, @response.body
214
- end
215
-
216
- def test_render_json_array_object_without_serializer
217
- get :render_json_array_object_without_serializer
218
-
219
- assert_equal 'application/json', @response.content_type
220
- expected_body = [{ error: 'Result is Invalid' }]
221
- assert_equal expected_body.to_json, @response.body
222
- end
223
-
224
- def test_render_array_using_implicit_serializer
225
- get :render_array_using_implicit_serializer
226
- assert_equal 'application/json', @response.content_type
227
-
228
- expected = [
229
- {
230
- name: 'Name 1',
231
- description: 'Description 1'
232
- },
233
- {
234
- name: 'Name 2',
235
- description: 'Description 2'
236
- }
237
- ]
238
-
239
- assert_equal expected.to_json, @response.body
240
- end
241
-
242
- def test_render_array_using_implicit_serializer_and_meta
243
- with_adapter :json_api do
244
- get :render_array_using_implicit_serializer_and_meta
245
- end
246
- expected = {
247
- data: [
248
- {
249
- id: @controller.instance_variable_get(:@profiles).first.id.to_s,
250
- type: 'profiles',
251
- attributes: {
252
- name: 'Name 1',
253
- description: 'Description 1'
254
- }
255
- }
256
- ],
257
- meta: {
258
- total: 10
259
- }
260
- }
261
-
262
- assert_equal 'application/json', @response.content_type
263
- assert_equal expected.to_json, @response.body
264
- end
265
-
266
- def test_render_array_using_implicit_serializer_and_links
267
- get :render_array_using_implicit_serializer_and_links
268
-
269
- expected = {
270
- data: [
271
- {
272
- id: @controller.instance_variable_get(:@profiles).first.id.to_s,
273
- type: 'profiles',
274
- attributes: {
275
- name: 'Name 1',
276
- description: 'Description 1'
277
- }
278
- }
279
- ],
280
- links: {
281
- self: 'http://example.com/api/profiles/1'
282
- }
283
- }
284
-
285
- assert_equal 'application/json', @response.content_type
286
- assert_equal expected.to_json, @response.body
287
- end
288
-
289
- def test_render_with_cache_enable
290
- expected = {
291
- id: 1,
292
- title: 'New Post',
293
- body: 'Body',
294
- comments: [
295
- {
296
- id: 1,
297
- body: 'ZOMG A COMMENT'
298
- }
299
- ],
300
- blog: {
301
- id: 999,
302
- name: 'Custom blog'
303
- },
304
- author: {
305
- id: 1,
306
- name: 'Joao Moura.'
307
- }
308
- }
309
-
310
- ActionController::Base.cache_store.clear
311
- Timecop.freeze(Time.zone.now) do
312
- get :render_object_with_cache_enabled
313
-
314
- assert_equal 'application/json', @response.content_type
315
- assert_equal expected.to_json, @response.body
316
-
317
- get :render_changed_object_with_cache_enabled
318
- assert_equal expected.to_json, @response.body
319
- end
320
-
321
- ActionController::Base.cache_store.clear
322
- get :render_changed_object_with_cache_enabled
323
- assert_not_equal expected.to_json, @response.body
324
- end
325
-
326
- def test_render_with_cache_enable_and_expired
327
- ActionController::Base.cache_store.clear
328
- get :render_object_expired_with_cache_enabled
329
-
330
- expected = {
331
- id: 1,
332
- title: 'ZOMG a New Post',
333
- body: 'Body',
334
- comments: [
335
- {
336
- id: 1,
337
- body: 'ZOMG A COMMENT'
338
- }
339
- ],
340
- blog: {
341
- id: 999,
342
- name: 'Custom blog'
343
- },
344
- author: {
345
- id: 1,
346
- name: 'Joao Moura.'
347
- }
348
- }
349
-
350
- assert_equal 'application/json', @response.content_type
351
- actual = @response.body
352
- expected = expected.to_json
353
- if ENV['APPVEYOR'] && actual != expected
354
- skip('Cache expiration tests sometimes fail on Appveyor. FIXME :)')
355
- else
356
- assert_equal actual, expected
357
- end
358
- end
359
-
360
- def test_render_with_fragment_only_cache_enable
361
- ActionController::Base.cache_store.clear
362
- get :render_fragment_changed_object_with_only_cache_enabled
363
- response = JSON.parse(@response.body)
364
-
365
- assert_equal 'application/json', @response.content_type
366
- assert_equal 'ZOMG A ROLE', response['name']
367
- assert_equal 'HUEHUEBRBR', response['description']
368
- end
369
-
370
- def test_render_with_fragment_except_cache_enable
371
- ActionController::Base.cache_store.clear
372
- get :render_fragment_changed_object_with_except_cache_enabled
373
- response = JSON.parse(@response.body)
374
-
375
- assert_equal 'application/json', @response.content_type
376
- assert_equal 5, response['rating']
377
- assert_equal 'lol', response['content']
378
- end
379
-
380
- def test_render_fragment_changed_object_with_relationship
381
- ActionController::Base.cache_store.clear
382
-
383
- Timecop.freeze(Time.zone.now) do
384
- get :render_fragment_changed_object_with_relationship
385
- response = JSON.parse(@response.body)
386
-
387
- expected_return = {
388
- 'id' => 1,
389
- 'time' => Time.zone.now.to_s,
390
- 'likeable' => {
391
- 'id' => 1,
392
- 'body' => 'ZOMG A COMMENT'
393
- }
394
- }
395
-
396
- assert_equal 'application/json', @response.content_type
397
- assert_equal expected_return, response
398
- end
399
- end
400
-
401
- def test_cache_expiration_on_update
402
- ActionController::Base.cache_store.clear
403
- get :render_object_with_cache_enabled
404
-
405
- expected = {
406
- id: 1,
407
- title: 'ZOMG a New Post',
408
- body: 'Body',
409
- comments: [
410
- {
411
- id: 1,
412
- body: 'ZOMG A COMMENT'
413
- }
414
- ],
415
- blog: {
416
- id: 999,
417
- name: 'Custom blog'
418
- },
419
- author: {
420
- id: 1,
421
- name: 'Joao Moura.'
422
- }
423
- }
424
-
425
- get :update_and_render_object_with_cache_enabled
426
-
427
- assert_equal 'application/json', @response.content_type
428
- actual = @response.body
429
- expected = expected.to_json
430
- if ENV['APPVEYOR'] && actual != expected
431
- skip('Cache expiration tests sometimes fail on Appveyor. FIXME :)')
432
- else
433
- assert_equal actual, expected
434
- end
435
- end
436
-
437
- def test_warn_overridding_use_adapter_as_falsy_on_controller_instance
438
- controller = Class.new(ImplicitSerializationTestController) do
439
- def use_adapter?
440
- false
441
- end
442
- end.new
443
- assert_output(nil, /adapter: false/) do
444
- controller.get_serializer(Profile.new)
445
- end
446
- end
447
-
448
- def test_dont_warn_overridding_use_adapter_as_truthy_on_controller_instance
449
- controller = Class.new(ImplicitSerializationTestController) do
450
- def use_adapter?
451
- true
452
- end
453
- end.new
454
- assert_output(nil, '') do
455
- controller.get_serializer(Profile.new)
456
- end
457
- end
458
-
459
- def test_render_event_is_emmited
460
- subscriber = ::ActiveSupport::Notifications.subscribe('render.active_model_serializers') do |name|
461
- @name = name
462
- end
463
-
464
- get :render_using_implicit_serializer
465
-
466
- assert_equal 'render.active_model_serializers', @name
467
- ensure
468
- ActiveSupport::Notifications.unsubscribe(subscriber) if subscriber
469
- end
470
- end
471
- end
472
- end