active_model_serializers 0.10.7 → 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 (213) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +62 -1
  3. data/README.md +20 -20
  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 +33 -18
  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 +2 -0
  15. data/lib/active_model/serializer/attribute.rb +2 -0
  16. data/lib/active_model/serializer/belongs_to_reflection.rb +2 -0
  17. data/lib/active_model/serializer/collection_serializer.rb +6 -6
  18. data/lib/active_model/serializer/concerns/caching.rb +7 -2
  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 +2 -0
  24. data/lib/active_model/serializer/has_one_reflection.rb +2 -0
  25. data/lib/active_model/serializer/lazy_association.rb +6 -2
  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 +9 -4
  30. data/lib/active_model/serializer/version.rb +3 -1
  31. data/lib/active_model_serializers.rb +20 -10
  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 +2 -0
  35. data/lib/active_model_serializers/adapter/json.rb +2 -0
  36. data/lib/active_model_serializers/adapter/json_api.rb +14 -9
  37. data/lib/active_model_serializers/adapter/json_api/deserialization.rb +2 -0
  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 +2 -0
  43. data/lib/active_model_serializers/adapter/json_api/relationship.rb +2 -0
  44. data/lib/active_model_serializers/adapter/json_api/resource_identifier.rb +3 -1
  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 +2 -0
  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 +2 -0
  60. data/lib/active_model_serializers/test/serializer.rb +2 -0
  61. data/lib/generators/rails/resource_override.rb +2 -0
  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 +2 -0
  67. metadata +70 -295
  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 -105
  72. data/.simplecov +0 -110
  73. data/.travis.yml +0 -52
  74. data/CODE_OF_CONDUCT.md +0 -74
  75. data/CONTRIBUTING.md +0 -105
  76. data/Gemfile +0 -72
  77. data/Rakefile +0 -74
  78. data/active_model_serializers.gemspec +0 -63
  79. data/appveyor.yml +0 -28
  80. data/bin/bench +0 -171
  81. data/bin/bench_regression +0 -316
  82. data/bin/rubocop +0 -38
  83. data/bin/serve_benchmark +0 -39
  84. data/docs/README.md +0 -41
  85. data/docs/STYLE.md +0 -58
  86. data/docs/general/adapters.md +0 -269
  87. data/docs/general/caching.md +0 -58
  88. data/docs/general/configuration_options.md +0 -185
  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 -21
  95. data/docs/general/rendering.md +0 -293
  96. data/docs/general/serializers.md +0 -483
  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 -140
  100. data/docs/howto/add_root_key.md +0 -62
  101. data/docs/howto/grape_integration.md +0 -42
  102. data/docs/howto/outside_controller_use.md +0 -66
  103. data/docs/howto/passing_arbitrary_options.md +0 -27
  104. data/docs/howto/serialize_poro.md +0 -73
  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 -147
  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/test/action_controller/adapter_selector_test.rb +0 -62
  115. data/test/action_controller/explicit_serializer_test.rb +0 -135
  116. data/test/action_controller/json/include_test.rb +0 -246
  117. data/test/action_controller/json_api/deserialization_test.rb +0 -112
  118. data/test/action_controller/json_api/errors_test.rb +0 -40
  119. data/test/action_controller/json_api/fields_test.rb +0 -66
  120. data/test/action_controller/json_api/linked_test.rb +0 -202
  121. data/test/action_controller/json_api/pagination_test.rb +0 -124
  122. data/test/action_controller/json_api/transform_test.rb +0 -189
  123. data/test/action_controller/lookup_proc_test.rb +0 -49
  124. data/test/action_controller/namespace_lookup_test.rb +0 -232
  125. data/test/action_controller/serialization_scope_name_test.rb +0 -235
  126. data/test/action_controller/serialization_test.rb +0 -472
  127. data/test/active_model_serializers/adapter_for_test.rb +0 -208
  128. data/test/active_model_serializers/json_pointer_test.rb +0 -22
  129. data/test/active_model_serializers/logging_test.rb +0 -77
  130. data/test/active_model_serializers/model_test.rb +0 -142
  131. data/test/active_model_serializers/railtie_test_isolated.rb +0 -68
  132. data/test/active_model_serializers/register_jsonapi_renderer_test_isolated.rb +0 -161
  133. data/test/active_model_serializers/serialization_context_test_isolated.rb +0 -71
  134. data/test/active_model_serializers/test/schema_test.rb +0 -131
  135. data/test/active_model_serializers/test/serializer_test.rb +0 -62
  136. data/test/active_record_test.rb +0 -9
  137. data/test/adapter/attributes_test.rb +0 -40
  138. data/test/adapter/deprecation_test.rb +0 -100
  139. data/test/adapter/json/belongs_to_test.rb +0 -45
  140. data/test/adapter/json/collection_test.rb +0 -104
  141. data/test/adapter/json/has_many_test.rb +0 -53
  142. data/test/adapter/json/transform_test.rb +0 -93
  143. data/test/adapter/json_api/belongs_to_test.rb +0 -155
  144. data/test/adapter/json_api/collection_test.rb +0 -96
  145. data/test/adapter/json_api/errors_test.rb +0 -76
  146. data/test/adapter/json_api/fields_test.rb +0 -96
  147. data/test/adapter/json_api/has_many_explicit_serializer_test.rb +0 -96
  148. data/test/adapter/json_api/has_many_test.rb +0 -173
  149. data/test/adapter/json_api/has_one_test.rb +0 -80
  150. data/test/adapter/json_api/include_data_if_sideloaded_test.rb +0 -213
  151. data/test/adapter/json_api/json_api_test.rb +0 -33
  152. data/test/adapter/json_api/linked_test.rb +0 -413
  153. data/test/adapter/json_api/links_test.rb +0 -95
  154. data/test/adapter/json_api/pagination_links_test.rb +0 -206
  155. data/test/adapter/json_api/parse_test.rb +0 -137
  156. data/test/adapter/json_api/relationship_test.rb +0 -397
  157. data/test/adapter/json_api/resource_meta_test.rb +0 -100
  158. data/test/adapter/json_api/toplevel_jsonapi_test.rb +0 -82
  159. data/test/adapter/json_api/transform_test.rb +0 -512
  160. data/test/adapter/json_api/type_test.rb +0 -193
  161. data/test/adapter/json_test.rb +0 -46
  162. data/test/adapter/null_test.rb +0 -22
  163. data/test/adapter/polymorphic_test.rb +0 -218
  164. data/test/adapter_test.rb +0 -67
  165. data/test/array_serializer_test.rb +0 -22
  166. data/test/benchmark/app.rb +0 -65
  167. data/test/benchmark/benchmarking_support.rb +0 -67
  168. data/test/benchmark/bm_active_record.rb +0 -81
  169. data/test/benchmark/bm_adapter.rb +0 -38
  170. data/test/benchmark/bm_caching.rb +0 -119
  171. data/test/benchmark/bm_lookup_chain.rb +0 -83
  172. data/test/benchmark/bm_transform.rb +0 -45
  173. data/test/benchmark/config.ru +0 -3
  174. data/test/benchmark/controllers.rb +0 -83
  175. data/test/benchmark/fixtures.rb +0 -219
  176. data/test/cache_test.rb +0 -651
  177. data/test/collection_serializer_test.rb +0 -127
  178. data/test/fixtures/active_record.rb +0 -113
  179. data/test/fixtures/poro.rb +0 -225
  180. data/test/generators/scaffold_controller_generator_test.rb +0 -24
  181. data/test/generators/serializer_generator_test.rb +0 -75
  182. data/test/grape_test.rb +0 -196
  183. data/test/lint_test.rb +0 -49
  184. data/test/logger_test.rb +0 -20
  185. data/test/poro_test.rb +0 -9
  186. data/test/serializable_resource_test.rb +0 -79
  187. data/test/serializers/association_macros_test.rb +0 -37
  188. data/test/serializers/associations_test.rb +0 -468
  189. data/test/serializers/attribute_test.rb +0 -153
  190. data/test/serializers/attributes_test.rb +0 -52
  191. data/test/serializers/caching_configuration_test_isolated.rb +0 -170
  192. data/test/serializers/configuration_test.rb +0 -32
  193. data/test/serializers/fieldset_test.rb +0 -14
  194. data/test/serializers/meta_test.rb +0 -202
  195. data/test/serializers/options_test.rb +0 -32
  196. data/test/serializers/read_attribute_for_serialization_test.rb +0 -79
  197. data/test/serializers/reflection_test.rb +0 -427
  198. data/test/serializers/root_test.rb +0 -21
  199. data/test/serializers/serialization_test.rb +0 -55
  200. data/test/serializers/serializer_for_test.rb +0 -136
  201. data/test/serializers/serializer_for_with_namespace_test.rb +0 -88
  202. data/test/support/custom_schemas/active_model_serializers/test/schema_test/my/index.json +0 -6
  203. data/test/support/isolated_unit.rb +0 -84
  204. data/test/support/rails5_shims.rb +0 -53
  205. data/test/support/rails_app.rb +0 -38
  206. data/test/support/schemas/active_model_serializers/test/schema_test/my/index.json +0 -6
  207. data/test/support/schemas/active_model_serializers/test/schema_test/my/show.json +0 -6
  208. data/test/support/schemas/custom/show.json +0 -7
  209. data/test/support/schemas/hyper_schema.json +0 -93
  210. data/test/support/schemas/render_using_json_api.json +0 -43
  211. data/test/support/schemas/simple_json_pointers.json +0 -10
  212. data/test/support/serialization_testing.rb +0 -79
  213. data/test/test_helper.rb +0 -70
@@ -1,32 +0,0 @@
1
- require 'test_helper'
2
-
3
- module ActiveModel
4
- class Serializer
5
- class OptionsTest < ActiveSupport::TestCase
6
- class ModelWithOptions < ActiveModelSerializers::Model
7
- attributes :name, :description
8
- end
9
- class ModelWithOptionsSerializer < ActiveModel::Serializer
10
- attributes :name, :description
11
-
12
- def arguments_passed_in?
13
- instance_options[:my_options] == :accessible
14
- end
15
- end
16
-
17
- setup do
18
- @model_with_options = ModelWithOptions.new(name: 'Name 1', description: 'Description 1')
19
- end
20
-
21
- def test_options_are_accessible
22
- model_with_options_serializer = ModelWithOptionsSerializer.new(@model_with_options, my_options: :accessible)
23
- assert model_with_options_serializer.arguments_passed_in?
24
- end
25
-
26
- def test_no_option_is_passed_in
27
- model_with_options_serializer = ModelWithOptionsSerializer.new(@model_with_options)
28
- refute model_with_options_serializer.arguments_passed_in?
29
- end
30
- end
31
- end
32
- end
@@ -1,79 +0,0 @@
1
- require 'test_helper'
2
-
3
- module ActiveModel
4
- class Serializer
5
- class ReadAttributeForSerializationTest < ActiveSupport::TestCase
6
- # https://github.com/rails-api/active_model_serializers/issues/1653
7
- class Parent < ActiveModelSerializers::Model
8
- attributes :id
9
- end
10
- class Child < Parent
11
- attributes :name
12
- end
13
- class ParentSerializer < ActiveModel::Serializer
14
- attributes :$id
15
-
16
- define_method(:$id) do
17
- object.id
18
- end
19
- end
20
- class ChildSerializer < ParentSerializer
21
- attributes :name
22
- end
23
-
24
- def test_child_serializer_calls_dynamic_method_in_parent_serializer
25
- parent = ParentSerializer.new(Parent.new(id: 5))
26
- child = ChildSerializer.new(Child.new(id: 6, name: 'Child'))
27
- assert_equal 5, parent.read_attribute_for_serialization(:$id)
28
- assert_equal 6, child.read_attribute_for_serialization(:$id)
29
- end
30
-
31
- # https://github.com/rails-api/active_model_serializers/issues/1658
32
- class ErrorResponse < ActiveModelSerializers::Model
33
- attributes :error
34
- end
35
- class ApplicationSerializer < ActiveModel::Serializer
36
- attributes :status
37
-
38
- def status
39
- object.try(:errors).blank? && object.try(:error).blank?
40
- end
41
- end
42
- class ErrorResponseSerializer < ApplicationSerializer
43
- attributes :error
44
- end
45
- class ErrorResponseWithSuperSerializer < ApplicationSerializer
46
- attributes :error
47
-
48
- def success
49
- super
50
- end
51
- end
52
-
53
- def test_child_serializer_with_error_attribute
54
- error = ErrorResponse.new(error: 'i have an error')
55
- serializer = ErrorResponseSerializer.new(error)
56
- serializer_with_super = ErrorResponseWithSuperSerializer.new(error)
57
- assert_equal false, serializer.read_attribute_for_serialization(:status)
58
- assert_equal false, serializer_with_super.read_attribute_for_serialization(:status)
59
- end
60
-
61
- def test_child_serializer_with_errors
62
- error = ErrorResponse.new
63
- error.errors.add(:invalid, 'i am not valid')
64
- serializer = ErrorResponseSerializer.new(error)
65
- serializer_with_super = ErrorResponseWithSuperSerializer.new(error)
66
- assert_equal false, serializer.read_attribute_for_serialization(:status)
67
- assert_equal false, serializer_with_super.read_attribute_for_serialization(:status)
68
- end
69
-
70
- def test_child_serializer_no_error_attribute_or_errors
71
- error = ErrorResponse.new
72
- serializer = ErrorResponseSerializer.new(error)
73
- serializer_with_super = ErrorResponseWithSuperSerializer.new(error)
74
- assert_equal true, serializer.read_attribute_for_serialization(:status)
75
- assert_equal true, serializer_with_super.read_attribute_for_serialization(:status)
76
- end
77
- end
78
- end
79
- end
@@ -1,427 +0,0 @@
1
- require 'test_helper'
2
- module ActiveModel
3
- class Serializer
4
- class ReflectionTest < ActiveSupport::TestCase
5
- class Blog < ActiveModelSerializers::Model
6
- attributes :id
7
- end
8
- class BlogSerializer < ActiveModel::Serializer
9
- type 'blog'
10
- attributes :id
11
- end
12
-
13
- setup do
14
- @expected_meta = { id: 1 }
15
- @expected_links = { self: 'no_uri_validation' }
16
- @empty_links = {}
17
- model_attributes = { blog: Blog.new(@expected_meta) }
18
- @model = Class.new(ActiveModelSerializers::Model) do
19
- attributes(*model_attributes.keys)
20
-
21
- def self.name
22
- 'TestModel'
23
- end
24
- end.new(model_attributes)
25
- @instance_options = {}
26
- end
27
-
28
- def evaluate_association_value(association)
29
- association.lazy_association.eval_reflection_block
30
- end
31
-
32
- # TODO: Remaining tests
33
- # test_reflection_value_block_with_scope
34
- # test_reflection_value_uses_serializer_instance_method
35
- # test_reflection_excluded_eh_blank_is_false
36
- # test_reflection_excluded_eh_if
37
- # test_reflection_excluded_eh_unless
38
- # test_evaluate_condition_symbol_serializer_method
39
- # test_evaluate_condition_string_serializer_method
40
- # test_evaluate_condition_proc
41
- # test_evaluate_condition_proc_yields_serializer
42
- # test_evaluate_condition_other
43
- # test_options_key
44
- # test_options_polymorphic
45
- # test_options_serializer
46
- # test_options_virtual_value
47
- # test_options_namespace
48
-
49
- def test_reflection_value
50
- serializer_class = Class.new(ActiveModel::Serializer) do
51
- has_one :blog
52
- end
53
- serializer_instance = serializer_class.new(@model, @instance_options)
54
-
55
- # Get Reflection
56
- reflection = serializer_class._reflections.fetch(:blog)
57
-
58
- # Assert
59
- assert_nil reflection.block
60
- assert_equal Serializer.config.include_data_default, reflection.options.fetch(:include_data_setting)
61
- assert_equal true, reflection.options.fetch(:include_data_setting)
62
-
63
- include_slice = :does_not_matter
64
- assert_equal @model.blog, reflection.send(:value, serializer_instance, include_slice)
65
- end
66
-
67
- def test_reflection_value_block
68
- serializer_class = Class.new(ActiveModel::Serializer) do
69
- has_one :blog do
70
- object.blog
71
- end
72
- end
73
- serializer_instance = serializer_class.new(@model, @instance_options)
74
-
75
- # Get Reflection
76
- reflection = serializer_class._reflections.fetch(:blog)
77
-
78
- # Assert
79
- assert_respond_to reflection.block, :call
80
- assert_equal Serializer.config.include_data_default, reflection.options.fetch(:include_data_setting)
81
- assert_equal true, reflection.options.fetch(:include_data_setting)
82
-
83
- include_slice = :does_not_matter
84
- assert_equal @model.blog, reflection.send(:value, serializer_instance, include_slice)
85
- end
86
-
87
- def test_reflection_value_block_with_explicit_include_data_true
88
- serializer_class = Class.new(ActiveModel::Serializer) do
89
- has_one :blog do
90
- include_data true
91
- object.blog
92
- end
93
- end
94
- serializer_instance = serializer_class.new(@model, @instance_options)
95
-
96
- # Get Reflection
97
- reflection = serializer_class._reflections.fetch(:blog)
98
-
99
- # Assert
100
- assert_respond_to reflection.block, :call
101
- assert_equal Serializer.config.include_data_default, reflection.options.fetch(:include_data_setting)
102
- assert_equal true, reflection.options.fetch(:include_data_setting)
103
-
104
- include_slice = :does_not_matter
105
- assert_equal @model.blog, reflection.send(:value, serializer_instance, include_slice)
106
- end
107
-
108
- def test_reflection_value_block_with_include_data_false_mutates_the_reflection_include_data
109
- serializer_class = Class.new(ActiveModel::Serializer) do
110
- has_one :blog do
111
- include_data false
112
- object.blog
113
- end
114
- end
115
- serializer_instance = serializer_class.new(@model, @instance_options)
116
-
117
- # Get Reflection
118
- reflection = serializer_class._reflections.fetch(:blog)
119
-
120
- # Assert
121
- assert_respond_to reflection.block, :call
122
- assert_equal true, reflection.options.fetch(:include_data_setting)
123
- include_slice = :does_not_matter
124
- assert_nil reflection.send(:value, serializer_instance, include_slice)
125
- assert_equal false, reflection.options.fetch(:include_data_setting)
126
- end
127
-
128
- def test_reflection_value_block_with_include_data_if_sideloaded_included_mutates_the_reflection_include_data
129
- serializer_class = Class.new(ActiveModel::Serializer) do
130
- has_one :blog do
131
- include_data :if_sideloaded
132
- object.blog
133
- end
134
- end
135
- serializer_instance = serializer_class.new(@model, @instance_options)
136
-
137
- # Get Reflection
138
- reflection = serializer_class._reflections.fetch(:blog)
139
-
140
- # Assert
141
- assert_respond_to reflection.block, :call
142
- assert_equal true, reflection.options.fetch(:include_data_setting)
143
- include_slice = {}
144
- assert_nil reflection.send(:value, serializer_instance, include_slice)
145
- assert_equal :if_sideloaded, reflection.options.fetch(:include_data_setting)
146
- end
147
-
148
- def test_reflection_value_block_with_include_data_if_sideloaded_excluded_mutates_the_reflection_include_data
149
- serializer_class = Class.new(ActiveModel::Serializer) do
150
- has_one :blog do
151
- include_data :if_sideloaded
152
- object.blog
153
- end
154
- end
155
- serializer_instance = serializer_class.new(@model, @instance_options)
156
-
157
- # Get Reflection
158
- reflection = serializer_class._reflections.fetch(:blog)
159
-
160
- # Assert
161
- assert_respond_to reflection.block, :call
162
- assert_equal true, reflection.options.fetch(:include_data_setting)
163
- include_slice = { blog: :does_not_matter }
164
- assert_equal @model.blog, reflection.send(:value, serializer_instance, include_slice)
165
- assert_equal :if_sideloaded, reflection.options.fetch(:include_data_setting)
166
- end
167
-
168
- def test_reflection_block_with_link_mutates_the_reflection_links
169
- serializer_class = Class.new(ActiveModel::Serializer) do
170
- has_one :blog do
171
- link :self, 'no_uri_validation'
172
- end
173
- end
174
- serializer_instance = serializer_class.new(@model, @instance_options)
175
-
176
- # Get Reflection
177
- reflection = serializer_class._reflections.fetch(:blog)
178
- assert_equal @empty_links, reflection.options.fetch(:links)
179
-
180
- # Build Association
181
- association = reflection.build_association(serializer_instance, @instance_options)
182
-
183
- # Assert association links empty when not yet evaluated
184
- assert_equal @empty_links, reflection.options.fetch(:links)
185
- assert_equal @empty_links, association.links
186
-
187
- evaluate_association_value(association)
188
-
189
- assert_equal @expected_links, association.links
190
- assert_equal @expected_links, reflection.options.fetch(:links)
191
- end
192
-
193
- def test_reflection_block_with_link_block_mutates_the_reflection_links
194
- serializer_class = Class.new(ActiveModel::Serializer) do
195
- has_one :blog do
196
- link :self do
197
- 'no_uri_validation'
198
- end
199
- end
200
- end
201
- serializer_instance = serializer_class.new(@model, @instance_options)
202
-
203
- # Get Reflection
204
- reflection = serializer_class._reflections.fetch(:blog)
205
- assert_equal @empty_links, reflection.options.fetch(:links)
206
-
207
- # Build Association
208
- association = reflection.build_association(serializer_instance, @instance_options)
209
-
210
- # Assert association links empty when not yet evaluated
211
- assert_equal @empty_links, association.links
212
-
213
- evaluate_association_value(association)
214
-
215
- # Assert before instance_eval link
216
- link = association.links.fetch(:self)
217
- assert_respond_to link, :call
218
- assert_respond_to reflection.options.fetch(:links).fetch(:self), :call
219
-
220
- # Assert after instance_eval link
221
- assert_equal @expected_links.fetch(:self), reflection.instance_eval(&link)
222
- assert_respond_to reflection.options.fetch(:links).fetch(:self), :call
223
- end
224
-
225
- def test_reflection_block_with_meta_mutates_the_reflection_meta
226
- serializer_class = Class.new(ActiveModel::Serializer) do
227
- has_one :blog do
228
- meta(id: object.blog.id)
229
- end
230
- end
231
- serializer_instance = serializer_class.new(@model, @instance_options)
232
-
233
- # Get Reflection
234
- reflection = serializer_class._reflections.fetch(:blog)
235
- assert_nil reflection.options.fetch(:meta)
236
-
237
- # Build Association
238
- association = reflection.build_association(serializer_instance, @instance_options)
239
-
240
- evaluate_association_value(association)
241
-
242
- assert_equal @expected_meta, association.meta
243
- assert_equal @expected_meta, reflection.options.fetch(:meta)
244
- end
245
-
246
- def test_reflection_block_with_meta_block_mutates_the_reflection_meta
247
- serializer_class = Class.new(ActiveModel::Serializer) do
248
- has_one :blog do
249
- meta do
250
- { id: object.blog.id }
251
- end
252
- end
253
- end
254
- serializer_instance = serializer_class.new(@model, @instance_options)
255
-
256
- # Get Reflection
257
- reflection = serializer_class._reflections.fetch(:blog)
258
- assert_nil reflection.options.fetch(:meta)
259
-
260
- # Build Association
261
- association = reflection.build_association(serializer_instance, @instance_options)
262
- # Assert before instance_eval meta
263
-
264
- evaluate_association_value(association)
265
-
266
- assert_respond_to association.meta, :call
267
- assert_respond_to reflection.options.fetch(:meta), :call
268
-
269
- # Assert after instance_eval meta
270
- assert_equal @expected_meta, reflection.instance_eval(&association.meta)
271
- assert_respond_to reflection.options.fetch(:meta), :call
272
- assert_respond_to association.meta, :call
273
- end
274
-
275
- # rubocop:disable Metrics/AbcSize
276
- def test_reflection_block_with_meta_in_link_block_mutates_the_reflection_meta
277
- serializer_class = Class.new(ActiveModel::Serializer) do
278
- has_one :blog do
279
- link :self do
280
- meta(id: object.blog.id)
281
- 'no_uri_validation'
282
- end
283
- end
284
- end
285
- serializer_instance = serializer_class.new(@model, @instance_options)
286
-
287
- # Get Reflection
288
- reflection = serializer_class._reflections.fetch(:blog)
289
- assert_nil reflection.options.fetch(:meta)
290
- assert_equal @empty_links, reflection.options.fetch(:links)
291
-
292
- # Build Association
293
- association = reflection.build_association(serializer_instance, @instance_options)
294
- # Assert before instance_eval link meta
295
- assert_nil association.meta
296
- assert_nil reflection.options.fetch(:meta)
297
-
298
- evaluate_association_value(association)
299
-
300
- link = association.links.fetch(:self)
301
- assert_respond_to link, :call
302
- assert_respond_to reflection.options.fetch(:links).fetch(:self), :call
303
- assert_nil reflection.options.fetch(:meta)
304
-
305
- # Assert after instance_eval link
306
- assert_equal 'no_uri_validation', reflection.instance_eval(&link)
307
- assert_equal @expected_meta, reflection.options.fetch(:meta)
308
- assert_equal @expected_meta, association.meta
309
- end
310
- # rubocop:enable Metrics/AbcSize
311
-
312
- # rubocop:disable Metrics/AbcSize
313
- def test_reflection_block_with_meta_block_in_link_block_mutates_the_reflection_meta
314
- serializer_class = Class.new(ActiveModel::Serializer) do
315
- has_one :blog do
316
- link :self do
317
- meta do
318
- { id: object.blog.id }
319
- end
320
- 'no_uri_validation'
321
- end
322
- end
323
- end
324
- serializer_instance = serializer_class.new(@model, @instance_options)
325
-
326
- # Get Reflection
327
- reflection = serializer_class._reflections.fetch(:blog)
328
- assert_nil reflection.options.fetch(:meta)
329
-
330
- # Build Association
331
- association = reflection.build_association(serializer_instance, @instance_options)
332
- assert_nil association.meta
333
- assert_nil reflection.options.fetch(:meta)
334
-
335
- # Assert before instance_eval link
336
-
337
- evaluate_association_value(association)
338
-
339
- link = association.links.fetch(:self)
340
- assert_nil reflection.options.fetch(:meta)
341
- assert_respond_to link, :call
342
- assert_respond_to association.links.fetch(:self), :call
343
-
344
- # Assert after instance_eval link
345
- assert_equal 'no_uri_validation', reflection.instance_eval(&link)
346
- assert_respond_to association.links.fetch(:self), :call
347
- # Assert before instance_eval link meta
348
- assert_respond_to reflection.options.fetch(:meta), :call
349
- assert_respond_to association.meta, :call
350
-
351
- # Assert after instance_eval link meta
352
- assert_equal @expected_meta, reflection.instance_eval(&reflection.options.fetch(:meta))
353
- assert_respond_to association.meta, :call
354
- end
355
- # rubocop:enable Metrics/AbcSize
356
-
357
- def test_no_href_in_vanilla_reflection
358
- serializer_class = Class.new(ActiveModel::Serializer) do
359
- has_one :blog do
360
- link :self do
361
- href 'no_uri_validation'
362
- end
363
- end
364
- end
365
- serializer_instance = serializer_class.new(@model, @instance_options)
366
-
367
- # Get Reflection
368
- reflection = serializer_class._reflections.fetch(:blog)
369
- assert_equal @empty_links, reflection.options.fetch(:links)
370
-
371
- # Build Association
372
- association = reflection.build_association(serializer_instance, @instance_options)
373
- # Assert before instance_eval link
374
-
375
- evaluate_association_value(association)
376
-
377
- link = association.links.fetch(:self)
378
- assert_respond_to link, :call
379
-
380
- # Assert after instance_eval link
381
- exception = assert_raise(NoMethodError) do
382
- reflection.instance_eval(&link)
383
- end
384
- assert_match(/undefined method `href'/, exception.message)
385
- end
386
-
387
- # rubocop:disable Metrics/AbcSize
388
- def test_mutating_reflection_block_is_not_thread_safe
389
- serializer_class = Class.new(ActiveModel::Serializer) do
390
- has_one :blog do
391
- meta(id: object.blog.id)
392
- end
393
- end
394
- model1_meta = @expected_meta
395
- # Evaluate reflection meta for model with id 1
396
- serializer_instance = serializer_class.new(@model, @instance_options)
397
- reflection = serializer_class._reflections.fetch(:blog)
398
- assert_nil reflection.options.fetch(:meta)
399
- association = reflection.build_association(serializer_instance, @instance_options)
400
-
401
- evaluate_association_value(association)
402
-
403
- assert_equal model1_meta, association.meta
404
- assert_equal model1_meta, reflection.options.fetch(:meta)
405
-
406
- model2_meta = @expected_meta.merge(id: 2)
407
- # Evaluate reflection meta for model with id 2
408
- @model.blog.id = 2
409
- assert_equal 2, @model.blog.id # sanity check
410
- serializer_instance = serializer_class.new(@model, @instance_options)
411
- reflection = serializer_class._reflections.fetch(:blog)
412
-
413
- # WARN: Thread-safety issue
414
- # Before the reflection is evaluated, it has the value from the previous evaluation
415
- assert_equal model1_meta, reflection.options.fetch(:meta)
416
-
417
- association = reflection.build_association(serializer_instance, @instance_options)
418
-
419
- evaluate_association_value(association)
420
-
421
- assert_equal model2_meta, association.meta
422
- assert_equal model2_meta, reflection.options.fetch(:meta)
423
- end
424
- # rubocop:enable Metrics/AbcSize
425
- end
426
- end
427
- end