active_model_serializers_custom 0.10.90

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (215) hide show
  1. checksums.yaml +7 -0
  2. data/.github/ISSUE_TEMPLATE.md +29 -0
  3. data/.github/PULL_REQUEST_TEMPLATE.md +15 -0
  4. data/.gitignore +35 -0
  5. data/.rubocop.yml +109 -0
  6. data/.simplecov +110 -0
  7. data/.travis.yml +63 -0
  8. data/CHANGELOG.md +727 -0
  9. data/CODE_OF_CONDUCT.md +74 -0
  10. data/CONTRIBUTING.md +105 -0
  11. data/Gemfile +74 -0
  12. data/MIT-LICENSE +22 -0
  13. data/README.md +305 -0
  14. data/Rakefile +76 -0
  15. data/active_model_serializers.gemspec +64 -0
  16. data/appveyor.yml +28 -0
  17. data/bin/bench +171 -0
  18. data/bin/bench_regression +316 -0
  19. data/bin/rubocop +38 -0
  20. data/bin/serve_benchmark +39 -0
  21. data/docs/README.md +41 -0
  22. data/docs/STYLE.md +58 -0
  23. data/docs/general/adapters.md +269 -0
  24. data/docs/general/caching.md +58 -0
  25. data/docs/general/configuration_options.md +185 -0
  26. data/docs/general/deserialization.md +100 -0
  27. data/docs/general/fields.md +31 -0
  28. data/docs/general/getting_started.md +133 -0
  29. data/docs/general/instrumentation.md +40 -0
  30. data/docs/general/key_transforms.md +40 -0
  31. data/docs/general/logging.md +21 -0
  32. data/docs/general/rendering.md +293 -0
  33. data/docs/general/serializers.md +495 -0
  34. data/docs/how-open-source-maintained.jpg +0 -0
  35. data/docs/howto/add_pagination_links.md +138 -0
  36. data/docs/howto/add_relationship_links.md +140 -0
  37. data/docs/howto/add_root_key.md +62 -0
  38. data/docs/howto/grape_integration.md +42 -0
  39. data/docs/howto/outside_controller_use.md +66 -0
  40. data/docs/howto/passing_arbitrary_options.md +27 -0
  41. data/docs/howto/serialize_poro.md +73 -0
  42. data/docs/howto/test.md +154 -0
  43. data/docs/howto/upgrade_from_0_8_to_0_10.md +265 -0
  44. data/docs/integrations/ember-and-json-api.md +147 -0
  45. data/docs/integrations/grape.md +19 -0
  46. data/docs/jsonapi/errors.md +56 -0
  47. data/docs/jsonapi/schema.md +151 -0
  48. data/docs/jsonapi/schema/schema.json +366 -0
  49. data/docs/rfcs/0000-namespace.md +106 -0
  50. data/docs/rfcs/template.md +15 -0
  51. data/lib/action_controller/serialization.rb +76 -0
  52. data/lib/active_model/serializable_resource.rb +13 -0
  53. data/lib/active_model/serializer.rb +418 -0
  54. data/lib/active_model/serializer/adapter.rb +26 -0
  55. data/lib/active_model/serializer/adapter/attributes.rb +17 -0
  56. data/lib/active_model/serializer/adapter/base.rb +20 -0
  57. data/lib/active_model/serializer/adapter/json.rb +17 -0
  58. data/lib/active_model/serializer/adapter/json_api.rb +17 -0
  59. data/lib/active_model/serializer/adapter/null.rb +17 -0
  60. data/lib/active_model/serializer/array_serializer.rb +14 -0
  61. data/lib/active_model/serializer/association.rb +91 -0
  62. data/lib/active_model/serializer/attribute.rb +27 -0
  63. data/lib/active_model/serializer/belongs_to_reflection.rb +13 -0
  64. data/lib/active_model/serializer/collection_serializer.rb +90 -0
  65. data/lib/active_model/serializer/concerns/caching.rb +304 -0
  66. data/lib/active_model/serializer/error_serializer.rb +16 -0
  67. data/lib/active_model/serializer/errors_serializer.rb +34 -0
  68. data/lib/active_model/serializer/field.rb +92 -0
  69. data/lib/active_model/serializer/fieldset.rb +33 -0
  70. data/lib/active_model/serializer/has_many_reflection.rb +12 -0
  71. data/lib/active_model/serializer/has_one_reflection.rb +9 -0
  72. data/lib/active_model/serializer/lazy_association.rb +99 -0
  73. data/lib/active_model/serializer/link.rb +23 -0
  74. data/lib/active_model/serializer/lint.rb +152 -0
  75. data/lib/active_model/serializer/null.rb +19 -0
  76. data/lib/active_model/serializer/reflection.rb +212 -0
  77. data/lib/active_model/serializer/version.rb +7 -0
  78. data/lib/active_model_serializers.rb +63 -0
  79. data/lib/active_model_serializers/adapter.rb +100 -0
  80. data/lib/active_model_serializers/adapter/attributes.rb +15 -0
  81. data/lib/active_model_serializers/adapter/base.rb +85 -0
  82. data/lib/active_model_serializers/adapter/json.rb +23 -0
  83. data/lib/active_model_serializers/adapter/json_api.rb +535 -0
  84. data/lib/active_model_serializers/adapter/json_api/deserialization.rb +215 -0
  85. data/lib/active_model_serializers/adapter/json_api/error.rb +98 -0
  86. data/lib/active_model_serializers/adapter/json_api/jsonapi.rb +51 -0
  87. data/lib/active_model_serializers/adapter/json_api/link.rb +85 -0
  88. data/lib/active_model_serializers/adapter/json_api/meta.rb +39 -0
  89. data/lib/active_model_serializers/adapter/json_api/pagination_links.rb +90 -0
  90. data/lib/active_model_serializers/adapter/json_api/relationship.rb +106 -0
  91. data/lib/active_model_serializers/adapter/json_api/resource_identifier.rb +68 -0
  92. data/lib/active_model_serializers/adapter/null.rb +11 -0
  93. data/lib/active_model_serializers/callbacks.rb +57 -0
  94. data/lib/active_model_serializers/deprecate.rb +56 -0
  95. data/lib/active_model_serializers/deserialization.rb +17 -0
  96. data/lib/active_model_serializers/json_pointer.rb +16 -0
  97. data/lib/active_model_serializers/logging.rb +124 -0
  98. data/lib/active_model_serializers/lookup_chain.rb +82 -0
  99. data/lib/active_model_serializers/model.rb +132 -0
  100. data/lib/active_model_serializers/railtie.rb +52 -0
  101. data/lib/active_model_serializers/register_jsonapi_renderer.rb +80 -0
  102. data/lib/active_model_serializers/serializable_resource.rb +84 -0
  103. data/lib/active_model_serializers/serialization_context.rb +41 -0
  104. data/lib/active_model_serializers/test.rb +9 -0
  105. data/lib/active_model_serializers/test/schema.rb +140 -0
  106. data/lib/active_model_serializers/test/serializer.rb +127 -0
  107. data/lib/generators/rails/USAGE +6 -0
  108. data/lib/generators/rails/resource_override.rb +12 -0
  109. data/lib/generators/rails/serializer_generator.rb +38 -0
  110. data/lib/generators/rails/templates/serializer.rb.erb +8 -0
  111. data/lib/grape/active_model_serializers.rb +18 -0
  112. data/lib/grape/formatters/active_model_serializers.rb +34 -0
  113. data/lib/grape/helpers/active_model_serializers.rb +19 -0
  114. data/lib/tasks/rubocop.rake +55 -0
  115. data/test/action_controller/adapter_selector_test.rb +64 -0
  116. data/test/action_controller/explicit_serializer_test.rb +137 -0
  117. data/test/action_controller/json/include_test.rb +248 -0
  118. data/test/action_controller/json_api/deserialization_test.rb +114 -0
  119. data/test/action_controller/json_api/errors_test.rb +42 -0
  120. data/test/action_controller/json_api/fields_test.rb +68 -0
  121. data/test/action_controller/json_api/linked_test.rb +204 -0
  122. data/test/action_controller/json_api/pagination_test.rb +126 -0
  123. data/test/action_controller/json_api/transform_test.rb +191 -0
  124. data/test/action_controller/lookup_proc_test.rb +51 -0
  125. data/test/action_controller/namespace_lookup_test.rb +239 -0
  126. data/test/action_controller/serialization_scope_name_test.rb +237 -0
  127. data/test/action_controller/serialization_test.rb +480 -0
  128. data/test/active_model_serializers/adapter_for_test.rb +210 -0
  129. data/test/active_model_serializers/json_pointer_test.rb +24 -0
  130. data/test/active_model_serializers/logging_test.rb +79 -0
  131. data/test/active_model_serializers/model_test.rb +144 -0
  132. data/test/active_model_serializers/railtie_test_isolated.rb +70 -0
  133. data/test/active_model_serializers/register_jsonapi_renderer_test_isolated.rb +163 -0
  134. data/test/active_model_serializers/serialization_context_test_isolated.rb +73 -0
  135. data/test/active_model_serializers/test/schema_test.rb +133 -0
  136. data/test/active_model_serializers/test/serializer_test.rb +64 -0
  137. data/test/active_record_test.rb +11 -0
  138. data/test/adapter/attributes_test.rb +42 -0
  139. data/test/adapter/deprecation_test.rb +102 -0
  140. data/test/adapter/json/belongs_to_test.rb +47 -0
  141. data/test/adapter/json/collection_test.rb +106 -0
  142. data/test/adapter/json/has_many_test.rb +55 -0
  143. data/test/adapter/json/transform_test.rb +95 -0
  144. data/test/adapter/json_api/belongs_to_test.rb +157 -0
  145. data/test/adapter/json_api/collection_test.rb +98 -0
  146. data/test/adapter/json_api/errors_test.rb +78 -0
  147. data/test/adapter/json_api/fields_test.rb +98 -0
  148. data/test/adapter/json_api/has_many_explicit_serializer_test.rb +98 -0
  149. data/test/adapter/json_api/has_many_test.rb +175 -0
  150. data/test/adapter/json_api/has_one_test.rb +82 -0
  151. data/test/adapter/json_api/include_data_if_sideloaded_test.rb +215 -0
  152. data/test/adapter/json_api/json_api_test.rb +35 -0
  153. data/test/adapter/json_api/linked_test.rb +415 -0
  154. data/test/adapter/json_api/links_test.rb +112 -0
  155. data/test/adapter/json_api/pagination_links_test.rb +208 -0
  156. data/test/adapter/json_api/parse_test.rb +139 -0
  157. data/test/adapter/json_api/relationship_test.rb +399 -0
  158. data/test/adapter/json_api/resource_meta_test.rb +102 -0
  159. data/test/adapter/json_api/toplevel_jsonapi_test.rb +84 -0
  160. data/test/adapter/json_api/transform_test.rb +514 -0
  161. data/test/adapter/json_api/type_test.rb +195 -0
  162. data/test/adapter/json_test.rb +48 -0
  163. data/test/adapter/null_test.rb +24 -0
  164. data/test/adapter/polymorphic_test.rb +220 -0
  165. data/test/adapter_test.rb +69 -0
  166. data/test/array_serializer_test.rb +24 -0
  167. data/test/benchmark/app.rb +67 -0
  168. data/test/benchmark/benchmarking_support.rb +69 -0
  169. data/test/benchmark/bm_active_record.rb +83 -0
  170. data/test/benchmark/bm_adapter.rb +40 -0
  171. data/test/benchmark/bm_caching.rb +121 -0
  172. data/test/benchmark/bm_lookup_chain.rb +85 -0
  173. data/test/benchmark/bm_transform.rb +47 -0
  174. data/test/benchmark/config.ru +3 -0
  175. data/test/benchmark/controllers.rb +85 -0
  176. data/test/benchmark/fixtures.rb +221 -0
  177. data/test/cache_test.rb +717 -0
  178. data/test/collection_serializer_test.rb +129 -0
  179. data/test/fixtures/active_record.rb +115 -0
  180. data/test/fixtures/poro.rb +227 -0
  181. data/test/generators/scaffold_controller_generator_test.rb +26 -0
  182. data/test/generators/serializer_generator_test.rb +77 -0
  183. data/test/grape_test.rb +198 -0
  184. data/test/lint_test.rb +51 -0
  185. data/test/logger_test.rb +22 -0
  186. data/test/poro_test.rb +11 -0
  187. data/test/serializable_resource_test.rb +81 -0
  188. data/test/serializers/association_macros_test.rb +39 -0
  189. data/test/serializers/associations_test.rb +520 -0
  190. data/test/serializers/attribute_test.rb +155 -0
  191. data/test/serializers/attributes_test.rb +54 -0
  192. data/test/serializers/caching_configuration_test_isolated.rb +172 -0
  193. data/test/serializers/configuration_test.rb +34 -0
  194. data/test/serializers/fieldset_test.rb +16 -0
  195. data/test/serializers/meta_test.rb +204 -0
  196. data/test/serializers/options_test.rb +34 -0
  197. data/test/serializers/read_attribute_for_serialization_test.rb +81 -0
  198. data/test/serializers/reflection_test.rb +481 -0
  199. data/test/serializers/root_test.rb +23 -0
  200. data/test/serializers/serialization_test.rb +57 -0
  201. data/test/serializers/serializer_for_test.rb +138 -0
  202. data/test/serializers/serializer_for_with_namespace_test.rb +90 -0
  203. data/test/support/custom_schemas/active_model_serializers/test/schema_test/my/index.json +6 -0
  204. data/test/support/isolated_unit.rb +86 -0
  205. data/test/support/rails5_shims.rb +55 -0
  206. data/test/support/rails_app.rb +40 -0
  207. data/test/support/schemas/active_model_serializers/test/schema_test/my/index.json +6 -0
  208. data/test/support/schemas/active_model_serializers/test/schema_test/my/show.json +6 -0
  209. data/test/support/schemas/custom/show.json +7 -0
  210. data/test/support/schemas/hyper_schema.json +93 -0
  211. data/test/support/schemas/render_using_json_api.json +43 -0
  212. data/test/support/schemas/simple_json_pointers.json +10 -0
  213. data/test/support/serialization_testing.rb +81 -0
  214. data/test/test_helper.rb +72 -0
  215. metadata +622 -0
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'test_helper'
4
+
5
+ class ActiveRecordTest < ActiveSupport::TestCase
6
+ include ActiveModel::Serializer::Lint::Tests
7
+
8
+ def setup
9
+ @resource = ARModels::Post.new
10
+ end
11
+ end
@@ -0,0 +1,42 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'test_helper'
4
+
5
+ module ActiveModelSerializers
6
+ module Adapter
7
+ class AttributesTest < ActiveSupport::TestCase
8
+ class Person < ActiveModelSerializers::Model
9
+ attributes :first_name, :last_name
10
+ end
11
+
12
+ class PersonSerializer < ActiveModel::Serializer
13
+ attributes :first_name, :last_name
14
+ end
15
+
16
+ def setup
17
+ ActionController::Base.cache_store.clear
18
+ end
19
+
20
+ def test_serializable_hash
21
+ person = Person.new(first_name: 'Arthur', last_name: 'Dent')
22
+ serializer = PersonSerializer.new(person)
23
+ adapter = ActiveModelSerializers::Adapter::Attributes.new(serializer)
24
+
25
+ assert_equal({ first_name: 'Arthur', last_name: 'Dent' },
26
+ adapter.serializable_hash)
27
+ end
28
+
29
+ def test_serializable_hash_with_transform_key_casing
30
+ person = Person.new(first_name: 'Arthur', last_name: 'Dent')
31
+ serializer = PersonSerializer.new(person)
32
+ adapter = ActiveModelSerializers::Adapter::Attributes.new(
33
+ serializer,
34
+ key_transform: :camel_lower
35
+ )
36
+
37
+ assert_equal({ firstName: 'Arthur', lastName: 'Dent' },
38
+ adapter.serializable_hash)
39
+ end
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,102 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'test_helper'
4
+ module ActiveModel
5
+ class Serializer
6
+ module Adapter
7
+ class DeprecationTest < ActiveSupport::TestCase
8
+ class PostSerializer < ActiveModel::Serializer
9
+ attribute :body
10
+ end
11
+ setup do
12
+ post = Post.new(id: 1, body: 'Hello')
13
+ @serializer = PostSerializer.new(post)
14
+ end
15
+
16
+ def test_null_adapter_serialization_deprecation
17
+ expected = {}
18
+ assert_deprecated do
19
+ assert_equal(expected, Null.new(@serializer).as_json)
20
+ end
21
+ end
22
+
23
+ def test_json_adapter_serialization_deprecation
24
+ expected = { post: { body: 'Hello' } }
25
+ assert_deprecated do
26
+ assert_equal(expected, Json.new(@serializer).as_json)
27
+ end
28
+ end
29
+
30
+ def test_jsonapi_adapter_serialization_deprecation
31
+ expected = {
32
+ data: {
33
+ id: '1',
34
+ type: 'posts',
35
+ attributes: {
36
+ body: 'Hello'
37
+ }
38
+ }
39
+ }
40
+ assert_deprecated do
41
+ assert_equal(expected, JsonApi.new(@serializer).as_json)
42
+ end
43
+ end
44
+
45
+ def test_attributes_adapter_serialization_deprecation
46
+ expected = { body: 'Hello' }
47
+ assert_deprecated do
48
+ assert_equal(expected, Attributes.new(@serializer).as_json)
49
+ end
50
+ end
51
+
52
+ def test_adapter_create_deprecation
53
+ assert_deprecated do
54
+ Adapter.create(@serializer)
55
+ end
56
+ end
57
+
58
+ def test_adapter_adapter_map_deprecation
59
+ assert_deprecated do
60
+ Adapter.adapter_map
61
+ end
62
+ end
63
+
64
+ def test_adapter_adapters_deprecation
65
+ assert_deprecated do
66
+ Adapter.adapters
67
+ end
68
+ end
69
+
70
+ def test_adapter_adapter_class_deprecation
71
+ assert_deprecated do
72
+ Adapter.adapter_class(:json_api)
73
+ end
74
+ end
75
+
76
+ def test_adapter_register_deprecation
77
+ assert_deprecated do
78
+ begin
79
+ Adapter.register(:test, Class.new)
80
+ ensure
81
+ Adapter.adapter_map.delete('test')
82
+ end
83
+ end
84
+ end
85
+
86
+ def test_adapter_lookup_deprecation
87
+ assert_deprecated do
88
+ Adapter.lookup(:json_api)
89
+ end
90
+ end
91
+
92
+ private
93
+
94
+ def assert_deprecated
95
+ assert_output(nil, /deprecated/) do
96
+ yield
97
+ end
98
+ end
99
+ end
100
+ end
101
+ end
102
+ end
@@ -0,0 +1,47 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'test_helper'
4
+
5
+ module ActiveModelSerializers
6
+ module Adapter
7
+ class Json
8
+ class BelongsToTest < ActiveSupport::TestCase
9
+ def setup
10
+ @post = Post.new(id: 42, title: 'New Post', body: 'Body')
11
+ @anonymous_post = Post.new(id: 43, title: 'Hello!!', body: 'Hello, world!!')
12
+ @comment = Comment.new(id: 1, body: 'ZOMG A COMMENT')
13
+ @post.comments = [@comment]
14
+ @anonymous_post.comments = []
15
+ @comment.post = @post
16
+ @comment.author = nil
17
+ @anonymous_post.author = nil
18
+ @blog = Blog.new(id: 1, name: 'My Blog!!')
19
+ @post.blog = @blog
20
+ @anonymous_post.blog = nil
21
+
22
+ @serializer = CommentSerializer.new(@comment)
23
+ @adapter = ActiveModelSerializers::Adapter::Json.new(@serializer)
24
+ ActionController::Base.cache_store.clear
25
+ end
26
+
27
+ def test_includes_post
28
+ assert_equal({ id: 42, title: 'New Post', body: 'Body' }, @adapter.serializable_hash[:comment][:post])
29
+ end
30
+
31
+ def test_include_nil_author
32
+ serializer = PostSerializer.new(@anonymous_post)
33
+ adapter = ActiveModelSerializers::Adapter::Json.new(serializer)
34
+
35
+ assert_equal({ post: { title: 'Hello!!', body: 'Hello, world!!', id: 43, comments: [], blog: { id: 999, name: 'Custom blog' }, author: nil } }, adapter.serializable_hash)
36
+ end
37
+
38
+ def test_include_nil_author_with_specified_serializer
39
+ serializer = PostPreviewSerializer.new(@anonymous_post)
40
+ adapter = ActiveModelSerializers::Adapter::Json.new(serializer)
41
+
42
+ assert_equal({ post: { title: 'Hello!!', body: 'Hello, world!!', id: 43, comments: [], author: nil } }, adapter.serializable_hash)
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,106 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'test_helper'
4
+
5
+ module ActiveModelSerializers
6
+ module Adapter
7
+ class Json
8
+ class Collection < ActiveSupport::TestCase
9
+ def setup
10
+ @author = Author.new(id: 1, name: 'Steve K.')
11
+ @first_post = Post.new(id: 1, title: 'Hello!!', body: 'Hello, world!!')
12
+ @second_post = Post.new(id: 2, title: 'New Post', body: 'Body')
13
+ @first_post.comments = []
14
+ @second_post.comments = []
15
+ @first_post.author = @author
16
+ @second_post.author = @author
17
+ @blog = Blog.new(id: 1, name: 'My Blog!!')
18
+ @first_post.blog = @blog
19
+ @second_post.blog = nil
20
+
21
+ ActionController::Base.cache_store.clear
22
+ end
23
+
24
+ def test_with_serializer_option
25
+ @blog.special_attribute = 'Special'
26
+ @blog.articles = [@first_post, @second_post]
27
+ serializer = ActiveModel::Serializer::CollectionSerializer.new([@blog], serializer: CustomBlogSerializer)
28
+ adapter = ActiveModelSerializers::Adapter::Json.new(serializer)
29
+
30
+ expected = { blogs: [{
31
+ id: 1,
32
+ special_attribute: 'Special',
33
+ articles: [{ id: 1, title: 'Hello!!', body: 'Hello, world!!' }, { id: 2, title: 'New Post', body: 'Body' }]
34
+ }] }
35
+ assert_equal expected, adapter.serializable_hash
36
+ end
37
+
38
+ def test_include_multiple_posts
39
+ serializer = ActiveModel::Serializer::CollectionSerializer.new([@first_post, @second_post])
40
+ adapter = ActiveModelSerializers::Adapter::Json.new(serializer)
41
+
42
+ expected = { posts: [{
43
+ title: 'Hello!!',
44
+ body: 'Hello, world!!',
45
+ id: 1,
46
+ comments: [],
47
+ author: {
48
+ id: 1,
49
+ name: 'Steve K.'
50
+ },
51
+ blog: {
52
+ id: 999,
53
+ name: 'Custom blog'
54
+ }
55
+ }, {
56
+ title: 'New Post',
57
+ body: 'Body',
58
+ id: 2,
59
+ comments: [],
60
+ author: {
61
+ id: 1,
62
+ name: 'Steve K.'
63
+ },
64
+ blog: {
65
+ id: 999,
66
+ name: 'Custom blog'
67
+ }
68
+ }] }
69
+ assert_equal expected, adapter.serializable_hash
70
+ end
71
+
72
+ def test_root_is_underscored
73
+ virtual_value = VirtualValue.new(id: 1)
74
+ serializer = ActiveModel::Serializer::CollectionSerializer.new([virtual_value])
75
+ adapter = ActiveModelSerializers::Adapter::Json.new(serializer)
76
+
77
+ assert_equal 1, adapter.serializable_hash[:virtual_values].length
78
+ end
79
+
80
+ def test_include_option
81
+ serializer = ActiveModel::Serializer::CollectionSerializer.new([@first_post, @second_post])
82
+ adapter = ActiveModelSerializers::Adapter::Json.new(serializer, include: '')
83
+ actual = adapter.serializable_hash
84
+ expected = { posts: [{ id: 1, title: 'Hello!!', body: 'Hello, world!!' },
85
+ { id: 2, title: 'New Post', body: 'Body' }] }
86
+
87
+ assert_equal(expected, actual)
88
+ end
89
+
90
+ def test_fields_with_no_associations_include_option
91
+ actual = ActiveModelSerializers::SerializableResource.new(
92
+ [@first_post, @second_post], adapter: :json, fields: [:id], include: []
93
+ ).as_json
94
+
95
+ expected = { posts: [{
96
+ id: 1
97
+ }, {
98
+ id: 2
99
+ }] }
100
+
101
+ assert_equal(expected, actual)
102
+ end
103
+ end
104
+ end
105
+ end
106
+ end
@@ -0,0 +1,55 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'test_helper'
4
+
5
+ module ActiveModelSerializers
6
+ module Adapter
7
+ class Json
8
+ class HasManyTestTest < ActiveSupport::TestCase
9
+ class ModelWithoutSerializer < ::Model
10
+ attributes :id, :name
11
+ end
12
+
13
+ def setup
14
+ ActionController::Base.cache_store.clear
15
+ @author = Author.new(id: 1, name: 'Steve K.')
16
+ @post = Post.new(id: 42, title: 'New Post', body: 'Body')
17
+ @first_comment = Comment.new(id: 1, body: 'ZOMG A COMMENT')
18
+ @second_comment = Comment.new(id: 2, body: 'ZOMG ANOTHER COMMENT')
19
+ @post.comments = [@first_comment, @second_comment]
20
+ @post.author = @author
21
+ @first_comment.post = @post
22
+ @second_comment.post = @post
23
+ @blog = Blog.new(id: 1, name: 'My Blog!!')
24
+ @post.blog = @blog
25
+ @tag = ModelWithoutSerializer.new(id: 1, name: '#hash_tag')
26
+ @post.tags = [@tag]
27
+ end
28
+
29
+ def test_has_many
30
+ serializer = PostSerializer.new(@post)
31
+ adapter = ActiveModelSerializers::Adapter::Json.new(serializer)
32
+ assert_equal([
33
+ { id: 1, body: 'ZOMG A COMMENT' },
34
+ { id: 2, body: 'ZOMG ANOTHER COMMENT' }
35
+ ], adapter.serializable_hash[:post][:comments])
36
+ end
37
+
38
+ def test_has_many_with_no_serializer
39
+ post_serializer_class = Class.new(ActiveModel::Serializer) do
40
+ attributes :id
41
+ has_many :tags
42
+ end
43
+ serializer = post_serializer_class.new(@post)
44
+ adapter = ActiveModelSerializers::Adapter::Json.new(serializer)
45
+ assert_equal({
46
+ id: 42,
47
+ tags: [
48
+ { 'id' => 1, 'name' => '#hash_tag' }
49
+ ]
50
+ }.to_json, adapter.serializable_hash[:post].to_json)
51
+ end
52
+ end
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,95 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'test_helper'
4
+
5
+ module ActiveModelSerializers
6
+ module Adapter
7
+ class Json
8
+ class KeyCaseTest < ActiveSupport::TestCase
9
+ def mock_request(key_transform = nil)
10
+ context = Minitest::Mock.new
11
+ context.expect(:request_url, URI)
12
+ context.expect(:query_parameters, {})
13
+ options = {}
14
+ options[:key_transform] = key_transform if key_transform
15
+ options[:serialization_context] = context
16
+ serializer = CustomBlogSerializer.new(@blog)
17
+ @adapter = ActiveModelSerializers::Adapter::Json.new(serializer, options)
18
+ end
19
+
20
+ class Post < ::Model; end
21
+ class PostSerializer < ActiveModel::Serializer
22
+ attributes :id, :title, :body, :publish_at
23
+ end
24
+
25
+ setup do
26
+ ActionController::Base.cache_store.clear
27
+ @blog = Blog.new(id: 1, name: 'My Blog!!', special_attribute: 'neat')
28
+ end
29
+
30
+ def test_transform_default
31
+ mock_request
32
+ assert_equal({
33
+ blog: { id: 1, special_attribute: 'neat', articles: nil }
34
+ }, @adapter.serializable_hash)
35
+ end
36
+
37
+ def test_transform_global_config
38
+ mock_request
39
+ result = with_config(key_transform: :camel_lower) do
40
+ @adapter.serializable_hash
41
+ end
42
+ assert_equal({
43
+ blog: { id: 1, specialAttribute: 'neat', articles: nil }
44
+ }, result)
45
+ end
46
+
47
+ def test_transform_serialization_ctx_overrides_global_config
48
+ mock_request(:camel)
49
+ result = with_config(key_transform: :camel_lower) do
50
+ @adapter.serializable_hash
51
+ end
52
+ assert_equal({
53
+ Blog: { Id: 1, SpecialAttribute: 'neat', Articles: nil }
54
+ }, result)
55
+ end
56
+
57
+ def test_transform_undefined
58
+ mock_request(:blam)
59
+ result = nil
60
+ assert_raises NoMethodError do
61
+ result = @adapter.serializable_hash
62
+ end
63
+ end
64
+
65
+ def test_transform_dash
66
+ mock_request(:dash)
67
+ assert_equal({
68
+ blog: { id: 1, :"special-attribute" => 'neat', articles: nil }
69
+ }, @adapter.serializable_hash)
70
+ end
71
+
72
+ def test_transform_unaltered
73
+ mock_request(:unaltered)
74
+ assert_equal({
75
+ blog: { id: 1, special_attribute: 'neat', articles: nil }
76
+ }, @adapter.serializable_hash)
77
+ end
78
+
79
+ def test_transform_camel
80
+ mock_request(:camel)
81
+ assert_equal({
82
+ Blog: { Id: 1, SpecialAttribute: 'neat', Articles: nil }
83
+ }, @adapter.serializable_hash)
84
+ end
85
+
86
+ def test_transform_camel_lower
87
+ mock_request(:camel_lower)
88
+ assert_equal({
89
+ blog: { id: 1, specialAttribute: 'neat', articles: nil }
90
+ }, @adapter.serializable_hash)
91
+ end
92
+ end
93
+ end
94
+ end
95
+ end