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,49 @@
1
+ require 'test_helper'
2
+
3
+ module ActionController
4
+ module Serialization
5
+ class LookupProcTest < ActionController::TestCase
6
+ module Api
7
+ module V3
8
+ class PostCustomSerializer < ActiveModel::Serializer
9
+ attributes :title, :body
10
+
11
+ belongs_to :author
12
+ end
13
+
14
+ class AuthorCustomSerializer < ActiveModel::Serializer
15
+ attributes :name
16
+ end
17
+
18
+ class LookupProcTestController < ActionController::Base
19
+ def implicit_namespaced_serializer
20
+ author = Author.new(name: 'Bob')
21
+ post = Post.new(title: 'New Post', body: 'Body', author: author)
22
+
23
+ render json: post
24
+ end
25
+ end
26
+ end
27
+ end
28
+
29
+ tests Api::V3::LookupProcTestController
30
+
31
+ test 'implicitly uses namespaced serializer' do
32
+ controller_namespace = lambda do |resource_class, _parent_serializer_class, namespace|
33
+ "#{namespace}::#{resource_class}CustomSerializer" if namespace
34
+ end
35
+
36
+ with_prepended_lookup(controller_namespace) do
37
+ get :implicit_namespaced_serializer
38
+
39
+ assert_serializer Api::V3::PostCustomSerializer
40
+
41
+ expected = { 'title' => 'New Post', 'body' => 'Body', 'author' => { 'name' => 'Bob' } }
42
+ actual = JSON.parse(@response.body)
43
+
44
+ assert_equal expected, actual
45
+ end
46
+ end
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,232 @@
1
+ require 'test_helper'
2
+
3
+ module ActionController
4
+ module Serialization
5
+ class NamespaceLookupTest < ActionController::TestCase
6
+ class Book < ::Model
7
+ attributes :title, :body
8
+ associations :writer, :chapters
9
+ end
10
+ class Chapter < ::Model
11
+ attributes :title
12
+ end
13
+ class Writer < ::Model
14
+ attributes :name
15
+ end
16
+
17
+ module Api
18
+ module V2
19
+ class BookSerializer < ActiveModel::Serializer
20
+ attributes :title
21
+ end
22
+ end
23
+
24
+ module VHeader
25
+ class BookSerializer < ActiveModel::Serializer
26
+ attributes :title, :body
27
+
28
+ def body
29
+ 'header'
30
+ end
31
+ end
32
+ end
33
+
34
+ module V3
35
+ class BookSerializer < ActiveModel::Serializer
36
+ attributes :title, :body
37
+
38
+ belongs_to :writer
39
+ has_many :chapters
40
+ end
41
+
42
+ class ChapterSerializer < ActiveModel::Serializer
43
+ attribute :title do
44
+ "Chapter - #{object.title}"
45
+ end
46
+ end
47
+
48
+ class WriterSerializer < ActiveModel::Serializer
49
+ attributes :name
50
+ end
51
+
52
+ class LookupTestController < ActionController::Base
53
+ before_action only: [:namespace_set_in_before_filter] do
54
+ self.namespace_for_serializer = Api::V2
55
+ end
56
+
57
+ def implicit_namespaced_serializer
58
+ writer = Writer.new(name: 'Bob')
59
+ book = Book.new(title: 'New Post', body: 'Body', writer: writer, chapters: [])
60
+
61
+ render json: book
62
+ end
63
+
64
+ def implicit_namespaced_collection_serializer
65
+ chapter1 = Chapter.new(title: 'Oh')
66
+ chapter2 = Chapter.new(title: 'Oh my')
67
+
68
+ render json: [chapter1, chapter2]
69
+ end
70
+
71
+ def implicit_has_many_namespaced_serializer
72
+ chapter1 = Chapter.new(title: 'Odd World')
73
+ chapter2 = Chapter.new(title: 'New World')
74
+ book = Book.new(title: 'New Post', body: 'Body', chapters: [chapter1, chapter2])
75
+
76
+ render json: book
77
+ end
78
+
79
+ def explicit_namespace_as_module
80
+ book = Book.new(title: 'New Post', body: 'Body')
81
+
82
+ render json: book, namespace: Api::V2
83
+ end
84
+
85
+ def explicit_namespace_as_string
86
+ book = Book.new(title: 'New Post', body: 'Body')
87
+
88
+ # because this is a string, ruby can't auto-lookup the constant, so otherwise
89
+ # the looku things we mean ::Api::V2
90
+ render json: book, namespace: 'ActionController::Serialization::NamespaceLookupTest::Api::V2'
91
+ end
92
+
93
+ def explicit_namespace_as_symbol
94
+ book = Book.new(title: 'New Post', body: 'Body')
95
+
96
+ # because this is a string, ruby can't auto-lookup the constant, so otherwise
97
+ # the looku things we mean ::Api::V2
98
+ render json: book, namespace: :'ActionController::Serialization::NamespaceLookupTest::Api::V2'
99
+ end
100
+
101
+ def invalid_namespace
102
+ book = Book.new(id: 'invalid_namespace_book_id', title: 'New Post', body: 'Body')
103
+
104
+ render json: book, namespace: :api_v2
105
+ end
106
+
107
+ def namespace_set_in_before_filter
108
+ book = Book.new(title: 'New Post', body: 'Body')
109
+ render json: book
110
+ end
111
+
112
+ def namespace_set_by_request_headers
113
+ book = Book.new(title: 'New Post', body: 'Body')
114
+ version_from_header = request.headers['X-API_VERSION']
115
+ namespace = "ActionController::Serialization::NamespaceLookupTest::#{version_from_header}"
116
+
117
+ render json: book, namespace: namespace
118
+ end
119
+ end
120
+ end
121
+ end
122
+
123
+ tests Api::V3::LookupTestController
124
+
125
+ setup do
126
+ @test_namespace = self.class.parent
127
+ end
128
+
129
+ test 'uses request headers to determine the namespace' do
130
+ request.env['X-API_VERSION'] = 'Api::VHeader'
131
+ get :namespace_set_by_request_headers
132
+
133
+ assert_serializer Api::VHeader::BookSerializer
134
+ end
135
+
136
+ test 'implicitly uses namespaced serializer' do
137
+ get :implicit_namespaced_serializer
138
+
139
+ assert_serializer Api::V3::BookSerializer
140
+
141
+ expected = { 'title' => 'New Post', 'body' => 'Body', 'writer' => { 'name' => 'Bob' }, 'chapters' => [] }
142
+ actual = JSON.parse(@response.body)
143
+
144
+ assert_equal expected, actual
145
+ end
146
+
147
+ test 'implicitly uses namespaced serializer for collection' do
148
+ get :implicit_namespaced_collection_serializer
149
+
150
+ assert_serializer 'ActiveModel::Serializer::CollectionSerializer'
151
+
152
+ expected = [{ 'title' => 'Chapter - Oh' }, { 'title' => 'Chapter - Oh my' }]
153
+ actual = JSON.parse(@response.body)
154
+
155
+ assert_equal expected, actual
156
+ end
157
+
158
+ test 'implicitly uses namespaced serializer for has_many' do
159
+ get :implicit_has_many_namespaced_serializer
160
+
161
+ assert_serializer Api::V3::BookSerializer
162
+
163
+ expected = {
164
+ 'title' => 'New Post',
165
+ 'body' => 'Body', 'writer' => nil,
166
+ 'chapters' => [
167
+ { 'title' => 'Chapter - Odd World' },
168
+ { 'title' => 'Chapter - New World' }
169
+ ]
170
+ }
171
+ actual = JSON.parse(@response.body)
172
+
173
+ assert_equal expected, actual
174
+ end
175
+
176
+ test 'explicit namespace as module' do
177
+ get :explicit_namespace_as_module
178
+
179
+ assert_serializer Api::V2::BookSerializer
180
+
181
+ expected = { 'title' => 'New Post' }
182
+ actual = JSON.parse(@response.body)
183
+
184
+ assert_equal expected, actual
185
+ end
186
+
187
+ test 'explicit namespace as string' do
188
+ get :explicit_namespace_as_string
189
+
190
+ assert_serializer Api::V2::BookSerializer
191
+
192
+ expected = { 'title' => 'New Post' }
193
+ actual = JSON.parse(@response.body)
194
+
195
+ assert_equal expected, actual
196
+ end
197
+
198
+ test 'explicit namespace as symbol' do
199
+ get :explicit_namespace_as_symbol
200
+
201
+ assert_serializer Api::V2::BookSerializer
202
+
203
+ expected = { 'title' => 'New Post' }
204
+ actual = JSON.parse(@response.body)
205
+
206
+ assert_equal expected, actual
207
+ end
208
+
209
+ test 'invalid namespace' do
210
+ get :invalid_namespace
211
+
212
+ assert_serializer ActiveModel::Serializer::Null
213
+
214
+ expected = { 'id' => 'invalid_namespace_book_id', 'title' => 'New Post', 'body' => 'Body' }
215
+ actual = JSON.parse(@response.body)
216
+
217
+ assert_equal expected, actual
218
+ end
219
+
220
+ test 'namespace set in before filter' do
221
+ get :namespace_set_in_before_filter
222
+
223
+ assert_serializer Api::V2::BookSerializer
224
+
225
+ expected = { 'title' => 'New Post' }
226
+ actual = JSON.parse(@response.body)
227
+
228
+ assert_equal expected, actual
229
+ end
230
+ end
231
+ end
232
+ end
@@ -0,0 +1,229 @@
1
+ require 'test_helper'
2
+
3
+ module SerializationScopeTesting
4
+ class User < ActiveModelSerializers::Model
5
+ attributes :id, :name, :admin
6
+ def admin?
7
+ admin
8
+ end
9
+ end
10
+ class Comment < ActiveModelSerializers::Model
11
+ attributes :id, :body
12
+ end
13
+ class Post < ActiveModelSerializers::Model
14
+ attributes :id, :title, :body, :comments
15
+ end
16
+ class PostSerializer < ActiveModel::Serializer
17
+ attributes :id, :title, :body, :comments
18
+
19
+ def body
20
+ "The 'scope' is the 'current_user': #{scope == current_user}"
21
+ end
22
+
23
+ def comments
24
+ if current_user.admin?
25
+ [Comment.new(id: 1, body: 'Admin')]
26
+ else
27
+ [Comment.new(id: 2, body: 'Scoped')]
28
+ end
29
+ end
30
+
31
+ def json_key
32
+ 'post'
33
+ end
34
+ end
35
+ class PostTestController < ActionController::Base
36
+ attr_accessor :current_user
37
+ def render_post_by_non_admin
38
+ self.current_user = User.new(id: 3, name: 'Pete', admin: false)
39
+ render json: new_post, serializer: serializer, adapter: :json
40
+ end
41
+
42
+ def render_post_by_admin
43
+ self.current_user = User.new(id: 3, name: 'Pete', admin: true)
44
+ render json: new_post, serializer: serializer, adapter: :json
45
+ end
46
+
47
+ private
48
+
49
+ def new_post
50
+ Post.new(id: 4, title: 'Title')
51
+ end
52
+
53
+ def serializer
54
+ PostSerializer
55
+ end
56
+ end
57
+ class PostViewContextSerializer < PostSerializer
58
+ def body
59
+ "The 'scope' is the 'view_context': #{scope == view_context}"
60
+ end
61
+
62
+ def comments
63
+ if view_context.controller.current_user.admin?
64
+ [Comment.new(id: 1, body: 'Admin')]
65
+ else
66
+ [Comment.new(id: 2, body: 'Scoped')]
67
+ end
68
+ end
69
+ end
70
+ class DefaultScopeTest < ActionController::TestCase
71
+ tests PostTestController
72
+
73
+ def test_default_serialization_scope
74
+ assert_equal :current_user, @controller._serialization_scope
75
+ end
76
+
77
+ def test_default_serialization_scope_object
78
+ assert_equal @controller.current_user, @controller.serialization_scope
79
+ end
80
+
81
+ def test_default_scope_non_admin
82
+ get :render_post_by_non_admin
83
+ expected_json = {
84
+ post: {
85
+ id: 4,
86
+ title: 'Title',
87
+ body: "The 'scope' is the 'current_user': true",
88
+ comments: [
89
+ { id: 2, body: 'Scoped' }
90
+ ]
91
+ }
92
+ }.to_json
93
+ assert_equal expected_json, @response.body
94
+ end
95
+
96
+ def test_default_scope_admin
97
+ get :render_post_by_admin
98
+ expected_json = {
99
+ post: {
100
+ id: 4,
101
+ title: 'Title',
102
+ body: "The 'scope' is the 'current_user': true",
103
+ comments: [
104
+ { id: 1, body: 'Admin' }
105
+ ]
106
+ }
107
+ }.to_json
108
+ assert_equal expected_json, @response.body
109
+ end
110
+ end
111
+ class SerializationScopeTest < ActionController::TestCase
112
+ class PostViewContextTestController < PostTestController
113
+ serialization_scope :view_context
114
+
115
+ private
116
+
117
+ def serializer
118
+ PostViewContextSerializer
119
+ end
120
+ end
121
+ tests PostViewContextTestController
122
+
123
+ def test_defined_serialization_scope
124
+ assert_equal :view_context, @controller._serialization_scope
125
+ end
126
+
127
+ def test_defined_serialization_scope_object
128
+ assert_equal @controller.view_context.class, @controller.serialization_scope.class
129
+ end
130
+
131
+ def test_serialization_scope_non_admin
132
+ get :render_post_by_non_admin
133
+ expected_json = {
134
+ post: {
135
+ id: 4,
136
+ title: 'Title',
137
+ body: "The 'scope' is the 'view_context': true",
138
+ comments: [
139
+ { id: 2, body: 'Scoped' }
140
+ ]
141
+ }
142
+ }.to_json
143
+ assert_equal expected_json, @response.body
144
+ end
145
+
146
+ def test_serialization_scope_admin
147
+ get :render_post_by_admin
148
+ expected_json = {
149
+ post: {
150
+ id: 4,
151
+ title: 'Title',
152
+ body: "The 'scope' is the 'view_context': true",
153
+ comments: [
154
+ { id: 1, body: 'Admin' }
155
+ ]
156
+ }
157
+ }.to_json
158
+ assert_equal expected_json, @response.body
159
+ end
160
+ end
161
+ class NilSerializationScopeTest < ActionController::TestCase
162
+ class PostViewContextTestController < ActionController::Base
163
+ serialization_scope nil
164
+
165
+ attr_accessor :current_user
166
+
167
+ def render_post_with_no_scope
168
+ self.current_user = User.new(id: 3, name: 'Pete', admin: false)
169
+ render json: new_post, serializer: PostSerializer, adapter: :json
170
+ end
171
+
172
+ def render_post_with_passed_in_scope
173
+ self.current_user = User.new(id: 3, name: 'Pete', admin: false)
174
+ render json: new_post, serializer: PostSerializer, adapter: :json, scope: current_user, scope_name: :current_user
175
+ end
176
+
177
+ def render_post_with_passed_in_scope_without_scope_name
178
+ self.current_user = User.new(id: 3, name: 'Pete', admin: false)
179
+ render json: new_post, serializer: PostSerializer, adapter: :json, scope: current_user
180
+ end
181
+
182
+ private
183
+
184
+ def new_post
185
+ Post.new(id: 4, title: 'Title')
186
+ end
187
+ end
188
+ tests PostViewContextTestController
189
+
190
+ def test_nil_serialization_scope
191
+ assert_nil @controller._serialization_scope
192
+ end
193
+
194
+ def test_nil_serialization_scope_object
195
+ assert_nil @controller.serialization_scope
196
+ end
197
+
198
+ def test_nil_scope
199
+ exception_matcher = /current_user/
200
+ exception = assert_raises(NameError) do
201
+ get :render_post_with_no_scope
202
+ end
203
+ assert_match exception_matcher, exception.message
204
+ end
205
+
206
+ def test_serialization_scope_is_and_nil_scope_passed_in_current_user
207
+ get :render_post_with_passed_in_scope
208
+ expected_json = {
209
+ post: {
210
+ id: 4,
211
+ title: 'Title',
212
+ body: "The 'scope' is the 'current_user': true",
213
+ comments: [
214
+ { id: 2, body: 'Scoped' }
215
+ ]
216
+ }
217
+ }.to_json
218
+ assert_equal expected_json, @response.body
219
+ end
220
+
221
+ def test_serialization_scope_is_nil_and_scope_passed_in_current_user_without_scope_name
222
+ exception_matcher = /current_user/
223
+ exception = assert_raises(NameError) do
224
+ get :render_post_with_passed_in_scope_without_scope_name
225
+ end
226
+ assert_match exception_matcher, exception.message
227
+ end
228
+ end
229
+ end