1
1
require 'test_helper'
2
2
3
3
module SerializationScopeTesting
4
+ def self . undef_serializer_dynamic_scope_methods
5
+ [ PostSerializer , PostViewContextSerializer ] . each do |serializer_class |
6
+ instance_method_cache = serializer_class . instance_variable_get ( :@_serializer_instance_methods )
7
+ class_method_cache = serializer_class . class_variable_get ( :@@_serializer_instance_methods ) [ serializer_class ]
8
+ [ :view_context , :current_user ] . each do |scope_method |
9
+ serializer_class . send ( :undef_method , scope_method ) if serializer_class . method_defined? ( scope_method )
10
+ instance_method_cache && instance_method_cache . delete ( scope_method )
11
+ class_method_cache && class_method_cache . delete ( scope_method )
12
+ end
13
+ end
14
+ end
4
15
class User < ActiveModelSerializers ::Model
5
16
attr_accessor :id , :name , :admin
6
17
def admin?
@@ -70,6 +81,10 @@ def comments
70
81
class DefaultScopeTest < ActionController ::TestCase
71
82
tests PostTestController
72
83
84
+ teardown do
85
+ SerializationScopeTesting . undef_serializer_dynamic_scope_methods
86
+ end
87
+
73
88
def test_default_serialization_scope
74
89
assert_equal :current_user , @controller . _serialization_scope
75
90
end
@@ -120,6 +135,10 @@ def serializer
120
135
end
121
136
tests PostViewContextTestController
122
137
138
+ teardown do
139
+ SerializationScopeTesting . undef_serializer_dynamic_scope_methods
140
+ end
141
+
123
142
def test_defined_serialization_scope
124
143
assert_equal :view_context , @controller . _serialization_scope
125
144
end
@@ -158,8 +177,6 @@ def test_serialization_scope_admin
158
177
assert_equal expected_json , @response . body
159
178
end
160
179
end
161
- # FIXME: Has bugs. See comments below and
162
- # https://github.com/rails-api/active_model_serializers/issues/1509
163
180
class NilSerializationScopeTest < ActionController ::TestCase
164
181
class PostViewContextTestController < ActionController ::Base
165
182
serialization_scope nil
@@ -171,12 +188,15 @@ def render_post_with_no_scope
171
188
render json : new_post , serializer : PostSerializer , adapter : :json
172
189
end
173
190
174
- # TODO: run test when
175
- # global state in Serializer._serializer_instance_methods is fixed
176
- # def render_post_with_passed_in_scope
177
- # self.current_user = User.new(id: 3, name: 'Pete', admin: false)
178
- # render json: new_post, serializer: PostSerializer, adapter: :json, scope: current_user, scope_name: :current_user
179
- # end
191
+ def render_post_with_passed_in_scope
192
+ self . current_user = User . new ( id : 3 , name : 'Pete' , admin : false )
193
+ render json : new_post , serializer : PostSerializer , adapter : :json , scope : current_user , scope_name : :current_user
194
+ end
195
+
196
+ def render_post_with_passed_in_scope_without_scope_name
197
+ self . current_user = User . new ( id : 3 , name : 'Pete' , admin : false )
198
+ render json : new_post , serializer : PostSerializer , adapter : :json , scope : current_user
199
+ end
180
200
181
201
private
182
202
@@ -186,6 +206,10 @@ def new_post
186
206
end
187
207
tests PostViewContextTestController
188
208
209
+ teardown do
210
+ SerializationScopeTesting . undef_serializer_dynamic_scope_methods
211
+ end
212
+
189
213
def test_nil_serialization_scope
190
214
assert_nil @controller . _serialization_scope
191
215
end
@@ -194,37 +218,35 @@ def test_nil_serialization_scope_object
194
218
assert_nil @controller . serialization_scope
195
219
end
196
220
197
- # TODO: change to NoMethodError and match 'admin?' when the
198
- # global state in Serializer._serializer_instance_methods is fixed
199
221
def test_nil_scope
200
- if Rails . version . start_with? ( '4.0' )
201
- exception_class = NoMethodError
202
- exception_matcher = 'admin?'
203
- else
204
- exception_class = NameError
205
- exception_matcher = /admin|current_user/
206
- end
207
- exception = assert_raises ( exception_class ) do
222
+ exception_matcher = /current_user/
223
+ exception = assert_raises ( NameError ) do
208
224
get :render_post_with_no_scope
209
225
end
210
226
assert_match exception_matcher , exception . message
211
227
end
212
228
213
- # TODO: run test when
214
- # global state in Serializer._serializer_instance_methods is fixed
215
- # def test_nil_scope_passed_in_current_user
216
- # get :render_post_with_passed_in_scope
217
- # expected_json = {
218
- # post: {
219
- # id: 4,
220
- # title: 'Title',
221
- # body: "The 'scope' is the 'current_user': true",
222
- # comments: [
223
- # { id: 2, body: 'Scoped' }
224
- # ]
225
- # }
226
- # }.to_json
227
- # assert_equal expected_json, @response.body
228
- # end
229
+ def test_serialization_scope_is_and_nil_scope_passed_in_current_user
230
+ get :render_post_with_passed_in_scope
231
+ expected_json = {
232
+ post : {
233
+ id : 4 ,
234
+ title : 'Title' ,
235
+ body : "The 'scope' is the 'current_user': true" ,
236
+ comments : [
237
+ { id : 2 , body : 'Scoped' }
238
+ ]
239
+ }
240
+ } . to_json
241
+ assert_equal expected_json , @response . body
242
+ end
243
+
244
+ def test_serialization_scope_is_nil_and_scope_passed_in_current_user_without_scope_name
245
+ exception_matcher = /current_user/
246
+ exception = assert_raises ( NameError ) do
247
+ get :render_post_with_passed_in_scope_without_scope_name
248
+ end
249
+ assert_match exception_matcher , exception . message
250
+ end
229
251
end
230
252
end
0 commit comments