Skip to content

Commit e07613b

Browse files
committed
Assert mutating reflection is not thread-safe
1 parent 629aa8c commit e07613b

File tree

1 file changed

+31
-0
lines changed

1 file changed

+31
-0
lines changed

test/serializers/reflection_test.rb

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -213,6 +213,37 @@ def test_no_href_in_vanilla_reflection
213213
end
214214
assert_match(/undefined method `href'/, exception.message)
215215
end
216+
217+
def test_mutating_reflection_block_is_not_thread_safe
218+
serializer_class = Class.new(ActiveModel::Serializer) do
219+
has_one :blog do
220+
meta(id: object.blog.id)
221+
end
222+
end
223+
model1_meta = @expected_meta
224+
# Evaluate reflection meta for model with id 1
225+
serializer_instance = serializer_class.new(@model, @instance_options)
226+
reflection = serializer_class._reflections.fetch(:blog)
227+
assert_nil reflection.instance_variable_get(:@_meta)
228+
association = reflection.build_association(serializer_instance, @instance_options)
229+
assert_equal model1_meta, association.meta
230+
assert_equal model1_meta, reflection.instance_variable_get(:@_meta)
231+
232+
model2_meta = @expected_meta.merge(id: 2)
233+
# Evaluate reflection meta for model with id 2
234+
@model.blog.id = 2
235+
assert_equal 2, @model.blog.id # sanity check
236+
serializer_instance = serializer_class.new(@model, @instance_options)
237+
reflection = serializer_class._reflections.fetch(:blog)
238+
239+
# WARN: Thread-safety issue
240+
# Before the reflection is evaluated, it has the value from the previous evaluation
241+
assert_equal model1_meta, reflection.instance_variable_get(:@_meta)
242+
243+
association = reflection.build_association(serializer_instance, @instance_options)
244+
assert_equal model2_meta, association.meta
245+
assert_equal model2_meta, reflection.instance_variable_get(:@_meta)
246+
end
216247
end
217248
end
218249
end

0 commit comments

Comments
 (0)