active_model_serializers 0.8.3 → 0.10.8

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 (235) hide show
  1. checksums.yaml +5 -5
  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 +105 -0
  6. data/.simplecov +110 -0
  7. data/.travis.yml +50 -24
  8. data/CHANGELOG.md +650 -6
  9. data/CODE_OF_CONDUCT.md +74 -0
  10. data/CONTRIBUTING.md +105 -0
  11. data/Gemfile +69 -1
  12. data/{MIT-LICENSE.txt → MIT-LICENSE} +3 -2
  13. data/README.md +195 -545
  14. data/Rakefile +64 -8
  15. data/active_model_serializers.gemspec +62 -23
  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/schema.json +366 -0
  48. data/docs/jsonapi/schema.md +151 -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 +43 -38
  52. data/lib/active_model/serializable_resource.rb +11 -0
  53. data/lib/active_model/serializer/adapter/attributes.rb +15 -0
  54. data/lib/active_model/serializer/adapter/base.rb +18 -0
  55. data/lib/active_model/serializer/adapter/json.rb +15 -0
  56. data/lib/active_model/serializer/adapter/json_api.rb +15 -0
  57. data/lib/active_model/serializer/adapter/null.rb +15 -0
  58. data/lib/active_model/serializer/adapter.rb +24 -0
  59. data/lib/active_model/serializer/array_serializer.rb +12 -0
  60. data/lib/active_model/serializer/association.rb +71 -0
  61. data/lib/active_model/serializer/attribute.rb +25 -0
  62. data/lib/active_model/serializer/belongs_to_reflection.rb +11 -0
  63. data/lib/active_model/serializer/collection_serializer.rb +88 -0
  64. data/lib/active_model/serializer/concerns/caching.rb +300 -0
  65. data/lib/active_model/serializer/error_serializer.rb +14 -0
  66. data/lib/active_model/serializer/errors_serializer.rb +32 -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 +7 -0
  71. data/lib/active_model/serializer/lazy_association.rb +96 -0
  72. data/lib/active_model/serializer/link.rb +21 -0
  73. data/lib/active_model/serializer/lint.rb +150 -0
  74. data/lib/active_model/serializer/null.rb +17 -0
  75. data/lib/active_model/serializer/reflection.rb +210 -0
  76. data/lib/active_model/{serializers → serializer}/version.rb +1 -1
  77. data/lib/active_model/serializer.rb +343 -442
  78. data/lib/active_model_serializers/adapter/attributes.rb +13 -0
  79. data/lib/active_model_serializers/adapter/base.rb +83 -0
  80. data/lib/active_model_serializers/adapter/json.rb +21 -0
  81. data/lib/active_model_serializers/adapter/json_api/deserialization.rb +213 -0
  82. data/lib/active_model_serializers/adapter/json_api/error.rb +96 -0
  83. data/lib/active_model_serializers/adapter/json_api/jsonapi.rb +49 -0
  84. data/lib/active_model_serializers/adapter/json_api/link.rb +83 -0
  85. data/lib/active_model_serializers/adapter/json_api/meta.rb +37 -0
  86. data/lib/active_model_serializers/adapter/json_api/pagination_links.rb +88 -0
  87. data/lib/active_model_serializers/adapter/json_api/relationship.rb +104 -0
  88. data/lib/active_model_serializers/adapter/json_api/resource_identifier.rb +66 -0
  89. data/lib/active_model_serializers/adapter/json_api.rb +533 -0
  90. data/lib/active_model_serializers/adapter/null.rb +9 -0
  91. data/lib/active_model_serializers/adapter.rb +98 -0
  92. data/lib/active_model_serializers/callbacks.rb +55 -0
  93. data/lib/active_model_serializers/deprecate.rb +54 -0
  94. data/lib/active_model_serializers/deserialization.rb +15 -0
  95. data/lib/active_model_serializers/json_pointer.rb +14 -0
  96. data/lib/active_model_serializers/logging.rb +122 -0
  97. data/lib/active_model_serializers/lookup_chain.rb +80 -0
  98. data/lib/active_model_serializers/model.rb +130 -0
  99. data/lib/active_model_serializers/railtie.rb +50 -0
  100. data/lib/active_model_serializers/register_jsonapi_renderer.rb +78 -0
  101. data/lib/active_model_serializers/serializable_resource.rb +82 -0
  102. data/lib/active_model_serializers/serialization_context.rb +39 -0
  103. data/lib/active_model_serializers/test/schema.rb +138 -0
  104. data/lib/active_model_serializers/test/serializer.rb +125 -0
  105. data/lib/active_model_serializers/test.rb +7 -0
  106. data/lib/active_model_serializers.rb +47 -81
  107. data/lib/generators/rails/USAGE +6 -0
  108. data/lib/generators/rails/resource_override.rb +10 -0
  109. data/lib/generators/rails/serializer_generator.rb +36 -0
  110. data/lib/generators/rails/templates/serializer.rb.erb +8 -0
  111. data/lib/grape/active_model_serializers.rb +16 -0
  112. data/lib/grape/formatters/active_model_serializers.rb +32 -0
  113. data/lib/grape/helpers/active_model_serializers.rb +17 -0
  114. data/lib/tasks/rubocop.rake +53 -0
  115. data/test/action_controller/adapter_selector_test.rb +62 -0
  116. data/test/action_controller/explicit_serializer_test.rb +135 -0
  117. data/test/action_controller/json/include_test.rb +246 -0
  118. data/test/action_controller/json_api/deserialization_test.rb +112 -0
  119. data/test/action_controller/json_api/errors_test.rb +40 -0
  120. data/test/action_controller/json_api/fields_test.rb +66 -0
  121. data/test/action_controller/json_api/linked_test.rb +202 -0
  122. data/test/action_controller/json_api/pagination_test.rb +124 -0
  123. data/test/action_controller/json_api/transform_test.rb +189 -0
  124. data/test/action_controller/lookup_proc_test.rb +49 -0
  125. data/test/action_controller/namespace_lookup_test.rb +232 -0
  126. data/test/action_controller/serialization_scope_name_test.rb +235 -0
  127. data/test/action_controller/serialization_test.rb +478 -0
  128. data/test/active_model_serializers/adapter_for_test.rb +208 -0
  129. data/test/active_model_serializers/json_pointer_test.rb +22 -0
  130. data/test/active_model_serializers/logging_test.rb +77 -0
  131. data/test/active_model_serializers/model_test.rb +142 -0
  132. data/test/active_model_serializers/railtie_test_isolated.rb +68 -0
  133. data/test/active_model_serializers/register_jsonapi_renderer_test_isolated.rb +161 -0
  134. data/test/active_model_serializers/serialization_context_test_isolated.rb +71 -0
  135. data/test/active_model_serializers/test/schema_test.rb +131 -0
  136. data/test/active_model_serializers/test/serializer_test.rb +62 -0
  137. data/test/active_record_test.rb +9 -0
  138. data/test/adapter/attributes_test.rb +40 -0
  139. data/test/adapter/deprecation_test.rb +100 -0
  140. data/test/adapter/json/belongs_to_test.rb +45 -0
  141. data/test/adapter/json/collection_test.rb +104 -0
  142. data/test/adapter/json/has_many_test.rb +53 -0
  143. data/test/adapter/json/transform_test.rb +93 -0
  144. data/test/adapter/json_api/belongs_to_test.rb +155 -0
  145. data/test/adapter/json_api/collection_test.rb +96 -0
  146. data/test/adapter/json_api/errors_test.rb +76 -0
  147. data/test/adapter/json_api/fields_test.rb +96 -0
  148. data/test/adapter/json_api/has_many_explicit_serializer_test.rb +96 -0
  149. data/test/adapter/json_api/has_many_test.rb +173 -0
  150. data/test/adapter/json_api/has_one_test.rb +80 -0
  151. data/test/adapter/json_api/include_data_if_sideloaded_test.rb +213 -0
  152. data/test/adapter/json_api/json_api_test.rb +33 -0
  153. data/test/adapter/json_api/linked_test.rb +413 -0
  154. data/test/adapter/json_api/links_test.rb +110 -0
  155. data/test/adapter/json_api/pagination_links_test.rb +206 -0
  156. data/test/adapter/json_api/parse_test.rb +137 -0
  157. data/test/adapter/json_api/relationship_test.rb +397 -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 +512 -0
  161. data/test/adapter/json_api/type_test.rb +193 -0
  162. data/test/adapter/json_test.rb +46 -0
  163. data/test/adapter/null_test.rb +22 -0
  164. data/test/adapter/polymorphic_test.rb +218 -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_active_record.rb +81 -0
  170. data/test/benchmark/bm_adapter.rb +38 -0
  171. data/test/benchmark/bm_caching.rb +119 -0
  172. data/test/benchmark/bm_lookup_chain.rb +83 -0
  173. data/test/benchmark/bm_transform.rb +45 -0
  174. data/test/benchmark/config.ru +3 -0
  175. data/test/benchmark/controllers.rb +83 -0
  176. data/test/benchmark/fixtures.rb +219 -0
  177. data/test/cache_test.rb +651 -0
  178. data/test/collection_serializer_test.rb +127 -0
  179. data/test/fixtures/active_record.rb +113 -0
  180. data/test/fixtures/poro.rb +225 -0
  181. data/test/generators/scaffold_controller_generator_test.rb +24 -0
  182. data/test/generators/serializer_generator_test.rb +75 -0
  183. data/test/grape_test.rb +196 -0
  184. data/test/lint_test.rb +49 -0
  185. data/test/logger_test.rb +20 -0
  186. data/test/poro_test.rb +9 -0
  187. data/test/serializable_resource_test.rb +79 -0
  188. data/test/serializers/association_macros_test.rb +37 -0
  189. data/test/serializers/associations_test.rb +518 -0
  190. data/test/serializers/attribute_test.rb +153 -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 +202 -0
  196. data/test/serializers/options_test.rb +32 -0
  197. data/test/serializers/read_attribute_for_serialization_test.rb +79 -0
  198. data/test/serializers/reflection_test.rb +479 -0
  199. data/test/serializers/root_test.rb +21 -0
  200. data/test/serializers/serialization_test.rb +55 -0
  201. data/test/serializers/serializer_for_test.rb +136 -0
  202. data/test/serializers/serializer_for_with_namespace_test.rb +88 -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 +84 -0
  205. data/test/support/rails5_shims.rb +53 -0
  206. data/test/support/rails_app.rb +38 -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 +79 -0
  214. data/test/test_helper.rb +59 -21
  215. metadata +529 -43
  216. data/DESIGN.textile +0 -586
  217. data/Gemfile.edge +0 -9
  218. data/bench/perf.rb +0 -43
  219. data/cruft.md +0 -19
  220. data/lib/active_model/array_serializer.rb +0 -104
  221. data/lib/active_model/serializer/associations.rb +0 -233
  222. data/lib/active_record/serializer_override.rb +0 -16
  223. data/lib/generators/resource_override.rb +0 -13
  224. data/lib/generators/serializer/USAGE +0 -9
  225. data/lib/generators/serializer/serializer_generator.rb +0 -42
  226. data/lib/generators/serializer/templates/serializer.rb +0 -19
  227. data/test/association_test.rb +0 -592
  228. data/test/caching_test.rb +0 -96
  229. data/test/generators_test.rb +0 -85
  230. data/test/no_serialization_scope_test.rb +0 -34
  231. data/test/serialization_scope_name_test.rb +0 -67
  232. data/test/serialization_test.rb +0 -392
  233. data/test/serializer_support_test.rb +0 -51
  234. data/test/serializer_test.rb +0 -1465
  235. data/test/test_fakes.rb +0 -217
@@ -0,0 +1,193 @@
1
+ require 'test_helper'
2
+
3
+ module ActiveModelSerializers
4
+ module Adapter
5
+ class JsonApi
6
+ class TypeTest < ActiveSupport::TestCase
7
+ class StringTypeSerializer < ActiveModel::Serializer
8
+ attribute :name
9
+ type 'profile'
10
+ end
11
+
12
+ class SymbolTypeSerializer < ActiveModel::Serializer
13
+ attribute :name
14
+ type :profile
15
+ end
16
+
17
+ setup do
18
+ @author = Author.new(id: 1, name: 'Steve K.')
19
+ end
20
+
21
+ def test_config_plural
22
+ with_jsonapi_inflection :plural do
23
+ assert_type(@author, 'authors')
24
+ end
25
+ end
26
+
27
+ def test_config_singular
28
+ with_jsonapi_inflection :singular do
29
+ assert_type(@author, 'author')
30
+ end
31
+ end
32
+
33
+ def test_explicit_string_type_value
34
+ assert_type(@author, 'profile', serializer: StringTypeSerializer)
35
+ end
36
+
37
+ def test_explicit_symbol_type_value
38
+ assert_type(@author, 'profile', serializer: SymbolTypeSerializer)
39
+ end
40
+
41
+ private
42
+
43
+ def assert_type(resource, expected_type, opts = {})
44
+ opts = opts.reverse_merge(adapter: :json_api)
45
+ hash = serializable(resource, opts).serializable_hash
46
+ assert_equal(expected_type, hash.fetch(:data).fetch(:type))
47
+ end
48
+ end
49
+ class ResourceIdentifierTest < ActiveSupport::TestCase
50
+ class WithDefinedTypeSerializer < ActiveModel::Serializer
51
+ type 'with_defined_types'
52
+ end
53
+
54
+ class WithDefinedIdSerializer < ActiveModel::Serializer
55
+ def id
56
+ 'special_id'
57
+ end
58
+ end
59
+
60
+ class FragmentedSerializer < ActiveModel::Serializer
61
+ cache only: :id
62
+
63
+ def id
64
+ 'special_id'
65
+ end
66
+ end
67
+
68
+ setup do
69
+ @model = Author.new(id: 1, name: 'Steve K.')
70
+ ActionController::Base.cache_store.clear
71
+ end
72
+
73
+ def test_defined_type
74
+ actual = with_jsonapi_inflection :plural do
75
+ actual_resource_identifier_object(WithDefinedTypeSerializer, @model)
76
+ end
77
+ expected = { id: expected_model_id(@model), type: 'with-defined-types' }
78
+ assert_equal actual, expected
79
+ end
80
+
81
+ def test_defined_type_not_inflected
82
+ actual = with_jsonapi_inflection :singular do
83
+ actual_resource_identifier_object(WithDefinedTypeSerializer, @model)
84
+ end
85
+ expected = { id: expected_model_id(@model), type: 'with-defined-types' }
86
+ assert_equal actual, expected
87
+ end
88
+
89
+ def test_singular_type
90
+ actual = with_jsonapi_inflection :singular do
91
+ actual_resource_identifier_object(AuthorSerializer, @model)
92
+ end
93
+ expected = { id: expected_model_id(@model), type: 'author' }
94
+ assert_equal actual, expected
95
+ end
96
+
97
+ def test_plural_type
98
+ actual = with_jsonapi_inflection :plural do
99
+ actual_resource_identifier_object(AuthorSerializer, @model)
100
+ end
101
+ expected = { id: expected_model_id(@model), type: 'authors' }
102
+ assert_equal actual, expected
103
+ end
104
+
105
+ def test_type_with_namespace
106
+ Object.const_set(:Admin, Module.new)
107
+ model = Class.new(::Model)
108
+ Admin.const_set(:PowerUser, model)
109
+ serializer = Class.new(ActiveModel::Serializer)
110
+ Admin.const_set(:PowerUserSerializer, serializer)
111
+ with_namespace_separator '--' do
112
+ admin_user = Admin::PowerUser.new
113
+ serializer = Admin::PowerUserSerializer.new(admin_user)
114
+ expected = {
115
+ id: admin_user.id,
116
+ type: 'admin--power-users'
117
+ }
118
+
119
+ identifier = ResourceIdentifier.new(serializer, {})
120
+ actual = identifier.as_json
121
+ assert_equal(expected, actual)
122
+ end
123
+ end
124
+
125
+ def test_id_defined_on_object
126
+ actual = actual_resource_identifier_object(AuthorSerializer, @model)
127
+ expected = { id: @model.id.to_s, type: expected_model_type(@model) }
128
+ assert_equal actual, expected
129
+ end
130
+
131
+ def test_blank_id
132
+ model = Author.new(id: nil, name: 'Steve K.')
133
+ actual = actual_resource_identifier_object(AuthorSerializer, model)
134
+ expected = { type: expected_model_type(model) }
135
+ assert_equal actual, expected
136
+ end
137
+
138
+ def test_for_type_with_id
139
+ id = 1
140
+ actual = ResourceIdentifier.for_type_with_id('admin_user', id, {})
141
+ expected = { id: '1', type: 'admin-users' }
142
+ assert_equal actual, expected
143
+ end
144
+
145
+ def test_for_type_with_id_given_blank_id
146
+ id = ''
147
+ actual = ResourceIdentifier.for_type_with_id('admin_user', id, {})
148
+ expected = { type: 'admin-users' }
149
+ assert_equal actual, expected
150
+ end
151
+
152
+ def test_for_type_with_id_inflected
153
+ id = 2
154
+ actual = with_jsonapi_inflection :singular do
155
+ ResourceIdentifier.for_type_with_id('admin_users', id, {})
156
+ end
157
+ expected = { id: '2', type: 'admin-user' }
158
+ assert_equal actual, expected
159
+ end
160
+
161
+ def test_id_defined_on_serializer
162
+ actual = actual_resource_identifier_object(WithDefinedIdSerializer, @model)
163
+ expected = { id: 'special_id', type: expected_model_type(@model) }
164
+ assert_equal actual, expected
165
+ end
166
+
167
+ def test_id_defined_on_fragmented
168
+ actual = actual_resource_identifier_object(FragmentedSerializer, @model)
169
+ expected = { id: 'special_id', type: expected_model_type(@model) }
170
+ assert_equal actual, expected
171
+ end
172
+
173
+ private
174
+
175
+ def actual_resource_identifier_object(serializer_class, model)
176
+ serializer = serializer_class.new(model)
177
+ resource_identifier = ResourceIdentifier.new(serializer, nil)
178
+ resource_identifier.as_json
179
+ end
180
+
181
+ def expected_model_type(model, inflection = ActiveModelSerializers.config.jsonapi_resource_type)
182
+ with_jsonapi_inflection inflection do
183
+ model.class.model_name.send(inflection)
184
+ end
185
+ end
186
+
187
+ def expected_model_id(model)
188
+ model.id.to_s
189
+ end
190
+ end
191
+ end
192
+ end
193
+ end
@@ -0,0 +1,46 @@
1
+ require 'test_helper'
2
+
3
+ module ActiveModelSerializers
4
+ module Adapter
5
+ class JsonTest < ActiveSupport::TestCase
6
+ def setup
7
+ ActionController::Base.cache_store.clear
8
+ @author = Author.new(id: 1, name: 'Steve K.')
9
+ @post = Post.new(id: 1, title: 'New Post', body: 'Body')
10
+ @first_comment = Comment.new(id: 1, body: 'ZOMG A COMMENT')
11
+ @second_comment = Comment.new(id: 2, body: 'ZOMG ANOTHER COMMENT')
12
+ @post.comments = [@first_comment, @second_comment]
13
+ @first_comment.post = @post
14
+ @second_comment.post = @post
15
+ @post.author = @author
16
+ @blog = Blog.new(id: 1, name: 'My Blog!!')
17
+ @post.blog = @blog
18
+
19
+ @serializer = PostSerializer.new(@post)
20
+ @adapter = ActiveModelSerializers::Adapter::Json.new(@serializer)
21
+ end
22
+
23
+ def test_has_many
24
+ assert_equal([
25
+ { id: 1, body: 'ZOMG A COMMENT' },
26
+ { id: 2, body: 'ZOMG ANOTHER COMMENT' }
27
+ ], @adapter.serializable_hash[:post][:comments])
28
+ end
29
+
30
+ def test_custom_keys
31
+ serializer = PostWithCustomKeysSerializer.new(@post)
32
+ adapter = ActiveModelSerializers::Adapter::Json.new(serializer)
33
+
34
+ assert_equal({
35
+ id: 1,
36
+ reviews: [
37
+ { id: 1, body: 'ZOMG A COMMENT' },
38
+ { id: 2, body: 'ZOMG ANOTHER COMMENT' }
39
+ ],
40
+ writer: { id: 1, name: 'Steve K.' },
41
+ site: { id: 1, name: 'My Blog!!' }
42
+ }, adapter.serializable_hash[:post])
43
+ end
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,22 @@
1
+ require 'test_helper'
2
+
3
+ module ActiveModelSerializers
4
+ module Adapter
5
+ class NullTest < ActiveSupport::TestCase
6
+ def setup
7
+ profile = Profile.new(name: 'Name 1', description: 'Description 1', comments: 'Comments 1')
8
+ serializer = ProfileSerializer.new(profile)
9
+
10
+ @adapter = Null.new(serializer)
11
+ end
12
+
13
+ def test_serializable_hash
14
+ assert_equal({}, @adapter.serializable_hash)
15
+ end
16
+
17
+ def test_it_returns_empty_json
18
+ assert_equal('{}', @adapter.to_json)
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,218 @@
1
+ require 'test_helper'
2
+
3
+ module ActiveModel
4
+ class Serializer
5
+ module Adapter
6
+ class PolymorphicTest < ActiveSupport::TestCase
7
+ setup do
8
+ @employee = Employee.new(id: 42, name: 'Zoop Zoopler', email: 'zoop@example.com')
9
+ @picture = @employee.pictures.new(id: 1, title: 'headshot-1.jpg')
10
+ @picture.imageable = @employee
11
+ end
12
+
13
+ def serialization(resource, adapter = :attributes)
14
+ serializable(resource, adapter: adapter, serializer: PolymorphicBelongsToSerializer).as_json
15
+ end
16
+
17
+ def tag_serialization(adapter = :attributes)
18
+ tag = PolyTag.new(id: 1, phrase: 'foo')
19
+ tag.object_tags << ObjectTag.new(id: 1, poly_tag_id: 1, taggable: @employee)
20
+ tag.object_tags << ObjectTag.new(id: 5, poly_tag_id: 1, taggable: @picture)
21
+ serializable(tag, adapter: adapter, serializer: PolymorphicTagSerializer, include: '*.*').as_json
22
+ end
23
+
24
+ def test_attributes_serialization
25
+ expected =
26
+ {
27
+ id: 1,
28
+ title: 'headshot-1.jpg',
29
+ imageable: {
30
+ type: 'employee',
31
+ employee: {
32
+ id: 42,
33
+ name: 'Zoop Zoopler'
34
+ }
35
+ }
36
+ }
37
+
38
+ assert_equal(expected, serialization(@picture))
39
+ end
40
+
41
+ def test_attributes_serialization_without_polymorphic_association
42
+ expected =
43
+ {
44
+ id: 2,
45
+ title: 'headshot-2.jpg',
46
+ imageable: nil
47
+ }
48
+
49
+ simple_picture = Picture.new(id: 2, title: 'headshot-2.jpg')
50
+ assert_equal(expected, serialization(simple_picture))
51
+ end
52
+
53
+ def test_attributes_serialization_with_polymorphic_has_many
54
+ expected =
55
+ {
56
+ id: 1,
57
+ phrase: 'foo',
58
+ object_tags: [
59
+ {
60
+ id: 1,
61
+ taggable: {
62
+ type: 'employee',
63
+ employee: {
64
+ id: 42
65
+ }
66
+ }
67
+ },
68
+ {
69
+ id: 5,
70
+ taggable: {
71
+ type: 'picture',
72
+ picture: {
73
+ id: 1
74
+ }
75
+ }
76
+ }
77
+ ]
78
+ }
79
+ assert_equal(expected, tag_serialization)
80
+ end
81
+
82
+ def test_json_serialization
83
+ expected =
84
+ {
85
+ picture: {
86
+ id: 1,
87
+ title: 'headshot-1.jpg',
88
+ imageable: {
89
+ type: 'employee',
90
+ employee: {
91
+ id: 42,
92
+ name: 'Zoop Zoopler'
93
+ }
94
+ }
95
+ }
96
+ }
97
+
98
+ assert_equal(expected, serialization(@picture, :json))
99
+ end
100
+
101
+ def test_json_serialization_without_polymorphic_association
102
+ expected =
103
+ {
104
+ picture: {
105
+ id: 2,
106
+ title: 'headshot-2.jpg',
107
+ imageable: nil
108
+ }
109
+ }
110
+
111
+ simple_picture = Picture.new(id: 2, title: 'headshot-2.jpg')
112
+ assert_equal(expected, serialization(simple_picture, :json))
113
+ end
114
+
115
+ def test_json_serialization_with_polymorphic_has_many
116
+ expected =
117
+ {
118
+ poly_tag: {
119
+ id: 1,
120
+ phrase: 'foo',
121
+ object_tags: [
122
+ {
123
+ id: 1,
124
+ taggable: {
125
+ type: 'employee',
126
+ employee: {
127
+ id: 42
128
+ }
129
+ }
130
+ },
131
+ {
132
+ id: 5,
133
+ taggable: {
134
+ type: 'picture',
135
+ picture: {
136
+ id: 1
137
+ }
138
+ }
139
+ }
140
+ ]
141
+ }
142
+ }
143
+ assert_equal(expected, tag_serialization(:json))
144
+ end
145
+
146
+ def test_json_api_serialization
147
+ expected =
148
+ {
149
+ data: {
150
+ id: '1',
151
+ type: 'pictures',
152
+ attributes: {
153
+ title: 'headshot-1.jpg'
154
+ },
155
+ relationships: {
156
+ imageable: {
157
+ data: {
158
+ id: '42',
159
+ type: 'employees'
160
+ }
161
+ }
162
+ }
163
+ }
164
+ }
165
+
166
+ assert_equal(expected, serialization(@picture, :json_api))
167
+ end
168
+
169
+ def test_json_api_serialization_with_polymorphic_belongs_to
170
+ expected = {
171
+ data: {
172
+ id: '1',
173
+ type: 'poly-tags',
174
+ attributes: { phrase: 'foo' },
175
+ relationships: {
176
+ :"object-tags" => {
177
+ data: [
178
+ { id: '1', type: 'object-tags' },
179
+ { id: '5', type: 'object-tags' }
180
+ ]
181
+ }
182
+ }
183
+ },
184
+ included: [
185
+ {
186
+ id: '1',
187
+ type: 'object-tags',
188
+ relationships: {
189
+ taggable: {
190
+ data: { id: '42', type: 'employees' }
191
+ }
192
+ }
193
+ },
194
+ {
195
+ id: '42',
196
+ type: 'employees'
197
+ },
198
+ {
199
+ id: '5',
200
+ type: 'object-tags',
201
+ relationships: {
202
+ taggable: {
203
+ data: { id: '1', type: 'pictures' }
204
+ }
205
+ }
206
+ },
207
+ {
208
+ id: '1',
209
+ type: 'pictures'
210
+ }
211
+ ]
212
+ }
213
+ assert_equal(expected, tag_serialization(:json_api))
214
+ end
215
+ end
216
+ end
217
+ end
218
+ end
@@ -0,0 +1,67 @@
1
+ require 'test_helper'
2
+
3
+ module ActiveModelSerializers
4
+ class AdapterTest < ActiveSupport::TestCase
5
+ def setup
6
+ profile = Profile.new
7
+ @serializer = ProfileSerializer.new(profile)
8
+ @adapter = ActiveModelSerializers::Adapter::Base.new(@serializer)
9
+ end
10
+
11
+ def test_serializable_hash_is_abstract_method
12
+ assert_raises(NotImplementedError) do
13
+ @adapter.serializable_hash(only: [:name])
14
+ end
15
+ end
16
+
17
+ def test_serialization_options_ensures_option_is_a_hash
18
+ adapter = Class.new(ActiveModelSerializers::Adapter::Base) do
19
+ def serializable_hash(options = nil)
20
+ serialization_options(options)
21
+ end
22
+ end.new(@serializer)
23
+ assert_equal({}, adapter.serializable_hash(nil))
24
+ assert_equal({}, adapter.serializable_hash({}))
25
+ ensure
26
+ ActiveModelSerializers::Adapter.adapter_map.delete_if { |k, _| k =~ /class/ }
27
+ end
28
+
29
+ def test_serialization_options_ensures_option_is_one_of_valid_options
30
+ adapter = Class.new(ActiveModelSerializers::Adapter::Base) do
31
+ def serializable_hash(options = nil)
32
+ serialization_options(options)
33
+ end
34
+ end.new(@serializer)
35
+ filtered_options = { now: :see_me, then: :not }
36
+ valid_options = ActiveModel::Serializer::SERIALIZABLE_HASH_VALID_KEYS.each_with_object({}) do |option, result|
37
+ result[option] = option
38
+ end
39
+ assert_equal(valid_options, adapter.serializable_hash(filtered_options.merge(valid_options)))
40
+ ensure
41
+ ActiveModelSerializers::Adapter.adapter_map.delete_if { |k, _| k =~ /class/ }
42
+ end
43
+
44
+ def test_serializer
45
+ assert_equal @serializer, @adapter.serializer
46
+ end
47
+
48
+ def test_create_adapter
49
+ adapter = ActiveModelSerializers::Adapter.create(@serializer)
50
+ assert_equal ActiveModelSerializers::Adapter::Attributes, adapter.class
51
+ end
52
+
53
+ def test_create_adapter_with_override
54
+ adapter = ActiveModelSerializers::Adapter.create(@serializer, adapter: :json_api)
55
+ assert_equal ActiveModelSerializers::Adapter::JsonApi, adapter.class
56
+ end
57
+
58
+ def test_inflected_adapter_class_for_known_adapter
59
+ ActiveSupport::Inflector.inflections(:en) { |inflect| inflect.acronym 'API' }
60
+ klass = ActiveModelSerializers::Adapter.adapter_class(:json_api)
61
+
62
+ ActiveSupport::Inflector.inflections.acronyms.clear
63
+
64
+ assert_equal ActiveModelSerializers::Adapter::JsonApi, klass
65
+ end
66
+ end
67
+ end
@@ -1,75 +1,22 @@
1
- require "test_helper"
2
- require "test_fakes"
3
-
4
- class ArraySerializerTest < ActiveModel::TestCase
5
-
6
- def test_array_items_do_not_have_root
7
- array = [
8
- BasicActiveModel.new(:name => "First model"),
9
- BasicActiveModel.new(:name => "Second model")
10
- ]
11
- expected = { "root" => [
12
- { :name => "First model" },
13
- { :name => "Second model" }
14
- ] }
15
-
16
- default_serializer = array.active_model_serializer.new(array, :root => "root")
17
- each_serializer = array.active_model_serializer.new(array, :root => "root", :each_serializer => BasicSerializer)
18
-
19
- default_json = default_serializer.as_json
20
- each_json = each_serializer.as_json
21
-
22
- assert_equal(expected, default_json)
23
- assert_equal(expected, each_json)
24
- end
25
-
26
- # serialize different typed objects
27
- def test_array_serializer
28
- model = Model.new
29
- user = User.new
30
- comments = Comment.new(:title => "Comment1", :id => 1)
31
-
32
- array = [model, user, comments]
33
- serializer = array.active_model_serializer.new(array, :scope => {:scope => true})
34
- assert_equal([
35
- { :model => "Model" },
36
- { :last_name => "Valim", :ok => true, :first_name => "Jose", :scope => true },
37
- { :title => "Comment1" }
38
- ], serializer.as_json)
39
- end
40
-
41
- def test_array_serializer_with_root
42
- comment1 = Comment.new(:title => "Comment1", :id => 1)
43
- comment2 = Comment.new(:title => "Comment2", :id => 2)
44
-
45
- array = [ comment1, comment2 ]
46
-
47
- serializer = array.active_model_serializer.new(array, :root => :comments)
48
-
49
- assert_equal({ :comments => [
50
- { :title => "Comment1" },
51
- { :title => "Comment2" }
52
- ]}, serializer.as_json)
53
- end
54
-
55
- def test_array_serializer_with_hash
56
- hash = {:value => "something"}
57
- array = [hash]
58
- serializer = array.active_model_serializer.new(array, :root => :items)
59
- assert_equal({ :items => [ hash.as_json ]}, serializer.as_json)
60
- end
61
-
62
- def test_array_serializer_with_specified_seriailizer
63
- post1 = Post.new(:title => "Post1", :author => "Author1", :id => 1)
64
- post2 = Post.new(:title => "Post2", :author => "Author2", :id => 2)
65
-
66
- array = [ post1, post2 ]
67
-
68
- serializer = array.active_model_serializer.new array, :each_serializer => CustomPostSerializer
69
-
70
- assert_equal([
71
- { :title => "Post1" },
72
- { :title => "Post2" }
73
- ], serializer.as_json)
1
+ require 'test_helper'
2
+ require_relative 'collection_serializer_test'
3
+
4
+ module ActiveModel
5
+ class Serializer
6
+ class ArraySerializerTest < CollectionSerializerTest
7
+ extend Minitest::Assertions
8
+ def self.run_one_method(*)
9
+ _, stderr = capture_io do
10
+ super
11
+ end
12
+ if stderr !~ /NOTE: ActiveModel::Serializer::ArraySerializer.new is deprecated/
13
+ fail Minitest::Assertion, stderr
14
+ end
15
+ end
16
+
17
+ def collection_serializer
18
+ ArraySerializer
19
+ end
20
+ end
74
21
  end
75
22
  end