1
0
Fork 0
mirror of https://github.com/rails/rails.git synced 2022-11-09 12:12:34 -05:00
rails--rails/activerecord/test/cases/explain_test.rb
Xavier Noria de24ed9f2d removes the convenience instance version of AR::Base.silence_auto_explain
Rationale: As discussed with José and Jon, this convenience
shortcut is not clearly justified and it could let the user
thing the disabled EXPLAINs are related to the model instance
rather than being globally disabled.
2011-12-03 14:26:34 +01:00

99 lines
2.7 KiB
Ruby

require 'cases/helper'
require 'models/car'
require 'active_support/core_ext/string/strip'
if ActiveRecord::Base.connection.supports_explain?
class ExplainTest < ActiveRecord::TestCase
fixtures :cars
def base
ActiveRecord::Base
end
def connection
base.connection
end
def test_logging_query_plan
base.logger.expects(:warn).with do |value|
value.starts_with?('EXPLAIN for:')
end
with_threshold(0) do
Car.where(:name => 'honda').all
end
end
def test_collecting_sqls_for_explain
base.auto_explain_threshold_in_seconds = nil
honda = cars(:honda)
expected_sqls = []
expected_binds = []
callback = lambda do |*args|
payload = args.last
unless base.ignore_explain_notification?(payload)
expected_sqls << payload[:sql]
expected_binds << payload[:binds]
end
end
result = sqls = binds = nil
ActiveSupport::Notifications.subscribed(callback, "sql.active_record") do
with_threshold(0) do
result, sqls, binds = base.collecting_sqls_for_explain {
Car.where(:name => 'honda').all
}
end
end
assert_equal result, [honda]
assert_equal expected_sqls, sqls
assert_equal expected_binds, binds
end
def test_exec_explain_with_no_binds
sqls = %w(foo bar)
binds = [[], []]
connection.stubs(:explain).returns('query plan foo', 'query plan bar')
expected = sqls.map {|sql| "EXPLAIN for: #{sql}\nquery plan #{sql}"}.join("\n")
assert_equal expected, base.exec_explain(sqls, binds)
end
def test_exec_explain_with_binds
cols = [Object.new, Object.new]
cols[0].expects(:name).returns('wadus')
cols[1].expects(:name).returns('chaflan')
sqls = %w(foo bar)
binds = [[[cols[0], 1]], [[cols[1], 2]]]
connection.stubs(:explain).returns("query plan foo\n", "query plan bar\n")
expected = <<-SQL.strip_heredoc
EXPLAIN for: #{sqls[0]} [["wadus", 1]]
query plan foo
EXPLAIN for: #{sqls[1]} [["chaflan", 2]]
query plan bar
SQL
assert_equal expected, base.exec_explain(sqls, binds)
end
def test_silence_auto_explain
base.expects(:collecting_sqls_for_explain).never
base.logger.expects(:warn).never
base.silence_auto_explain do
with_threshold(0) { Car.all }
end
end
def with_threshold(threshold)
current_threshold = base.auto_explain_threshold_in_seconds
base.auto_explain_threshold_in_seconds = threshold
yield
ensure
base.auto_explain_threshold_in_seconds = current_threshold
end
end
end