active_model_serializers 0.10.9 → 0.10.13

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 (161) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +41 -2
  3. data/README.md +18 -19
  4. data/lib/action_controller/serialization.rb +9 -1
  5. data/lib/active_model/serializer/collection_serializer.rb +11 -2
  6. data/lib/active_model/serializer/concerns/caching.rb +2 -1
  7. data/lib/active_model/serializer/fieldset.rb +1 -1
  8. data/lib/active_model/serializer/reflection.rb +4 -4
  9. data/lib/active_model/serializer/version.rb +1 -1
  10. data/lib/active_model/serializer.rb +13 -4
  11. data/lib/active_model_serializers/adapter/attributes.rb +21 -0
  12. data/lib/active_model_serializers/adapter/json_api/pagination_links.rb +5 -1
  13. data/lib/active_model_serializers/adapter/json_api/resource_identifier.rb +1 -1
  14. data/lib/active_model_serializers/model/caching.rb +26 -0
  15. metadata +20 -292
  16. data/.github/ISSUE_TEMPLATE.md +0 -29
  17. data/.github/PULL_REQUEST_TEMPLATE.md +0 -15
  18. data/.gitignore +0 -35
  19. data/.rubocop.yml +0 -109
  20. data/.simplecov +0 -110
  21. data/.travis.yml +0 -63
  22. data/CODE_OF_CONDUCT.md +0 -74
  23. data/CONTRIBUTING.md +0 -105
  24. data/Gemfile +0 -74
  25. data/Rakefile +0 -76
  26. data/active_model_serializers.gemspec +0 -64
  27. data/appveyor.yml +0 -28
  28. data/bin/bench +0 -171
  29. data/bin/bench_regression +0 -316
  30. data/bin/rubocop +0 -38
  31. data/bin/serve_benchmark +0 -39
  32. data/docs/README.md +0 -41
  33. data/docs/STYLE.md +0 -58
  34. data/docs/general/adapters.md +0 -269
  35. data/docs/general/caching.md +0 -58
  36. data/docs/general/configuration_options.md +0 -185
  37. data/docs/general/deserialization.md +0 -100
  38. data/docs/general/fields.md +0 -31
  39. data/docs/general/getting_started.md +0 -133
  40. data/docs/general/instrumentation.md +0 -40
  41. data/docs/general/key_transforms.md +0 -40
  42. data/docs/general/logging.md +0 -21
  43. data/docs/general/rendering.md +0 -293
  44. data/docs/general/serializers.md +0 -495
  45. data/docs/how-open-source-maintained.jpg +0 -0
  46. data/docs/howto/add_pagination_links.md +0 -138
  47. data/docs/howto/add_relationship_links.md +0 -140
  48. data/docs/howto/add_root_key.md +0 -62
  49. data/docs/howto/grape_integration.md +0 -42
  50. data/docs/howto/outside_controller_use.md +0 -66
  51. data/docs/howto/passing_arbitrary_options.md +0 -27
  52. data/docs/howto/serialize_poro.md +0 -73
  53. data/docs/howto/test.md +0 -154
  54. data/docs/howto/upgrade_from_0_8_to_0_10.md +0 -265
  55. data/docs/integrations/ember-and-json-api.md +0 -147
  56. data/docs/integrations/grape.md +0 -19
  57. data/docs/jsonapi/errors.md +0 -56
  58. data/docs/jsonapi/schema/schema.json +0 -366
  59. data/docs/jsonapi/schema.md +0 -151
  60. data/docs/rfcs/0000-namespace.md +0 -106
  61. data/docs/rfcs/template.md +0 -15
  62. data/test/action_controller/adapter_selector_test.rb +0 -64
  63. data/test/action_controller/explicit_serializer_test.rb +0 -137
  64. data/test/action_controller/json/include_test.rb +0 -248
  65. data/test/action_controller/json_api/deserialization_test.rb +0 -114
  66. data/test/action_controller/json_api/errors_test.rb +0 -42
  67. data/test/action_controller/json_api/fields_test.rb +0 -68
  68. data/test/action_controller/json_api/linked_test.rb +0 -204
  69. data/test/action_controller/json_api/pagination_test.rb +0 -126
  70. data/test/action_controller/json_api/transform_test.rb +0 -191
  71. data/test/action_controller/lookup_proc_test.rb +0 -51
  72. data/test/action_controller/namespace_lookup_test.rb +0 -234
  73. data/test/action_controller/serialization_scope_name_test.rb +0 -237
  74. data/test/action_controller/serialization_test.rb +0 -480
  75. data/test/active_model_serializers/adapter_for_test.rb +0 -210
  76. data/test/active_model_serializers/json_pointer_test.rb +0 -24
  77. data/test/active_model_serializers/logging_test.rb +0 -79
  78. data/test/active_model_serializers/model_test.rb +0 -144
  79. data/test/active_model_serializers/railtie_test_isolated.rb +0 -70
  80. data/test/active_model_serializers/register_jsonapi_renderer_test_isolated.rb +0 -163
  81. data/test/active_model_serializers/serialization_context_test_isolated.rb +0 -73
  82. data/test/active_model_serializers/test/schema_test.rb +0 -133
  83. data/test/active_model_serializers/test/serializer_test.rb +0 -64
  84. data/test/active_record_test.rb +0 -11
  85. data/test/adapter/attributes_test.rb +0 -42
  86. data/test/adapter/deprecation_test.rb +0 -102
  87. data/test/adapter/json/belongs_to_test.rb +0 -47
  88. data/test/adapter/json/collection_test.rb +0 -106
  89. data/test/adapter/json/has_many_test.rb +0 -55
  90. data/test/adapter/json/transform_test.rb +0 -95
  91. data/test/adapter/json_api/belongs_to_test.rb +0 -157
  92. data/test/adapter/json_api/collection_test.rb +0 -98
  93. data/test/adapter/json_api/errors_test.rb +0 -78
  94. data/test/adapter/json_api/fields_test.rb +0 -98
  95. data/test/adapter/json_api/has_many_explicit_serializer_test.rb +0 -98
  96. data/test/adapter/json_api/has_many_test.rb +0 -175
  97. data/test/adapter/json_api/has_one_test.rb +0 -82
  98. data/test/adapter/json_api/include_data_if_sideloaded_test.rb +0 -215
  99. data/test/adapter/json_api/json_api_test.rb +0 -35
  100. data/test/adapter/json_api/linked_test.rb +0 -415
  101. data/test/adapter/json_api/links_test.rb +0 -112
  102. data/test/adapter/json_api/pagination_links_test.rb +0 -208
  103. data/test/adapter/json_api/parse_test.rb +0 -139
  104. data/test/adapter/json_api/relationship_test.rb +0 -399
  105. data/test/adapter/json_api/resource_meta_test.rb +0 -102
  106. data/test/adapter/json_api/toplevel_jsonapi_test.rb +0 -84
  107. data/test/adapter/json_api/transform_test.rb +0 -514
  108. data/test/adapter/json_api/type_test.rb +0 -195
  109. data/test/adapter/json_test.rb +0 -48
  110. data/test/adapter/null_test.rb +0 -24
  111. data/test/adapter/polymorphic_test.rb +0 -220
  112. data/test/adapter_test.rb +0 -69
  113. data/test/array_serializer_test.rb +0 -24
  114. data/test/benchmark/app.rb +0 -67
  115. data/test/benchmark/benchmarking_support.rb +0 -69
  116. data/test/benchmark/bm_active_record.rb +0 -83
  117. data/test/benchmark/bm_adapter.rb +0 -40
  118. data/test/benchmark/bm_caching.rb +0 -121
  119. data/test/benchmark/bm_lookup_chain.rb +0 -85
  120. data/test/benchmark/bm_transform.rb +0 -47
  121. data/test/benchmark/config.ru +0 -3
  122. data/test/benchmark/controllers.rb +0 -85
  123. data/test/benchmark/fixtures.rb +0 -221
  124. data/test/cache_test.rb +0 -717
  125. data/test/collection_serializer_test.rb +0 -129
  126. data/test/fixtures/active_record.rb +0 -115
  127. data/test/fixtures/poro.rb +0 -227
  128. data/test/generators/scaffold_controller_generator_test.rb +0 -26
  129. data/test/generators/serializer_generator_test.rb +0 -77
  130. data/test/grape_test.rb +0 -198
  131. data/test/lint_test.rb +0 -51
  132. data/test/logger_test.rb +0 -22
  133. data/test/poro_test.rb +0 -11
  134. data/test/serializable_resource_test.rb +0 -81
  135. data/test/serializers/association_macros_test.rb +0 -39
  136. data/test/serializers/associations_test.rb +0 -520
  137. data/test/serializers/attribute_test.rb +0 -155
  138. data/test/serializers/attributes_test.rb +0 -54
  139. data/test/serializers/caching_configuration_test_isolated.rb +0 -172
  140. data/test/serializers/configuration_test.rb +0 -34
  141. data/test/serializers/fieldset_test.rb +0 -16
  142. data/test/serializers/meta_test.rb +0 -204
  143. data/test/serializers/options_test.rb +0 -34
  144. data/test/serializers/read_attribute_for_serialization_test.rb +0 -81
  145. data/test/serializers/reflection_test.rb +0 -481
  146. data/test/serializers/root_test.rb +0 -23
  147. data/test/serializers/serialization_test.rb +0 -57
  148. data/test/serializers/serializer_for_test.rb +0 -138
  149. data/test/serializers/serializer_for_with_namespace_test.rb +0 -90
  150. data/test/support/custom_schemas/active_model_serializers/test/schema_test/my/index.json +0 -6
  151. data/test/support/isolated_unit.rb +0 -86
  152. data/test/support/rails5_shims.rb +0 -55
  153. data/test/support/rails_app.rb +0 -40
  154. data/test/support/schemas/active_model_serializers/test/schema_test/my/index.json +0 -6
  155. data/test/support/schemas/active_model_serializers/test/schema_test/my/show.json +0 -6
  156. data/test/support/schemas/custom/show.json +0 -7
  157. data/test/support/schemas/hyper_schema.json +0 -93
  158. data/test/support/schemas/render_using_json_api.json +0 -43
  159. data/test/support/schemas/simple_json_pointers.json +0 -10
  160. data/test/support/serialization_testing.rb +0 -81
  161. data/test/test_helper.rb +0 -72
@@ -1,481 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'test_helper'
4
- module ActiveModel
5
- class Serializer
6
- class ReflectionTest < ActiveSupport::TestCase
7
- class Blog < ActiveModelSerializers::Model
8
- attributes :id
9
- end
10
- class BlogSerializer < ActiveModel::Serializer
11
- type 'blog'
12
- attributes :id
13
- end
14
-
15
- setup do
16
- @expected_meta = { id: 1 }
17
- @expected_links = { self: 'no_uri_validation' }
18
- @empty_links = {}
19
- model_attributes = { blog: Blog.new(@expected_meta) }
20
- @model = Class.new(ActiveModelSerializers::Model) do
21
- attributes(*model_attributes.keys)
22
-
23
- def self.name
24
- 'TestModel'
25
- end
26
- end.new(model_attributes)
27
- @instance_options = {}
28
- end
29
-
30
- def evaluate_association_value(association)
31
- association.lazy_association.eval_reflection_block
32
- end
33
-
34
- # TODO: Remaining tests
35
- # test_reflection_value_block_with_scope
36
- # test_reflection_value_uses_serializer_instance_method
37
- # test_reflection_excluded_eh_blank_is_false
38
- # test_reflection_excluded_eh_if
39
- # test_reflection_excluded_eh_unless
40
- # test_evaluate_condition_symbol_serializer_method
41
- # test_evaluate_condition_string_serializer_method
42
- # test_evaluate_condition_proc
43
- # test_evaluate_condition_proc_yields_serializer
44
- # test_evaluate_condition_other
45
- # test_options_key
46
- # test_options_polymorphic
47
- # test_options_serializer
48
- # test_options_virtual_value
49
- # test_options_namespace
50
-
51
- def test_reflection_value
52
- serializer_class = Class.new(ActiveModel::Serializer) do
53
- has_one :blog
54
- end
55
- serializer_instance = serializer_class.new(@model, @instance_options)
56
-
57
- # Get Reflection
58
- reflection = serializer_class._reflections.fetch(:blog)
59
-
60
- # Assert
61
- assert_nil reflection.block
62
- assert_equal Serializer.config.include_data_default, reflection.options.fetch(:include_data_setting)
63
- assert_equal true, reflection.options.fetch(:include_data_setting)
64
-
65
- include_slice = :does_not_matter
66
- assert_equal @model.blog, reflection.send(:value, serializer_instance, include_slice)
67
- end
68
-
69
- def test_reflection_value_block
70
- serializer_class = Class.new(ActiveModel::Serializer) do
71
- has_one :blog do
72
- object.blog
73
- end
74
- end
75
- serializer_instance = serializer_class.new(@model, @instance_options)
76
-
77
- # Get Reflection
78
- reflection = serializer_class._reflections.fetch(:blog)
79
-
80
- # Assert
81
- assert_respond_to reflection.block, :call
82
- assert_equal Serializer.config.include_data_default, reflection.options.fetch(:include_data_setting)
83
- assert_equal true, reflection.options.fetch(:include_data_setting)
84
-
85
- include_slice = :does_not_matter
86
- assert_equal @model.blog, reflection.send(:value, serializer_instance, include_slice)
87
- end
88
-
89
- def test_reflection_value_block_with_explicit_include_data_true
90
- serializer_class = Class.new(ActiveModel::Serializer) do
91
- has_one :blog do
92
- include_data true
93
- object.blog
94
- end
95
- end
96
- serializer_instance = serializer_class.new(@model, @instance_options)
97
-
98
- # Get Reflection
99
- reflection = serializer_class._reflections.fetch(:blog)
100
-
101
- # Assert
102
- assert_respond_to reflection.block, :call
103
- assert_equal Serializer.config.include_data_default, reflection.options.fetch(:include_data_setting)
104
- assert_equal true, reflection.options.fetch(:include_data_setting)
105
-
106
- include_slice = :does_not_matter
107
- assert_equal @model.blog, reflection.send(:value, serializer_instance, include_slice)
108
- end
109
-
110
- def test_reflection_value_block_with_include_data_false_mutates_the_reflection_include_data
111
- serializer_class = Class.new(ActiveModel::Serializer) do
112
- has_one :blog do
113
- include_data false
114
- object.blog
115
- end
116
- end
117
- serializer_instance = serializer_class.new(@model, @instance_options)
118
-
119
- # Get Reflection
120
- reflection = serializer_class._reflections.fetch(:blog)
121
-
122
- # Assert
123
- assert_respond_to reflection.block, :call
124
- assert_equal true, reflection.options.fetch(:include_data_setting)
125
- include_slice = :does_not_matter
126
- assert_nil reflection.send(:value, serializer_instance, include_slice)
127
- assert_equal false, reflection.options.fetch(:include_data_setting)
128
- end
129
-
130
- def test_reflection_value_block_with_include_data_if_sideloaded_included_mutates_the_reflection_include_data
131
- serializer_class = Class.new(ActiveModel::Serializer) do
132
- has_one :blog do
133
- include_data :if_sideloaded
134
- object.blog
135
- end
136
- end
137
- serializer_instance = serializer_class.new(@model, @instance_options)
138
-
139
- # Get Reflection
140
- reflection = serializer_class._reflections.fetch(:blog)
141
-
142
- # Assert
143
- assert_respond_to reflection.block, :call
144
- assert_equal true, reflection.options.fetch(:include_data_setting)
145
- include_slice = {}
146
- assert_nil reflection.send(:value, serializer_instance, include_slice)
147
- assert_equal :if_sideloaded, reflection.options.fetch(:include_data_setting)
148
- end
149
-
150
- def test_reflection_value_block_with_include_data_if_sideloaded_excluded_mutates_the_reflection_include_data
151
- serializer_class = Class.new(ActiveModel::Serializer) do
152
- has_one :blog do
153
- include_data :if_sideloaded
154
- object.blog
155
- end
156
- end
157
- serializer_instance = serializer_class.new(@model, @instance_options)
158
-
159
- # Get Reflection
160
- reflection = serializer_class._reflections.fetch(:blog)
161
-
162
- # Assert
163
- assert_respond_to reflection.block, :call
164
- assert_equal true, reflection.options.fetch(:include_data_setting)
165
- include_slice = { blog: :does_not_matter }
166
- assert_equal @model.blog, reflection.send(:value, serializer_instance, include_slice)
167
- assert_equal :if_sideloaded, reflection.options.fetch(:include_data_setting)
168
- end
169
-
170
- def test_reflection_block_with_link_mutates_the_reflection_links
171
- serializer_class = Class.new(ActiveModel::Serializer) do
172
- has_one :blog do
173
- link :self, 'no_uri_validation'
174
- end
175
- end
176
- serializer_instance = serializer_class.new(@model, @instance_options)
177
-
178
- # Get Reflection
179
- reflection = serializer_class._reflections.fetch(:blog)
180
- assert_equal @empty_links, reflection.options.fetch(:links)
181
-
182
- # Build Association
183
- association = reflection.build_association(serializer_instance, @instance_options)
184
-
185
- # Assert association links empty when not yet evaluated
186
- assert_equal @empty_links, reflection.options.fetch(:links)
187
- assert_equal @empty_links, association.links
188
-
189
- evaluate_association_value(association)
190
-
191
- assert_equal @expected_links, association.links
192
- assert_equal @expected_links, reflection.options.fetch(:links)
193
- end
194
-
195
- def test_reflection_block_with_link_block_mutates_the_reflection_links
196
- serializer_class = Class.new(ActiveModel::Serializer) do
197
- has_one :blog do
198
- link :self do
199
- 'no_uri_validation'
200
- end
201
- end
202
- end
203
- serializer_instance = serializer_class.new(@model, @instance_options)
204
-
205
- # Get Reflection
206
- reflection = serializer_class._reflections.fetch(:blog)
207
- assert_equal @empty_links, reflection.options.fetch(:links)
208
-
209
- # Build Association
210
- association = reflection.build_association(serializer_instance, @instance_options)
211
-
212
- # Assert association links empty when not yet evaluated
213
- assert_equal @empty_links, association.links
214
-
215
- evaluate_association_value(association)
216
-
217
- # Assert before instance_eval link
218
- link = association.links.fetch(:self)
219
- assert_respond_to link, :call
220
- assert_respond_to reflection.options.fetch(:links).fetch(:self), :call
221
-
222
- # Assert after instance_eval link
223
- assert_equal @expected_links.fetch(:self), reflection.instance_eval(&link)
224
- assert_respond_to reflection.options.fetch(:links).fetch(:self), :call
225
- end
226
-
227
- def test_reflection_block_with_meta_mutates_the_reflection_meta
228
- serializer_class = Class.new(ActiveModel::Serializer) do
229
- has_one :blog do
230
- meta(id: object.blog.id)
231
- end
232
- end
233
- serializer_instance = serializer_class.new(@model, @instance_options)
234
-
235
- # Get Reflection
236
- reflection = serializer_class._reflections.fetch(:blog)
237
- assert_nil reflection.options.fetch(:meta)
238
-
239
- # Build Association
240
- association = reflection.build_association(serializer_instance, @instance_options)
241
-
242
- evaluate_association_value(association)
243
-
244
- assert_equal @expected_meta, association.meta
245
- assert_equal @expected_meta, reflection.options.fetch(:meta)
246
- end
247
-
248
- def test_reflection_block_with_meta_block_mutates_the_reflection_meta
249
- serializer_class = Class.new(ActiveModel::Serializer) do
250
- has_one :blog do
251
- meta do
252
- { id: object.blog.id }
253
- end
254
- end
255
- end
256
- serializer_instance = serializer_class.new(@model, @instance_options)
257
-
258
- # Get Reflection
259
- reflection = serializer_class._reflections.fetch(:blog)
260
- assert_nil reflection.options.fetch(:meta)
261
-
262
- # Build Association
263
- association = reflection.build_association(serializer_instance, @instance_options)
264
- # Assert before instance_eval meta
265
-
266
- evaluate_association_value(association)
267
-
268
- assert_respond_to association.meta, :call
269
- assert_respond_to reflection.options.fetch(:meta), :call
270
-
271
- # Assert after instance_eval meta
272
- assert_equal @expected_meta, reflection.instance_eval(&association.meta)
273
- assert_respond_to reflection.options.fetch(:meta), :call
274
- assert_respond_to association.meta, :call
275
- end
276
-
277
- # rubocop:disable Metrics/AbcSize
278
- def test_reflection_block_with_meta_in_link_block_mutates_the_reflection_meta
279
- serializer_class = Class.new(ActiveModel::Serializer) do
280
- has_one :blog do
281
- link :self do
282
- meta(id: object.blog.id)
283
- 'no_uri_validation'
284
- end
285
- end
286
- end
287
- serializer_instance = serializer_class.new(@model, @instance_options)
288
-
289
- # Get Reflection
290
- reflection = serializer_class._reflections.fetch(:blog)
291
- assert_nil reflection.options.fetch(:meta)
292
- assert_equal @empty_links, reflection.options.fetch(:links)
293
-
294
- # Build Association
295
- association = reflection.build_association(serializer_instance, @instance_options)
296
- # Assert before instance_eval link meta
297
- assert_nil association.meta
298
- assert_nil reflection.options.fetch(:meta)
299
-
300
- evaluate_association_value(association)
301
-
302
- link = association.links.fetch(:self)
303
- assert_respond_to link, :call
304
- assert_respond_to reflection.options.fetch(:links).fetch(:self), :call
305
- assert_nil reflection.options.fetch(:meta)
306
-
307
- # Assert after instance_eval link
308
- assert_equal 'no_uri_validation', reflection.instance_eval(&link)
309
- assert_equal @expected_meta, reflection.options.fetch(:meta)
310
- assert_equal @expected_meta, association.meta
311
- end
312
- # rubocop:enable Metrics/AbcSize
313
-
314
- # rubocop:disable Metrics/AbcSize
315
- def test_reflection_block_with_meta_block_in_link_block_mutates_the_reflection_meta
316
- serializer_class = Class.new(ActiveModel::Serializer) do
317
- has_one :blog do
318
- link :self do
319
- meta do
320
- { id: object.blog.id }
321
- end
322
- 'no_uri_validation'
323
- end
324
- end
325
- end
326
- serializer_instance = serializer_class.new(@model, @instance_options)
327
-
328
- # Get Reflection
329
- reflection = serializer_class._reflections.fetch(:blog)
330
- assert_nil reflection.options.fetch(:meta)
331
-
332
- # Build Association
333
- association = reflection.build_association(serializer_instance, @instance_options)
334
- assert_nil association.meta
335
- assert_nil reflection.options.fetch(:meta)
336
-
337
- # Assert before instance_eval link
338
-
339
- evaluate_association_value(association)
340
-
341
- link = association.links.fetch(:self)
342
- assert_nil reflection.options.fetch(:meta)
343
- assert_respond_to link, :call
344
- assert_respond_to association.links.fetch(:self), :call
345
-
346
- # Assert after instance_eval link
347
- assert_equal 'no_uri_validation', reflection.instance_eval(&link)
348
- assert_respond_to association.links.fetch(:self), :call
349
- # Assert before instance_eval link meta
350
- assert_respond_to reflection.options.fetch(:meta), :call
351
- assert_respond_to association.meta, :call
352
-
353
- # Assert after instance_eval link meta
354
- assert_equal @expected_meta, reflection.instance_eval(&reflection.options.fetch(:meta))
355
- assert_respond_to association.meta, :call
356
- end
357
- # rubocop:enable Metrics/AbcSize
358
-
359
- def test_no_href_in_vanilla_reflection
360
- serializer_class = Class.new(ActiveModel::Serializer) do
361
- has_one :blog do
362
- link :self do
363
- href 'no_uri_validation'
364
- end
365
- end
366
- end
367
- serializer_instance = serializer_class.new(@model, @instance_options)
368
-
369
- # Get Reflection
370
- reflection = serializer_class._reflections.fetch(:blog)
371
- assert_equal @empty_links, reflection.options.fetch(:links)
372
-
373
- # Build Association
374
- association = reflection.build_association(serializer_instance, @instance_options)
375
- # Assert before instance_eval link
376
-
377
- evaluate_association_value(association)
378
-
379
- link = association.links.fetch(:self)
380
- assert_respond_to link, :call
381
-
382
- # Assert after instance_eval link
383
- exception = assert_raise(NoMethodError) do
384
- reflection.instance_eval(&link)
385
- end
386
- assert_match(/undefined method `href'/, exception.message)
387
- end
388
-
389
- # rubocop:disable Metrics/AbcSize
390
- def test_mutating_reflection_block_is_not_thread_safe
391
- serializer_class = Class.new(ActiveModel::Serializer) do
392
- has_one :blog do
393
- meta(id: object.blog.id)
394
- end
395
- end
396
- model1_meta = @expected_meta
397
- # Evaluate reflection meta for model with id 1
398
- serializer_instance = serializer_class.new(@model, @instance_options)
399
- reflection = serializer_class._reflections.fetch(:blog)
400
- assert_nil reflection.options.fetch(:meta)
401
- association = reflection.build_association(serializer_instance, @instance_options)
402
-
403
- evaluate_association_value(association)
404
-
405
- assert_equal model1_meta, association.meta
406
- assert_equal model1_meta, reflection.options.fetch(:meta)
407
-
408
- model2_meta = @expected_meta.merge(id: 2)
409
- # Evaluate reflection meta for model with id 2
410
- @model.blog.id = 2
411
- assert_equal 2, @model.blog.id # sanity check
412
- serializer_instance = serializer_class.new(@model, @instance_options)
413
- reflection = serializer_class._reflections.fetch(:blog)
414
-
415
- # WARN: Thread-safety issue
416
- # Before the reflection is evaluated, it has the value from the previous evaluation
417
- assert_equal model1_meta, reflection.options.fetch(:meta)
418
-
419
- association = reflection.build_association(serializer_instance, @instance_options)
420
-
421
- evaluate_association_value(association)
422
-
423
- assert_equal model2_meta, association.meta
424
- assert_equal model2_meta, reflection.options.fetch(:meta)
425
- end
426
- # rubocop:enable Metrics/AbcSize
427
- end
428
- class ThreadedReflectionTest < ActiveSupport::TestCase
429
- class Post < ::Model
430
- attributes :id, :title, :body
431
- associations :comments
432
- end
433
- class Comment < ::Model
434
- attributes :id, :body
435
- associations :post
436
- end
437
- class CommentSerializer < ActiveModel::Serializer
438
- type 'comment'
439
- attributes :id, :body
440
- has_one :post
441
- end
442
- class PostSerializer < ActiveModel::Serializer
443
- type 'post'
444
- attributes :id, :title, :body
445
- has_many :comments, serializer: CommentSerializer do
446
- sleep 0.1
447
- object.comments
448
- end
449
- end
450
-
451
- # per https://github.com/rails-api/active_model_serializers/issues/2270
452
- def test_concurrent_serialization
453
- post1 = Post.new(id: 1, title: 'Post 1 Title', body: 'Post 1 Body')
454
- post1.comments = [Comment.new(id: 1, body: 'Comment on Post 1', post: post1)]
455
- post2 = Post.new(id: 2, title: 'Post 2 Title', body: 'Post 2 Body')
456
- post2.comments = [Comment.new(id: 2, body: 'Comment on Post 2', post: post2)]
457
- serialized_posts = {
458
- first: Set.new,
459
- second: Set.new
460
- }
461
- t1 = Thread.new do
462
- 10.times do
463
- serialized_posts[:first] << PostSerializer.new(post1, {}).to_json
464
- end
465
- end
466
- t2 = Thread.new do
467
- 10.times do
468
- serialized_posts[:second] << PostSerializer.new(post2, {}).to_json
469
- end
470
- end
471
- t1.join
472
- t2.join
473
- expected_first_post_serialization = '{"id":1,"title":"Post 1 Title","body":"Post 1 Body","comments":[{"id":1,"body":"Comment on Post 1"}]}'
474
- expected_second_post_serialization = '{"id":2,"title":"Post 2 Title","body":"Post 2 Body","comments":[{"id":2,"body":"Comment on Post 2"}]}'
475
-
476
- assert_equal [expected_second_post_serialization], serialized_posts[:second].to_a
477
- assert_equal [expected_first_post_serialization], serialized_posts[:first].to_a
478
- end
479
- end
480
- end
481
- end
@@ -1,23 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'test_helper'
4
-
5
- module ActiveModel
6
- class Serializer
7
- class RootTest < ActiveSupport::TestCase
8
- def setup
9
- @virtual_value = VirtualValue.new(id: 1)
10
- end
11
-
12
- def test_overwrite_root
13
- serializer = VirtualValueSerializer.new(@virtual_value, root: 'smth')
14
- assert_equal('smth', serializer.json_key)
15
- end
16
-
17
- def test_underscore_in_root
18
- serializer = VirtualValueSerializer.new(@virtual_value)
19
- assert_equal('virtual_value', serializer.json_key)
20
- end
21
- end
22
- end
23
- end
@@ -1,57 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module ActiveModel
4
- class Serializer
5
- class SerializationTest < ActiveSupport::TestCase
6
- class Blog < ActiveModelSerializers::Model
7
- attributes :id, :name, :authors
8
- end
9
- class Author < ActiveModelSerializers::Model
10
- attributes :id, :name
11
- end
12
- class BlogSerializer < ActiveModel::Serializer
13
- attributes :id
14
- attribute :name, key: :title
15
-
16
- has_many :authors
17
- end
18
- class AuthorSerializer < ActiveModel::Serializer
19
- attributes :id, :name
20
- end
21
-
22
- setup do
23
- @authors = [Author.new(id: 1, name: 'Blog Author')]
24
- @blog = Blog.new(id: 2, name: 'The Blog', authors: @authors)
25
- @serializer_instance = BlogSerializer.new(@blog)
26
- @serializable = ActiveModelSerializers::SerializableResource.new(@blog, serializer: BlogSerializer, adapter: :attributes)
27
- @expected_hash = { id: 2, title: 'The Blog', authors: [{ id: 1, name: 'Blog Author' }] }
28
- @expected_json = '{"id":2,"title":"The Blog","authors":[{"id":1,"name":"Blog Author"}]}'
29
- end
30
-
31
- test '#serializable_hash is the same as generated by the attributes adapter' do
32
- assert_equal @serializable.serializable_hash, @serializer_instance.serializable_hash
33
- assert_equal @expected_hash, @serializer_instance.serializable_hash
34
- end
35
-
36
- test '#as_json is the same as generated by the attributes adapter' do
37
- assert_equal @serializable.as_json, @serializer_instance.as_json
38
- assert_equal @expected_hash, @serializer_instance.as_json
39
- end
40
-
41
- test '#to_json is the same as generated by the attributes adapter' do
42
- assert_equal @serializable.to_json, @serializer_instance.to_json
43
- assert_equal @expected_json, @serializer_instance.to_json
44
- end
45
-
46
- test '#to_h is an alias for #serializable_hash' do
47
- assert_equal @serializable.serializable_hash, @serializer_instance.to_h
48
- assert_equal @expected_hash, @serializer_instance.to_h
49
- end
50
-
51
- test '#to_hash is an alias for #serializable_hash' do
52
- assert_equal @serializable.serializable_hash, @serializer_instance.to_hash
53
- assert_equal @expected_hash, @serializer_instance.to_hash
54
- end
55
- end
56
- end
57
- end
@@ -1,138 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'test_helper'
4
-
5
- module ActiveModel
6
- class Serializer
7
- class SerializerForTest < ActiveSupport::TestCase
8
- class CollectionSerializerTest < ActiveSupport::TestCase
9
- def setup
10
- @array = [1, 2, 3]
11
- @previous_collection_serializer = ActiveModelSerializers.config.collection_serializer
12
- end
13
-
14
- def teardown
15
- ActiveModelSerializers.config.collection_serializer = @previous_collection_serializer
16
- end
17
-
18
- def test_serializer_for_array
19
- serializer = ActiveModel::Serializer.serializer_for(@array)
20
- assert_equal ActiveModelSerializers.config.collection_serializer, serializer
21
- end
22
-
23
- def test_overwritten_serializer_for_array
24
- new_collection_serializer = Class.new
25
- ActiveModelSerializers.config.collection_serializer = new_collection_serializer
26
- serializer = ActiveModel::Serializer.serializer_for(@array)
27
- assert_equal new_collection_serializer, serializer
28
- end
29
- end
30
-
31
- class SerializerTest < ActiveSupport::TestCase
32
- module ResourceNamespace
33
- class Post < ::Model; end
34
- class Comment < ::Model; end
35
-
36
- class PostSerializer < ActiveModel::Serializer
37
- class CommentSerializer < ActiveModel::Serializer
38
- end
39
- end
40
- end
41
-
42
- class MyProfile < Profile
43
- end
44
-
45
- class CustomProfile
46
- def serializer_class
47
- ProfileSerializer
48
- end
49
- end
50
-
51
- class Tweet < ::Model; end
52
- TweetSerializer = Class.new
53
-
54
- def setup
55
- @profile = Profile.new
56
- @my_profile = MyProfile.new
57
- @custom_profile = CustomProfile.new
58
- @model = ::Model.new
59
- @tweet = Tweet.new
60
- end
61
-
62
- def test_serializer_for_non_ams_serializer
63
- serializer = ActiveModel::Serializer.serializer_for(@tweet)
64
- assert_nil serializer
65
- end
66
-
67
- def test_serializer_for_existing_serializer
68
- serializer = ActiveModel::Serializer.serializer_for(@profile)
69
- assert_equal ProfileSerializer, serializer
70
- end
71
-
72
- def test_serializer_for_existing_serializer_with_lookup_disabled
73
- serializer = with_serializer_lookup_disabled do
74
- ActiveModel::Serializer.serializer_for(@profile)
75
- end
76
- assert_nil serializer
77
- end
78
-
79
- def test_serializer_for_not_existing_serializer
80
- serializer = ActiveModel::Serializer.serializer_for(@model)
81
- assert_nil serializer
82
- end
83
-
84
- def test_serializer_inherited_serializer
85
- serializer = ActiveModel::Serializer.serializer_for(@my_profile)
86
- assert_equal ProfileSerializer, serializer
87
- end
88
-
89
- def test_serializer_inherited_serializer_with_lookup_disabled
90
- serializer = with_serializer_lookup_disabled do
91
- ActiveModel::Serializer.serializer_for(@my_profile)
92
- end
93
- assert_nil serializer
94
- end
95
-
96
- def test_serializer_custom_serializer
97
- serializer = ActiveModel::Serializer.serializer_for(@custom_profile)
98
- assert_equal ProfileSerializer, serializer
99
- end
100
-
101
- def test_serializer_custom_serializer_with_lookup_disabled
102
- serializer = with_serializer_lookup_disabled do
103
- ActiveModel::Serializer.serializer_for(@custom_profile)
104
- end
105
- assert_equal ProfileSerializer, serializer
106
- end
107
-
108
- def test_serializer_for_namespaced_resource
109
- post = ResourceNamespace::Post.new
110
- serializer = ActiveModel::Serializer.serializer_for(post)
111
- assert_equal ResourceNamespace::PostSerializer, serializer
112
- end
113
-
114
- def test_serializer_for_namespaced_resource_with_lookup_disabled
115
- post = ResourceNamespace::Post.new
116
- serializer = with_serializer_lookup_disabled do
117
- ActiveModel::Serializer.serializer_for(post)
118
- end
119
- assert_nil serializer
120
- end
121
-
122
- def test_serializer_for_nested_resource
123
- comment = ResourceNamespace::Comment.new
124
- serializer = ResourceNamespace::PostSerializer.serializer_for(comment)
125
- assert_equal ResourceNamespace::PostSerializer::CommentSerializer, serializer
126
- end
127
-
128
- def test_serializer_for_nested_resource_with_lookup_disabled
129
- comment = ResourceNamespace::Comment.new
130
- serializer = with_serializer_lookup_disabled do
131
- ResourceNamespace::PostSerializer.serializer_for(comment)
132
- end
133
- assert_nil serializer
134
- end
135
- end
136
- end
137
- end
138
- end