active_model_serializers_custom 0.10.90

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 (215) hide show
  1. checksums.yaml +7 -0
  2. data/.github/ISSUE_TEMPLATE.md +29 -0
  3. data/.github/PULL_REQUEST_TEMPLATE.md +15 -0
  4. data/.gitignore +35 -0
  5. data/.rubocop.yml +109 -0
  6. data/.simplecov +110 -0
  7. data/.travis.yml +63 -0
  8. data/CHANGELOG.md +727 -0
  9. data/CODE_OF_CONDUCT.md +74 -0
  10. data/CONTRIBUTING.md +105 -0
  11. data/Gemfile +74 -0
  12. data/MIT-LICENSE +22 -0
  13. data/README.md +305 -0
  14. data/Rakefile +76 -0
  15. data/active_model_serializers.gemspec +64 -0
  16. data/appveyor.yml +28 -0
  17. data/bin/bench +171 -0
  18. data/bin/bench_regression +316 -0
  19. data/bin/rubocop +38 -0
  20. data/bin/serve_benchmark +39 -0
  21. data/docs/README.md +41 -0
  22. data/docs/STYLE.md +58 -0
  23. data/docs/general/adapters.md +269 -0
  24. data/docs/general/caching.md +58 -0
  25. data/docs/general/configuration_options.md +185 -0
  26. data/docs/general/deserialization.md +100 -0
  27. data/docs/general/fields.md +31 -0
  28. data/docs/general/getting_started.md +133 -0
  29. data/docs/general/instrumentation.md +40 -0
  30. data/docs/general/key_transforms.md +40 -0
  31. data/docs/general/logging.md +21 -0
  32. data/docs/general/rendering.md +293 -0
  33. data/docs/general/serializers.md +495 -0
  34. data/docs/how-open-source-maintained.jpg +0 -0
  35. data/docs/howto/add_pagination_links.md +138 -0
  36. data/docs/howto/add_relationship_links.md +140 -0
  37. data/docs/howto/add_root_key.md +62 -0
  38. data/docs/howto/grape_integration.md +42 -0
  39. data/docs/howto/outside_controller_use.md +66 -0
  40. data/docs/howto/passing_arbitrary_options.md +27 -0
  41. data/docs/howto/serialize_poro.md +73 -0
  42. data/docs/howto/test.md +154 -0
  43. data/docs/howto/upgrade_from_0_8_to_0_10.md +265 -0
  44. data/docs/integrations/ember-and-json-api.md +147 -0
  45. data/docs/integrations/grape.md +19 -0
  46. data/docs/jsonapi/errors.md +56 -0
  47. data/docs/jsonapi/schema.md +151 -0
  48. data/docs/jsonapi/schema/schema.json +366 -0
  49. data/docs/rfcs/0000-namespace.md +106 -0
  50. data/docs/rfcs/template.md +15 -0
  51. data/lib/action_controller/serialization.rb +76 -0
  52. data/lib/active_model/serializable_resource.rb +13 -0
  53. data/lib/active_model/serializer.rb +418 -0
  54. data/lib/active_model/serializer/adapter.rb +26 -0
  55. data/lib/active_model/serializer/adapter/attributes.rb +17 -0
  56. data/lib/active_model/serializer/adapter/base.rb +20 -0
  57. data/lib/active_model/serializer/adapter/json.rb +17 -0
  58. data/lib/active_model/serializer/adapter/json_api.rb +17 -0
  59. data/lib/active_model/serializer/adapter/null.rb +17 -0
  60. data/lib/active_model/serializer/array_serializer.rb +14 -0
  61. data/lib/active_model/serializer/association.rb +91 -0
  62. data/lib/active_model/serializer/attribute.rb +27 -0
  63. data/lib/active_model/serializer/belongs_to_reflection.rb +13 -0
  64. data/lib/active_model/serializer/collection_serializer.rb +90 -0
  65. data/lib/active_model/serializer/concerns/caching.rb +304 -0
  66. data/lib/active_model/serializer/error_serializer.rb +16 -0
  67. data/lib/active_model/serializer/errors_serializer.rb +34 -0
  68. data/lib/active_model/serializer/field.rb +92 -0
  69. data/lib/active_model/serializer/fieldset.rb +33 -0
  70. data/lib/active_model/serializer/has_many_reflection.rb +12 -0
  71. data/lib/active_model/serializer/has_one_reflection.rb +9 -0
  72. data/lib/active_model/serializer/lazy_association.rb +99 -0
  73. data/lib/active_model/serializer/link.rb +23 -0
  74. data/lib/active_model/serializer/lint.rb +152 -0
  75. data/lib/active_model/serializer/null.rb +19 -0
  76. data/lib/active_model/serializer/reflection.rb +212 -0
  77. data/lib/active_model/serializer/version.rb +7 -0
  78. data/lib/active_model_serializers.rb +63 -0
  79. data/lib/active_model_serializers/adapter.rb +100 -0
  80. data/lib/active_model_serializers/adapter/attributes.rb +15 -0
  81. data/lib/active_model_serializers/adapter/base.rb +85 -0
  82. data/lib/active_model_serializers/adapter/json.rb +23 -0
  83. data/lib/active_model_serializers/adapter/json_api.rb +535 -0
  84. data/lib/active_model_serializers/adapter/json_api/deserialization.rb +215 -0
  85. data/lib/active_model_serializers/adapter/json_api/error.rb +98 -0
  86. data/lib/active_model_serializers/adapter/json_api/jsonapi.rb +51 -0
  87. data/lib/active_model_serializers/adapter/json_api/link.rb +85 -0
  88. data/lib/active_model_serializers/adapter/json_api/meta.rb +39 -0
  89. data/lib/active_model_serializers/adapter/json_api/pagination_links.rb +90 -0
  90. data/lib/active_model_serializers/adapter/json_api/relationship.rb +106 -0
  91. data/lib/active_model_serializers/adapter/json_api/resource_identifier.rb +68 -0
  92. data/lib/active_model_serializers/adapter/null.rb +11 -0
  93. data/lib/active_model_serializers/callbacks.rb +57 -0
  94. data/lib/active_model_serializers/deprecate.rb +56 -0
  95. data/lib/active_model_serializers/deserialization.rb +17 -0
  96. data/lib/active_model_serializers/json_pointer.rb +16 -0
  97. data/lib/active_model_serializers/logging.rb +124 -0
  98. data/lib/active_model_serializers/lookup_chain.rb +82 -0
  99. data/lib/active_model_serializers/model.rb +132 -0
  100. data/lib/active_model_serializers/railtie.rb +52 -0
  101. data/lib/active_model_serializers/register_jsonapi_renderer.rb +80 -0
  102. data/lib/active_model_serializers/serializable_resource.rb +84 -0
  103. data/lib/active_model_serializers/serialization_context.rb +41 -0
  104. data/lib/active_model_serializers/test.rb +9 -0
  105. data/lib/active_model_serializers/test/schema.rb +140 -0
  106. data/lib/active_model_serializers/test/serializer.rb +127 -0
  107. data/lib/generators/rails/USAGE +6 -0
  108. data/lib/generators/rails/resource_override.rb +12 -0
  109. data/lib/generators/rails/serializer_generator.rb +38 -0
  110. data/lib/generators/rails/templates/serializer.rb.erb +8 -0
  111. data/lib/grape/active_model_serializers.rb +18 -0
  112. data/lib/grape/formatters/active_model_serializers.rb +34 -0
  113. data/lib/grape/helpers/active_model_serializers.rb +19 -0
  114. data/lib/tasks/rubocop.rake +55 -0
  115. data/test/action_controller/adapter_selector_test.rb +64 -0
  116. data/test/action_controller/explicit_serializer_test.rb +137 -0
  117. data/test/action_controller/json/include_test.rb +248 -0
  118. data/test/action_controller/json_api/deserialization_test.rb +114 -0
  119. data/test/action_controller/json_api/errors_test.rb +42 -0
  120. data/test/action_controller/json_api/fields_test.rb +68 -0
  121. data/test/action_controller/json_api/linked_test.rb +204 -0
  122. data/test/action_controller/json_api/pagination_test.rb +126 -0
  123. data/test/action_controller/json_api/transform_test.rb +191 -0
  124. data/test/action_controller/lookup_proc_test.rb +51 -0
  125. data/test/action_controller/namespace_lookup_test.rb +239 -0
  126. data/test/action_controller/serialization_scope_name_test.rb +237 -0
  127. data/test/action_controller/serialization_test.rb +480 -0
  128. data/test/active_model_serializers/adapter_for_test.rb +210 -0
  129. data/test/active_model_serializers/json_pointer_test.rb +24 -0
  130. data/test/active_model_serializers/logging_test.rb +79 -0
  131. data/test/active_model_serializers/model_test.rb +144 -0
  132. data/test/active_model_serializers/railtie_test_isolated.rb +70 -0
  133. data/test/active_model_serializers/register_jsonapi_renderer_test_isolated.rb +163 -0
  134. data/test/active_model_serializers/serialization_context_test_isolated.rb +73 -0
  135. data/test/active_model_serializers/test/schema_test.rb +133 -0
  136. data/test/active_model_serializers/test/serializer_test.rb +64 -0
  137. data/test/active_record_test.rb +11 -0
  138. data/test/adapter/attributes_test.rb +42 -0
  139. data/test/adapter/deprecation_test.rb +102 -0
  140. data/test/adapter/json/belongs_to_test.rb +47 -0
  141. data/test/adapter/json/collection_test.rb +106 -0
  142. data/test/adapter/json/has_many_test.rb +55 -0
  143. data/test/adapter/json/transform_test.rb +95 -0
  144. data/test/adapter/json_api/belongs_to_test.rb +157 -0
  145. data/test/adapter/json_api/collection_test.rb +98 -0
  146. data/test/adapter/json_api/errors_test.rb +78 -0
  147. data/test/adapter/json_api/fields_test.rb +98 -0
  148. data/test/adapter/json_api/has_many_explicit_serializer_test.rb +98 -0
  149. data/test/adapter/json_api/has_many_test.rb +175 -0
  150. data/test/adapter/json_api/has_one_test.rb +82 -0
  151. data/test/adapter/json_api/include_data_if_sideloaded_test.rb +215 -0
  152. data/test/adapter/json_api/json_api_test.rb +35 -0
  153. data/test/adapter/json_api/linked_test.rb +415 -0
  154. data/test/adapter/json_api/links_test.rb +112 -0
  155. data/test/adapter/json_api/pagination_links_test.rb +208 -0
  156. data/test/adapter/json_api/parse_test.rb +139 -0
  157. data/test/adapter/json_api/relationship_test.rb +399 -0
  158. data/test/adapter/json_api/resource_meta_test.rb +102 -0
  159. data/test/adapter/json_api/toplevel_jsonapi_test.rb +84 -0
  160. data/test/adapter/json_api/transform_test.rb +514 -0
  161. data/test/adapter/json_api/type_test.rb +195 -0
  162. data/test/adapter/json_test.rb +48 -0
  163. data/test/adapter/null_test.rb +24 -0
  164. data/test/adapter/polymorphic_test.rb +220 -0
  165. data/test/adapter_test.rb +69 -0
  166. data/test/array_serializer_test.rb +24 -0
  167. data/test/benchmark/app.rb +67 -0
  168. data/test/benchmark/benchmarking_support.rb +69 -0
  169. data/test/benchmark/bm_active_record.rb +83 -0
  170. data/test/benchmark/bm_adapter.rb +40 -0
  171. data/test/benchmark/bm_caching.rb +121 -0
  172. data/test/benchmark/bm_lookup_chain.rb +85 -0
  173. data/test/benchmark/bm_transform.rb +47 -0
  174. data/test/benchmark/config.ru +3 -0
  175. data/test/benchmark/controllers.rb +85 -0
  176. data/test/benchmark/fixtures.rb +221 -0
  177. data/test/cache_test.rb +717 -0
  178. data/test/collection_serializer_test.rb +129 -0
  179. data/test/fixtures/active_record.rb +115 -0
  180. data/test/fixtures/poro.rb +227 -0
  181. data/test/generators/scaffold_controller_generator_test.rb +26 -0
  182. data/test/generators/serializer_generator_test.rb +77 -0
  183. data/test/grape_test.rb +198 -0
  184. data/test/lint_test.rb +51 -0
  185. data/test/logger_test.rb +22 -0
  186. data/test/poro_test.rb +11 -0
  187. data/test/serializable_resource_test.rb +81 -0
  188. data/test/serializers/association_macros_test.rb +39 -0
  189. data/test/serializers/associations_test.rb +520 -0
  190. data/test/serializers/attribute_test.rb +155 -0
  191. data/test/serializers/attributes_test.rb +54 -0
  192. data/test/serializers/caching_configuration_test_isolated.rb +172 -0
  193. data/test/serializers/configuration_test.rb +34 -0
  194. data/test/serializers/fieldset_test.rb +16 -0
  195. data/test/serializers/meta_test.rb +204 -0
  196. data/test/serializers/options_test.rb +34 -0
  197. data/test/serializers/read_attribute_for_serialization_test.rb +81 -0
  198. data/test/serializers/reflection_test.rb +481 -0
  199. data/test/serializers/root_test.rb +23 -0
  200. data/test/serializers/serialization_test.rb +57 -0
  201. data/test/serializers/serializer_for_test.rb +138 -0
  202. data/test/serializers/serializer_for_with_namespace_test.rb +90 -0
  203. data/test/support/custom_schemas/active_model_serializers/test/schema_test/my/index.json +6 -0
  204. data/test/support/isolated_unit.rb +86 -0
  205. data/test/support/rails5_shims.rb +55 -0
  206. data/test/support/rails_app.rb +40 -0
  207. data/test/support/schemas/active_model_serializers/test/schema_test/my/index.json +6 -0
  208. data/test/support/schemas/active_model_serializers/test/schema_test/my/show.json +6 -0
  209. data/test/support/schemas/custom/show.json +7 -0
  210. data/test/support/schemas/hyper_schema.json +93 -0
  211. data/test/support/schemas/render_using_json_api.json +43 -0
  212. data/test/support/schemas/simple_json_pointers.json +10 -0
  213. data/test/support/serialization_testing.rb +81 -0
  214. data/test/test_helper.rb +72 -0
  215. metadata +622 -0
@@ -0,0 +1,210 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'test_helper'
4
+
5
+ module ActiveModelSerializers
6
+ class AdapterForTest < ::ActiveSupport::TestCase
7
+ UnknownAdapterError = ::ActiveModelSerializers::Adapter::UnknownAdapterError
8
+
9
+ def test_serializer_adapter_returns_configured_adapter
10
+ assert_output(nil, /ActiveModelSerializers::Adapter.configured_adapter/) do
11
+ assert_equal ActiveModelSerializers::Adapter.configured_adapter, ActiveModel::Serializer.adapter
12
+ end
13
+ end
14
+
15
+ def test_returns_default_adapter
16
+ with_adapter_config_setup do
17
+ adapter = ActiveModelSerializers::Adapter.configured_adapter
18
+ assert_equal ActiveModelSerializers::Adapter::Attributes, adapter
19
+ end
20
+ end
21
+
22
+ def test_overwrite_adapter_with_symbol
23
+ with_adapter_config_setup do
24
+ ActiveModelSerializers.config.adapter = :null
25
+
26
+ adapter = ActiveModelSerializers::Adapter.configured_adapter
27
+ assert_equal ActiveModelSerializers::Adapter::Null, adapter
28
+ end
29
+ end
30
+
31
+ def test_overwrite_adapter_with_camelcased_symbol
32
+ with_adapter_config_setup do
33
+ ActiveModelSerializers.config.adapter = :JsonApi
34
+
35
+ adapter = ActiveModelSerializers::Adapter.configured_adapter
36
+ assert_equal ActiveModelSerializers::Adapter::JsonApi, adapter
37
+ end
38
+ end
39
+
40
+ def test_overwrite_adapter_with_string
41
+ with_adapter_config_setup do
42
+ ActiveModelSerializers.config.adapter = 'json_api'
43
+
44
+ adapter = ActiveModelSerializers::Adapter.configured_adapter
45
+ assert_equal ActiveModelSerializers::Adapter::JsonApi, adapter
46
+ end
47
+ end
48
+
49
+ def test_overwrite_adapter_with_a_camelcased_string
50
+ with_adapter_config_setup do
51
+ ActiveModelSerializers.config.adapter = 'JsonApi'
52
+
53
+ adapter = ActiveModelSerializers::Adapter.configured_adapter
54
+ assert_equal ActiveModelSerializers::Adapter::JsonApi, adapter
55
+ end
56
+ end
57
+
58
+ def test_overwrite_adapter_with_class
59
+ with_adapter_config_setup do
60
+ ActiveModelSerializers.config.adapter = ActiveModelSerializers::Adapter::Null
61
+
62
+ adapter = ActiveModelSerializers::Adapter.configured_adapter
63
+ assert_equal ActiveModelSerializers::Adapter::Null, adapter
64
+ end
65
+ end
66
+
67
+ def test_raises_exception_if_invalid_symbol_given
68
+ with_adapter_config_setup do
69
+ ActiveModelSerializers.config.adapter = :unknown
70
+
71
+ assert_raises UnknownAdapterError do
72
+ ActiveModelSerializers::Adapter.configured_adapter
73
+ end
74
+ end
75
+ end
76
+
77
+ def test_raises_exception_if_it_does_not_know_hot_to_infer_adapter
78
+ with_adapter_config_setup do
79
+ ActiveModelSerializers.config.adapter = 42
80
+
81
+ assert_raises UnknownAdapterError do
82
+ ActiveModelSerializers::Adapter.configured_adapter
83
+ end
84
+ end
85
+ end
86
+
87
+ def test_adapter_class_for_known_adapter
88
+ klass = ActiveModelSerializers::Adapter.adapter_class(:json_api)
89
+ assert_equal ActiveModelSerializers::Adapter::JsonApi, klass
90
+ end
91
+
92
+ def test_adapter_class_for_unknown_adapter
93
+ assert_raises UnknownAdapterError do
94
+ ActiveModelSerializers::Adapter.adapter_class(:json_simple)
95
+ end
96
+ end
97
+
98
+ def test_adapter_map
99
+ expected_adapter_map = {
100
+ 'null'.freeze => ActiveModelSerializers::Adapter::Null,
101
+ 'json'.freeze => ActiveModelSerializers::Adapter::Json,
102
+ 'attributes'.freeze => ActiveModelSerializers::Adapter::Attributes,
103
+ 'json_api'.freeze => ActiveModelSerializers::Adapter::JsonApi
104
+ }
105
+ actual = ActiveModelSerializers::Adapter.adapter_map
106
+ assert_equal actual, expected_adapter_map
107
+ end
108
+
109
+ def test_adapters
110
+ assert_equal ActiveModelSerializers::Adapter.adapters.sort, [
111
+ 'attributes'.freeze,
112
+ 'json'.freeze,
113
+ 'json_api'.freeze,
114
+ 'null'.freeze
115
+ ]
116
+ end
117
+
118
+ def test_lookup_adapter_by_string_name
119
+ assert_equal ActiveModelSerializers::Adapter.lookup('json'.freeze), ActiveModelSerializers::Adapter::Json
120
+ end
121
+
122
+ def test_lookup_adapter_by_symbol_name
123
+ assert_equal ActiveModelSerializers::Adapter.lookup(:json), ActiveModelSerializers::Adapter::Json
124
+ end
125
+
126
+ def test_lookup_adapter_by_class
127
+ klass = ActiveModelSerializers::Adapter::Json
128
+ assert_equal ActiveModelSerializers::Adapter.lookup(klass), klass
129
+ end
130
+
131
+ def test_lookup_adapter_from_environment_registers_adapter
132
+ ActiveModelSerializers::Adapter.const_set(:AdapterFromEnvironment, Class.new)
133
+ klass = ::ActiveModelSerializers::Adapter::AdapterFromEnvironment
134
+ name = 'adapter_from_environment'.freeze
135
+ assert_equal ActiveModelSerializers::Adapter.lookup(name), klass
136
+ assert ActiveModelSerializers::Adapter.adapters.include?(name)
137
+ ensure
138
+ ActiveModelSerializers::Adapter.adapter_map.delete(name)
139
+ ActiveModelSerializers::Adapter.send(:remove_const, :AdapterFromEnvironment)
140
+ end
141
+
142
+ def test_lookup_adapter_for_unknown_name
143
+ assert_raises UnknownAdapterError do
144
+ ActiveModelSerializers::Adapter.lookup(:json_simple)
145
+ end
146
+ end
147
+
148
+ def test_adapter
149
+ assert_equal ActiveModelSerializers.config.adapter, :attributes
150
+ assert_equal ActiveModelSerializers::Adapter.configured_adapter, ActiveModelSerializers::Adapter::Attributes
151
+ end
152
+
153
+ def test_register_adapter
154
+ new_adapter_name = :foo
155
+ new_adapter_klass = Class.new
156
+ ActiveModelSerializers::Adapter.register(new_adapter_name, new_adapter_klass)
157
+ assert ActiveModelSerializers::Adapter.adapters.include?('foo'.freeze)
158
+ assert ActiveModelSerializers::Adapter.lookup(:foo), new_adapter_klass
159
+ ensure
160
+ ActiveModelSerializers::Adapter.adapter_map.delete(new_adapter_name.to_s)
161
+ end
162
+
163
+ def test_inherited_adapter_hooks_register_adapter
164
+ Object.const_set(:MyAdapter, Class.new)
165
+ my_adapter = MyAdapter
166
+ ActiveModelSerializers::Adapter::Base.inherited(my_adapter)
167
+ assert_equal ActiveModelSerializers::Adapter.lookup(:my_adapter), my_adapter
168
+ ensure
169
+ ActiveModelSerializers::Adapter.adapter_map.delete('my_adapter'.freeze)
170
+ Object.send(:remove_const, :MyAdapter)
171
+ end
172
+
173
+ def test_inherited_adapter_hooks_register_namespaced_adapter
174
+ Object.const_set(:MyNamespace, Module.new)
175
+ MyNamespace.const_set(:MyAdapter, Class.new)
176
+ my_adapter = MyNamespace::MyAdapter
177
+ ActiveModelSerializers::Adapter::Base.inherited(my_adapter)
178
+ assert_equal ActiveModelSerializers::Adapter.lookup(:'my_namespace/my_adapter'), my_adapter
179
+ ensure
180
+ ActiveModelSerializers::Adapter.adapter_map.delete('my_namespace/my_adapter'.freeze)
181
+ MyNamespace.send(:remove_const, :MyAdapter)
182
+ Object.send(:remove_const, :MyNamespace)
183
+ end
184
+
185
+ def test_inherited_adapter_hooks_register_subclass_of_registered_adapter
186
+ Object.const_set(:MyAdapter, Class.new)
187
+ my_adapter = MyAdapter
188
+ Object.const_set(:MySubclassedAdapter, Class.new(MyAdapter))
189
+ my_subclassed_adapter = MySubclassedAdapter
190
+ ActiveModelSerializers::Adapter::Base.inherited(my_adapter)
191
+ ActiveModelSerializers::Adapter::Base.inherited(my_subclassed_adapter)
192
+ assert_equal ActiveModelSerializers::Adapter.lookup(:my_adapter), my_adapter
193
+ assert_equal ActiveModelSerializers::Adapter.lookup(:my_subclassed_adapter), my_subclassed_adapter
194
+ ensure
195
+ ActiveModelSerializers::Adapter.adapter_map.delete('my_adapter'.freeze)
196
+ ActiveModelSerializers::Adapter.adapter_map.delete('my_subclassed_adapter'.freeze)
197
+ Object.send(:remove_const, :MyAdapter)
198
+ Object.send(:remove_const, :MySubclassedAdapter)
199
+ end
200
+
201
+ private
202
+
203
+ def with_adapter_config_setup
204
+ previous_adapter = ActiveModelSerializers.config.adapter
205
+ yield
206
+ ensure
207
+ ActiveModelSerializers.config.adapter = previous_adapter
208
+ end
209
+ end
210
+ end
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'test_helper'
4
+
5
+ module ActiveModelSerializers
6
+ class JsonPointerTest < ActiveSupport::TestCase
7
+ def test_attribute_pointer
8
+ attribute_name = 'title'
9
+ pointer = ActiveModelSerializers::JsonPointer.new(:attribute, attribute_name)
10
+ assert_equal '/data/attributes/title', pointer
11
+ end
12
+
13
+ def test_primary_data_pointer
14
+ pointer = ActiveModelSerializers::JsonPointer.new(:primary_data)
15
+ assert_equal '/data', pointer
16
+ end
17
+
18
+ def test_unknown_data_pointer
19
+ assert_raises(TypeError) do
20
+ ActiveModelSerializers::JsonPointer.new(:unknown)
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,79 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'test_helper'
4
+
5
+ module ActiveModel
6
+ class Serializer
7
+ class LoggingTest < ActiveSupport::TestCase
8
+ class TestLogger < ActiveSupport::Logger
9
+ def initialize
10
+ @file = StringIO.new
11
+ super(@file)
12
+ end
13
+
14
+ def messages
15
+ @file.rewind
16
+ @file.read
17
+ end
18
+ end
19
+
20
+ def setup
21
+ @author = Author.new(name: 'Steve K.')
22
+ @post = Post.new(title: 'New Post', body: 'Body')
23
+ @comment = Comment.new(id: 1, body: 'ZOMG A COMMENT')
24
+ @post.comments = [@comment]
25
+ @comment.post = @post
26
+ @post.author = @author
27
+ @author.posts = [@post]
28
+ @post_serializer = PostSerializer.new(@post, custom_options: true)
29
+
30
+ @old_logger = ActiveModelSerializers.logger
31
+ @logger = ActiveSupport::TaggedLogging.new(TestLogger.new)
32
+ logger @logger
33
+ end
34
+
35
+ def teardown
36
+ logger @old_logger
37
+ end
38
+
39
+ def logger(logger)
40
+ ActiveModelSerializers.logger = logger
41
+ end
42
+
43
+ def test_uses_ams_as_tag
44
+ ActiveModelSerializers::SerializableResource.new(@post).serializable_hash
45
+ assert_match(/\[active_model_serializers\]/, @logger.messages)
46
+ end
47
+
48
+ def test_logs_when_call_serializable_hash
49
+ ActiveModelSerializers::SerializableResource.new(@post).serializable_hash
50
+ assert_match(/Rendered/, @logger.messages)
51
+ end
52
+
53
+ def test_logs_when_call_as_json
54
+ ActiveModelSerializers::SerializableResource.new(@post).as_json
55
+ assert_match(/Rendered/, @logger.messages)
56
+ end
57
+
58
+ def test_logs_when_call_to_json
59
+ ActiveModelSerializers::SerializableResource.new(@post).to_json
60
+ assert_match(/Rendered/, @logger.messages)
61
+ end
62
+
63
+ def test_logs_correct_serializer
64
+ ActiveModelSerializers::SerializableResource.new(@post).serializable_hash
65
+ assert_match(/PostSerializer/, @logger.messages)
66
+ end
67
+
68
+ def test_logs_correct_adapter
69
+ ActiveModelSerializers::SerializableResource.new(@post).serializable_hash
70
+ assert_match(/ActiveModelSerializers::Adapter::Attributes/, @logger.messages)
71
+ end
72
+
73
+ def test_logs_the_duration
74
+ ActiveModelSerializers::SerializableResource.new(@post).serializable_hash
75
+ assert_match(/\(\d+\.\d+ms\)/, @logger.messages)
76
+ end
77
+ end
78
+ end
79
+ end
@@ -0,0 +1,144 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'test_helper'
4
+
5
+ module ActiveModelSerializers
6
+ class ModelTest < ActiveSupport::TestCase
7
+ include ActiveModel::Serializer::Lint::Tests
8
+
9
+ setup do
10
+ @resource = ActiveModelSerializers::Model.new
11
+ end
12
+
13
+ def test_initialization_with_string_keys
14
+ klass = Class.new(ActiveModelSerializers::Model) do
15
+ attributes :key
16
+ end
17
+ value = 'value'
18
+
19
+ model_instance = klass.new('key' => value)
20
+
21
+ assert_equal model_instance.read_attribute_for_serialization(:key), value
22
+ end
23
+
24
+ def test_attributes_can_be_read_for_serialization
25
+ klass = Class.new(ActiveModelSerializers::Model) do
26
+ attributes :one, :two, :three
27
+ end
28
+ original_attributes = { one: 1, two: 2, three: 3 }
29
+ original_instance = klass.new(original_attributes)
30
+
31
+ # Initial value
32
+ instance = original_instance
33
+ expected_attributes = { one: 1, two: 2, three: 3 }.with_indifferent_access
34
+ assert_equal expected_attributes, instance.attributes
35
+ assert_equal 1, instance.one
36
+ assert_equal 1, instance.read_attribute_for_serialization(:one)
37
+
38
+ # FIXME: Change via accessor has no effect on attributes.
39
+ instance = original_instance.dup
40
+ instance.one = :not_one
41
+ assert_equal expected_attributes, instance.attributes
42
+ assert_equal :not_one, instance.one
43
+ assert_equal :not_one, instance.read_attribute_for_serialization(:one)
44
+
45
+ # FIXME: Change via mutating attributes
46
+ instance = original_instance.dup
47
+ instance.attributes[:one] = :not_one
48
+ expected_attributes = { one: :not_one, two: 2, three: 3 }.with_indifferent_access
49
+ assert_equal expected_attributes, instance.attributes
50
+ assert_equal 1, instance.one
51
+ assert_equal 1, instance.read_attribute_for_serialization(:one)
52
+ end
53
+
54
+ def test_attributes_can_be_read_for_serialization_with_attributes_accessors_fix
55
+ klass = Class.new(ActiveModelSerializers::Model) do
56
+ derive_attributes_from_names_and_fix_accessors
57
+ attributes :one, :two, :three
58
+ end
59
+ original_attributes = { one: 1, two: 2, three: 3 }
60
+ original_instance = klass.new(original_attributes)
61
+
62
+ # Initial value
63
+ instance = original_instance
64
+ expected_attributes = { one: 1, two: 2, three: 3 }.with_indifferent_access
65
+ assert_equal expected_attributes, instance.attributes
66
+ assert_equal 1, instance.one
67
+ assert_equal 1, instance.read_attribute_for_serialization(:one)
68
+
69
+ expected_attributes = { one: :not_one, two: 2, three: 3 }.with_indifferent_access
70
+ # Change via accessor
71
+ instance = original_instance.dup
72
+ instance.one = :not_one
73
+ assert_equal expected_attributes, instance.attributes
74
+ assert_equal :not_one, instance.one
75
+ assert_equal :not_one, instance.read_attribute_for_serialization(:one)
76
+
77
+ # Attributes frozen
78
+ assert instance.attributes.frozen?
79
+ end
80
+
81
+ def test_id_attribute_can_be_read_for_serialization
82
+ klass = Class.new(ActiveModelSerializers::Model) do
83
+ attributes :id, :one, :two, :three
84
+ end
85
+ self.class.const_set(:SomeTestModel, klass)
86
+ original_attributes = { id: :ego, one: 1, two: 2, three: 3 }
87
+ original_instance = klass.new(original_attributes)
88
+
89
+ # Initial value
90
+ instance = original_instance.dup
91
+ expected_attributes = { id: :ego, one: 1, two: 2, three: 3 }.with_indifferent_access
92
+ assert_equal expected_attributes, instance.attributes
93
+ assert_equal :ego, instance.id
94
+ assert_equal :ego, instance.read_attribute_for_serialization(:id)
95
+
96
+ # FIXME: Change via accessor has no effect on attributes.
97
+ instance = original_instance.dup
98
+ instance.id = :superego
99
+ assert_equal expected_attributes, instance.attributes
100
+ assert_equal :superego, instance.id
101
+ assert_equal :superego, instance.read_attribute_for_serialization(:id)
102
+
103
+ # FIXME: Change via mutating attributes
104
+ instance = original_instance.dup
105
+ instance.attributes[:id] = :superego
106
+ expected_attributes = { id: :superego, one: 1, two: 2, three: 3 }.with_indifferent_access
107
+ assert_equal expected_attributes, instance.attributes
108
+ assert_equal :ego, instance.id
109
+ assert_equal :ego, instance.read_attribute_for_serialization(:id)
110
+ ensure
111
+ self.class.send(:remove_const, :SomeTestModel)
112
+ end
113
+
114
+ def test_id_attribute_can_be_read_for_serialization_with_attributes_accessors_fix
115
+ klass = Class.new(ActiveModelSerializers::Model) do
116
+ derive_attributes_from_names_and_fix_accessors
117
+ attributes :id, :one, :two, :three
118
+ end
119
+ self.class.const_set(:SomeTestModel, klass)
120
+ original_attributes = { id: :ego, one: 1, two: 2, three: 3 }
121
+ original_instance = klass.new(original_attributes)
122
+
123
+ # Initial value
124
+ instance = original_instance.dup
125
+ expected_attributes = { id: :ego, one: 1, two: 2, three: 3 }.with_indifferent_access
126
+ assert_equal expected_attributes, instance.attributes
127
+ assert_equal :ego, instance.id
128
+ assert_equal :ego, instance.read_attribute_for_serialization(:id)
129
+
130
+ expected_attributes = { id: :superego, one: 1, two: 2, three: 3 }.with_indifferent_access
131
+ # Change via accessor
132
+ instance = original_instance.dup
133
+ instance.id = :superego
134
+ assert_equal expected_attributes, instance.attributes
135
+ assert_equal :superego, instance.id
136
+ assert_equal :superego, instance.read_attribute_for_serialization(:id)
137
+
138
+ # Attributes frozen
139
+ assert instance.attributes.frozen?
140
+ ensure
141
+ self.class.send(:remove_const, :SomeTestModel)
142
+ end
143
+ end
144
+ end