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,7 +0,0 @@
1
- module ActiveModel
2
- class Serializer
3
- # @api private
4
- class SingularReflection < Reflection
5
- end
6
- end
7
- end
@@ -1,25 +0,0 @@
1
- module ActiveModel
2
- class Serializer
3
- module Type
4
- extend ActiveSupport::Concern
5
-
6
- included do
7
- with_options instance_writer: false, instance_reader: true do |serializer|
8
- serializer.class_attribute :_type # @api private
9
- end
10
-
11
- extend ActiveSupport::Autoload
12
- end
13
-
14
- module ClassMethods
15
- # Set the JSON API type of a serializer.
16
- # @example
17
- # class AdminAuthorSerializer < ActiveModel::Serializer
18
- # type 'authors'
19
- def type(type)
20
- self._type = type && type.to_s
21
- end
22
- end
23
- end
24
- end
25
- end
@@ -1,70 +0,0 @@
1
- require 'active_support/core_ext/hash/keys'
2
-
3
- module ActiveModelSerializers
4
- module KeyTransform
5
- module_function
6
-
7
- # Transforms values to UpperCamelCase or PascalCase.
8
- #
9
- # @example:
10
- # "some_key" => "SomeKey",
11
- # @see {https://github.com/rails/rails/blob/master/activesupport/lib/active_support/inflector/methods.rb#L66-L76 ActiveSupport::Inflector.camelize}
12
- def camel(value)
13
- case value
14
- when Hash then value.deep_transform_keys! { |key| camel(key) }
15
- when Symbol then camel(value.to_s).to_sym
16
- when String then value.underscore.camelize
17
- else value
18
- end
19
- end
20
-
21
- # Transforms values to camelCase.
22
- #
23
- # @example:
24
- # "some_key" => "someKey",
25
- # @see {https://github.com/rails/rails/blob/master/activesupport/lib/active_support/inflector/methods.rb#L66-L76 ActiveSupport::Inflector.camelize}
26
- def camel_lower(value)
27
- case value
28
- when Hash then value.deep_transform_keys! { |key| camel_lower(key) }
29
- when Symbol then camel_lower(value.to_s).to_sym
30
- when String then value.underscore.camelize(:lower)
31
- else value
32
- end
33
- end
34
-
35
- # Transforms values to dashed-case.
36
- # This is the default case for the JsonApi adapter.
37
- #
38
- # @example:
39
- # "some_key" => "some-key",
40
- # @see {https://github.com/rails/rails/blob/master/activesupport/lib/active_support/inflector/methods.rb#L185-L187 ActiveSupport::Inflector.dasherize}
41
- def dash(value)
42
- case value
43
- when Hash then value.deep_transform_keys! { |key| dash(key) }
44
- when Symbol then dash(value.to_s).to_sym
45
- when String then value.underscore.dasherize
46
- else value
47
- end
48
- end
49
-
50
- # Transforms values to underscore_case.
51
- # This is the default case for deserialization in the JsonApi adapter.
52
- #
53
- # @example:
54
- # "some-key" => "some_key",
55
- # @see {https://github.com/rails/rails/blob/master/activesupport/lib/active_support/inflector/methods.rb#L89-L98 ActiveSupport::Inflector.underscore}
56
- def underscore(value)
57
- case value
58
- when Hash then value.deep_transform_keys! { |key| underscore(key) }
59
- when Symbol then underscore(value.to_s).to_sym
60
- when String then value.underscore
61
- else value
62
- end
63
- end
64
-
65
- # Returns the value unaltered
66
- def unaltered(value)
67
- value
68
- end
69
- end
70
- end
@@ -1,53 +0,0 @@
1
- require 'test_helper'
2
-
3
- module ActionController
4
- module Serialization
5
- class AdapterSelectorTest < ActionController::TestCase
6
- class AdapterSelectorTestController < ActionController::Base
7
- def render_using_default_adapter
8
- @profile = Profile.new({ name: 'Name 1', description: 'Description 1', comments: 'Comments 1' })
9
- render json: @profile
10
- end
11
-
12
- def render_using_adapter_override
13
- @profile = Profile.new({ name: 'Name 1', description: 'Description 1', comments: 'Comments 1' })
14
- render json: @profile, adapter: :json_api
15
- end
16
-
17
- def render_skipping_adapter
18
- @profile = Profile.new({ name: 'Name 1', description: 'Description 1', comments: 'Comments 1' })
19
- render json: @profile, adapter: false
20
- end
21
- end
22
-
23
- tests AdapterSelectorTestController
24
-
25
- def test_render_using_default_adapter
26
- get :render_using_default_adapter
27
- assert_equal '{"name":"Name 1","description":"Description 1"}', response.body
28
- end
29
-
30
- def test_render_using_adapter_override
31
- get :render_using_adapter_override
32
-
33
- expected = {
34
- data: {
35
- id: assigns(:profile).id.to_s,
36
- type: 'profiles',
37
- attributes: {
38
- name: 'Name 1',
39
- description: 'Description 1'
40
- }
41
- }
42
- }
43
-
44
- assert_equal expected.to_json, response.body
45
- end
46
-
47
- def test_render_skipping_adapter
48
- get :render_skipping_adapter
49
- assert_equal '{"name":"Name 1","description":"Description 1","comments":"Comments 1"}', response.body
50
- end
51
- end
52
- end
53
- end
@@ -1,134 +0,0 @@
1
- require 'test_helper'
2
-
3
- module ActionController
4
- module Serialization
5
- class ExplicitSerializerTest < ActionController::TestCase
6
- class ExplicitSerializerTestController < ActionController::Base
7
- def render_using_explicit_serializer
8
- @profile = Profile.new(name: 'Name 1',
9
- description: 'Description 1',
10
- comments: 'Comments 1')
11
- render json: @profile, serializer: ProfilePreviewSerializer
12
- end
13
-
14
- def render_array_using_explicit_serializer
15
- array = [
16
- Profile.new(name: 'Name 1',
17
- description: 'Description 1',
18
- comments: 'Comments 1'),
19
- Profile.new(name: 'Name 2',
20
- description: 'Description 2',
21
- comments: 'Comments 2')
22
- ]
23
- render json: array,
24
- serializer: PaginatedSerializer,
25
- each_serializer: ProfilePreviewSerializer
26
- end
27
-
28
- def render_array_using_implicit_serializer
29
- array = [
30
- Profile.new(name: 'Name 1',
31
- description: 'Description 1',
32
- comments: 'Comments 1'),
33
- Profile.new(name: 'Name 2',
34
- description: 'Description 2',
35
- comments: 'Comments 2')
36
- ]
37
- render json: array,
38
- each_serializer: ProfilePreviewSerializer
39
- end
40
-
41
- def render_array_using_explicit_serializer_and_custom_serializers
42
- @post = Post.new(title: 'New Post', body: 'Body')
43
- @author = Author.new(name: 'Jane Blogger')
44
- @author.posts = [@post]
45
- @post.author = @author
46
- @first_comment = Comment.new(id: 1, body: 'ZOMG A COMMENT')
47
- @second_comment = Comment.new(id: 2, body: 'ZOMG ANOTHER COMMENT')
48
- @post.comments = [@first_comment, @second_comment]
49
- @first_comment.post = @post
50
- @first_comment.author = nil
51
- @second_comment.post = @post
52
- @second_comment.author = nil
53
- @blog = Blog.new(id: 23, name: 'AMS Blog')
54
- @post.blog = @blog
55
-
56
- render json: [@post], each_serializer: PostPreviewSerializer
57
- end
58
-
59
- def render_using_explicit_each_serializer
60
- location = Location.new(id: 42, lat: '-23.550520', lng: '-46.633309')
61
- place = Place.new(id: 1337, name: 'Amazing Place', locations: [location])
62
-
63
- render json: place, each_serializer: PlaceSerializer
64
- end
65
- end
66
-
67
- tests ExplicitSerializerTestController
68
-
69
- def test_render_using_explicit_serializer
70
- get :render_using_explicit_serializer
71
-
72
- assert_equal 'application/json', @response.content_type
73
- assert_equal '{"name":"Name 1"}', @response.body
74
- end
75
-
76
- def test_render_array_using_explicit_serializer
77
- get :render_array_using_explicit_serializer
78
- assert_equal 'application/json', @response.content_type
79
-
80
- expected = [
81
- { 'name' => 'Name 1' },
82
- { 'name' => 'Name 2' }
83
- ]
84
-
85
- assert_equal expected.to_json, @response.body
86
- end
87
-
88
- def test_render_array_using_implicit_serializer
89
- get :render_array_using_implicit_serializer
90
- assert_equal 'application/json', @response.content_type
91
-
92
- expected = [
93
- { 'name' => 'Name 1' },
94
- { 'name' => 'Name 2' }
95
- ]
96
- assert_equal expected.to_json, @response.body
97
- end
98
-
99
- def test_render_array_using_explicit_serializer_and_custom_serializers
100
- get :render_array_using_explicit_serializer_and_custom_serializers
101
-
102
- expected = [
103
- { 'title' => 'New Post',
104
- 'body' => 'Body',
105
- 'id' => assigns(:post).id,
106
- 'comments' => [{ 'id' => 1 }, { 'id' => 2 }],
107
- 'author' => { 'id' => assigns(:author).id }
108
- }
109
- ]
110
-
111
- assert_equal expected.to_json, @response.body
112
- end
113
-
114
- def test_render_using_explicit_each_serializer
115
- get :render_using_explicit_each_serializer
116
-
117
- expected = {
118
- id: 1337,
119
- name: 'Amazing Place',
120
- locations: [
121
- {
122
- id: 42,
123
- lat: '-23.550520',
124
- lng: '-46.633309',
125
- place: 'Nowhere' # is a virtual attribute on LocationSerializer
126
- }
127
- ]
128
- }
129
-
130
- assert_equal expected.to_json, response.body
131
- end
132
- end
133
- end
134
- end
@@ -1,167 +0,0 @@
1
- require 'test_helper'
2
-
3
- module ActionController
4
- module Serialization
5
- class Json
6
- class IncludeTest < ActionController::TestCase
7
- class IncludeTestController < ActionController::Base
8
- def setup_data
9
- ActionController::Base.cache_store.clear
10
-
11
- @author = Author.new(id: 1, name: 'Steve K.')
12
-
13
- @post = Post.new(id: 42, title: 'New Post', body: 'Body')
14
- @first_comment = Comment.new(id: 1, body: 'ZOMG A COMMENT')
15
- @second_comment = Comment.new(id: 2, body: 'ZOMG ANOTHER COMMENT')
16
-
17
- @post.comments = [@first_comment, @second_comment]
18
- @post.author = @author
19
-
20
- @first_comment.post = @post
21
- @second_comment.post = @post
22
-
23
- @blog = Blog.new(id: 1, name: 'My Blog!!')
24
- @post.blog = @blog
25
- @author.posts = [@post]
26
-
27
- @first_comment.author = @author
28
- @second_comment.author = @author
29
- @author.comments = [@first_comment, @second_comment]
30
- @author.roles = []
31
- @author.bio = {}
32
- end
33
-
34
- def render_without_include
35
- setup_data
36
- render json: @author, adapter: :json
37
- end
38
-
39
- def render_resource_with_include_hash
40
- setup_data
41
- render json: @author, include: { posts: :comments }, adapter: :json
42
- end
43
-
44
- def render_resource_with_include_string
45
- setup_data
46
- render json: @author, include: 'posts.comments', adapter: :json
47
- end
48
-
49
- def render_resource_with_deep_include
50
- setup_data
51
- render json: @author, include: 'posts.comments.author', adapter: :json
52
- end
53
- end
54
-
55
- tests IncludeTestController
56
-
57
- def test_render_without_include
58
- get :render_without_include
59
- response = JSON.parse(@response.body)
60
- expected = {
61
- 'author' => {
62
- 'id' => 1,
63
- 'name' => 'Steve K.',
64
- 'posts' => [
65
- {
66
- 'id' => 42, 'title' => 'New Post', 'body' => 'Body'
67
- }
68
- ],
69
- 'roles' => [],
70
- 'bio' => {}
71
- }
72
- }
73
-
74
- assert_equal(expected, response)
75
- end
76
-
77
- def test_render_resource_with_include_hash
78
- get :render_resource_with_include_hash
79
- response = JSON.parse(@response.body)
80
- expected = {
81
- 'author' => {
82
- 'id' => 1,
83
- 'name' => 'Steve K.',
84
- 'posts' => [
85
- {
86
- 'id' => 42, 'title' => 'New Post', 'body' => 'Body',
87
- 'comments' => [
88
- {
89
- 'id' => 1, 'body' => 'ZOMG A COMMENT'
90
- },
91
- {
92
- 'id' => 2, 'body' => 'ZOMG ANOTHER COMMENT'
93
- }
94
- ]
95
- }
96
- ]
97
- }
98
- }
99
-
100
- assert_equal(expected, response)
101
- end
102
-
103
- def test_render_resource_with_include_string
104
- get :render_resource_with_include_string
105
-
106
- response = JSON.parse(@response.body)
107
- expected = {
108
- 'author' => {
109
- 'id' => 1,
110
- 'name' => 'Steve K.',
111
- 'posts' => [
112
- {
113
- 'id' => 42, 'title' => 'New Post', 'body' => 'Body',
114
- 'comments' => [
115
- {
116
- 'id' => 1, 'body' => 'ZOMG A COMMENT'
117
- },
118
- {
119
- 'id' => 2, 'body' => 'ZOMG ANOTHER COMMENT'
120
- }
121
- ]
122
- }
123
- ]
124
- }
125
- }
126
-
127
- assert_equal(expected, response)
128
- end
129
-
130
- def test_render_resource_with_deep_include
131
- get :render_resource_with_deep_include
132
-
133
- response = JSON.parse(@response.body)
134
- expected = {
135
- 'author' => {
136
- 'id' => 1,
137
- 'name' => 'Steve K.',
138
- 'posts' => [
139
- {
140
- 'id' => 42, 'title' => 'New Post', 'body' => 'Body',
141
- 'comments' => [
142
- {
143
- 'id' => 1, 'body' => 'ZOMG A COMMENT',
144
- 'author' => {
145
- 'id' => 1,
146
- 'name' => 'Steve K.'
147
- }
148
- },
149
- {
150
- 'id' => 2, 'body' => 'ZOMG ANOTHER COMMENT',
151
- 'author' => {
152
- 'id' => 1,
153
- 'name' => 'Steve K.'
154
- }
155
- }
156
- ]
157
- }
158
- ]
159
- }
160
- }
161
-
162
- assert_equal(expected, response)
163
- end
164
- end
165
- end
166
- end
167
- end
@@ -1,112 +0,0 @@
1
- require 'test_helper'
2
-
3
- module ActionController
4
- module Serialization
5
- class JsonApi
6
- class DeserializationTest < ActionController::TestCase
7
- class DeserializationTestController < ActionController::Base
8
- def render_parsed_payload
9
- parsed_hash = ActiveModelSerializers::Deserialization.jsonapi_parse(params)
10
- render json: parsed_hash
11
- end
12
-
13
- def render_polymorphic_parsed_payload
14
- parsed_hash = ActiveModelSerializers::Deserialization.jsonapi_parse(
15
- params,
16
- polymorphic: [:restriction_for, :restricted_to]
17
- )
18
- render json: parsed_hash
19
- end
20
- end
21
-
22
- tests DeserializationTestController
23
-
24
- def test_deserialization_of_relationship_only_object
25
- hash = {
26
- 'data' => {
27
- 'type' => 'restraints',
28
- 'relationships' => {
29
- 'restriction_for' => {
30
- 'data' => {
31
- 'type' => 'discounts',
32
- 'id' => '67'
33
- }
34
- },
35
- 'restricted_to' => {
36
- 'data' => nil
37
- }
38
- }
39
- },
40
- 'restraint' => {}
41
- }
42
-
43
- post :render_polymorphic_parsed_payload, params: hash
44
-
45
- response = JSON.parse(@response.body)
46
- expected = {
47
- 'restriction_for_id' => '67',
48
- 'restriction_for_type' => 'discounts',
49
- 'restricted_to_id' => nil,
50
- 'restricted_to_type' => nil
51
- }
52
-
53
- assert_equal(expected, response)
54
- end
55
-
56
- def test_deserialization
57
- hash = {
58
- 'data' => {
59
- 'type' => 'photos',
60
- 'id' => 'zorglub',
61
- 'attributes' => {
62
- 'title' => 'Ember Hamster',
63
- 'src' => 'http://example.com/images/productivity.png',
64
- 'image-width' => '200',
65
- 'imageHeight' => '200',
66
- 'ImageSize' => '1024'
67
- },
68
- 'relationships' => {
69
- 'author' => {
70
- 'data' => nil
71
- },
72
- 'photographer' => {
73
- 'data' => { 'type' => 'people', 'id' => '9' }
74
- },
75
- 'comments' => {
76
- 'data' => [
77
- { 'type' => 'comments', 'id' => '1' },
78
- { 'type' => 'comments', 'id' => '2' }
79
- ]
80
- },
81
- 'related-images' => {
82
- 'data' => [
83
- { 'type' => 'image', 'id' => '7' },
84
- { 'type' => 'image', 'id' => '8' }
85
- ]
86
- }
87
- }
88
- }
89
- }
90
-
91
- post :render_parsed_payload, params: hash
92
-
93
- response = JSON.parse(@response.body)
94
- expected = {
95
- 'id' => 'zorglub',
96
- 'title' => 'Ember Hamster',
97
- 'src' => 'http://example.com/images/productivity.png',
98
- 'image_width' => '200',
99
- 'image_height' => '200',
100
- 'image_size' => '1024',
101
- 'author_id' => nil,
102
- 'photographer_id' => '9',
103
- 'comment_ids' => %w(1 2),
104
- 'related_image_ids' => %w(7 8)
105
- }
106
-
107
- assert_equal(expected, response)
108
- end
109
- end
110
- end
111
- end
112
- end
@@ -1,41 +0,0 @@
1
- require 'test_helper'
2
-
3
- module ActionController
4
- module Serialization
5
- class JsonApi
6
- class ErrorsTest < ActionController::TestCase
7
- def test_active_model_with_multiple_errors
8
- get :render_resource_with_errors
9
-
10
- expected_errors_object =
11
- { :errors =>
12
- [
13
- { :source => { :pointer => '/data/attributes/name' }, :detail => 'cannot be nil' },
14
- { :source => { :pointer => '/data/attributes/name' }, :detail => 'must be longer' },
15
- { :source => { :pointer => '/data/attributes/id' }, :detail => 'must be a uuid' }
16
- ]
17
- }.to_json
18
- assert_equal json_reponse_body.to_json, expected_errors_object
19
- end
20
-
21
- def json_reponse_body
22
- JSON.load(@response.body)
23
- end
24
-
25
- class ErrorsTestController < ActionController::Base
26
- def render_resource_with_errors
27
- resource = Profile.new(name: 'Name 1',
28
- description: 'Description 1',
29
- comments: 'Comments 1')
30
- resource.errors.add(:name, 'cannot be nil')
31
- resource.errors.add(:name, 'must be longer')
32
- resource.errors.add(:id, 'must be a uuid')
33
- render json: resource, adapter: :json_api, serializer: ActiveModel::Serializer::ErrorSerializer
34
- end
35
- end
36
-
37
- tests ErrorsTestController
38
- end
39
- end
40
- end
41
- end