Files
gitlab-foss/spec/support/locks.rb
2025-02-08 18:09:18 +00:00

55 lines
1.4 KiB
Ruby

# frozen_string_literal: true
RSpec.configure do |config|
lock_recorder = Gitlab::Database::LockRecorder.instance
config.before(:all, :lock_recorder) do
ApplicationRecord.alias_method :old_reload, :reload
ApplicationRecord.define_method(:reload) do |args = {}|
locked_obj = old_reload(args)
if lock_recorder.recording? && args.has_key?(:lock)
lock_recorder.add(locked_obj, normalized_lock_type(args[:lock]))
end
locked_obj
end
ActiveRecord::Relation.alias_method :old_load, :load
ActiveRecord::Relation.define_method(:load) do |&block|
loaded_objs = old_load(&block)
if lock_recorder.recording? && values.has_key?(:lock)
@records.each do |record|
lock_recorder.add(record, normalized_lock_type(values[:lock]))
end
end
loaded_objs
end
end
config.after(:each, :lock_recorder) do
lock_recorder.stop
lock_recorder.clear
end
config.after(:all, :lock_recorder) do
ApplicationRecord.alias_method :record_reload, :reload
ApplicationRecord.alias_method :reload, :old_reload
ApplicationRecord.remove_method :record_reload
ActiveRecord::Relation.alias_method :record_load, :load
ActiveRecord::Relation.alias_method :load, :old_load
ActiveRecord::Relation.remove_method :record_load
end
def normalized_lock_type(lock_type)
if lock_type == true
'FOR UPDATE'
else
lock_type
end
end
end