active_model_serializers 0.10.9 → 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 (161) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +41 -2
  3. data/README.md +18 -19
  4. data/lib/action_controller/serialization.rb +9 -1
  5. data/lib/active_model/serializer/collection_serializer.rb +11 -2
  6. data/lib/active_model/serializer/concerns/caching.rb +2 -1
  7. data/lib/active_model/serializer/fieldset.rb +1 -1
  8. data/lib/active_model/serializer/reflection.rb +4 -4
  9. data/lib/active_model/serializer/version.rb +1 -1
  10. data/lib/active_model/serializer.rb +13 -4
  11. data/lib/active_model_serializers/adapter/attributes.rb +21 -0
  12. data/lib/active_model_serializers/adapter/json_api/pagination_links.rb +5 -1
  13. data/lib/active_model_serializers/adapter/json_api/resource_identifier.rb +1 -1
  14. data/lib/active_model_serializers/model/caching.rb +26 -0
  15. metadata +20 -292
  16. data/.github/ISSUE_TEMPLATE.md +0 -29
  17. data/.github/PULL_REQUEST_TEMPLATE.md +0 -15
  18. data/.gitignore +0 -35
  19. data/.rubocop.yml +0 -109
  20. data/.simplecov +0 -110
  21. data/.travis.yml +0 -63
  22. data/CODE_OF_CONDUCT.md +0 -74
  23. data/CONTRIBUTING.md +0 -105
  24. data/Gemfile +0 -74
  25. data/Rakefile +0 -76
  26. data/active_model_serializers.gemspec +0 -64
  27. data/appveyor.yml +0 -28
  28. data/bin/bench +0 -171
  29. data/bin/bench_regression +0 -316
  30. data/bin/rubocop +0 -38
  31. data/bin/serve_benchmark +0 -39
  32. data/docs/README.md +0 -41
  33. data/docs/STYLE.md +0 -58
  34. data/docs/general/adapters.md +0 -269
  35. data/docs/general/caching.md +0 -58
  36. data/docs/general/configuration_options.md +0 -185
  37. data/docs/general/deserialization.md +0 -100
  38. data/docs/general/fields.md +0 -31
  39. data/docs/general/getting_started.md +0 -133
  40. data/docs/general/instrumentation.md +0 -40
  41. data/docs/general/key_transforms.md +0 -40
  42. data/docs/general/logging.md +0 -21
  43. data/docs/general/rendering.md +0 -293
  44. data/docs/general/serializers.md +0 -495
  45. data/docs/how-open-source-maintained.jpg +0 -0
  46. data/docs/howto/add_pagination_links.md +0 -138
  47. data/docs/howto/add_relationship_links.md +0 -140
  48. data/docs/howto/add_root_key.md +0 -62
  49. data/docs/howto/grape_integration.md +0 -42
  50. data/docs/howto/outside_controller_use.md +0 -66
  51. data/docs/howto/passing_arbitrary_options.md +0 -27
  52. data/docs/howto/serialize_poro.md +0 -73
  53. data/docs/howto/test.md +0 -154
  54. data/docs/howto/upgrade_from_0_8_to_0_10.md +0 -265
  55. data/docs/integrations/ember-and-json-api.md +0 -147
  56. data/docs/integrations/grape.md +0 -19
  57. data/docs/jsonapi/errors.md +0 -56
  58. data/docs/jsonapi/schema/schema.json +0 -366
  59. data/docs/jsonapi/schema.md +0 -151
  60. data/docs/rfcs/0000-namespace.md +0 -106
  61. data/docs/rfcs/template.md +0 -15
  62. data/test/action_controller/adapter_selector_test.rb +0 -64
  63. data/test/action_controller/explicit_serializer_test.rb +0 -137
  64. data/test/action_controller/json/include_test.rb +0 -248
  65. data/test/action_controller/json_api/deserialization_test.rb +0 -114
  66. data/test/action_controller/json_api/errors_test.rb +0 -42
  67. data/test/action_controller/json_api/fields_test.rb +0 -68
  68. data/test/action_controller/json_api/linked_test.rb +0 -204
  69. data/test/action_controller/json_api/pagination_test.rb +0 -126
  70. data/test/action_controller/json_api/transform_test.rb +0 -191
  71. data/test/action_controller/lookup_proc_test.rb +0 -51
  72. data/test/action_controller/namespace_lookup_test.rb +0 -234
  73. data/test/action_controller/serialization_scope_name_test.rb +0 -237
  74. data/test/action_controller/serialization_test.rb +0 -480
  75. data/test/active_model_serializers/adapter_for_test.rb +0 -210
  76. data/test/active_model_serializers/json_pointer_test.rb +0 -24
  77. data/test/active_model_serializers/logging_test.rb +0 -79
  78. data/test/active_model_serializers/model_test.rb +0 -144
  79. data/test/active_model_serializers/railtie_test_isolated.rb +0 -70
  80. data/test/active_model_serializers/register_jsonapi_renderer_test_isolated.rb +0 -163
  81. data/test/active_model_serializers/serialization_context_test_isolated.rb +0 -73
  82. data/test/active_model_serializers/test/schema_test.rb +0 -133
  83. data/test/active_model_serializers/test/serializer_test.rb +0 -64
  84. data/test/active_record_test.rb +0 -11
  85. data/test/adapter/attributes_test.rb +0 -42
  86. data/test/adapter/deprecation_test.rb +0 -102
  87. data/test/adapter/json/belongs_to_test.rb +0 -47
  88. data/test/adapter/json/collection_test.rb +0 -106
  89. data/test/adapter/json/has_many_test.rb +0 -55
  90. data/test/adapter/json/transform_test.rb +0 -95
  91. data/test/adapter/json_api/belongs_to_test.rb +0 -157
  92. data/test/adapter/json_api/collection_test.rb +0 -98
  93. data/test/adapter/json_api/errors_test.rb +0 -78
  94. data/test/adapter/json_api/fields_test.rb +0 -98
  95. data/test/adapter/json_api/has_many_explicit_serializer_test.rb +0 -98
  96. data/test/adapter/json_api/has_many_test.rb +0 -175
  97. data/test/adapter/json_api/has_one_test.rb +0 -82
  98. data/test/adapter/json_api/include_data_if_sideloaded_test.rb +0 -215
  99. data/test/adapter/json_api/json_api_test.rb +0 -35
  100. data/test/adapter/json_api/linked_test.rb +0 -415
  101. data/test/adapter/json_api/links_test.rb +0 -112
  102. data/test/adapter/json_api/pagination_links_test.rb +0 -208
  103. data/test/adapter/json_api/parse_test.rb +0 -139
  104. data/test/adapter/json_api/relationship_test.rb +0 -399
  105. data/test/adapter/json_api/resource_meta_test.rb +0 -102
  106. data/test/adapter/json_api/toplevel_jsonapi_test.rb +0 -84
  107. data/test/adapter/json_api/transform_test.rb +0 -514
  108. data/test/adapter/json_api/type_test.rb +0 -195
  109. data/test/adapter/json_test.rb +0 -48
  110. data/test/adapter/null_test.rb +0 -24
  111. data/test/adapter/polymorphic_test.rb +0 -220
  112. data/test/adapter_test.rb +0 -69
  113. data/test/array_serializer_test.rb +0 -24
  114. data/test/benchmark/app.rb +0 -67
  115. data/test/benchmark/benchmarking_support.rb +0 -69
  116. data/test/benchmark/bm_active_record.rb +0 -83
  117. data/test/benchmark/bm_adapter.rb +0 -40
  118. data/test/benchmark/bm_caching.rb +0 -121
  119. data/test/benchmark/bm_lookup_chain.rb +0 -85
  120. data/test/benchmark/bm_transform.rb +0 -47
  121. data/test/benchmark/config.ru +0 -3
  122. data/test/benchmark/controllers.rb +0 -85
  123. data/test/benchmark/fixtures.rb +0 -221
  124. data/test/cache_test.rb +0 -717
  125. data/test/collection_serializer_test.rb +0 -129
  126. data/test/fixtures/active_record.rb +0 -115
  127. data/test/fixtures/poro.rb +0 -227
  128. data/test/generators/scaffold_controller_generator_test.rb +0 -26
  129. data/test/generators/serializer_generator_test.rb +0 -77
  130. data/test/grape_test.rb +0 -198
  131. data/test/lint_test.rb +0 -51
  132. data/test/logger_test.rb +0 -22
  133. data/test/poro_test.rb +0 -11
  134. data/test/serializable_resource_test.rb +0 -81
  135. data/test/serializers/association_macros_test.rb +0 -39
  136. data/test/serializers/associations_test.rb +0 -520
  137. data/test/serializers/attribute_test.rb +0 -155
  138. data/test/serializers/attributes_test.rb +0 -54
  139. data/test/serializers/caching_configuration_test_isolated.rb +0 -172
  140. data/test/serializers/configuration_test.rb +0 -34
  141. data/test/serializers/fieldset_test.rb +0 -16
  142. data/test/serializers/meta_test.rb +0 -204
  143. data/test/serializers/options_test.rb +0 -34
  144. data/test/serializers/read_attribute_for_serialization_test.rb +0 -81
  145. data/test/serializers/reflection_test.rb +0 -481
  146. data/test/serializers/root_test.rb +0 -23
  147. data/test/serializers/serialization_test.rb +0 -57
  148. data/test/serializers/serializer_for_test.rb +0 -138
  149. data/test/serializers/serializer_for_with_namespace_test.rb +0 -90
  150. data/test/support/custom_schemas/active_model_serializers/test/schema_test/my/index.json +0 -6
  151. data/test/support/isolated_unit.rb +0 -86
  152. data/test/support/rails5_shims.rb +0 -55
  153. data/test/support/rails_app.rb +0 -40
  154. data/test/support/schemas/active_model_serializers/test/schema_test/my/index.json +0 -6
  155. data/test/support/schemas/active_model_serializers/test/schema_test/my/show.json +0 -6
  156. data/test/support/schemas/custom/show.json +0 -7
  157. data/test/support/schemas/hyper_schema.json +0 -93
  158. data/test/support/schemas/render_using_json_api.json +0 -43
  159. data/test/support/schemas/simple_json_pointers.json +0 -10
  160. data/test/support/serialization_testing.rb +0 -81
  161. data/test/test_helper.rb +0 -72
@@ -1,204 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'test_helper'
4
-
5
- module ActionController
6
- module Serialization
7
- class JsonApi
8
- class LinkedTest < ActionDispatch::IntegrationTest
9
- class LinkedTestController < ActionController::Base
10
- def setup_post
11
- ActionController::Base.cache_store.clear
12
- @role1 = Role.new(id: 1, name: 'admin')
13
- @role2 = Role.new(id: 2, name: 'colab')
14
- @author = Author.new(id: 1, name: 'Steve K.')
15
- @author.posts = []
16
- @author.bio = nil
17
- @author.roles = [@role1, @role2]
18
- @role1.author = @author
19
- @role2.author = @author
20
- @author2 = Author.new(id: 2, name: 'Anonymous')
21
- @author2.posts = []
22
- @author2.bio = nil
23
- @author2.roles = []
24
- @post = Post.new(id: 1, title: 'New Post', body: 'Body')
25
- @first_comment = Comment.new(id: 1, body: 'ZOMG A COMMENT')
26
- @second_comment = Comment.new(id: 2, body: 'ZOMG ANOTHER COMMENT')
27
- @post.comments = [@first_comment, @second_comment]
28
- @post.author = @author
29
- @first_comment.post = @post
30
- @first_comment.author = @author2
31
- @second_comment.post = @post
32
- @second_comment.author = nil
33
- @post2 = Post.new(id: 2, title: 'Another Post', body: 'Body')
34
- @post2.author = @author
35
- @post2.comments = []
36
- @blog = Blog.new(id: 1, name: 'My Blog!!')
37
- @post.blog = @blog
38
- @post2.blog = @blog
39
- end
40
-
41
- def render_resource_without_include
42
- setup_post
43
- render json: @post
44
- end
45
-
46
- def render_resource_with_include
47
- setup_post
48
- render json: @post, adapter: :json_api, include: [:author]
49
- end
50
-
51
- def render_resource_with_include_of_custom_key_by_original
52
- setup_post
53
- render json: @post, adapter: :json_api, include: [:reviews], serializer: PostWithCustomKeysSerializer
54
- end
55
-
56
- def render_resource_with_nested_include
57
- setup_post
58
- render json: @post, adapter: :json_api, include: [comments: [:author]]
59
- end
60
-
61
- def render_resource_with_nested_has_many_include_wildcard
62
- setup_post
63
- render json: @post, adapter: :json_api, include: 'author.*'
64
- end
65
-
66
- def render_resource_with_missing_nested_has_many_include
67
- setup_post
68
- @post.author = @author2 # author2 has no roles.
69
- render json: @post, adapter: :json_api, include: [author: [:roles]]
70
- end
71
-
72
- def render_collection_with_missing_nested_has_many_include
73
- setup_post
74
- @post.author = @author2
75
- render json: [@post, @post2], adapter: :json_api, include: [author: [:roles]]
76
- end
77
-
78
- def render_collection_without_include
79
- setup_post
80
- render json: [@post], adapter: :json_api
81
- end
82
-
83
- def render_collection_with_include
84
- setup_post
85
- render json: [@post], adapter: :json_api, include: 'author, comments'
86
- end
87
- end
88
-
89
- setup do
90
- @routes = Rails.application.routes.draw do
91
- ActiveSupport::Deprecation.silence do
92
- match ':action', to: LinkedTestController, via: [:get, :post]
93
- end
94
- end
95
- end
96
-
97
- def test_render_resource_without_include
98
- get '/render_resource_without_include'
99
- response = JSON.parse(@response.body)
100
- refute response.key? 'included'
101
- end
102
-
103
- def test_render_resource_with_include
104
- get '/render_resource_with_include'
105
- response = JSON.parse(@response.body)
106
- assert response.key? 'included'
107
- assert_equal 1, response['included'].size
108
- assert_equal 'Steve K.', response['included'].first['attributes']['name']
109
- end
110
-
111
- def test_render_resource_with_nested_has_many_include
112
- get '/render_resource_with_nested_has_many_include_wildcard'
113
- response = JSON.parse(@response.body)
114
- expected_linked = [
115
- {
116
- 'id' => '1',
117
- 'type' => 'authors',
118
- 'attributes' => {
119
- 'name' => 'Steve K.'
120
- },
121
- 'relationships' => {
122
- 'posts' => { 'data' => [] },
123
- 'roles' => { 'data' => [{ 'type' => 'roles', 'id' => '1' }, { 'type' => 'roles', 'id' => '2' }] },
124
- 'bio' => { 'data' => nil }
125
- }
126
- }, {
127
- 'id' => '1',
128
- 'type' => 'roles',
129
- 'attributes' => {
130
- 'name' => 'admin',
131
- 'description' => nil,
132
- 'slug' => 'admin-1'
133
- },
134
- 'relationships' => {
135
- 'author' => { 'data' => { 'type' => 'authors', 'id' => '1' } }
136
- }
137
- }, {
138
- 'id' => '2',
139
- 'type' => 'roles',
140
- 'attributes' => {
141
- 'name' => 'colab',
142
- 'description' => nil,
143
- 'slug' => 'colab-2'
144
- },
145
- 'relationships' => {
146
- 'author' => { 'data' => { 'type' => 'authors', 'id' => '1' } }
147
- }
148
- }
149
- ]
150
- assert_equal expected_linked, response['included']
151
- end
152
-
153
- def test_render_resource_with_include_of_custom_key_by_original
154
- get '/render_resource_with_include_of_custom_key_by_original'
155
- response = JSON.parse(@response.body)
156
- assert response.key? 'included'
157
-
158
- relationships = response['data']['relationships']
159
-
160
- assert_includes relationships, 'reviews'
161
- assert_includes relationships, 'writer'
162
- assert_includes relationships, 'site'
163
- end
164
-
165
- def test_render_resource_with_nested_include
166
- get '/render_resource_with_nested_include'
167
- response = JSON.parse(@response.body)
168
- assert response.key? 'included'
169
- assert_equal 3, response['included'].size
170
- end
171
-
172
- def test_render_collection_without_include
173
- get '/render_collection_without_include'
174
- response = JSON.parse(@response.body)
175
- refute response.key? 'included'
176
- end
177
-
178
- def test_render_collection_with_include
179
- get '/render_collection_with_include'
180
- response = JSON.parse(@response.body)
181
- assert response.key? 'included'
182
- end
183
-
184
- def test_render_resource_with_nested_attributes_even_when_missing_associations
185
- get '/render_resource_with_missing_nested_has_many_include'
186
- response = JSON.parse(@response.body)
187
- assert response.key? 'included'
188
- refute include_type?(response['included'], 'roles')
189
- end
190
-
191
- def test_render_collection_with_missing_nested_has_many_include
192
- get '/render_collection_with_missing_nested_has_many_include'
193
- response = JSON.parse(@response.body)
194
- assert response.key? 'included'
195
- assert include_type?(response['included'], 'roles')
196
- end
197
-
198
- def include_type?(collection, value)
199
- collection.detect { |i| i['type'] == value }
200
- end
201
- end
202
- end
203
- end
204
- end
@@ -1,126 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'test_helper'
4
- require 'will_paginate/array'
5
- require 'kaminari'
6
- require 'kaminari/hooks'
7
- ::Kaminari::Hooks.init
8
-
9
- module ActionController
10
- module Serialization
11
- class JsonApi
12
- class PaginationTest < ActionController::TestCase
13
- KAMINARI_URI = 'http://test.host/action_controller/serialization/json_api/pagination_test/pagination_test/render_pagination_using_kaminari'.freeze
14
- WILL_PAGINATE_URI = 'http://test.host/action_controller/serialization/json_api/pagination_test/pagination_test/render_pagination_using_will_paginate'.freeze
15
-
16
- class PaginationTestController < ActionController::Base
17
- def setup
18
- @array = [
19
- Profile.new(name: 'Name 1', description: 'Description 1', comments: 'Comments 1'),
20
- Profile.new(name: 'Name 2', description: 'Description 2', comments: 'Comments 2'),
21
- Profile.new(name: 'Name 3', description: 'Description 3', comments: 'Comments 3')
22
- ]
23
- end
24
-
25
- def using_kaminari
26
- setup
27
- Kaminari.paginate_array(@array).page(params[:page][:number]).per(params[:page][:size])
28
- end
29
-
30
- def using_will_paginate
31
- setup
32
- @array.paginate(page: params[:page][:number], per_page: params[:page][:size])
33
- end
34
-
35
- def render_pagination_using_kaminari
36
- render json: using_kaminari, adapter: :json_api
37
- end
38
-
39
- def render_pagination_using_will_paginate
40
- render json: using_will_paginate, adapter: :json_api
41
- end
42
-
43
- def render_array_without_pagination_links
44
- setup
45
- render json: @array, adapter: :json_api
46
- end
47
- end
48
-
49
- tests PaginationTestController
50
-
51
- def test_render_pagination_links_with_will_paginate
52
- expected_links = { 'self' => "#{WILL_PAGINATE_URI}?page%5Bnumber%5D=2&page%5Bsize%5D=1",
53
- 'first' => "#{WILL_PAGINATE_URI}?page%5Bnumber%5D=1&page%5Bsize%5D=1",
54
- 'prev' => "#{WILL_PAGINATE_URI}?page%5Bnumber%5D=1&page%5Bsize%5D=1",
55
- 'next' => "#{WILL_PAGINATE_URI}?page%5Bnumber%5D=3&page%5Bsize%5D=1",
56
- 'last' => "#{WILL_PAGINATE_URI}?page%5Bnumber%5D=3&page%5Bsize%5D=1" }
57
-
58
- get :render_pagination_using_will_paginate, params: { page: { number: 2, size: 1 } }
59
- response = JSON.parse(@response.body)
60
- assert_equal expected_links, response['links']
61
- end
62
-
63
- def test_render_only_first_last_and_next_pagination_links
64
- expected_links = { 'self' => "#{WILL_PAGINATE_URI}?page%5Bnumber%5D=1&page%5Bsize%5D=2",
65
- 'first' => "#{WILL_PAGINATE_URI}?page%5Bnumber%5D=1&page%5Bsize%5D=2",
66
- 'prev' => nil,
67
- 'next' => "#{WILL_PAGINATE_URI}?page%5Bnumber%5D=2&page%5Bsize%5D=2",
68
- 'last' => "#{WILL_PAGINATE_URI}?page%5Bnumber%5D=2&page%5Bsize%5D=2" }
69
- get :render_pagination_using_will_paginate, params: { page: { number: 1, size: 2 } }
70
- response = JSON.parse(@response.body)
71
- assert_equal expected_links, response['links']
72
- end
73
-
74
- def test_render_pagination_links_with_kaminari
75
- expected_links = { 'self' => "#{KAMINARI_URI}?page%5Bnumber%5D=2&page%5Bsize%5D=1",
76
- 'first' => "#{KAMINARI_URI}?page%5Bnumber%5D=1&page%5Bsize%5D=1",
77
- 'prev' => "#{KAMINARI_URI}?page%5Bnumber%5D=1&page%5Bsize%5D=1",
78
- 'next' => "#{KAMINARI_URI}?page%5Bnumber%5D=3&page%5Bsize%5D=1",
79
- 'last' => "#{KAMINARI_URI}?page%5Bnumber%5D=3&page%5Bsize%5D=1" }
80
- get :render_pagination_using_kaminari, params: { page: { number: 2, size: 1 } }
81
- response = JSON.parse(@response.body)
82
- assert_equal expected_links, response['links']
83
- end
84
-
85
- def test_render_only_prev_first_and_last_pagination_links
86
- expected_links = { 'self' => "#{KAMINARI_URI}?page%5Bnumber%5D=3&page%5Bsize%5D=1",
87
- 'first' => "#{KAMINARI_URI}?page%5Bnumber%5D=1&page%5Bsize%5D=1",
88
- 'prev' => "#{KAMINARI_URI}?page%5Bnumber%5D=2&page%5Bsize%5D=1",
89
- 'next' => nil,
90
- 'last' => "#{KAMINARI_URI}?page%5Bnumber%5D=3&page%5Bsize%5D=1" }
91
- get :render_pagination_using_kaminari, params: { page: { number: 3, size: 1 } }
92
- response = JSON.parse(@response.body)
93
- assert_equal expected_links, response['links']
94
- end
95
-
96
- def test_render_only_first_last_and_next_pagination_links_with_additional_params
97
- expected_links = { 'self' => "#{WILL_PAGINATE_URI}?page%5Bnumber%5D=1&page%5Bsize%5D=2&teste=additional",
98
- 'first' => "#{WILL_PAGINATE_URI}?page%5Bnumber%5D=1&page%5Bsize%5D=2&teste=additional",
99
- 'prev' => nil,
100
- 'next' => "#{WILL_PAGINATE_URI}?page%5Bnumber%5D=2&page%5Bsize%5D=2&teste=additional",
101
- 'last' => "#{WILL_PAGINATE_URI}?page%5Bnumber%5D=2&page%5Bsize%5D=2&teste=additional" }
102
- get :render_pagination_using_will_paginate, params: { page: { number: 1, size: 2 }, teste: 'additional' }
103
- response = JSON.parse(@response.body)
104
- assert_equal expected_links, response['links']
105
- end
106
-
107
- def test_render_only_prev_first_and_last_pagination_links_with_additional_params
108
- expected_links = { 'self' => "#{KAMINARI_URI}?page%5Bnumber%5D=3&page%5Bsize%5D=1&teste=additional",
109
- 'first' => "#{KAMINARI_URI}?page%5Bnumber%5D=1&page%5Bsize%5D=1&teste=additional",
110
- 'prev' => "#{KAMINARI_URI}?page%5Bnumber%5D=2&page%5Bsize%5D=1&teste=additional",
111
- 'next' => nil,
112
- 'last' => "#{KAMINARI_URI}?page%5Bnumber%5D=3&page%5Bsize%5D=1&teste=additional" }
113
- get :render_pagination_using_kaminari, params: { page: { number: 3, size: 1 }, teste: 'additional' }
114
- response = JSON.parse(@response.body)
115
- assert_equal expected_links, response['links']
116
- end
117
-
118
- def test_array_without_pagination_links
119
- get :render_array_without_pagination_links, params: { page: { number: 2, size: 1 } }
120
- response = JSON.parse(@response.body)
121
- refute response.key? 'links'
122
- end
123
- end
124
- end
125
- end
126
- end
@@ -1,191 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'test_helper'
4
-
5
- module ActionController
6
- module Serialization
7
- class JsonApi
8
- class KeyTransformTest < ActionController::TestCase
9
- class KeyTransformTestController < ActionController::Base
10
- class Post < ::Model
11
- attributes :title, :body, :publish_at
12
- associations :author, :top_comments
13
- end
14
- class Author < ::Model
15
- attributes :first_name, :last_name
16
- end
17
- class TopComment < ::Model
18
- attributes :body
19
- associations :author, :post
20
- end
21
- class PostSerializer < ActiveModel::Serializer
22
- type 'posts'
23
- attributes :title, :body, :publish_at
24
- belongs_to :author
25
- has_many :top_comments
26
-
27
- link(:post_authors) { 'https://example.com/post_authors' }
28
-
29
- meta do
30
- {
31
- rating: 5,
32
- favorite_count: 10
33
- }
34
- end
35
- end
36
-
37
- class AuthorSerializer < ActiveModel::Serializer
38
- type 'authors'
39
- attributes :first_name, :last_name
40
- end
41
-
42
- class TopCommentSerializer < ActiveModel::Serializer
43
- type 'top_comments'
44
- attributes :body
45
- belongs_to :author
46
- end
47
-
48
- def setup_post
49
- ActionController::Base.cache_store.clear
50
- @author = Author.new(id: 1, first_name: 'Bob', last_name: 'Jones')
51
- @comment1 = TopComment.new(id: 7, body: 'cool', author: @author)
52
- @comment2 = TopComment.new(id: 12, body: 'awesome', author: @author)
53
- @post = Post.new(id: 1337, title: 'Title 1', body: 'Body 1',
54
- author: @author, top_comments: [@comment1, @comment2],
55
- publish_at: '2020-03-16T03:55:25.291Z')
56
- @comment1.post = @post
57
- @comment2.post = @post
58
- end
59
-
60
- def render_resource_with_transform
61
- setup_post
62
- render json: @post, serializer: PostSerializer, adapter: :json_api,
63
- key_transform: :camel
64
- end
65
-
66
- def render_resource_with_transform_nil
67
- setup_post
68
- render json: @post, serializer: PostSerializer, adapter: :json_api,
69
- key_transform: nil
70
- end
71
-
72
- def render_resource_with_transform_with_global_config
73
- old_transform = ActiveModelSerializers.config.key_transform
74
- setup_post
75
- ActiveModelSerializers.config.key_transform = :camel_lower
76
- render json: @post, serializer: PostSerializer, adapter: :json_api
77
- ensure
78
- ActiveModelSerializers.config.key_transform = old_transform
79
- end
80
- end
81
-
82
- tests KeyTransformTestController
83
-
84
- def test_render_resource_with_transform
85
- get :render_resource_with_transform
86
- response = JSON.parse(@response.body)
87
- expected = {
88
- 'Data' => {
89
- 'Id' => '1337',
90
- 'Type' => 'Posts',
91
- 'Attributes' => {
92
- 'Title' => 'Title 1',
93
- 'Body' => 'Body 1',
94
- 'PublishAt' => '2020-03-16T03:55:25.291Z'
95
- },
96
- 'Relationships' => {
97
- 'Author' => {
98
- 'Data' => {
99
- 'Id' => '1',
100
- 'Type' => 'Authors'
101
- }
102
- },
103
- 'TopComments' => {
104
- 'Data' => [
105
- { 'Id' => '7', 'Type' => 'TopComments' },
106
- { 'Id' => '12', 'Type' => 'TopComments' }
107
- ]
108
- }
109
- },
110
- 'Links' => {
111
- 'PostAuthors' => 'https://example.com/post_authors'
112
- },
113
- 'Meta' => { 'Rating' => 5, 'FavoriteCount' => 10 }
114
- }
115
- }
116
- assert_equal expected, response
117
- end
118
-
119
- def test_render_resource_with_transform_nil
120
- get :render_resource_with_transform_nil
121
- response = JSON.parse(@response.body)
122
- expected = {
123
- 'data' => {
124
- 'id' => '1337',
125
- 'type' => 'posts',
126
- 'attributes' => {
127
- 'title' => 'Title 1',
128
- 'body' => 'Body 1',
129
- 'publish-at' => '2020-03-16T03:55:25.291Z'
130
- },
131
- 'relationships' => {
132
- 'author' => {
133
- 'data' => {
134
- 'id' => '1',
135
- 'type' => 'authors'
136
- }
137
- },
138
- 'top-comments' => {
139
- 'data' => [
140
- { 'id' => '7', 'type' => 'top-comments' },
141
- { 'id' => '12', 'type' => 'top-comments' }
142
- ]
143
- }
144
- },
145
- 'links' => {
146
- 'post-authors' => 'https://example.com/post_authors'
147
- },
148
- 'meta' => { 'rating' => 5, 'favorite-count' => 10 }
149
- }
150
- }
151
- assert_equal expected, response
152
- end
153
-
154
- def test_render_resource_with_transform_with_global_config
155
- get :render_resource_with_transform_with_global_config
156
- response = JSON.parse(@response.body)
157
- expected = {
158
- 'data' => {
159
- 'id' => '1337',
160
- 'type' => 'posts',
161
- 'attributes' => {
162
- 'title' => 'Title 1',
163
- 'body' => 'Body 1',
164
- 'publishAt' => '2020-03-16T03:55:25.291Z'
165
- },
166
- 'relationships' => {
167
- 'author' => {
168
- 'data' => {
169
- 'id' => '1',
170
- 'type' => 'authors'
171
- }
172
- },
173
- 'topComments' => {
174
- 'data' => [
175
- { 'id' => '7', 'type' => 'topComments' },
176
- { 'id' => '12', 'type' => 'topComments' }
177
- ]
178
- }
179
- },
180
- 'links' => {
181
- 'postAuthors' => 'https://example.com/post_authors'
182
- },
183
- 'meta' => { 'rating' => 5, 'favoriteCount' => 10 }
184
- }
185
- }
186
- assert_equal expected, response
187
- end
188
- end
189
- end
190
- end
191
- end
@@ -1,51 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'test_helper'
4
-
5
- module ActionController
6
- module Serialization
7
- class LookupProcTest < ActionController::TestCase
8
- module Api
9
- module V3
10
- class PostCustomSerializer < ActiveModel::Serializer
11
- attributes :title, :body
12
-
13
- belongs_to :author
14
- end
15
-
16
- class AuthorCustomSerializer < ActiveModel::Serializer
17
- attributes :name
18
- end
19
-
20
- class LookupProcTestController < ActionController::Base
21
- def implicit_namespaced_serializer
22
- author = Author.new(name: 'Bob')
23
- post = Post.new(title: 'New Post', body: 'Body', author: author)
24
-
25
- render json: post
26
- end
27
- end
28
- end
29
- end
30
-
31
- tests Api::V3::LookupProcTestController
32
-
33
- test 'implicitly uses namespaced serializer' do
34
- controller_namespace = lambda do |resource_class, _parent_serializer_class, namespace|
35
- "#{namespace}::#{resource_class}CustomSerializer" if namespace
36
- end
37
-
38
- with_prepended_lookup(controller_namespace) do
39
- get :implicit_namespaced_serializer
40
-
41
- assert_serializer Api::V3::PostCustomSerializer
42
-
43
- expected = { 'title' => 'New Post', 'body' => 'Body', 'author' => { 'name' => 'Bob' } }
44
- actual = JSON.parse(@response.body)
45
-
46
- assert_equal expected, actual
47
- end
48
- end
49
- end
50
- end
51
- end