clear and disable query cache when an exception is raised from called middleware

This commit is contained in:
Aaron Patterson
2011-08-28 14:15:51 -07:00
parent cd00e3b89d
commit a04503390f
2 changed files with 33 additions and 1 deletions

View File

@@ -61,6 +61,12 @@ module ActiveRecord
status, headers, body = @app.call(env)
[status, headers, BodyProxy.new(old, body)]
rescue Exception => e
ActiveRecord::Base.connection.clear_query_cache
unless old
ActiveRecord::Base.connection.disable_query_cache!
end
raise e
end
end
end

View File

@@ -13,6 +13,32 @@ class QueryCacheTest < ActiveRecord::TestCase
ActiveRecord::Base.connection.disable_query_cache!
end
def test_exceptional_middleware_clears_and_disables_cache_on_error
assert !ActiveRecord::Base.connection.query_cache_enabled, 'cache off'
mw = ActiveRecord::QueryCache.new lambda { |env|
Task.find 1
Task.find 1
assert_equal 1, ActiveRecord::Base.connection.query_cache.length
raise "lol borked"
}
assert_raises(RuntimeError) { mw.call({}) }
assert_equal 0, ActiveRecord::Base.connection.query_cache.length
assert !ActiveRecord::Base.connection.query_cache_enabled, 'cache off'
end
def test_exceptional_middleware_leaves_enabled_cache_alone
ActiveRecord::Base.connection.enable_query_cache!
mw = ActiveRecord::QueryCache.new lambda { |env|
raise "lol borked"
}
assert_raises(RuntimeError) { mw.call({}) }
assert ActiveRecord::Base.connection.query_cache_enabled, 'cache off'
end
def test_middleware_delegates
called = false
mw = ActiveRecord::QueryCache.new lambda { |env|
@@ -213,4 +239,4 @@ class QueryCacheBodyProxyTest < ActiveRecord::TestCase
assert_equal proxy.to_path, "/path"
end
end
end