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,197 +0,0 @@
1
- require 'test_helper'
2
-
3
- module ActionController
4
- module Serialization
5
- class JsonApi
6
- class LinkedTest < ActionController::TestCase
7
- class LinkedTestController < ActionController::Base
8
- require 'active_model_serializers/register_jsonapi_renderer'
9
- def setup_post
10
- ActionController::Base.cache_store.clear
11
- @role1 = Role.new(id: 1, name: 'admin')
12
- @role2 = Role.new(id: 2, name: 'colab')
13
- @author = Author.new(id: 1, name: 'Steve K.')
14
- @author.posts = []
15
- @author.bio = nil
16
- @author.roles = [@role1, @role2]
17
- @role1.author = @author
18
- @role2.author = @author
19
- @author2 = Author.new(id: 2, name: 'Anonymous')
20
- @author2.posts = []
21
- @author2.bio = nil
22
- @author2.roles = []
23
- @post = Post.new(id: 1, title: 'New Post', body: 'Body')
24
- @first_comment = Comment.new(id: 1, body: 'ZOMG A COMMENT')
25
- @second_comment = Comment.new(id: 2, body: 'ZOMG ANOTHER COMMENT')
26
- @post.comments = [@first_comment, @second_comment]
27
- @post.author = @author
28
- @first_comment.post = @post
29
- @first_comment.author = @author2
30
- @second_comment.post = @post
31
- @second_comment.author = nil
32
- @post2 = Post.new(id: 2, title: 'Another Post', body: 'Body')
33
- @post2.author = @author
34
- @post2.comments = []
35
- @blog = Blog.new(id: 1, name: 'My Blog!!')
36
- @post.blog = @blog
37
- @post2.blog = @blog
38
- end
39
-
40
- def render_resource_without_include
41
- setup_post
42
- render jsonapi: @post
43
- end
44
-
45
- def render_resource_with_include
46
- setup_post
47
- render jsonapi: @post, include: [:author]
48
- end
49
-
50
- def render_resource_with_include_of_custom_key_by_original
51
- setup_post
52
- render jsonapi: @post, include: [:reviews], serializer: PostWithCustomKeysSerializer
53
- end
54
-
55
- def render_resource_with_nested_include
56
- setup_post
57
- render jsonapi: @post, include: [comments: [:author]]
58
- end
59
-
60
- def render_resource_with_nested_has_many_include_wildcard
61
- setup_post
62
- render jsonapi: @post, include: 'author.*'
63
- end
64
-
65
- def render_resource_with_missing_nested_has_many_include
66
- setup_post
67
- @post.author = @author2 # author2 has no roles.
68
- render jsonapi: @post, include: [author: [:roles]]
69
- end
70
-
71
- def render_collection_with_missing_nested_has_many_include
72
- setup_post
73
- @post.author = @author2
74
- render jsonapi: [@post, @post2], include: [author: [:roles]]
75
- end
76
-
77
- def render_collection_without_include
78
- setup_post
79
- render jsonapi: [@post]
80
- end
81
-
82
- def render_collection_with_include
83
- setup_post
84
- render jsonapi: [@post], include: 'author, comments'
85
- end
86
- end
87
-
88
- tests LinkedTestController
89
-
90
- def test_render_resource_without_include
91
- get :render_resource_without_include
92
- response = JSON.parse(@response.body)
93
- refute response.key? 'included'
94
- end
95
-
96
- def test_render_resource_with_include
97
- get :render_resource_with_include
98
- response = JSON.parse(@response.body)
99
- assert response.key? 'included'
100
- assert_equal 1, response['included'].size
101
- assert_equal 'Steve K.', response['included'].first['attributes']['name']
102
- end
103
-
104
- def test_render_resource_with_nested_has_many_include
105
- get :render_resource_with_nested_has_many_include_wildcard
106
- response = JSON.parse(@response.body)
107
- expected_linked = [
108
- {
109
- 'id' => '1',
110
- 'type' => 'authors',
111
- 'attributes' => {
112
- 'name' => 'Steve K.'
113
- },
114
- 'relationships' => {
115
- 'posts' => { 'data' => [] },
116
- 'roles' => { 'data' => [{ 'type' => 'roles', 'id' => '1' }, { 'type' => 'roles', 'id' => '2' }] },
117
- 'bio' => { 'data' => nil }
118
- }
119
- }, {
120
- 'id' => '1',
121
- 'type' => 'roles',
122
- 'attributes' => {
123
- 'name' => 'admin',
124
- 'description' => nil,
125
- 'slug' => 'admin-1'
126
- },
127
- 'relationships' => {
128
- 'author' => { 'data' => { 'type' => 'authors', 'id' => '1' } }
129
- }
130
- }, {
131
- 'id' => '2',
132
- 'type' => 'roles',
133
- 'attributes' => {
134
- 'name' => 'colab',
135
- 'description' => nil,
136
- 'slug' => 'colab-2'
137
- },
138
- 'relationships' => {
139
- 'author' => { 'data' => { 'type' => 'authors', 'id' => '1' } }
140
- }
141
- }
142
- ]
143
- assert_equal expected_linked, response['included']
144
- end
145
-
146
- def test_render_resource_with_include_of_custom_key_by_original
147
- get :render_resource_with_include_of_custom_key_by_original
148
- response = JSON.parse(@response.body)
149
- assert response.key? 'included'
150
-
151
- relationships = response['data']['relationships']
152
-
153
- assert_includes relationships, 'reviews'
154
- assert_includes relationships, 'writer'
155
- assert_includes relationships, 'site'
156
- end
157
-
158
- def test_render_resource_with_nested_include
159
- get :render_resource_with_nested_include
160
- response = JSON.parse(@response.body)
161
- assert response.key? 'included'
162
- assert_equal 3, response['included'].size
163
- end
164
-
165
- def test_render_collection_without_include
166
- get :render_collection_without_include
167
- response = JSON.parse(@response.body)
168
- refute response.key? 'included'
169
- end
170
-
171
- def test_render_collection_with_include
172
- get :render_collection_with_include
173
- response = JSON.parse(@response.body)
174
- assert response.key? 'included'
175
- end
176
-
177
- def test_render_resource_with_nested_attributes_even_when_missing_associations
178
- get :render_resource_with_missing_nested_has_many_include
179
- response = JSON.parse(@response.body)
180
- assert response.key? 'included'
181
- refute has_type?(response['included'], 'roles')
182
- end
183
-
184
- def test_render_collection_with_missing_nested_has_many_include
185
- get :render_collection_with_missing_nested_has_many_include
186
- response = JSON.parse(@response.body)
187
- assert response.key? 'included'
188
- assert has_type?(response['included'], 'roles')
189
- end
190
-
191
- def has_type?(collection, value)
192
- collection.detect { |i| i['type'] == value }
193
- end
194
- end
195
- end
196
- end
197
- end
@@ -1,116 +0,0 @@
1
- require 'test_helper'
2
- require 'will_paginate/array'
3
- require 'kaminari'
4
- require 'kaminari/hooks'
5
- ::Kaminari::Hooks.init
6
-
7
- module ActionController
8
- module Serialization
9
- class JsonApi
10
- class PaginationTest < ActionController::TestCase
11
- KAMINARI_URI = 'http://test.host/action_controller/serialization/json_api/pagination_test/pagination_test/render_pagination_using_kaminari'.freeze
12
- WILL_PAGINATE_URI = 'http://test.host/action_controller/serialization/json_api/pagination_test/pagination_test/render_pagination_using_will_paginate'.freeze
13
-
14
- class PaginationTestController < ActionController::Base
15
- def setup
16
- @array = [
17
- Profile.new({ name: 'Name 1', description: 'Description 1', comments: 'Comments 1' }),
18
- Profile.new({ name: 'Name 2', description: 'Description 2', comments: 'Comments 2' }),
19
- Profile.new({ name: 'Name 3', description: 'Description 3', comments: 'Comments 3' })
20
- ]
21
- end
22
-
23
- def using_kaminari
24
- setup
25
- Kaminari.paginate_array(@array).page(params[:page][:number]).per(params[:page][:size])
26
- end
27
-
28
- def using_will_paginate
29
- setup
30
- @array.paginate(page: params[:page][:number], per_page: params[:page][:size])
31
- end
32
-
33
- def render_pagination_using_kaminari
34
- render json: using_kaminari, adapter: :json_api
35
- end
36
-
37
- def render_pagination_using_will_paginate
38
- render json: using_will_paginate, adapter: :json_api
39
- end
40
-
41
- def render_array_without_pagination_links
42
- setup
43
- render json: @array, adapter: :json_api
44
- end
45
- end
46
-
47
- tests PaginationTestController
48
-
49
- def test_render_pagination_links_with_will_paginate
50
- expected_links = { 'self' => "#{WILL_PAGINATE_URI}?page%5Bnumber%5D=2&page%5Bsize%5D=1",
51
- 'first' => "#{WILL_PAGINATE_URI}?page%5Bnumber%5D=1&page%5Bsize%5D=1",
52
- 'prev' => "#{WILL_PAGINATE_URI}?page%5Bnumber%5D=1&page%5Bsize%5D=1",
53
- 'next' => "#{WILL_PAGINATE_URI}?page%5Bnumber%5D=3&page%5Bsize%5D=1",
54
- 'last' => "#{WILL_PAGINATE_URI}?page%5Bnumber%5D=3&page%5Bsize%5D=1" }
55
-
56
- get :render_pagination_using_will_paginate, params: { page: { number: 2, size: 1 } }
57
- response = JSON.parse(@response.body)
58
- assert_equal expected_links, response['links']
59
- end
60
-
61
- def test_render_only_last_and_next_pagination_links
62
- expected_links = { 'self' => "#{WILL_PAGINATE_URI}?page%5Bnumber%5D=1&page%5Bsize%5D=2",
63
- 'next' => "#{WILL_PAGINATE_URI}?page%5Bnumber%5D=2&page%5Bsize%5D=2",
64
- 'last' => "#{WILL_PAGINATE_URI}?page%5Bnumber%5D=2&page%5Bsize%5D=2" }
65
- get :render_pagination_using_will_paginate, params: { page: { number: 1, size: 2 } }
66
- response = JSON.parse(@response.body)
67
- assert_equal expected_links, response['links']
68
- end
69
-
70
- def test_render_pagination_links_with_kaminari
71
- expected_links = { 'self' => "#{KAMINARI_URI}?page%5Bnumber%5D=2&page%5Bsize%5D=1",
72
- 'first' => "#{KAMINARI_URI}?page%5Bnumber%5D=1&page%5Bsize%5D=1",
73
- 'prev' => "#{KAMINARI_URI}?page%5Bnumber%5D=1&page%5Bsize%5D=1",
74
- 'next' => "#{KAMINARI_URI}?page%5Bnumber%5D=3&page%5Bsize%5D=1",
75
- 'last' => "#{KAMINARI_URI}?page%5Bnumber%5D=3&page%5Bsize%5D=1" }
76
- get :render_pagination_using_kaminari, params: { page: { number: 2, size: 1 } }
77
- response = JSON.parse(@response.body)
78
- assert_equal expected_links, response['links']
79
- end
80
-
81
- def test_render_only_prev_and_first_pagination_links
82
- expected_links = { 'self' => "#{KAMINARI_URI}?page%5Bnumber%5D=3&page%5Bsize%5D=1",
83
- 'first' => "#{KAMINARI_URI}?page%5Bnumber%5D=1&page%5Bsize%5D=1",
84
- 'prev' => "#{KAMINARI_URI}?page%5Bnumber%5D=2&page%5Bsize%5D=1" }
85
- get :render_pagination_using_kaminari, params: { page: { number: 3, size: 1 } }
86
- response = JSON.parse(@response.body)
87
- assert_equal expected_links, response['links']
88
- end
89
-
90
- def test_render_only_last_and_next_pagination_links_with_additional_params
91
- expected_links = { 'self' => "#{WILL_PAGINATE_URI}?page%5Bnumber%5D=1&page%5Bsize%5D=2&teste=additional",
92
- 'next' => "#{WILL_PAGINATE_URI}?page%5Bnumber%5D=2&page%5Bsize%5D=2&teste=additional",
93
- 'last' => "#{WILL_PAGINATE_URI}?page%5Bnumber%5D=2&page%5Bsize%5D=2&teste=additional" }
94
- get :render_pagination_using_will_paginate, params: { page: { number: 1, size: 2 }, teste: 'additional' }
95
- response = JSON.parse(@response.body)
96
- assert_equal expected_links, response['links']
97
- end
98
-
99
- def test_render_only_prev_and_first_pagination_links_with_additional_params
100
- expected_links = { 'self' => "#{KAMINARI_URI}?page%5Bnumber%5D=3&page%5Bsize%5D=1&teste=additional",
101
- 'first' => "#{KAMINARI_URI}?page%5Bnumber%5D=1&page%5Bsize%5D=1&teste=additional",
102
- 'prev' => "#{KAMINARI_URI}?page%5Bnumber%5D=2&page%5Bsize%5D=1&teste=additional" }
103
- get :render_pagination_using_kaminari, params: { page: { number: 3, size: 1 }, teste: 'additional' }
104
- response = JSON.parse(@response.body)
105
- assert_equal expected_links, response['links']
106
- end
107
-
108
- def test_array_without_pagination_links
109
- get :render_array_without_pagination_links, params: { page: { number: 2, size: 1 } }
110
- response = JSON.parse(@response.body)
111
- refute response.key? 'links'
112
- end
113
- end
114
- end
115
- end
116
- end
@@ -1,181 +0,0 @@
1
- require 'test_helper'
2
-
3
- module ActionController
4
- module Serialization
5
- class JsonApi
6
- class KeyTransformTest < ActionController::TestCase
7
- class KeyTransformTestController < ActionController::Base
8
- Post = Class.new(::Model)
9
- class PostSerializer < ActiveModel::Serializer
10
- type 'posts'
11
- attributes :title, :body, :publish_at
12
- belongs_to :author
13
- has_many :top_comments
14
-
15
- link(:post_authors) { 'https://example.com/post_authors' }
16
-
17
- meta do
18
- {
19
- rating: 5,
20
- favorite_count: 10
21
- }
22
- end
23
- end
24
-
25
- Author = Class.new(::Model)
26
- class AuthorSerializer < ActiveModel::Serializer
27
- type 'authors'
28
- attributes :first_name, :last_name
29
- end
30
-
31
- TopComment = Class.new(::Model)
32
- class TopCommentSerializer < ActiveModel::Serializer
33
- type 'top_comments'
34
- attributes :body
35
- belongs_to :author
36
- end
37
-
38
- def setup_post
39
- ActionController::Base.cache_store.clear
40
- @author = Author.new(id: 1, first_name: 'Bob', last_name: 'Jones')
41
- @comment1 = TopComment.new(id: 7, body: 'cool', author: @author)
42
- @comment2 = TopComment.new(id: 12, body: 'awesome', author: @author)
43
- @post = Post.new(id: 1337, title: 'Title 1', body: 'Body 1',
44
- author: @author, top_comments: [@comment1, @comment2],
45
- publish_at: '2020-03-16T03:55:25.291Z')
46
- @comment1.post = @post
47
- @comment2.post = @post
48
- end
49
-
50
- def render_resource_with_transform
51
- setup_post
52
- render json: @post, serializer: PostSerializer, adapter: :json_api,
53
- key_transform: :camel
54
- end
55
-
56
- def render_resource_with_transform_nil
57
- setup_post
58
- render json: @post, serializer: PostSerializer, adapter: :json_api,
59
- key_transform: nil
60
- end
61
-
62
- def render_resource_with_transform_with_global_config
63
- old_transform = ActiveModelSerializers.config.key_transform
64
- setup_post
65
- ActiveModelSerializers.config.key_transform = :camel_lower
66
- render json: @post, serializer: PostSerializer, adapter: :json_api
67
- ensure
68
- ActiveModelSerializers.config.key_transform = old_transform
69
- end
70
- end
71
-
72
- tests KeyTransformTestController
73
-
74
- def test_render_resource_with_transform
75
- get :render_resource_with_transform
76
- response = JSON.parse(@response.body)
77
- expected = {
78
- 'Data' => {
79
- 'Id' => '1337',
80
- 'Type' => 'Posts',
81
- 'Attributes' => {
82
- 'Title' => 'Title 1',
83
- 'Body' => 'Body 1',
84
- 'PublishAt' => '2020-03-16T03:55:25.291Z'
85
- },
86
- 'Relationships' => {
87
- 'Author' => {
88
- 'Data' => {
89
- 'Id' => '1',
90
- 'Type' => 'Authors'
91
- }
92
- },
93
- 'TopComments' => {
94
- 'Data' => [
95
- { 'Id' => '7', 'Type' => 'TopComments' },
96
- { 'Id' => '12', 'Type' => 'TopComments' }
97
- ]
98
- }
99
- },
100
- 'Links' => {
101
- 'PostAuthors' => 'https://example.com/post_authors'
102
- },
103
- 'Meta' => { 'Rating' => 5, 'FavoriteCount' => 10 }
104
- }
105
- }
106
- assert_equal expected, response
107
- end
108
-
109
- def test_render_resource_with_transform_nil
110
- get :render_resource_with_transform_nil
111
- response = JSON.parse(@response.body)
112
- expected = {
113
- 'data' => {
114
- 'id' => '1337',
115
- 'type' => 'posts',
116
- 'attributes' => {
117
- 'title' => 'Title 1',
118
- 'body' => 'Body 1',
119
- 'publish-at' => '2020-03-16T03:55:25.291Z'
120
- },
121
- 'relationships' => {
122
- 'author' => {
123
- 'data' => {
124
- 'id' => '1',
125
- 'type' => 'authors'
126
- }
127
- },
128
- 'top-comments' => {
129
- 'data' => [
130
- { 'id' => '7', 'type' => 'top-comments' },
131
- { 'id' => '12', 'type' => 'top-comments' }
132
- ]
133
- }
134
- },
135
- 'links' => {
136
- 'post-authors' => 'https://example.com/post_authors'
137
- },
138
- 'meta' => { 'rating' => 5, 'favorite-count' => 10 }
139
- }
140
- }
141
- assert_equal expected, response
142
- end
143
-
144
- def test_render_resource_with_transform_with_global_config
145
- get :render_resource_with_transform_with_global_config
146
- response = JSON.parse(@response.body)
147
- expected = {
148
- 'data' => {
149
- 'id' => '1337',
150
- 'type' => 'posts',
151
- 'attributes' => {
152
- 'title' => 'Title 1',
153
- 'body' => 'Body 1',
154
- 'publishAt' => '2020-03-16T03:55:25.291Z'
155
- },
156
- 'relationships' => {
157
- 'author' => {
158
- 'data' => {
159
- 'id' => '1',
160
- 'type' => 'authors'
161
- }
162
- },
163
- 'topComments' => {
164
- 'data' => [
165
- { 'id' => '7', 'type' => 'topComments' },
166
- { 'id' => '12', 'type' => 'topComments' }
167
- ]
168
- }
169
- },
170
- 'links' => {
171
- 'postAuthors' => 'https://example.com/post_authors'
172
- },
173
- 'meta' => { 'rating' => 5, 'favoriteCount' => 10 }
174
- }
175
- }
176
- assert_equal expected, response
177
- end
178
- end
179
- end
180
- end
181
- end