Utilize RequestStore for thread-safe PaperTrail#paper_trail_store object
This commit is contained in:
parent
3c13949d98
commit
e28d29ef0f
|
@ -1,3 +1,5 @@
|
|||
require 'request_store'
|
||||
|
||||
# Require core library
|
||||
Dir[File.join(File.dirname(__FILE__), 'paper_trail', '*.rb')].each do |file|
|
||||
require File.join('paper_trail', File.basename(file, '.rb'))
|
||||
|
@ -118,7 +120,7 @@ module PaperTrail
|
|||
# Thread-safe hash to hold PaperTrail's data.
|
||||
# Initializing with needed default values.
|
||||
def self.paper_trail_store
|
||||
Thread.current[:paper_trail] ||= { :request_enabled_for_controller => true }
|
||||
RequestStore.store[:paper_trail] ||= { :request_enabled_for_controller => true }
|
||||
end
|
||||
|
||||
# Returns PaperTrail's configuration object.
|
||||
|
|
|
@ -5,6 +5,7 @@ module PaperTrail
|
|||
|
||||
# Register this module inside your Sinatra application to gain access to controller-level methods used by PaperTrail
|
||||
def self.registered(app)
|
||||
app.use RequestStore::Middleware
|
||||
app.helpers self
|
||||
app.before { set_paper_trail_whodunnit }
|
||||
end
|
||||
|
|
|
@ -21,6 +21,7 @@ Gem::Specification.new do |s|
|
|||
|
||||
s.add_dependency 'activerecord', ['>= 3.0', '< 6.0']
|
||||
s.add_dependency 'activesupport', ['>= 3.0', '< 6.0']
|
||||
s.add_dependency 'request_store', '~> 1.1.0'
|
||||
|
||||
s.add_development_dependency 'rake', '~> 10.1.1'
|
||||
s.add_development_dependency 'shoulda', '~> 3.5'
|
||||
|
|
|
@ -9,7 +9,6 @@ describe "Articles management", :type => :request, :order => :defined do
|
|||
it "should not create a version" do
|
||||
expect(PaperTrail).to be_enabled_for_controller
|
||||
expect { post(articles_path, valid_params) }.to_not change(PaperTrail::Version, :count)
|
||||
expect(PaperTrail).not_to be_enabled_for_controller
|
||||
end
|
||||
|
||||
it "should not leak the state of the `PaperTrail.enabled_for_controller?` into the next test" do
|
||||
|
@ -24,7 +23,6 @@ describe "Articles management", :type => :request, :order => :defined do
|
|||
it "should set that value as the `whodunnit`" do
|
||||
expect { post articles_path, valid_params }.to change(PaperTrail::Version, :count).by(1)
|
||||
expect(article.title).to eq('Doh')
|
||||
expect(PaperTrail.whodunnit).to eq('foobar')
|
||||
expect(article.versions.last.whodunnit).to eq('foobar')
|
||||
end
|
||||
end
|
||||
|
|
|
@ -7,8 +7,10 @@ class ControllerTest < ActionController::TestCase
|
|||
@request.env['REMOTE_ADDR'] = '127.0.0.1'
|
||||
end
|
||||
|
||||
# Mimick what RequestStore will do outside of the test env, since it is
|
||||
# middleware, and doesn't get executed in controller / request specs
|
||||
teardown do
|
||||
PaperTrail.enabled_for_controller = true
|
||||
RequestStore.store[:paper_trail] = nil
|
||||
end
|
||||
|
||||
test 'disable on create' do
|
||||
|
@ -82,7 +84,7 @@ class ControllerTest < ActionController::TestCase
|
|||
@request.env['HTTP_USER_AGENT'] = 'Disable User-Agent'
|
||||
post :create, :widget => { :name => 'Flugel' }
|
||||
assert_equal 0, assigns(:widget).versions.length
|
||||
assert !PaperTrail.enabled_for_controller?
|
||||
assert !PaperTrail.enabled_for_controller?
|
||||
assert PaperTrail.whodunnit.nil?
|
||||
assert PaperTrail.controller_info.nil?
|
||||
end
|
||||
|
|
Loading…
Reference in New Issue