active_model_serializers 0.8.3 → 0.10.0

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 (232) hide show
  1. checksums.yaml +4 -4
  2. data/.github/ISSUE_TEMPLATE.md +29 -0
  3. data/.github/PULL_REQUEST_TEMPLATE.md +15 -0
  4. data/.gitignore +17 -0
  5. data/.rubocop.yml +104 -0
  6. data/.rubocop_todo.yml +167 -0
  7. data/.simplecov +110 -0
  8. data/.travis.yml +39 -24
  9. data/CHANGELOG.md +465 -6
  10. data/CONTRIBUTING.md +105 -0
  11. data/Gemfile +50 -1
  12. data/{MIT-LICENSE.txt → MIT-LICENSE} +3 -2
  13. data/README.md +102 -590
  14. data/Rakefile +93 -8
  15. data/active_model_serializers.gemspec +65 -23
  16. data/appveyor.yml +24 -0
  17. data/bin/bench +171 -0
  18. data/bin/bench_regression +316 -0
  19. data/bin/serve_benchmark +39 -0
  20. data/docs/ARCHITECTURE.md +126 -0
  21. data/docs/README.md +40 -0
  22. data/docs/STYLE.md +58 -0
  23. data/docs/general/adapters.md +245 -0
  24. data/docs/general/caching.md +52 -0
  25. data/docs/general/configuration_options.md +100 -0
  26. data/docs/general/deserialization.md +100 -0
  27. data/docs/general/getting_started.md +133 -0
  28. data/docs/general/instrumentation.md +40 -0
  29. data/docs/general/key_transforms.md +40 -0
  30. data/docs/general/logging.md +14 -0
  31. data/docs/general/rendering.md +255 -0
  32. data/docs/general/serializers.md +372 -0
  33. data/docs/how-open-source-maintained.jpg +0 -0
  34. data/docs/howto/add_pagination_links.md +139 -0
  35. data/docs/howto/add_root_key.md +51 -0
  36. data/docs/howto/outside_controller_use.md +58 -0
  37. data/docs/howto/passing_arbitrary_options.md +27 -0
  38. data/docs/howto/serialize_poro.md +32 -0
  39. data/docs/howto/test.md +152 -0
  40. data/docs/integrations/ember-and-json-api.md +112 -0
  41. data/docs/integrations/grape.md +19 -0
  42. data/docs/jsonapi/errors.md +56 -0
  43. data/docs/jsonapi/schema/schema.json +366 -0
  44. data/docs/jsonapi/schema.md +151 -0
  45. data/docs/rfcs/0000-namespace.md +106 -0
  46. data/docs/rfcs/template.md +15 -0
  47. data/lib/action_controller/serialization.rb +31 -36
  48. data/lib/active_model/serializable_resource.rb +11 -0
  49. data/lib/active_model/serializer/adapter/attributes.rb +15 -0
  50. data/lib/active_model/serializer/adapter/base.rb +16 -0
  51. data/lib/active_model/serializer/adapter/json.rb +15 -0
  52. data/lib/active_model/serializer/adapter/json_api.rb +15 -0
  53. data/lib/active_model/serializer/adapter/null.rb +15 -0
  54. data/lib/active_model/serializer/adapter.rb +24 -0
  55. data/lib/active_model/serializer/array_serializer.rb +9 -0
  56. data/lib/active_model/serializer/association.rb +19 -0
  57. data/lib/active_model/serializer/associations.rb +87 -220
  58. data/lib/active_model/serializer/attribute.rb +25 -0
  59. data/lib/active_model/serializer/attributes.rb +82 -0
  60. data/lib/active_model/serializer/belongs_to_reflection.rb +10 -0
  61. data/lib/active_model/serializer/caching.rb +333 -0
  62. data/lib/active_model/serializer/collection_reflection.rb +7 -0
  63. data/lib/active_model/serializer/collection_serializer.rb +64 -0
  64. data/lib/active_model/serializer/configuration.rb +35 -0
  65. data/lib/active_model/serializer/error_serializer.rb +10 -0
  66. data/lib/active_model/serializer/errors_serializer.rb +27 -0
  67. data/lib/active_model/serializer/field.rb +90 -0
  68. data/lib/active_model/serializer/fieldset.rb +31 -0
  69. data/lib/active_model/serializer/has_many_reflection.rb +10 -0
  70. data/lib/active_model/serializer/has_one_reflection.rb +10 -0
  71. data/lib/active_model/serializer/include_tree.rb +111 -0
  72. data/lib/active_model/serializer/links.rb +35 -0
  73. data/lib/active_model/serializer/lint.rb +146 -0
  74. data/lib/active_model/serializer/meta.rb +29 -0
  75. data/lib/active_model/serializer/null.rb +17 -0
  76. data/lib/active_model/serializer/reflection.rb +147 -0
  77. data/lib/active_model/serializer/singular_reflection.rb +7 -0
  78. data/lib/active_model/serializer/type.rb +25 -0
  79. data/lib/active_model/{serializers → serializer}/version.rb +1 -1
  80. data/lib/active_model/serializer.rb +158 -481
  81. data/lib/active_model_serializers/adapter/attributes.rb +76 -0
  82. data/lib/active_model_serializers/adapter/base.rb +83 -0
  83. data/lib/active_model_serializers/adapter/json.rb +21 -0
  84. data/lib/active_model_serializers/adapter/json_api/deserialization.rb +213 -0
  85. data/lib/active_model_serializers/adapter/json_api/error.rb +96 -0
  86. data/lib/active_model_serializers/adapter/json_api/jsonapi.rb +49 -0
  87. data/lib/active_model_serializers/adapter/json_api/link.rb +83 -0
  88. data/lib/active_model_serializers/adapter/json_api/meta.rb +37 -0
  89. data/lib/active_model_serializers/adapter/json_api/pagination_links.rb +62 -0
  90. data/lib/active_model_serializers/adapter/json_api/relationship.rb +52 -0
  91. data/lib/active_model_serializers/adapter/json_api/resource_identifier.rb +37 -0
  92. data/lib/active_model_serializers/adapter/json_api.rb +516 -0
  93. data/lib/active_model_serializers/adapter/null.rb +9 -0
  94. data/lib/active_model_serializers/adapter.rb +92 -0
  95. data/lib/active_model_serializers/callbacks.rb +55 -0
  96. data/lib/active_model_serializers/deprecate.rb +55 -0
  97. data/lib/active_model_serializers/deserialization.rb +13 -0
  98. data/lib/active_model_serializers/json_pointer.rb +14 -0
  99. data/lib/active_model_serializers/key_transform.rb +70 -0
  100. data/lib/active_model_serializers/logging.rb +122 -0
  101. data/lib/active_model_serializers/model.rb +49 -0
  102. data/lib/active_model_serializers/railtie.rb +46 -0
  103. data/lib/active_model_serializers/register_jsonapi_renderer.rb +65 -0
  104. data/lib/active_model_serializers/serializable_resource.rb +81 -0
  105. data/lib/active_model_serializers/serialization_context.rb +32 -0
  106. data/lib/active_model_serializers/test/schema.rb +138 -0
  107. data/lib/active_model_serializers/test/serializer.rb +125 -0
  108. data/lib/active_model_serializers/test.rb +7 -0
  109. data/lib/active_model_serializers.rb +32 -89
  110. data/lib/generators/rails/USAGE +6 -0
  111. data/lib/generators/rails/resource_override.rb +10 -0
  112. data/lib/generators/rails/serializer_generator.rb +36 -0
  113. data/lib/generators/rails/templates/serializer.rb.erb +8 -0
  114. data/lib/grape/active_model_serializers.rb +14 -0
  115. data/lib/grape/formatters/active_model_serializers.rb +15 -0
  116. data/lib/grape/helpers/active_model_serializers.rb +16 -0
  117. data/test/action_controller/adapter_selector_test.rb +53 -0
  118. data/test/action_controller/explicit_serializer_test.rb +134 -0
  119. data/test/action_controller/json/include_test.rb +167 -0
  120. data/test/action_controller/json_api/deserialization_test.rb +112 -0
  121. data/test/action_controller/json_api/errors_test.rb +41 -0
  122. data/test/action_controller/json_api/linked_test.rb +197 -0
  123. data/test/action_controller/json_api/pagination_test.rb +116 -0
  124. data/test/action_controller/json_api/transform_test.rb +181 -0
  125. data/test/action_controller/serialization_scope_name_test.rb +229 -0
  126. data/test/action_controller/serialization_test.rb +469 -0
  127. data/test/active_model_serializers/adapter_for_test.rb +208 -0
  128. data/test/active_model_serializers/json_pointer_test.rb +20 -0
  129. data/test/active_model_serializers/key_transform_test.rb +263 -0
  130. data/test/active_model_serializers/logging_test.rb +77 -0
  131. data/test/active_model_serializers/model_test.rb +9 -0
  132. data/test/active_model_serializers/railtie_test_isolated.rb +63 -0
  133. data/test/active_model_serializers/serialization_context_test_isolated.rb +58 -0
  134. data/test/active_model_serializers/test/schema_test.rb +130 -0
  135. data/test/active_model_serializers/test/serializer_test.rb +62 -0
  136. data/test/active_record_test.rb +9 -0
  137. data/test/adapter/deprecation_test.rb +100 -0
  138. data/test/adapter/json/belongs_to_test.rb +45 -0
  139. data/test/adapter/json/collection_test.rb +90 -0
  140. data/test/adapter/json/has_many_test.rb +45 -0
  141. data/test/adapter/json/transform_test.rb +93 -0
  142. data/test/adapter/json_api/belongs_to_test.rb +155 -0
  143. data/test/adapter/json_api/collection_test.rb +95 -0
  144. data/test/adapter/json_api/errors_test.rb +78 -0
  145. data/test/adapter/json_api/fields_test.rb +87 -0
  146. data/test/adapter/json_api/has_many_embed_ids_test.rb +43 -0
  147. data/test/adapter/json_api/has_many_explicit_serializer_test.rb +96 -0
  148. data/test/adapter/json_api/has_many_test.rb +144 -0
  149. data/test/adapter/json_api/has_one_test.rb +80 -0
  150. data/test/adapter/json_api/json_api_test.rb +35 -0
  151. data/test/adapter/json_api/linked_test.rb +392 -0
  152. data/test/adapter/json_api/links_test.rb +93 -0
  153. data/test/adapter/json_api/pagination_links_test.rb +166 -0
  154. data/test/adapter/json_api/parse_test.rb +137 -0
  155. data/test/adapter/json_api/relationship_test.rb +161 -0
  156. data/test/adapter/json_api/relationships_test.rb +199 -0
  157. data/test/adapter/json_api/resource_identifier_test.rb +85 -0
  158. data/test/adapter/json_api/resource_meta_test.rb +100 -0
  159. data/test/adapter/json_api/toplevel_jsonapi_test.rb +82 -0
  160. data/test/adapter/json_api/transform_test.rb +502 -0
  161. data/test/adapter/json_api/type_test.rb +61 -0
  162. data/test/adapter/json_test.rb +45 -0
  163. data/test/adapter/null_test.rb +23 -0
  164. data/test/adapter/polymorphic_test.rb +171 -0
  165. data/test/adapter_test.rb +67 -0
  166. data/test/array_serializer_test.rb +20 -73
  167. data/test/benchmark/app.rb +65 -0
  168. data/test/benchmark/benchmarking_support.rb +67 -0
  169. data/test/benchmark/bm_caching.rb +119 -0
  170. data/test/benchmark/bm_transform.rb +34 -0
  171. data/test/benchmark/config.ru +3 -0
  172. data/test/benchmark/controllers.rb +84 -0
  173. data/test/benchmark/fixtures.rb +219 -0
  174. data/test/cache_test.rb +485 -0
  175. data/test/collection_serializer_test.rb +110 -0
  176. data/test/fixtures/active_record.rb +78 -0
  177. data/test/fixtures/poro.rb +282 -0
  178. data/test/generators/scaffold_controller_generator_test.rb +24 -0
  179. data/test/generators/serializer_generator_test.rb +57 -0
  180. data/test/grape_test.rb +82 -0
  181. data/test/include_tree/from_include_args_test.rb +26 -0
  182. data/test/include_tree/from_string_test.rb +94 -0
  183. data/test/include_tree/include_args_to_hash_test.rb +64 -0
  184. data/test/lint_test.rb +49 -0
  185. data/test/logger_test.rb +18 -0
  186. data/test/poro_test.rb +9 -0
  187. data/test/serializable_resource_test.rb +83 -0
  188. data/test/serializers/association_macros_test.rb +36 -0
  189. data/test/serializers/associations_test.rb +295 -0
  190. data/test/serializers/attribute_test.rb +151 -0
  191. data/test/serializers/attributes_test.rb +52 -0
  192. data/test/serializers/caching_configuration_test_isolated.rb +170 -0
  193. data/test/serializers/configuration_test.rb +32 -0
  194. data/test/serializers/fieldset_test.rb +14 -0
  195. data/test/serializers/meta_test.rb +196 -0
  196. data/test/serializers/options_test.rb +21 -0
  197. data/test/serializers/read_attribute_for_serialization_test.rb +79 -0
  198. data/test/serializers/root_test.rb +21 -0
  199. data/test/serializers/serialization_test.rb +55 -0
  200. data/test/serializers/serializer_for_test.rb +134 -0
  201. data/test/support/custom_schemas/active_model_serializers/test/schema_test/my/index.json +6 -0
  202. data/test/support/isolated_unit.rb +79 -0
  203. data/test/support/rails5_shims.rb +47 -0
  204. data/test/support/rails_app.rb +45 -0
  205. data/test/support/schemas/active_model_serializers/test/schema_test/my/index.json +6 -0
  206. data/test/support/schemas/active_model_serializers/test/schema_test/my/show.json +6 -0
  207. data/test/support/schemas/custom/show.json +7 -0
  208. data/test/support/schemas/hyper_schema.json +93 -0
  209. data/test/support/schemas/render_using_json_api.json +43 -0
  210. data/test/support/schemas/simple_json_pointers.json +10 -0
  211. data/test/support/serialization_testing.rb +53 -0
  212. data/test/test_helper.rb +48 -23
  213. metadata +449 -43
  214. data/DESIGN.textile +0 -586
  215. data/Gemfile.edge +0 -9
  216. data/bench/perf.rb +0 -43
  217. data/cruft.md +0 -19
  218. data/lib/active_model/array_serializer.rb +0 -104
  219. data/lib/active_record/serializer_override.rb +0 -16
  220. data/lib/generators/resource_override.rb +0 -13
  221. data/lib/generators/serializer/USAGE +0 -9
  222. data/lib/generators/serializer/serializer_generator.rb +0 -42
  223. data/lib/generators/serializer/templates/serializer.rb +0 -19
  224. data/test/association_test.rb +0 -592
  225. data/test/caching_test.rb +0 -96
  226. data/test/generators_test.rb +0 -85
  227. data/test/no_serialization_scope_test.rb +0 -34
  228. data/test/serialization_scope_name_test.rb +0 -67
  229. data/test/serialization_test.rb +0 -392
  230. data/test/serializer_support_test.rb +0 -51
  231. data/test/serializer_test.rb +0 -1465
  232. data/test/test_fakes.rb +0 -217
@@ -0,0 +1,170 @@
1
+ # Execute this test in isolation
2
+ require 'support/isolated_unit'
3
+
4
+ class CachingConfigurationTest < ActiveSupport::TestCase
5
+ include ActiveSupport::Testing::Isolation
6
+
7
+ setup do
8
+ require 'rails'
9
+ # AMS needs to be required before Rails.application is initialized for
10
+ # Railtie's to fire in Rails.application.initialize!
11
+ # (and make_basic_app initializes the app)
12
+ require 'active_model_serializers'
13
+ # Create serializers before Rails.application.initialize!
14
+ # To ensure we're testing that the cache settings depend on
15
+ # the Railtie firing, not on the ActionController being loaded.
16
+ create_serializers
17
+ end
18
+
19
+ def create_serializers
20
+ @cached_serializer = Class.new(ActiveModel::Serializer) do
21
+ cache skip_digest: true
22
+ attributes :id, :name, :title
23
+ end
24
+ @fragment_cached_serializer = Class.new(ActiveModel::Serializer) do
25
+ cache only: :id
26
+ attributes :id, :name, :title
27
+ end
28
+ @non_cached_serializer = Class.new(ActiveModel::Serializer) do
29
+ attributes :id, :name, :title
30
+ end
31
+ end
32
+
33
+ class PerformCachingTrue < CachingConfigurationTest
34
+ setup do
35
+ # Let's make that Rails app and initialize it!
36
+ make_basic_app do |app|
37
+ app.config.action_controller.perform_caching = true
38
+ app.config.action_controller.cache_store = ActiveSupport::Cache.lookup_store(:memory_store)
39
+ end
40
+ controller_cache_store # Force ActiveSupport.on_load(:action_controller) to run
41
+ end
42
+
43
+ test 'it sets perform_caching to true on AMS.config and serializers' do
44
+ assert Rails.configuration.action_controller.perform_caching
45
+ assert ActiveModelSerializers.config.perform_caching
46
+ assert ActiveModel::Serializer.perform_caching?
47
+ assert @cached_serializer.perform_caching?
48
+ assert @non_cached_serializer.perform_caching?
49
+ assert @fragment_cached_serializer.perform_caching?
50
+ end
51
+
52
+ test 'it sets the AMS.config.cache_store to the controller cache_store' do
53
+ assert_equal controller_cache_store, ActiveSupport::Cache::MemoryStore
54
+ assert_equal controller_cache_store, ActiveModelSerializers.config.cache_store.class
55
+ end
56
+
57
+ test 'it sets the cached serializer cache_store to the ActionController::Base.cache_store' do
58
+ assert_equal ActiveSupport::Cache::NullStore, @cached_serializer._cache.class
59
+ assert_equal controller_cache_store, @cached_serializer.cache_store.class
60
+ assert_equal ActiveSupport::Cache::MemoryStore, @cached_serializer._cache.class
61
+ end
62
+
63
+ test 'the cached serializer has cache_enabled?' do
64
+ assert @cached_serializer.cache_enabled?
65
+ end
66
+
67
+ test 'the cached serializer does not have fragment_cache_enabled?' do
68
+ refute @cached_serializer.fragment_cache_enabled?
69
+ end
70
+
71
+ test 'the non-cached serializer cache_store is nil' do
72
+ assert_equal nil, @non_cached_serializer._cache
73
+ assert_equal nil, @non_cached_serializer.cache_store
74
+ assert_equal nil, @non_cached_serializer._cache
75
+ end
76
+
77
+ test 'the non-cached serializer does not have cache_enabled?' do
78
+ refute @non_cached_serializer.cache_enabled?
79
+ end
80
+
81
+ test 'the non-cached serializer does not have fragment_cache_enabled?' do
82
+ refute @non_cached_serializer.fragment_cache_enabled?
83
+ end
84
+
85
+ test 'it sets the fragment cached serializer cache_store to the ActionController::Base.cache_store' do
86
+ assert_equal ActiveSupport::Cache::NullStore, @fragment_cached_serializer._cache.class
87
+ assert_equal controller_cache_store, @fragment_cached_serializer.cache_store.class
88
+ assert_equal ActiveSupport::Cache::MemoryStore, @fragment_cached_serializer._cache.class
89
+ end
90
+
91
+ test 'the fragment cached serializer does not have cache_enabled?' do
92
+ refute @fragment_cached_serializer.cache_enabled?
93
+ end
94
+
95
+ test 'the fragment cached serializer has fragment_cache_enabled?' do
96
+ assert @fragment_cached_serializer.fragment_cache_enabled?
97
+ end
98
+ end
99
+
100
+ class PerformCachingFalse < CachingConfigurationTest
101
+ setup do
102
+ # Let's make that Rails app and initialize it!
103
+ make_basic_app do |app|
104
+ app.config.action_controller.perform_caching = false
105
+ app.config.action_controller.cache_store = ActiveSupport::Cache.lookup_store(:memory_store)
106
+ end
107
+ controller_cache_store # Force ActiveSupport.on_load(:action_controller) to run
108
+ end
109
+
110
+ test 'it sets perform_caching to false on AMS.config and serializers' do
111
+ refute Rails.configuration.action_controller.perform_caching
112
+ refute ActiveModelSerializers.config.perform_caching
113
+ refute ActiveModel::Serializer.perform_caching?
114
+ refute @cached_serializer.perform_caching?
115
+ refute @non_cached_serializer.perform_caching?
116
+ refute @fragment_cached_serializer.perform_caching?
117
+ end
118
+
119
+ test 'it sets the AMS.config.cache_store to the controller cache_store' do
120
+ assert_equal controller_cache_store, ActiveSupport::Cache::MemoryStore
121
+ assert_equal controller_cache_store, ActiveModelSerializers.config.cache_store.class
122
+ end
123
+
124
+ test 'it sets the cached serializer cache_store to the ActionController::Base.cache_store' do
125
+ assert_equal ActiveSupport::Cache::NullStore, @cached_serializer._cache.class
126
+ assert_equal controller_cache_store, @cached_serializer.cache_store.class
127
+ assert_equal ActiveSupport::Cache::MemoryStore, @cached_serializer._cache.class
128
+ end
129
+
130
+ test 'the cached serializer does not have cache_enabled?' do
131
+ refute @cached_serializer.cache_enabled?
132
+ end
133
+
134
+ test 'the cached serializer does not have fragment_cache_enabled?' do
135
+ refute @cached_serializer.fragment_cache_enabled?
136
+ end
137
+
138
+ test 'the non-cached serializer cache_store is nil' do
139
+ assert_equal nil, @non_cached_serializer._cache
140
+ assert_equal nil, @non_cached_serializer.cache_store
141
+ assert_equal nil, @non_cached_serializer._cache
142
+ end
143
+
144
+ test 'the non-cached serializer does not have cache_enabled?' do
145
+ refute @non_cached_serializer.cache_enabled?
146
+ end
147
+
148
+ test 'the non-cached serializer does not have fragment_cache_enabled?' do
149
+ refute @non_cached_serializer.fragment_cache_enabled?
150
+ end
151
+
152
+ test 'it sets the fragment cached serializer cache_store to the ActionController::Base.cache_store' do
153
+ assert_equal ActiveSupport::Cache::NullStore, @fragment_cached_serializer._cache.class
154
+ assert_equal controller_cache_store, @fragment_cached_serializer.cache_store.class
155
+ assert_equal ActiveSupport::Cache::MemoryStore, @fragment_cached_serializer._cache.class
156
+ end
157
+
158
+ test 'the fragment cached serializer does not have cache_enabled?' do
159
+ refute @fragment_cached_serializer.cache_enabled?
160
+ end
161
+
162
+ test 'the fragment cached serializer does not have fragment_cache_enabled?' do
163
+ refute @fragment_cached_serializer.fragment_cache_enabled?
164
+ end
165
+ end
166
+
167
+ def controller_cache_store
168
+ ActionController::Base.cache_store.class
169
+ end
170
+ end
@@ -0,0 +1,32 @@
1
+ require 'test_helper'
2
+
3
+ module ActiveModel
4
+ class Serializer
5
+ class ConfigurationTest < ActiveSupport::TestCase
6
+ def test_collection_serializer
7
+ assert_equal ActiveModel::Serializer::CollectionSerializer, ActiveModelSerializers.config.collection_serializer
8
+ end
9
+
10
+ def test_array_serializer
11
+ assert_equal ActiveModel::Serializer::CollectionSerializer, ActiveModelSerializers.config.array_serializer
12
+ end
13
+
14
+ def test_setting_array_serializer_sets_collection_serializer
15
+ config = ActiveModelSerializers.config
16
+ old_config = config.dup
17
+ begin
18
+ assert_equal ActiveModel::Serializer::CollectionSerializer, config.collection_serializer
19
+ config.array_serializer = :foo
20
+ assert_equal config.array_serializer, :foo
21
+ assert_equal config.collection_serializer, :foo
22
+ ensure
23
+ ActiveModelSerializers.config.replace(old_config)
24
+ end
25
+ end
26
+
27
+ def test_default_adapter
28
+ assert_equal :attributes, ActiveModelSerializers.config.adapter
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,14 @@
1
+ require 'test_helper'
2
+
3
+ module ActiveModel
4
+ class Serializer
5
+ class FieldsetTest < ActiveSupport::TestCase
6
+ def test_fieldset_with_hash
7
+ fieldset = ActiveModel::Serializer::Fieldset.new('post' => %w(id title), 'comment' => ['body'])
8
+ expected = { :post => [:id, :title], :comment => [:body] }
9
+
10
+ assert_equal(expected, fieldset.fields)
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,196 @@
1
+ require 'test_helper'
2
+
3
+ module ActiveModel
4
+ class Serializer
5
+ class MetaTest < ActiveSupport::TestCase
6
+ def setup
7
+ @blog = Blog.new(id: 1,
8
+ name: 'AMS Hints',
9
+ writer: Author.new(id: 2, name: 'Steve'),
10
+ articles: [Post.new(id: 3, title: 'AMS')])
11
+ end
12
+
13
+ def test_meta_is_present_with_root
14
+ actual = ActiveModelSerializers::SerializableResource.new(
15
+ @blog,
16
+ adapter: :json,
17
+ serializer: AlternateBlogSerializer,
18
+ meta: { total: 10 }).as_json
19
+ expected = {
20
+ blog: {
21
+ id: 1,
22
+ title: 'AMS Hints'
23
+ },
24
+ 'meta' => {
25
+ total: 10
26
+ }
27
+ }
28
+ assert_equal(expected, actual)
29
+ end
30
+
31
+ def test_meta_is_not_included_when_blank
32
+ actual = ActiveModelSerializers::SerializableResource.new(
33
+ @blog,
34
+ adapter: :json,
35
+ serializer: AlternateBlogSerializer,
36
+ meta: {}
37
+ ).as_json
38
+ expected = {
39
+ blog: {
40
+ id: 1,
41
+ title: 'AMS Hints'
42
+ }
43
+ }
44
+ assert_equal(expected, actual)
45
+ end
46
+
47
+ def test_meta_is_not_included_when_empty_string
48
+ actual = ActiveModelSerializers::SerializableResource.new(
49
+ @blog,
50
+ adapter: :json,
51
+ serializer: AlternateBlogSerializer,
52
+ meta: ''
53
+ ).as_json
54
+ expected = {
55
+ blog: {
56
+ id: 1,
57
+ title: 'AMS Hints'
58
+ }
59
+ }
60
+ assert_equal(expected, actual)
61
+ end
62
+
63
+ def test_meta_is_not_included_when_root_is_missing
64
+ actual = ActiveModelSerializers::SerializableResource.new(
65
+ @blog,
66
+ adapter: :attributes,
67
+ serializer: AlternateBlogSerializer,
68
+ meta: { total: 10 }).as_json
69
+ expected = {
70
+ id: 1,
71
+ title: 'AMS Hints'
72
+ }
73
+ assert_equal(expected, actual)
74
+ end
75
+
76
+ def test_meta_key_is_used
77
+ actual = ActiveModelSerializers::SerializableResource.new(
78
+ @blog,
79
+ adapter: :json,
80
+ serializer: AlternateBlogSerializer,
81
+ meta: { total: 10 },
82
+ meta_key: 'haha_meta').as_json
83
+ expected = {
84
+ blog: {
85
+ id: 1,
86
+ title: 'AMS Hints'
87
+ },
88
+ 'haha_meta' => {
89
+ total: 10
90
+ }
91
+ }
92
+ assert_equal(expected, actual)
93
+ end
94
+
95
+ def test_meta_key_is_not_used_with_json_api
96
+ actual = ActiveModelSerializers::SerializableResource.new(
97
+ @blog,
98
+ adapter: :json_api,
99
+ serializer: AlternateBlogSerializer,
100
+ meta: { total: 10 },
101
+ meta_key: 'haha_meta').as_json
102
+ expected = {
103
+ data: {
104
+ id: '1',
105
+ type: 'blogs',
106
+ attributes: { title: 'AMS Hints' }
107
+ },
108
+ meta: { total: 10 }
109
+ }
110
+ assert_equal(expected, actual)
111
+ end
112
+
113
+ def test_meta_key_is_not_present_when_empty_hash_with_json_api
114
+ actual = ActiveModelSerializers::SerializableResource.new(
115
+ @blog,
116
+ adapter: :json_api,
117
+ serializer: AlternateBlogSerializer,
118
+ meta: {}
119
+ ).as_json
120
+ expected = {
121
+ data: {
122
+ id: '1',
123
+ type: 'blogs',
124
+ attributes: { title: 'AMS Hints' }
125
+ }
126
+ }
127
+ assert_equal(expected, actual)
128
+ end
129
+
130
+ def test_meta_key_is_not_present_when_empty_string_with_json_api
131
+ actual = ActiveModelSerializers::SerializableResource.new(
132
+ @blog,
133
+ adapter: :json_api,
134
+ serializer: AlternateBlogSerializer,
135
+ meta: ''
136
+ ).as_json
137
+ expected = {
138
+ data: {
139
+ id: '1',
140
+ type: 'blogs',
141
+ attributes: { title: 'AMS Hints' }
142
+ }
143
+ }
144
+ assert_equal(expected, actual)
145
+ end
146
+
147
+ def test_meta_is_not_present_on_arrays_without_root
148
+ actual = ActiveModelSerializers::SerializableResource.new(
149
+ [@blog],
150
+ adapter: :attributes,
151
+ meta: { total: 10 }).as_json
152
+ expected = [{
153
+ id: 1,
154
+ name: 'AMS Hints',
155
+ writer: {
156
+ id: 2,
157
+ name: 'Steve'
158
+ },
159
+ articles: [{
160
+ id: 3,
161
+ title: 'AMS',
162
+ body: nil
163
+ }]
164
+ }]
165
+ assert_equal(expected, actual)
166
+ end
167
+
168
+ def test_meta_is_present_on_arrays_with_root
169
+ actual = ActiveModelSerializers::SerializableResource.new(
170
+ [@blog],
171
+ adapter: :json,
172
+ meta: { total: 10 },
173
+ meta_key: 'haha_meta').as_json
174
+ expected = {
175
+ blogs: [{
176
+ id: 1,
177
+ name: 'AMS Hints',
178
+ writer: {
179
+ id: 2,
180
+ name: 'Steve'
181
+ },
182
+ articles: [{
183
+ id: 3,
184
+ title: 'AMS',
185
+ body: nil
186
+ }]
187
+ }],
188
+ 'haha_meta' => {
189
+ total: 10
190
+ }
191
+ }
192
+ assert_equal(expected, actual)
193
+ end
194
+ end
195
+ end
196
+ end
@@ -0,0 +1,21 @@
1
+ require 'test_helper'
2
+
3
+ module ActiveModel
4
+ class Serializer
5
+ class OptionsTest < ActiveSupport::TestCase
6
+ def setup
7
+ @profile = Profile.new(name: 'Name 1', description: 'Description 1')
8
+ end
9
+
10
+ def test_options_are_accessible
11
+ @profile_serializer = ProfileSerializer.new(@profile, my_options: :accessible)
12
+ assert @profile_serializer.arguments_passed_in?
13
+ end
14
+
15
+ def test_no_option_is_passed_in
16
+ @profile_serializer = ProfileSerializer.new(@profile)
17
+ refute @profile_serializer.arguments_passed_in?
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,79 @@
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
+ attr_accessor :id
9
+ end
10
+ class Child < Parent
11
+ attr_accessor :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
+ attr_accessor :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
@@ -0,0 +1,21 @@
1
+ require 'test_helper'
2
+
3
+ module ActiveModel
4
+ class Serializer
5
+ class RootTest < ActiveSupport::TestCase
6
+ def setup
7
+ @virtual_value = VirtualValue.new(id: 1)
8
+ end
9
+
10
+ def test_overwrite_root
11
+ serializer = VirtualValueSerializer.new(@virtual_value, { root: 'smth' })
12
+ assert_equal('smth', serializer.json_key)
13
+ end
14
+
15
+ def test_underscore_in_root
16
+ serializer = VirtualValueSerializer.new(@virtual_value)
17
+ assert_equal('virtual_value', serializer.json_key)
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,55 @@
1
+ module ActiveModel
2
+ class Serializer
3
+ class SerializationTest < ActiveSupport::TestCase
4
+ class Blog < ActiveModelSerializers::Model
5
+ attr_accessor :id, :name, :authors
6
+ end
7
+ class Author < ActiveModelSerializers::Model
8
+ attr_accessor :id, :name
9
+ end
10
+ class BlogSerializer < ActiveModel::Serializer
11
+ attributes :id
12
+ attribute :name, key: :title
13
+
14
+ has_many :authors
15
+ end
16
+ class AuthorSerializer < ActiveModel::Serializer
17
+ attributes :id, :name
18
+ end
19
+
20
+ setup do
21
+ @authors = [Author.new(id: 1, name: 'Blog Author')]
22
+ @blog = Blog.new(id: 2, name: 'The Blog', authors: @authors)
23
+ @serializer_instance = BlogSerializer.new(@blog)
24
+ @serializable = ActiveModelSerializers::SerializableResource.new(@blog, serializer: BlogSerializer, adapter: :attributes)
25
+ @expected_hash = { id: 2, title: 'The Blog', authors: [{ id: 1, name: 'Blog Author' }] }
26
+ @expected_json = '{"id":2,"title":"The Blog","authors":[{"id":1,"name":"Blog Author"}]}'
27
+ end
28
+
29
+ test '#serializable_hash is the same as generated by the attributes adapter' do
30
+ assert_equal @serializable.serializable_hash, @serializer_instance.serializable_hash
31
+ assert_equal @expected_hash, @serializer_instance.serializable_hash
32
+ end
33
+
34
+ test '#as_json is the same as generated by the attributes adapter' do
35
+ assert_equal @serializable.as_json, @serializer_instance.as_json
36
+ assert_equal @expected_hash, @serializer_instance.as_json
37
+ end
38
+
39
+ test '#to_json is the same as generated by the attributes adapter' do
40
+ assert_equal @serializable.to_json, @serializer_instance.to_json
41
+ assert_equal @expected_json, @serializer_instance.to_json
42
+ end
43
+
44
+ test '#to_h is an alias for #serializable_hash' do
45
+ assert_equal @serializable.serializable_hash, @serializer_instance.to_h
46
+ assert_equal @expected_hash, @serializer_instance.to_h
47
+ end
48
+
49
+ test '#to_hash is an alias for #serializable_hash' do
50
+ assert_equal @serializable.serializable_hash, @serializer_instance.to_hash
51
+ assert_equal @expected_hash, @serializer_instance.to_hash
52
+ end
53
+ end
54
+ end
55
+ end