aboutsummaryrefslogtreecommitdiffstats
path: root/activerecord/test
diff options
context:
space:
mode:
Diffstat (limited to 'activerecord/test')
-rwxr-xr-xactiverecord/test/abstract_unit.rb36
-rw-r--r--activerecord/test/query_cache_test.rb80
2 files changed, 100 insertions, 16 deletions
diff --git a/activerecord/test/abstract_unit.rb b/activerecord/test/abstract_unit.rb
index 3fd94afc00..5a15871279 100755
--- a/activerecord/test/abstract_unit.rb
+++ b/activerecord/test/abstract_unit.rb
@@ -36,16 +36,10 @@ class Test::Unit::TestCase #:nodoc:
end
def assert_queries(num = 1)
- ActiveRecord::Base.connection.class.class_eval do
- self.query_count = 0
- alias_method :execute, :execute_with_query_counting
- end
+ $query_count = 0
yield
ensure
- ActiveRecord::Base.connection.class.class_eval do
- alias_method :execute, :execute_without_query_counting
- end
- assert_equal num, ActiveRecord::Base.connection.query_count, "#{ActiveRecord::Base.connection.query_count} instead of #{num} queries were executed."
+ assert_equal num, $query_count, "#{$query_count} instead of #{num} queries were executed."
end
def assert_no_queries(&block)
@@ -60,16 +54,26 @@ def current_adapter?(*types)
end
end
-ActiveRecord::Base.connection.class.class_eval do
- cattr_accessor :query_count
+def uses_mocha(test_name)
+ require 'mocha'
+ require 'stubba'
+ yield
+rescue LoadError
+ $stderr.puts "Skipping #{test_name} tests. `gem install mocha` and try again."
+end
- # Array of regexes of queries that are not counted against query_count
- @@ignore_list = [/^SELECT currval/, /^SELECT CAST/, /^SELECT @@IDENTITY/]
+ActiveRecord::Base.connection.class.class_eval do
+
+ if not (const_get('IGNORED_SQL') rescue nil)
+ IGNORED_SQL = [/^PRAGMA/, /^SELECT currval/, /^SELECT CAST/, /^SELECT @@IDENTITY/]
+
+ def execute_with_counting(sql, name = nil, &block)
+ $query_count ||= 0
+ $query_count += 1 unless IGNORED_SQL.any? { |r| sql =~ r }
+ execute_without_counting(sql, name, &block)
+ end
- alias_method :execute_without_query_counting, :execute
- def execute_with_query_counting(sql, name = nil, &block)
- self.query_count += 1 unless @@ignore_list.any? { |r| sql =~ r }
- execute_without_query_counting(sql, name, &block)
+ alias_method_chain :execute, :counting
end
end
diff --git a/activerecord/test/query_cache_test.rb b/activerecord/test/query_cache_test.rb
new file mode 100644
index 0000000000..5326351483
--- /dev/null
+++ b/activerecord/test/query_cache_test.rb
@@ -0,0 +1,80 @@
+require 'abstract_unit'
+require 'fixtures/topic'
+require 'fixtures/reply'
+require 'fixtures/task'
+
+
+class QueryCacheTest < Test::Unit::TestCase
+ fixtures :tasks
+
+
+ def test_find_queries
+ assert_queries(2) { Task.find(1); Task.find(1) }
+ end
+
+ def test_find_queries_with_cache
+ Task.cache do
+ assert_queries(1) { Task.find(1); Task.find(1) }
+ end
+ end
+
+ def test_find_queries_with_cache
+ Task.cache do
+ assert_queries(1) { Task.find(1); Task.find(1) }
+ end
+ end
+
+ def test_cache_is_scoped_on_actual_class_only
+ Task.cache do
+ assert_queries(2) { Topic.find(1); Topic.find(1) }
+ end
+ end
+end
+
+uses_mocha('QueryCacheExpiryTest') do
+
+class QueryCacheExpiryTest < Test::Unit::TestCase
+ fixtures :tasks
+
+ def test_find
+ ActiveRecord::QueryCache.any_instance.expects(:clear_query_cache).times(0)
+
+ Task.cache do
+ Task.find(1)
+ end
+ end
+
+ def test_save
+ ActiveRecord::QueryCache.any_instance.expects(:clear_query_cache).times(1)
+
+ Task.cache do
+ Task.find(1).save
+ end
+ end
+
+ def test_destroy
+ ActiveRecord::QueryCache.any_instance.expects(:clear_query_cache).at_least_once
+
+ Task.cache do
+ Task.find(1).destroy
+ end
+ end
+
+ def test_create
+ ActiveRecord::QueryCache.any_instance.expects(:clear_query_cache).times(1)
+
+ Task.cache do
+ Task.create!
+ end
+ end
+
+ def test_new_save
+ ActiveRecord::QueryCache.any_instance.expects(:clear_query_cache).times(1)
+
+ Task.cache do
+ Task.new.save
+ end
+ end
+end
+
+end \ No newline at end of file