active_model_serializers 0.10.0 → 0.10.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (215) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +239 -2
  3. data/README.md +171 -34
  4. data/lib/action_controller/serialization.rb +23 -3
  5. data/lib/active_model/serializable_resource.rb +2 -0
  6. data/lib/active_model/serializer/adapter/attributes.rb +2 -0
  7. data/lib/active_model/serializer/adapter/base.rb +4 -0
  8. data/lib/active_model/serializer/adapter/json.rb +2 -0
  9. data/lib/active_model/serializer/adapter/json_api.rb +2 -0
  10. data/lib/active_model/serializer/adapter/null.rb +2 -0
  11. data/lib/active_model/serializer/adapter.rb +2 -0
  12. data/lib/active_model/serializer/array_serializer.rb +10 -5
  13. data/lib/active_model/serializer/association.rb +64 -10
  14. data/lib/active_model/serializer/attribute.rb +2 -0
  15. data/lib/active_model/serializer/belongs_to_reflection.rb +6 -3
  16. data/lib/active_model/serializer/collection_serializer.rb +48 -13
  17. data/lib/active_model/serializer/{caching.rb → concerns/caching.rb} +89 -117
  18. data/lib/active_model/serializer/error_serializer.rb +13 -7
  19. data/lib/active_model/serializer/errors_serializer.rb +27 -20
  20. data/lib/active_model/serializer/field.rb +2 -0
  21. data/lib/active_model/serializer/fieldset.rb +3 -1
  22. data/lib/active_model/serializer/has_many_reflection.rb +5 -3
  23. data/lib/active_model/serializer/has_one_reflection.rb +3 -4
  24. data/lib/active_model/serializer/lazy_association.rb +99 -0
  25. data/lib/active_model/serializer/link.rb +23 -0
  26. data/lib/active_model/serializer/lint.rb +136 -130
  27. data/lib/active_model/serializer/null.rb +2 -0
  28. data/lib/active_model/serializer/reflection.rb +130 -65
  29. data/lib/active_model/serializer/version.rb +3 -1
  30. data/lib/active_model/serializer.rb +321 -86
  31. data/lib/active_model_serializers/adapter/attributes.rb +17 -57
  32. data/lib/active_model_serializers/adapter/base.rb +41 -39
  33. data/lib/active_model_serializers/adapter/json.rb +2 -0
  34. data/lib/active_model_serializers/adapter/json_api/deserialization.rb +4 -2
  35. data/lib/active_model_serializers/adapter/json_api/error.rb +2 -0
  36. data/lib/active_model_serializers/adapter/json_api/jsonapi.rb +2 -0
  37. data/lib/active_model_serializers/adapter/json_api/link.rb +3 -1
  38. data/lib/active_model_serializers/adapter/json_api/meta.rb +2 -0
  39. data/lib/active_model_serializers/adapter/json_api/pagination_links.rb +52 -20
  40. data/lib/active_model_serializers/adapter/json_api/relationship.rb +77 -23
  41. data/lib/active_model_serializers/adapter/json_api/resource_identifier.rb +41 -10
  42. data/lib/active_model_serializers/adapter/json_api.rb +84 -65
  43. data/lib/active_model_serializers/adapter/null.rb +2 -0
  44. data/lib/active_model_serializers/adapter.rb +9 -1
  45. data/lib/active_model_serializers/callbacks.rb +2 -0
  46. data/lib/active_model_serializers/deprecate.rb +3 -2
  47. data/lib/active_model_serializers/deserialization.rb +4 -0
  48. data/lib/active_model_serializers/json_pointer.rb +2 -0
  49. data/lib/active_model_serializers/logging.rb +2 -0
  50. data/lib/active_model_serializers/lookup_chain.rb +82 -0
  51. data/lib/active_model_serializers/model/caching.rb +26 -0
  52. data/lib/active_model_serializers/model.rb +111 -28
  53. data/lib/active_model_serializers/railtie.rb +7 -1
  54. data/lib/active_model_serializers/register_jsonapi_renderer.rb +46 -31
  55. data/lib/active_model_serializers/serializable_resource.rb +10 -7
  56. data/lib/active_model_serializers/serialization_context.rb +12 -3
  57. data/lib/active_model_serializers/test/schema.rb +4 -2
  58. data/lib/active_model_serializers/test/serializer.rb +2 -0
  59. data/lib/active_model_serializers/test.rb +2 -0
  60. data/lib/active_model_serializers.rb +35 -10
  61. data/lib/generators/rails/resource_override.rb +3 -1
  62. data/lib/generators/rails/serializer_generator.rb +6 -4
  63. data/lib/grape/active_model_serializers.rb +9 -5
  64. data/lib/grape/formatters/active_model_serializers.rb +21 -2
  65. data/lib/grape/helpers/active_model_serializers.rb +3 -0
  66. data/lib/tasks/rubocop.rake +55 -0
  67. metadata +104 -296
  68. data/.github/ISSUE_TEMPLATE.md +0 -29
  69. data/.github/PULL_REQUEST_TEMPLATE.md +0 -15
  70. data/.gitignore +0 -35
  71. data/.rubocop.yml +0 -104
  72. data/.rubocop_todo.yml +0 -167
  73. data/.simplecov +0 -110
  74. data/.travis.yml +0 -43
  75. data/CONTRIBUTING.md +0 -105
  76. data/Gemfile +0 -53
  77. data/Rakefile +0 -103
  78. data/active_model_serializers.gemspec +0 -66
  79. data/appveyor.yml +0 -24
  80. data/bin/bench +0 -171
  81. data/bin/bench_regression +0 -316
  82. data/bin/serve_benchmark +0 -39
  83. data/docs/ARCHITECTURE.md +0 -126
  84. data/docs/README.md +0 -40
  85. data/docs/STYLE.md +0 -58
  86. data/docs/general/adapters.md +0 -245
  87. data/docs/general/caching.md +0 -52
  88. data/docs/general/configuration_options.md +0 -100
  89. data/docs/general/deserialization.md +0 -100
  90. data/docs/general/getting_started.md +0 -133
  91. data/docs/general/instrumentation.md +0 -40
  92. data/docs/general/key_transforms.md +0 -40
  93. data/docs/general/logging.md +0 -14
  94. data/docs/general/rendering.md +0 -255
  95. data/docs/general/serializers.md +0 -372
  96. data/docs/how-open-source-maintained.jpg +0 -0
  97. data/docs/howto/add_pagination_links.md +0 -139
  98. data/docs/howto/add_root_key.md +0 -51
  99. data/docs/howto/outside_controller_use.md +0 -58
  100. data/docs/howto/passing_arbitrary_options.md +0 -27
  101. data/docs/howto/serialize_poro.md +0 -32
  102. data/docs/howto/test.md +0 -152
  103. data/docs/integrations/ember-and-json-api.md +0 -112
  104. data/docs/integrations/grape.md +0 -19
  105. data/docs/jsonapi/errors.md +0 -56
  106. data/docs/jsonapi/schema/schema.json +0 -366
  107. data/docs/jsonapi/schema.md +0 -151
  108. data/docs/rfcs/0000-namespace.md +0 -106
  109. data/docs/rfcs/template.md +0 -15
  110. data/lib/active_model/serializer/associations.rb +0 -100
  111. data/lib/active_model/serializer/attributes.rb +0 -82
  112. data/lib/active_model/serializer/collection_reflection.rb +0 -7
  113. data/lib/active_model/serializer/configuration.rb +0 -35
  114. data/lib/active_model/serializer/include_tree.rb +0 -111
  115. data/lib/active_model/serializer/links.rb +0 -35
  116. data/lib/active_model/serializer/meta.rb +0 -29
  117. data/lib/active_model/serializer/singular_reflection.rb +0 -7
  118. data/lib/active_model/serializer/type.rb +0 -25
  119. data/lib/active_model_serializers/key_transform.rb +0 -70
  120. data/test/action_controller/adapter_selector_test.rb +0 -53
  121. data/test/action_controller/explicit_serializer_test.rb +0 -134
  122. data/test/action_controller/json/include_test.rb +0 -167
  123. data/test/action_controller/json_api/deserialization_test.rb +0 -112
  124. data/test/action_controller/json_api/errors_test.rb +0 -41
  125. data/test/action_controller/json_api/linked_test.rb +0 -197
  126. data/test/action_controller/json_api/pagination_test.rb +0 -116
  127. data/test/action_controller/json_api/transform_test.rb +0 -181
  128. data/test/action_controller/serialization_scope_name_test.rb +0 -229
  129. data/test/action_controller/serialization_test.rb +0 -469
  130. data/test/active_model_serializers/adapter_for_test.rb +0 -208
  131. data/test/active_model_serializers/json_pointer_test.rb +0 -20
  132. data/test/active_model_serializers/key_transform_test.rb +0 -263
  133. data/test/active_model_serializers/logging_test.rb +0 -77
  134. data/test/active_model_serializers/model_test.rb +0 -9
  135. data/test/active_model_serializers/railtie_test_isolated.rb +0 -63
  136. data/test/active_model_serializers/serialization_context_test_isolated.rb +0 -58
  137. data/test/active_model_serializers/test/schema_test.rb +0 -130
  138. data/test/active_model_serializers/test/serializer_test.rb +0 -62
  139. data/test/active_record_test.rb +0 -9
  140. data/test/adapter/deprecation_test.rb +0 -100
  141. data/test/adapter/json/belongs_to_test.rb +0 -45
  142. data/test/adapter/json/collection_test.rb +0 -90
  143. data/test/adapter/json/has_many_test.rb +0 -45
  144. data/test/adapter/json/transform_test.rb +0 -93
  145. data/test/adapter/json_api/belongs_to_test.rb +0 -155
  146. data/test/adapter/json_api/collection_test.rb +0 -95
  147. data/test/adapter/json_api/errors_test.rb +0 -78
  148. data/test/adapter/json_api/fields_test.rb +0 -87
  149. data/test/adapter/json_api/has_many_embed_ids_test.rb +0 -43
  150. data/test/adapter/json_api/has_many_explicit_serializer_test.rb +0 -96
  151. data/test/adapter/json_api/has_many_test.rb +0 -144
  152. data/test/adapter/json_api/has_one_test.rb +0 -80
  153. data/test/adapter/json_api/json_api_test.rb +0 -35
  154. data/test/adapter/json_api/linked_test.rb +0 -392
  155. data/test/adapter/json_api/links_test.rb +0 -93
  156. data/test/adapter/json_api/pagination_links_test.rb +0 -166
  157. data/test/adapter/json_api/parse_test.rb +0 -137
  158. data/test/adapter/json_api/relationship_test.rb +0 -161
  159. data/test/adapter/json_api/relationships_test.rb +0 -199
  160. data/test/adapter/json_api/resource_identifier_test.rb +0 -85
  161. data/test/adapter/json_api/resource_meta_test.rb +0 -100
  162. data/test/adapter/json_api/toplevel_jsonapi_test.rb +0 -82
  163. data/test/adapter/json_api/transform_test.rb +0 -502
  164. data/test/adapter/json_api/type_test.rb +0 -61
  165. data/test/adapter/json_test.rb +0 -45
  166. data/test/adapter/null_test.rb +0 -23
  167. data/test/adapter/polymorphic_test.rb +0 -171
  168. data/test/adapter_test.rb +0 -67
  169. data/test/array_serializer_test.rb +0 -22
  170. data/test/benchmark/app.rb +0 -65
  171. data/test/benchmark/benchmarking_support.rb +0 -67
  172. data/test/benchmark/bm_caching.rb +0 -119
  173. data/test/benchmark/bm_transform.rb +0 -34
  174. data/test/benchmark/config.ru +0 -3
  175. data/test/benchmark/controllers.rb +0 -84
  176. data/test/benchmark/fixtures.rb +0 -219
  177. data/test/cache_test.rb +0 -485
  178. data/test/collection_serializer_test.rb +0 -110
  179. data/test/fixtures/active_record.rb +0 -78
  180. data/test/fixtures/poro.rb +0 -282
  181. data/test/generators/scaffold_controller_generator_test.rb +0 -24
  182. data/test/generators/serializer_generator_test.rb +0 -57
  183. data/test/grape_test.rb +0 -82
  184. data/test/include_tree/from_include_args_test.rb +0 -26
  185. data/test/include_tree/from_string_test.rb +0 -94
  186. data/test/include_tree/include_args_to_hash_test.rb +0 -64
  187. data/test/lint_test.rb +0 -49
  188. data/test/logger_test.rb +0 -18
  189. data/test/poro_test.rb +0 -9
  190. data/test/serializable_resource_test.rb +0 -83
  191. data/test/serializers/association_macros_test.rb +0 -36
  192. data/test/serializers/associations_test.rb +0 -295
  193. data/test/serializers/attribute_test.rb +0 -151
  194. data/test/serializers/attributes_test.rb +0 -52
  195. data/test/serializers/caching_configuration_test_isolated.rb +0 -170
  196. data/test/serializers/configuration_test.rb +0 -32
  197. data/test/serializers/fieldset_test.rb +0 -14
  198. data/test/serializers/meta_test.rb +0 -196
  199. data/test/serializers/options_test.rb +0 -21
  200. data/test/serializers/read_attribute_for_serialization_test.rb +0 -79
  201. data/test/serializers/root_test.rb +0 -21
  202. data/test/serializers/serialization_test.rb +0 -55
  203. data/test/serializers/serializer_for_test.rb +0 -134
  204. data/test/support/custom_schemas/active_model_serializers/test/schema_test/my/index.json +0 -6
  205. data/test/support/isolated_unit.rb +0 -79
  206. data/test/support/rails5_shims.rb +0 -47
  207. data/test/support/rails_app.rb +0 -45
  208. data/test/support/schemas/active_model_serializers/test/schema_test/my/index.json +0 -6
  209. data/test/support/schemas/active_model_serializers/test/schema_test/my/show.json +0 -6
  210. data/test/support/schemas/custom/show.json +0 -7
  211. data/test/support/schemas/hyper_schema.json +0 -93
  212. data/test/support/schemas/render_using_json_api.json +0 -43
  213. data/test/support/schemas/simple_json_pointers.json +0 -10
  214. data/test/support/serialization_testing.rb +0 -53
  215. data/test/test_helper.rb +0 -57
@@ -1,502 +0,0 @@
1
- require 'test_helper'
2
-
3
- module ActiveModelSerializers
4
- module Adapter
5
- class JsonApi
6
- class KeyCaseTest < ActiveSupport::TestCase
7
- Post = Class.new(::Model)
8
- class PostSerializer < ActiveModel::Serializer
9
- type 'posts'
10
- attributes :title, :body, :publish_at
11
- belongs_to :author
12
- has_many :comments
13
-
14
- link(:self) { post_url(object.id) }
15
- link(:post_authors) { post_authors_url(object.id) }
16
- link(:subscriber_comments) { post_comments_url(object.id) }
17
-
18
- meta do
19
- {
20
- rating: 5,
21
- favorite_count: 10
22
- }
23
- end
24
- end
25
-
26
- Author = Class.new(::Model)
27
- class AuthorSerializer < ActiveModel::Serializer
28
- type 'authors'
29
- attributes :first_name, :last_name
30
- end
31
-
32
- Comment = Class.new(::Model)
33
- class CommentSerializer < ActiveModel::Serializer
34
- type 'comments'
35
- attributes :body
36
- belongs_to :author
37
- end
38
-
39
- def mock_request(transform = nil)
40
- context = Minitest::Mock.new
41
- context.expect(:request_url, URI)
42
- context.expect(:query_parameters, {})
43
- context.expect(:url_helpers, Rails.application.routes.url_helpers)
44
- @options = {}
45
- @options[:key_transform] = transform if transform
46
- @options[:serialization_context] = context
47
- end
48
-
49
- def setup
50
- Rails.application.routes.draw do
51
- resources :posts do
52
- resources :authors
53
- resources :comments
54
- end
55
- end
56
- @publish_at = 1.day.from_now
57
- @author = Author.new(id: 1, first_name: 'Bob', last_name: 'Jones')
58
- @comment1 = Comment.new(id: 7, body: 'cool', author: @author)
59
- @comment2 = Comment.new(id: 12, body: 'awesome', author: @author)
60
- @post = Post.new(id: 1337, title: 'Title 1', body: 'Body 1',
61
- author: @author, comments: [@comment1, @comment2],
62
- publish_at: @publish_at)
63
- @comment1.post = @post
64
- @comment2.post = @post
65
- end
66
-
67
- def test_success_document_transform_default
68
- mock_request
69
- serializer = PostSerializer.new(@post)
70
- adapter = ActiveModelSerializers::Adapter::JsonApi.new(serializer, @options)
71
- result = adapter.serializable_hash
72
- assert_equal({
73
- data: {
74
- id: '1337',
75
- type: 'posts',
76
- attributes: {
77
- title: 'Title 1',
78
- body: 'Body 1',
79
- :"publish-at" => @publish_at
80
- },
81
- relationships: {
82
- author: {
83
- data: { id: '1', type: 'authors' }
84
- },
85
- comments: {
86
- data: [
87
- { id: '7', type: 'comments' },
88
- { id: '12', type: 'comments' }
89
- ] }
90
- },
91
- links: {
92
- self: 'http://example.com/posts/1337',
93
- :"post-authors" => 'http://example.com/posts/1337/authors',
94
- :"subscriber-comments" => 'http://example.com/posts/1337/comments'
95
- },
96
- meta: { rating: 5, :"favorite-count" => 10 }
97
- }
98
- }, result)
99
- end
100
-
101
- def test_success_document_transform_global_config
102
- mock_request
103
- result = with_config(key_transform: :camel_lower) do
104
- serializer = PostSerializer.new(@post)
105
- adapter = ActiveModelSerializers::Adapter::JsonApi.new(serializer, @options)
106
- adapter.serializable_hash
107
- end
108
- assert_equal({
109
- data: {
110
- id: '1337',
111
- type: 'posts',
112
- attributes: {
113
- title: 'Title 1',
114
- body: 'Body 1',
115
- publishAt: @publish_at
116
- },
117
- relationships: {
118
- author: {
119
- data: { id: '1', type: 'authors' }
120
- },
121
- comments: {
122
- data: [
123
- { id: '7', type: 'comments' },
124
- { id: '12', type: 'comments' }
125
- ] }
126
- },
127
- links: {
128
- self: 'http://example.com/posts/1337',
129
- postAuthors: 'http://example.com/posts/1337/authors',
130
- subscriberComments: 'http://example.com/posts/1337/comments'
131
- },
132
- meta: { rating: 5, favoriteCount: 10 }
133
- }
134
- }, result)
135
- end
136
-
137
- def test_success_doc_transform_serialization_ctx_overrides_global
138
- mock_request(:camel)
139
- result = with_config(key_transform: :camel_lower) do
140
- serializer = PostSerializer.new(@post)
141
- adapter = ActiveModelSerializers::Adapter::JsonApi.new(serializer, @options)
142
- adapter.serializable_hash
143
- end
144
- assert_equal({
145
- Data: {
146
- Id: '1337',
147
- Type: 'Posts',
148
- Attributes: {
149
- Title: 'Title 1',
150
- Body: 'Body 1',
151
- PublishAt: @publish_at
152
- },
153
- Relationships: {
154
- Author: {
155
- Data: { Id: '1', Type: 'Authors' }
156
- },
157
- Comments: {
158
- Data: [
159
- { Id: '7', Type: 'Comments' },
160
- { Id: '12', Type: 'Comments' }
161
- ] }
162
- },
163
- Links: {
164
- Self: 'http://example.com/posts/1337',
165
- PostAuthors: 'http://example.com/posts/1337/authors',
166
- SubscriberComments: 'http://example.com/posts/1337/comments'
167
- },
168
- Meta: { Rating: 5, FavoriteCount: 10 }
169
- }
170
- }, result)
171
- end
172
-
173
- def test_success_document_transform_dash
174
- mock_request(:dash)
175
- serializer = PostSerializer.new(@post)
176
- adapter = ActiveModelSerializers::Adapter::JsonApi.new(serializer, @options)
177
- result = adapter.serializable_hash
178
- assert_equal({
179
- data: {
180
- id: '1337',
181
- type: 'posts',
182
- attributes: {
183
- title: 'Title 1',
184
- body: 'Body 1',
185
- :"publish-at" => @publish_at
186
- },
187
- relationships: {
188
- author: {
189
- data: { id: '1', type: 'authors' }
190
- },
191
- comments: {
192
- data: [
193
- { id: '7', type: 'comments' },
194
- { id: '12', type: 'comments' }
195
- ] }
196
- },
197
- links: {
198
- self: 'http://example.com/posts/1337',
199
- :"post-authors" => 'http://example.com/posts/1337/authors',
200
- :"subscriber-comments" => 'http://example.com/posts/1337/comments'
201
- },
202
- meta: { rating: 5, :"favorite-count" => 10 }
203
- }
204
- }, result)
205
- end
206
-
207
- def test_success_document_transform_unaltered
208
- mock_request(:unaltered)
209
- serializer = PostSerializer.new(@post)
210
- adapter = ActiveModelSerializers::Adapter::JsonApi.new(serializer, @options)
211
- result = adapter.serializable_hash
212
- assert_equal({
213
- data: {
214
- id: '1337',
215
- type: 'posts',
216
- attributes: {
217
- title: 'Title 1',
218
- body: 'Body 1',
219
- publish_at: @publish_at
220
- },
221
- relationships: {
222
- author: {
223
- data: { id: '1', type: 'authors' }
224
- },
225
- comments: {
226
- data: [
227
- { id: '7', type: 'comments' },
228
- { id: '12', type: 'comments' }
229
- ] }
230
- },
231
- links: {
232
- self: 'http://example.com/posts/1337',
233
- post_authors: 'http://example.com/posts/1337/authors',
234
- subscriber_comments: 'http://example.com/posts/1337/comments'
235
- },
236
- meta: { rating: 5, favorite_count: 10 }
237
- }
238
- }, result)
239
- end
240
-
241
- def test_success_document_transform_undefined
242
- mock_request(:zoot)
243
- serializer = PostSerializer.new(@post)
244
- adapter = ActiveModelSerializers::Adapter::JsonApi.new(serializer, @options)
245
- exception = assert_raises NoMethodError do
246
- adapter.serializable_hash
247
- end
248
- assert_match(/undefined method.*zoot/, exception.message)
249
- end
250
-
251
- def test_success_document_transform_camel
252
- mock_request(:camel)
253
- serializer = PostSerializer.new(@post)
254
- adapter = ActiveModelSerializers::Adapter::JsonApi.new(serializer, @options)
255
- result = adapter.serializable_hash
256
- assert_equal({
257
- Data: {
258
- Id: '1337',
259
- Type: 'Posts',
260
- Attributes: {
261
- Title: 'Title 1',
262
- Body: 'Body 1',
263
- PublishAt: @publish_at
264
- },
265
- Relationships: {
266
- Author: {
267
- Data: { Id: '1', Type: 'Authors' }
268
- },
269
- Comments: {
270
- Data: [
271
- { Id: '7', Type: 'Comments' },
272
- { Id: '12', Type: 'Comments' }
273
- ] }
274
- },
275
- Links: {
276
- Self: 'http://example.com/posts/1337',
277
- PostAuthors: 'http://example.com/posts/1337/authors',
278
- SubscriberComments: 'http://example.com/posts/1337/comments'
279
- },
280
- Meta: { Rating: 5, FavoriteCount: 10 }
281
- }
282
- }, result)
283
- end
284
-
285
- def test_success_document_transform_camel_lower
286
- mock_request(:camel_lower)
287
- serializer = PostSerializer.new(@post)
288
- adapter = ActiveModelSerializers::Adapter::JsonApi.new(serializer, @options)
289
- result = adapter.serializable_hash
290
- assert_equal({
291
- data: {
292
- id: '1337',
293
- type: 'posts',
294
- attributes: {
295
- title: 'Title 1',
296
- body: 'Body 1',
297
- publishAt: @publish_at
298
- },
299
- relationships: {
300
- author: {
301
- data: { id: '1', type: 'authors' }
302
- },
303
- comments: {
304
- data: [
305
- { id: '7', type: 'comments' },
306
- { id: '12', type: 'comments' }
307
- ] }
308
- },
309
- links: {
310
- self: 'http://example.com/posts/1337',
311
- postAuthors: 'http://example.com/posts/1337/authors',
312
- subscriberComments: 'http://example.com/posts/1337/comments'
313
- },
314
- meta: { rating: 5, favoriteCount: 10 }
315
- }
316
- }, result)
317
- end
318
-
319
- def test_error_document_transform_default
320
- mock_request
321
- resource = ModelWithErrors.new
322
- resource.errors.add(:published_at, 'must be in the future')
323
- resource.errors.add(:title, 'must be longer')
324
- serializer = ActiveModel::Serializer::ErrorSerializer.new(resource)
325
- adapter = ActiveModelSerializers::Adapter::JsonApi.new(serializer, @options)
326
- result = adapter.serializable_hash
327
- expected_errors_object =
328
- { :errors =>
329
- [
330
- {
331
- :source => { :pointer => '/data/attributes/published-at' },
332
- :detail => 'must be in the future' },
333
- {
334
- :source => { :pointer => '/data/attributes/title' },
335
- :detail => 'must be longer'
336
- }
337
- ]
338
- }
339
- assert_equal expected_errors_object, result
340
- end
341
-
342
- def test_error_document_transform_global_config
343
- mock_request
344
- result = with_config(key_transform: :camel) do
345
- resource = ModelWithErrors.new
346
- resource.errors.add(:published_at, 'must be in the future')
347
- resource.errors.add(:title, 'must be longer')
348
- serializer = ActiveModel::Serializer::ErrorSerializer.new(resource)
349
- adapter = ActiveModelSerializers::Adapter::JsonApi.new(serializer, @options)
350
- adapter.serializable_hash
351
- end
352
- expected_errors_object =
353
- { :Errors =>
354
- [
355
- {
356
- :Source => { :Pointer => '/data/attributes/PublishedAt' },
357
- :Detail => 'must be in the future'
358
- },
359
- {
360
- :Source => { :Pointer => '/data/attributes/Title' },
361
- :Detail => 'must be longer'
362
- }
363
- ]
364
- }
365
- assert_equal expected_errors_object, result
366
- end
367
-
368
- def test_error_document_transform_serialization_ctx_overrides_global
369
- mock_request(:camel)
370
- result = with_config(key_transform: :camel_lower) do
371
- resource = ModelWithErrors.new
372
- resource.errors.add(:published_at, 'must be in the future')
373
- resource.errors.add(:title, 'must be longer')
374
- serializer = ActiveModel::Serializer::ErrorSerializer.new(resource)
375
- adapter = ActiveModelSerializers::Adapter::JsonApi.new(serializer, @options)
376
- adapter.serializable_hash
377
- end
378
- expected_errors_object =
379
- { :Errors =>
380
- [
381
- {
382
- :Source => { :Pointer => '/data/attributes/PublishedAt' },
383
- :Detail => 'must be in the future'
384
- },
385
- {
386
- :Source => { :Pointer => '/data/attributes/Title' },
387
- :Detail => 'must be longer'
388
- }
389
- ]
390
- }
391
- assert_equal expected_errors_object, result
392
- end
393
-
394
- def test_error_document_transform_dash
395
- mock_request(:dash)
396
-
397
- resource = ModelWithErrors.new
398
- resource.errors.add(:published_at, 'must be in the future')
399
- resource.errors.add(:title, 'must be longer')
400
-
401
- serializer = ActiveModel::Serializer::ErrorSerializer.new(resource)
402
- adapter = ActiveModelSerializers::Adapter::JsonApi.new(serializer, @options)
403
- result = adapter.serializable_hash
404
-
405
- expected_errors_object =
406
- { :errors =>
407
- [
408
- {
409
- :source => { :pointer => '/data/attributes/published-at' },
410
- :detail => 'must be in the future'
411
- },
412
- {
413
- :source => { :pointer => '/data/attributes/title' },
414
- :detail => 'must be longer'
415
- }
416
- ]
417
- }
418
- assert_equal expected_errors_object, result
419
- end
420
-
421
- def test_error_document_transform_unaltered
422
- mock_request(:unaltered)
423
-
424
- resource = ModelWithErrors.new
425
- resource.errors.add(:published_at, 'must be in the future')
426
- resource.errors.add(:title, 'must be longer')
427
-
428
- serializer = ActiveModel::Serializer::ErrorSerializer.new(resource)
429
- adapter = ActiveModelSerializers::Adapter::JsonApi.new(serializer, @options)
430
- result = adapter.serializable_hash
431
-
432
- expected_errors_object =
433
- { :errors =>
434
- [
435
- { :source => { :pointer => '/data/attributes/published_at' }, :detail => 'must be in the future' },
436
- { :source => { :pointer => '/data/attributes/title' }, :detail => 'must be longer' }
437
- ]
438
- }
439
- assert_equal expected_errors_object, result
440
- end
441
-
442
- def test_error_document_transform_undefined
443
- mock_request(:krazy)
444
-
445
- resource = ModelWithErrors.new
446
- resource.errors.add(:published_at, 'must be in the future')
447
- resource.errors.add(:title, 'must be longer')
448
-
449
- serializer = ActiveModel::Serializer::ErrorSerializer.new(resource)
450
- adapter = ActiveModelSerializers::Adapter::JsonApi.new(serializer, @options)
451
-
452
- exception = assert_raises NoMethodError do
453
- adapter.serializable_hash
454
- end
455
- assert_match(/undefined method.*krazy/, exception.message)
456
- end
457
-
458
- def test_error_document_transform_camel
459
- mock_request(:camel)
460
-
461
- resource = ModelWithErrors.new
462
- resource.errors.add(:published_at, 'must be in the future')
463
- resource.errors.add(:title, 'must be longer')
464
-
465
- serializer = ActiveModel::Serializer::ErrorSerializer.new(resource)
466
- adapter = ActiveModelSerializers::Adapter::JsonApi.new(serializer, @options)
467
- result = adapter.serializable_hash
468
-
469
- expected_errors_object =
470
- { :Errors =>
471
- [
472
- { :Source => { :Pointer => '/data/attributes/PublishedAt' }, :Detail => 'must be in the future' },
473
- { :Source => { :Pointer => '/data/attributes/Title' }, :Detail => 'must be longer' }
474
- ]
475
- }
476
- assert_equal expected_errors_object, result
477
- end
478
-
479
- def test_error_document_transform_camel_lower
480
- mock_request(:camel_lower)
481
-
482
- resource = ModelWithErrors.new
483
- resource.errors.add(:published_at, 'must be in the future')
484
- resource.errors.add(:title, 'must be longer')
485
-
486
- serializer = ActiveModel::Serializer::ErrorSerializer.new(resource)
487
- adapter = ActiveModelSerializers::Adapter::JsonApi.new(serializer, @options)
488
- result = adapter.serializable_hash
489
-
490
- expected_errors_object =
491
- { :errors =>
492
- [
493
- { :source => { :pointer => '/data/attributes/publishedAt' }, :detail => 'must be in the future' },
494
- { :source => { :pointer => '/data/attributes/title' }, :detail => 'must be longer' }
495
- ]
496
- }
497
- assert_equal expected_errors_object, result
498
- end
499
- end
500
- end
501
- end
502
- end
@@ -1,61 +0,0 @@
1
- require 'test_helper'
2
-
3
- module ActiveModel
4
- class Serializer
5
- module Adapter
6
- class JsonApi
7
- class TypeTest < ActiveSupport::TestCase
8
- class StringTypeSerializer < ActiveModel::Serializer
9
- attribute :name
10
- type 'profile'
11
- end
12
-
13
- class SymbolTypeSerializer < ActiveModel::Serializer
14
- attribute :name
15
- type :profile
16
- end
17
-
18
- setup do
19
- @author = Author.new(id: 1, name: 'Steve K.')
20
- end
21
-
22
- def test_config_plural
23
- with_jsonapi_resource_type :plural do
24
- assert_type(@author, 'authors')
25
- end
26
- end
27
-
28
- def test_config_singular
29
- with_jsonapi_resource_type :singular do
30
- assert_type(@author, 'author')
31
- end
32
- end
33
-
34
- def test_explicit_string_type_value
35
- assert_type(@author, 'profile', serializer: StringTypeSerializer)
36
- end
37
-
38
- def test_explicit_symbol_type_value
39
- assert_type(@author, 'profile', serializer: SymbolTypeSerializer)
40
- end
41
-
42
- private
43
-
44
- def assert_type(resource, expected_type, opts = {})
45
- opts = opts.reverse_merge(adapter: :json_api)
46
- hash = serializable(resource, opts).serializable_hash
47
- assert_equal(expected_type, hash.fetch(:data).fetch(:type))
48
- end
49
-
50
- def with_jsonapi_resource_type inflection
51
- old_inflection = ActiveModelSerializers.config.jsonapi_resource_type
52
- ActiveModelSerializers.config.jsonapi_resource_type = inflection
53
- yield
54
- ensure
55
- ActiveModelSerializers.config.jsonapi_resource_type = old_inflection
56
- end
57
- end
58
- end
59
- end
60
- end
61
- end
@@ -1,45 +0,0 @@
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: [{ id: 1, body: 'ZOMG A COMMENT' },
37
- { id: 2, body: 'ZOMG ANOTHER COMMENT' }
38
- ],
39
- writer: { id: 1, name: 'Steve K.' },
40
- site: { id: 1, name: 'My Blog!!' }
41
- }, adapter.serializable_hash[:post])
42
- end
43
- end
44
- end
45
- end
@@ -1,23 +0,0 @@
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
23
-