agi_active_model_serializers 0.10.7

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 (220) 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 +102 -0
  6. data/.simplecov +110 -0
  7. data/.travis.yml +51 -0
  8. data/CHANGELOG.md +612 -0
  9. data/CODE_OF_CONDUCT.md +74 -0
  10. data/CONTRIBUTING.md +105 -0
  11. data/Gemfile +56 -0
  12. data/MIT-LICENSE +22 -0
  13. data/README.md +307 -0
  14. data/Rakefile +103 -0
  15. data/active_model_serializers.gemspec +63 -0
  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/README.md +41 -0
  21. data/docs/STYLE.md +58 -0
  22. data/docs/general/adapters.md +247 -0
  23. data/docs/general/caching.md +58 -0
  24. data/docs/general/configuration_options.md +169 -0
  25. data/docs/general/deserialization.md +100 -0
  26. data/docs/general/fields.md +31 -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 +279 -0
  32. data/docs/general/serializers.md +461 -0
  33. data/docs/how-open-source-maintained.jpg +0 -0
  34. data/docs/howto/add_pagination_links.md +138 -0
  35. data/docs/howto/add_relationship_links.md +137 -0
  36. data/docs/howto/add_root_key.md +55 -0
  37. data/docs/howto/grape_integration.md +42 -0
  38. data/docs/howto/outside_controller_use.md +65 -0
  39. data/docs/howto/passing_arbitrary_options.md +27 -0
  40. data/docs/howto/serialize_poro.md +32 -0
  41. data/docs/howto/test.md +154 -0
  42. data/docs/howto/upgrade_from_0_8_to_0_10.md +265 -0
  43. data/docs/integrations/ember-and-json-api.md +144 -0
  44. data/docs/integrations/grape.md +19 -0
  45. data/docs/jsonapi/errors.md +56 -0
  46. data/docs/jsonapi/schema.md +151 -0
  47. data/docs/jsonapi/schema/schema.json +366 -0
  48. data/docs/rfcs/0000-namespace.md +106 -0
  49. data/docs/rfcs/template.md +15 -0
  50. data/lib/action_controller/serialization.rb +66 -0
  51. data/lib/active_model/serializable_resource.rb +11 -0
  52. data/lib/active_model/serializer.rb +231 -0
  53. data/lib/active_model/serializer/adapter.rb +24 -0
  54. data/lib/active_model/serializer/adapter/attributes.rb +15 -0
  55. data/lib/active_model/serializer/adapter/base.rb +18 -0
  56. data/lib/active_model/serializer/adapter/json.rb +15 -0
  57. data/lib/active_model/serializer/adapter/json_api.rb +15 -0
  58. data/lib/active_model/serializer/adapter/null.rb +15 -0
  59. data/lib/active_model/serializer/array_serializer.rb +12 -0
  60. data/lib/active_model/serializer/association.rb +34 -0
  61. data/lib/active_model/serializer/attribute.rb +25 -0
  62. data/lib/active_model/serializer/belongs_to_reflection.rb +7 -0
  63. data/lib/active_model/serializer/collection_reflection.rb +7 -0
  64. data/lib/active_model/serializer/collection_serializer.rb +87 -0
  65. data/lib/active_model/serializer/concerns/associations.rb +102 -0
  66. data/lib/active_model/serializer/concerns/attributes.rb +82 -0
  67. data/lib/active_model/serializer/concerns/caching.rb +292 -0
  68. data/lib/active_model/serializer/concerns/configuration.rb +59 -0
  69. data/lib/active_model/serializer/concerns/links.rb +35 -0
  70. data/lib/active_model/serializer/concerns/meta.rb +29 -0
  71. data/lib/active_model/serializer/concerns/type.rb +25 -0
  72. data/lib/active_model/serializer/error_serializer.rb +14 -0
  73. data/lib/active_model/serializer/errors_serializer.rb +32 -0
  74. data/lib/active_model/serializer/field.rb +90 -0
  75. data/lib/active_model/serializer/fieldset.rb +31 -0
  76. data/lib/active_model/serializer/has_many_reflection.rb +7 -0
  77. data/lib/active_model/serializer/has_one_reflection.rb +7 -0
  78. data/lib/active_model/serializer/lint.rb +150 -0
  79. data/lib/active_model/serializer/null.rb +17 -0
  80. data/lib/active_model/serializer/reflection.rb +163 -0
  81. data/lib/active_model/serializer/singular_reflection.rb +7 -0
  82. data/lib/active_model/serializer/version.rb +5 -0
  83. data/lib/active_model_serializers.rb +53 -0
  84. data/lib/active_model_serializers/adapter.rb +98 -0
  85. data/lib/active_model_serializers/adapter/attributes.rb +13 -0
  86. data/lib/active_model_serializers/adapter/base.rb +83 -0
  87. data/lib/active_model_serializers/adapter/json.rb +21 -0
  88. data/lib/active_model_serializers/adapter/json_api.rb +517 -0
  89. data/lib/active_model_serializers/adapter/json_api/deserialization.rb +213 -0
  90. data/lib/active_model_serializers/adapter/json_api/error.rb +96 -0
  91. data/lib/active_model_serializers/adapter/json_api/jsonapi.rb +49 -0
  92. data/lib/active_model_serializers/adapter/json_api/link.rb +83 -0
  93. data/lib/active_model_serializers/adapter/json_api/meta.rb +37 -0
  94. data/lib/active_model_serializers/adapter/json_api/pagination_links.rb +69 -0
  95. data/lib/active_model_serializers/adapter/json_api/relationship.rb +63 -0
  96. data/lib/active_model_serializers/adapter/json_api/resource_identifier.rb +51 -0
  97. data/lib/active_model_serializers/adapter/null.rb +9 -0
  98. data/lib/active_model_serializers/callbacks.rb +55 -0
  99. data/lib/active_model_serializers/deprecate.rb +54 -0
  100. data/lib/active_model_serializers/deserialization.rb +15 -0
  101. data/lib/active_model_serializers/json_pointer.rb +14 -0
  102. data/lib/active_model_serializers/logging.rb +122 -0
  103. data/lib/active_model_serializers/lookup_chain.rb +80 -0
  104. data/lib/active_model_serializers/model.rb +71 -0
  105. data/lib/active_model_serializers/railtie.rb +48 -0
  106. data/lib/active_model_serializers/register_jsonapi_renderer.rb +78 -0
  107. data/lib/active_model_serializers/serializable_resource.rb +82 -0
  108. data/lib/active_model_serializers/serialization_context.rb +39 -0
  109. data/lib/active_model_serializers/test.rb +7 -0
  110. data/lib/active_model_serializers/test/schema.rb +138 -0
  111. data/lib/active_model_serializers/test/serializer.rb +125 -0
  112. data/lib/generators/rails/USAGE +6 -0
  113. data/lib/generators/rails/resource_override.rb +10 -0
  114. data/lib/generators/rails/serializer_generator.rb +36 -0
  115. data/lib/generators/rails/templates/serializer.rb.erb +15 -0
  116. data/lib/grape/active_model_serializers.rb +16 -0
  117. data/lib/grape/formatters/active_model_serializers.rb +32 -0
  118. data/lib/grape/helpers/active_model_serializers.rb +17 -0
  119. data/test/action_controller/adapter_selector_test.rb +53 -0
  120. data/test/action_controller/explicit_serializer_test.rb +135 -0
  121. data/test/action_controller/json/include_test.rb +246 -0
  122. data/test/action_controller/json_api/deserialization_test.rb +112 -0
  123. data/test/action_controller/json_api/errors_test.rb +40 -0
  124. data/test/action_controller/json_api/fields_test.rb +66 -0
  125. data/test/action_controller/json_api/linked_test.rb +202 -0
  126. data/test/action_controller/json_api/pagination_test.rb +116 -0
  127. data/test/action_controller/json_api/transform_test.rb +189 -0
  128. data/test/action_controller/lookup_proc_test.rb +49 -0
  129. data/test/action_controller/namespace_lookup_test.rb +232 -0
  130. data/test/action_controller/serialization_scope_name_test.rb +229 -0
  131. data/test/action_controller/serialization_test.rb +472 -0
  132. data/test/active_model_serializers/adapter_for_test.rb +208 -0
  133. data/test/active_model_serializers/json_pointer_test.rb +22 -0
  134. data/test/active_model_serializers/logging_test.rb +77 -0
  135. data/test/active_model_serializers/model_test.rb +69 -0
  136. data/test/active_model_serializers/railtie_test_isolated.rb +63 -0
  137. data/test/active_model_serializers/register_jsonapi_renderer_test_isolated.rb +161 -0
  138. data/test/active_model_serializers/serialization_context_test_isolated.rb +71 -0
  139. data/test/active_model_serializers/test/schema_test.rb +131 -0
  140. data/test/active_model_serializers/test/serializer_test.rb +62 -0
  141. data/test/active_record_test.rb +9 -0
  142. data/test/adapter/attributes_test.rb +43 -0
  143. data/test/adapter/deprecation_test.rb +100 -0
  144. data/test/adapter/json/belongs_to_test.rb +45 -0
  145. data/test/adapter/json/collection_test.rb +104 -0
  146. data/test/adapter/json/has_many_test.rb +45 -0
  147. data/test/adapter/json/transform_test.rb +93 -0
  148. data/test/adapter/json_api/belongs_to_test.rb +155 -0
  149. data/test/adapter/json_api/collection_test.rb +96 -0
  150. data/test/adapter/json_api/errors_test.rb +76 -0
  151. data/test/adapter/json_api/fields_test.rb +96 -0
  152. data/test/adapter/json_api/has_many_embed_ids_test.rb +43 -0
  153. data/test/adapter/json_api/has_many_explicit_serializer_test.rb +96 -0
  154. data/test/adapter/json_api/has_many_test.rb +165 -0
  155. data/test/adapter/json_api/has_one_test.rb +80 -0
  156. data/test/adapter/json_api/include_data_if_sideloaded_test.rb +168 -0
  157. data/test/adapter/json_api/json_api_test.rb +33 -0
  158. data/test/adapter/json_api/linked_test.rb +413 -0
  159. data/test/adapter/json_api/links_test.rb +95 -0
  160. data/test/adapter/json_api/pagination_links_test.rb +193 -0
  161. data/test/adapter/json_api/parse_test.rb +137 -0
  162. data/test/adapter/json_api/relationship_test.rb +397 -0
  163. data/test/adapter/json_api/resource_identifier_test.rb +110 -0
  164. data/test/adapter/json_api/resource_meta_test.rb +100 -0
  165. data/test/adapter/json_api/toplevel_jsonapi_test.rb +82 -0
  166. data/test/adapter/json_api/transform_test.rb +512 -0
  167. data/test/adapter/json_api/type_test.rb +61 -0
  168. data/test/adapter/json_test.rb +46 -0
  169. data/test/adapter/null_test.rb +22 -0
  170. data/test/adapter/polymorphic_test.rb +171 -0
  171. data/test/adapter_test.rb +67 -0
  172. data/test/array_serializer_test.rb +22 -0
  173. data/test/benchmark/app.rb +65 -0
  174. data/test/benchmark/benchmarking_support.rb +67 -0
  175. data/test/benchmark/bm_active_record.rb +81 -0
  176. data/test/benchmark/bm_adapter.rb +38 -0
  177. data/test/benchmark/bm_caching.rb +119 -0
  178. data/test/benchmark/bm_lookup_chain.rb +83 -0
  179. data/test/benchmark/bm_transform.rb +45 -0
  180. data/test/benchmark/config.ru +3 -0
  181. data/test/benchmark/controllers.rb +83 -0
  182. data/test/benchmark/fixtures.rb +219 -0
  183. data/test/cache_test.rb +595 -0
  184. data/test/collection_serializer_test.rb +123 -0
  185. data/test/fixtures/active_record.rb +113 -0
  186. data/test/fixtures/poro.rb +232 -0
  187. data/test/generators/scaffold_controller_generator_test.rb +24 -0
  188. data/test/generators/serializer_generator_test.rb +74 -0
  189. data/test/grape_test.rb +178 -0
  190. data/test/lint_test.rb +49 -0
  191. data/test/logger_test.rb +20 -0
  192. data/test/poro_test.rb +9 -0
  193. data/test/serializable_resource_test.rb +79 -0
  194. data/test/serializers/association_macros_test.rb +37 -0
  195. data/test/serializers/associations_test.rb +383 -0
  196. data/test/serializers/attribute_test.rb +153 -0
  197. data/test/serializers/attributes_test.rb +52 -0
  198. data/test/serializers/caching_configuration_test_isolated.rb +170 -0
  199. data/test/serializers/configuration_test.rb +32 -0
  200. data/test/serializers/fieldset_test.rb +14 -0
  201. data/test/serializers/meta_test.rb +202 -0
  202. data/test/serializers/options_test.rb +32 -0
  203. data/test/serializers/read_attribute_for_serialization_test.rb +79 -0
  204. data/test/serializers/root_test.rb +21 -0
  205. data/test/serializers/serialization_test.rb +55 -0
  206. data/test/serializers/serializer_for_test.rb +136 -0
  207. data/test/serializers/serializer_for_with_namespace_test.rb +88 -0
  208. data/test/support/custom_schemas/active_model_serializers/test/schema_test/my/index.json +6 -0
  209. data/test/support/isolated_unit.rb +82 -0
  210. data/test/support/rails5_shims.rb +53 -0
  211. data/test/support/rails_app.rb +36 -0
  212. data/test/support/schemas/active_model_serializers/test/schema_test/my/index.json +6 -0
  213. data/test/support/schemas/active_model_serializers/test/schema_test/my/show.json +6 -0
  214. data/test/support/schemas/custom/show.json +7 -0
  215. data/test/support/schemas/hyper_schema.json +93 -0
  216. data/test/support/schemas/render_using_json_api.json +43 -0
  217. data/test/support/schemas/simple_json_pointers.json +10 -0
  218. data/test/support/serialization_testing.rb +71 -0
  219. data/test/test_helper.rb +58 -0
  220. metadata +602 -0
@@ -0,0 +1,104 @@
1
+ require 'test_helper'
2
+
3
+ module ActiveModelSerializers
4
+ module Adapter
5
+ class Json
6
+ class Collection < ActiveSupport::TestCase
7
+ def setup
8
+ @author = Author.new(id: 1, name: 'Steve K.')
9
+ @first_post = Post.new(id: 1, title: 'Hello!!', body: 'Hello, world!!')
10
+ @second_post = Post.new(id: 2, title: 'New Post', body: 'Body')
11
+ @first_post.comments = []
12
+ @second_post.comments = []
13
+ @first_post.author = @author
14
+ @second_post.author = @author
15
+ @blog = Blog.new(id: 1, name: 'My Blog!!')
16
+ @first_post.blog = @blog
17
+ @second_post.blog = nil
18
+
19
+ ActionController::Base.cache_store.clear
20
+ end
21
+
22
+ def test_with_serializer_option
23
+ @blog.special_attribute = 'Special'
24
+ @blog.articles = [@first_post, @second_post]
25
+ serializer = ActiveModel::Serializer::CollectionSerializer.new([@blog], serializer: CustomBlogSerializer)
26
+ adapter = ActiveModelSerializers::Adapter::Json.new(serializer)
27
+
28
+ expected = { blogs: [{
29
+ id: 1,
30
+ special_attribute: 'Special',
31
+ articles: [{ id: 1, title: 'Hello!!', body: 'Hello, world!!' }, { id: 2, title: 'New Post', body: 'Body' }]
32
+ }] }
33
+ assert_equal expected, adapter.serializable_hash
34
+ end
35
+
36
+ def test_include_multiple_posts
37
+ serializer = ActiveModel::Serializer::CollectionSerializer.new([@first_post, @second_post])
38
+ adapter = ActiveModelSerializers::Adapter::Json.new(serializer)
39
+
40
+ expected = { posts: [{
41
+ title: 'Hello!!',
42
+ body: 'Hello, world!!',
43
+ id: 1,
44
+ comments: [],
45
+ author: {
46
+ id: 1,
47
+ name: 'Steve K.'
48
+ },
49
+ blog: {
50
+ id: 999,
51
+ name: 'Custom blog'
52
+ }
53
+ }, {
54
+ title: 'New Post',
55
+ body: 'Body',
56
+ id: 2,
57
+ comments: [],
58
+ author: {
59
+ id: 1,
60
+ name: 'Steve K.'
61
+ },
62
+ blog: {
63
+ id: 999,
64
+ name: 'Custom blog'
65
+ }
66
+ }] }
67
+ assert_equal expected, adapter.serializable_hash
68
+ end
69
+
70
+ def test_root_is_underscored
71
+ virtual_value = VirtualValue.new(id: 1)
72
+ serializer = ActiveModel::Serializer::CollectionSerializer.new([virtual_value])
73
+ adapter = ActiveModelSerializers::Adapter::Json.new(serializer)
74
+
75
+ assert_equal 1, adapter.serializable_hash[:virtual_values].length
76
+ end
77
+
78
+ def test_include_option
79
+ serializer = ActiveModel::Serializer::CollectionSerializer.new([@first_post, @second_post])
80
+ adapter = ActiveModelSerializers::Adapter::Json.new(serializer, include: '')
81
+ actual = adapter.serializable_hash
82
+ expected = { posts: [{ id: 1, title: 'Hello!!', body: 'Hello, world!!' },
83
+ { id: 2, title: 'New Post', body: 'Body' }] }
84
+
85
+ assert_equal(expected, actual)
86
+ end
87
+
88
+ def test_fields_with_no_associations_include_option
89
+ actual = ActiveModelSerializers::SerializableResource.new(
90
+ [@first_post, @second_post], adapter: :json, fields: [:id], include: []
91
+ ).as_json
92
+
93
+ expected = { posts: [{
94
+ id: 1
95
+ }, {
96
+ id: 2
97
+ }] }
98
+
99
+ assert_equal(expected, actual)
100
+ end
101
+ end
102
+ end
103
+ end
104
+ end
@@ -0,0 +1,45 @@
1
+ require 'test_helper'
2
+
3
+ module ActiveModelSerializers
4
+ module Adapter
5
+ class Json
6
+ class HasManyTestTest < ActiveSupport::TestCase
7
+ def setup
8
+ ActionController::Base.cache_store.clear
9
+ @author = Author.new(id: 1, name: 'Steve K.')
10
+ @post = Post.new(id: 42, title: 'New Post', body: 'Body')
11
+ @first_comment = Comment.new(id: 1, body: 'ZOMG A COMMENT')
12
+ @second_comment = Comment.new(id: 2, body: 'ZOMG ANOTHER COMMENT')
13
+ @post.comments = [@first_comment, @second_comment]
14
+ @post.author = @author
15
+ @first_comment.post = @post
16
+ @second_comment.post = @post
17
+ @blog = Blog.new(id: 1, name: 'My Blog!!')
18
+ @post.blog = @blog
19
+ @tag = Tag.new(id: 1, name: '#hash_tag')
20
+ @post.tags = [@tag]
21
+ end
22
+
23
+ def test_has_many
24
+ serializer = PostSerializer.new(@post)
25
+ adapter = ActiveModelSerializers::Adapter::Json.new(serializer)
26
+ assert_equal([
27
+ { id: 1, body: 'ZOMG A COMMENT' },
28
+ { id: 2, body: 'ZOMG ANOTHER COMMENT' }
29
+ ], adapter.serializable_hash[:post][:comments])
30
+ end
31
+
32
+ def test_has_many_with_no_serializer
33
+ serializer = PostWithTagsSerializer.new(@post)
34
+ adapter = ActiveModelSerializers::Adapter::Json.new(serializer)
35
+ assert_equal({
36
+ id: 42,
37
+ tags: [
38
+ { 'id' => 1, 'name' => '#hash_tag' }
39
+ ]
40
+ }.to_json, adapter.serializable_hash[:post].to_json)
41
+ end
42
+ end
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,93 @@
1
+ require 'test_helper'
2
+
3
+ module ActiveModelSerializers
4
+ module Adapter
5
+ class Json
6
+ class KeyCaseTest < ActiveSupport::TestCase
7
+ def mock_request(key_transform = nil)
8
+ context = Minitest::Mock.new
9
+ context.expect(:request_url, URI)
10
+ context.expect(:query_parameters, {})
11
+ options = {}
12
+ options[:key_transform] = key_transform if key_transform
13
+ options[:serialization_context] = context
14
+ serializer = CustomBlogSerializer.new(@blog)
15
+ @adapter = ActiveModelSerializers::Adapter::Json.new(serializer, options)
16
+ end
17
+
18
+ class Post < ::Model; end
19
+ class PostSerializer < ActiveModel::Serializer
20
+ attributes :id, :title, :body, :publish_at
21
+ end
22
+
23
+ setup do
24
+ ActionController::Base.cache_store.clear
25
+ @blog = Blog.new(id: 1, name: 'My Blog!!', special_attribute: 'neat')
26
+ end
27
+
28
+ def test_transform_default
29
+ mock_request
30
+ assert_equal({
31
+ blog: { id: 1, special_attribute: 'neat', articles: nil }
32
+ }, @adapter.serializable_hash)
33
+ end
34
+
35
+ def test_transform_global_config
36
+ mock_request
37
+ result = with_config(key_transform: :camel_lower) do
38
+ @adapter.serializable_hash
39
+ end
40
+ assert_equal({
41
+ blog: { id: 1, specialAttribute: 'neat', articles: nil }
42
+ }, result)
43
+ end
44
+
45
+ def test_transform_serialization_ctx_overrides_global_config
46
+ mock_request(:camel)
47
+ result = with_config(key_transform: :camel_lower) do
48
+ @adapter.serializable_hash
49
+ end
50
+ assert_equal({
51
+ Blog: { Id: 1, SpecialAttribute: 'neat', Articles: nil }
52
+ }, result)
53
+ end
54
+
55
+ def test_transform_undefined
56
+ mock_request(:blam)
57
+ result = nil
58
+ assert_raises NoMethodError do
59
+ result = @adapter.serializable_hash
60
+ end
61
+ end
62
+
63
+ def test_transform_dash
64
+ mock_request(:dash)
65
+ assert_equal({
66
+ blog: { id: 1, :"special-attribute" => 'neat', articles: nil }
67
+ }, @adapter.serializable_hash)
68
+ end
69
+
70
+ def test_transform_unaltered
71
+ mock_request(:unaltered)
72
+ assert_equal({
73
+ blog: { id: 1, special_attribute: 'neat', articles: nil }
74
+ }, @adapter.serializable_hash)
75
+ end
76
+
77
+ def test_transform_camel
78
+ mock_request(:camel)
79
+ assert_equal({
80
+ Blog: { Id: 1, SpecialAttribute: 'neat', Articles: nil }
81
+ }, @adapter.serializable_hash)
82
+ end
83
+
84
+ def test_transform_camel_lower
85
+ mock_request(:camel_lower)
86
+ assert_equal({
87
+ blog: { id: 1, specialAttribute: 'neat', articles: nil }
88
+ }, @adapter.serializable_hash)
89
+ end
90
+ end
91
+ end
92
+ end
93
+ end
@@ -0,0 +1,155 @@
1
+ require 'test_helper'
2
+
3
+ module ActiveModelSerializers
4
+ module Adapter
5
+ class JsonApi
6
+ class BelongsToTest < ActiveSupport::TestCase
7
+ def setup
8
+ @author = Author.new(id: 1, name: 'Steve K.')
9
+ @author.bio = nil
10
+ @author.roles = []
11
+ @blog = Blog.new(id: 23, name: 'AMS Blog')
12
+ @post = Post.new(id: 42, title: 'New Post', body: 'Body')
13
+ @anonymous_post = Post.new(id: 43, title: 'Hello!!', body: 'Hello, world!!')
14
+ @comment = Comment.new(id: 1, body: 'ZOMG A COMMENT')
15
+ @post.comments = [@comment]
16
+ @post.blog = @blog
17
+ @anonymous_post.comments = []
18
+ @anonymous_post.blog = nil
19
+ @comment.post = @post
20
+ @comment.author = nil
21
+ @post.author = @author
22
+ @anonymous_post.author = nil
23
+ @blog = Blog.new(id: 1, name: 'My Blog!!')
24
+ @blog.writer = @author
25
+ @blog.articles = [@post, @anonymous_post]
26
+ @author.posts = []
27
+
28
+ @serializer = CommentSerializer.new(@comment)
29
+ @adapter = ActiveModelSerializers::Adapter::JsonApi.new(@serializer)
30
+ ActionController::Base.cache_store.clear
31
+ end
32
+
33
+ def test_includes_post_id
34
+ expected = { data: { type: 'posts', id: '42' } }
35
+
36
+ assert_equal(expected, @adapter.serializable_hash[:data][:relationships][:post])
37
+ end
38
+
39
+ def test_includes_linked_post
40
+ @adapter = ActiveModelSerializers::Adapter::JsonApi.new(@serializer, include: [:post])
41
+ expected = [{
42
+ id: '42',
43
+ type: 'posts',
44
+ attributes: {
45
+ title: 'New Post',
46
+ body: 'Body'
47
+ },
48
+ relationships: {
49
+ comments: { data: [{ type: 'comments', id: '1' }] },
50
+ blog: { data: { type: 'blogs', id: '999' } },
51
+ author: { data: { type: 'authors', id: '1' } }
52
+ }
53
+ }]
54
+ assert_equal expected, @adapter.serializable_hash[:included]
55
+ end
56
+
57
+ def test_limiting_linked_post_fields
58
+ @adapter = ActiveModelSerializers::Adapter::JsonApi.new(@serializer, include: [:post], fields: { post: [:title, :comments, :blog, :author] })
59
+ expected = [{
60
+ id: '42',
61
+ type: 'posts',
62
+ attributes: {
63
+ title: 'New Post'
64
+ },
65
+ relationships: {
66
+ comments: { data: [{ type: 'comments', id: '1' }] },
67
+ blog: { data: { type: 'blogs', id: '999' } },
68
+ author: { data: { type: 'authors', id: '1' } }
69
+ }
70
+ }]
71
+ assert_equal expected, @adapter.serializable_hash[:included]
72
+ end
73
+
74
+ def test_include_nil_author
75
+ serializer = PostSerializer.new(@anonymous_post)
76
+ adapter = ActiveModelSerializers::Adapter::JsonApi.new(serializer)
77
+
78
+ assert_equal({ comments: { data: [] }, blog: { data: { type: 'blogs', id: '999' } }, author: { data: nil } }, adapter.serializable_hash[:data][:relationships])
79
+ end
80
+
81
+ def test_include_type_for_association_when_different_than_name
82
+ serializer = BlogSerializer.new(@blog)
83
+ adapter = ActiveModelSerializers::Adapter::JsonApi.new(serializer)
84
+ relationships = adapter.serializable_hash[:data][:relationships]
85
+ expected = {
86
+ writer: {
87
+ data: {
88
+ type: 'authors',
89
+ id: '1'
90
+ }
91
+ },
92
+ articles: {
93
+ data: [
94
+ {
95
+ type: 'posts',
96
+ id: '42'
97
+ },
98
+ {
99
+ type: 'posts',
100
+ id: '43'
101
+ }
102
+ ]
103
+ }
104
+ }
105
+ assert_equal expected, relationships
106
+ end
107
+
108
+ def test_include_linked_resources_with_type_name
109
+ serializer = BlogSerializer.new(@blog)
110
+ adapter = ActiveModelSerializers::Adapter::JsonApi.new(serializer, include: [:writer, :articles])
111
+ linked = adapter.serializable_hash[:included]
112
+ expected = [
113
+ {
114
+ id: '1',
115
+ type: 'authors',
116
+ attributes: {
117
+ name: 'Steve K.'
118
+ },
119
+ relationships: {
120
+ posts: { data: [] },
121
+ roles: { data: [] },
122
+ bio: { data: nil }
123
+ }
124
+ }, {
125
+ id: '42',
126
+ type: 'posts',
127
+ attributes: {
128
+ title: 'New Post',
129
+ body: 'Body'
130
+ },
131
+ relationships: {
132
+ comments: { data: [{ type: 'comments', id: '1' }] },
133
+ blog: { data: { type: 'blogs', id: '999' } },
134
+ author: { data: { type: 'authors', id: '1' } }
135
+ }
136
+ }, {
137
+ id: '43',
138
+ type: 'posts',
139
+ attributes: {
140
+ title: 'Hello!!',
141
+ body: 'Hello, world!!'
142
+ },
143
+ relationships: {
144
+ comments: { data: [] },
145
+ blog: { data: { type: 'blogs', id: '999' } },
146
+ author: { data: nil }
147
+ }
148
+ }
149
+ ]
150
+ assert_equal expected, linked
151
+ end
152
+ end
153
+ end
154
+ end
155
+ end
@@ -0,0 +1,96 @@
1
+ require 'test_helper'
2
+
3
+ module ActiveModelSerializers
4
+ module Adapter
5
+ class JsonApi
6
+ class CollectionTest < ActiveSupport::TestCase
7
+ def setup
8
+ @author = Author.new(id: 1, name: 'Steve K.')
9
+ @author.bio = nil
10
+ @blog = Blog.new(id: 23, name: 'AMS Blog')
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.blog = @blog
16
+ @second_post.blog = nil
17
+ @first_post.author = @author
18
+ @second_post.author = @author
19
+ @author.posts = [@first_post, @second_post]
20
+
21
+ @serializer = ActiveModel::Serializer::CollectionSerializer.new([@first_post, @second_post])
22
+ @adapter = ActiveModelSerializers::Adapter::JsonApi.new(@serializer)
23
+ ActionController::Base.cache_store.clear
24
+ end
25
+
26
+ def test_include_multiple_posts
27
+ expected = [
28
+ {
29
+ id: '1',
30
+ type: 'posts',
31
+ attributes: {
32
+ title: 'Hello!!',
33
+ body: 'Hello, world!!'
34
+ },
35
+ relationships: {
36
+ comments: { data: [] },
37
+ blog: { data: { type: 'blogs', id: '999' } },
38
+ author: { data: { type: 'authors', id: '1' } }
39
+ }
40
+ },
41
+ {
42
+ id: '2',
43
+ type: 'posts',
44
+ attributes: {
45
+ title: 'New Post',
46
+ body: 'Body'
47
+ },
48
+ relationships: {
49
+ comments: { data: [] },
50
+ blog: { data: { type: 'blogs', id: '999' } },
51
+ author: { data: { type: 'authors', id: '1' } }
52
+ }
53
+ }
54
+ ]
55
+
56
+ assert_equal(expected, @adapter.serializable_hash[:data])
57
+ end
58
+
59
+ def test_limiting_fields
60
+ actual = ActiveModelSerializers::SerializableResource.new(
61
+ [@first_post, @second_post],
62
+ adapter: :json_api,
63
+ fields: { posts: %w(title comments blog author) }
64
+ ).serializable_hash
65
+ expected = [
66
+ {
67
+ id: '1',
68
+ type: 'posts',
69
+ attributes: {
70
+ title: 'Hello!!'
71
+ },
72
+ relationships: {
73
+ comments: { data: [] },
74
+ blog: { data: { type: 'blogs', id: '999' } },
75
+ author: { data: { type: 'authors', id: '1' } }
76
+ }
77
+ },
78
+ {
79
+ id: '2',
80
+ type: 'posts',
81
+ attributes: {
82
+ title: 'New Post'
83
+ },
84
+ relationships: {
85
+ comments: { data: [] },
86
+ blog: { data: { type: 'blogs', id: '999' } },
87
+ author: { data: { type: 'authors', id: '1' } }
88
+ }
89
+ }
90
+ ]
91
+ assert_equal(expected, actual[:data])
92
+ end
93
+ end
94
+ end
95
+ end
96
+ end