public
Description: Ruby on Rails
Homepage: http://rubyonrails.org
Clone URL: git://github.com/rails/rails.git
Add assert_sql helper method to check for specific SQL output in Active Record 
test suite. [#325 state:resolved]

Signed-off-by: Pratik Naik <pratiknaik@gmail.com>
dasil003 (author)
Tue Jun 03 13:50:42 -0700 2008
lifo (committer)
Mon Jul 14 15:22:39 -0700 2008
commit  cd9b24286a90111a08002e0da753198c5fb2432a
tree    3edbdc4ddfaa8ea9ba5819e1a31afcd4f3b5ab1f
parent  2d6562d51b96af518c1eb2947d6d34d5dd5bad12
...
22
23
24
 
 
 
 
 
 
 
 
 
 
 
25
26
 
27
28
29
 
30
31
32
...
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
 
37
38
39
 
40
41
42
43
0
@@ -22,11 +22,22 @@ module ActiveRecord
0
       end
0
     end
0
 
0
+    def assert_sql(*patterns_to_match)
0
+      $queries_executed = []
0
+      yield
0
+    ensure
0
+      failed_patterns = []
0
+      patterns_to_match.each do |pattern|
0
+        failed_patterns << pattern unless $queries_executed.any?{ |sql| pattern === sql }
0
+      end
0
+      assert failed_patterns.empty?, "Query pattern(s) #{failed_patterns.map(&:inspect).join(', ')} not found."
0
+    end
0
+
0
     def assert_queries(num = 1)
0
-      $query_count = 0
0
+      $queries_executed = []
0
       yield
0
     ensure
0
-      assert_equal num, $query_count, "#{$query_count} instead of #{num} queries were executed."
0
+      assert_equal num, $queries_executed.size, "#{$queries_executed.size} instead of #{num} queries were executed."
0
     end
0
 
0
     def assert_no_queries(&block)
...
32
33
34
35
36
37
38
 
 
 
 
39
40
41
 
42
43
44
...
32
33
34
 
 
 
 
35
36
37
38
39
40
 
41
42
43
44
0
@@ -32,13 +32,13 @@ end
0
 ActiveRecord::Base.connection.class.class_eval do
0
   IGNORED_SQL = [/^PRAGMA/, /^SELECT currval/, /^SELECT CAST/, /^SELECT @@IDENTITY/, /^SELECT @@ROWCOUNT/]
0
 
0
-  def execute_with_counting(sql, name = nil, &block)
0
-    $query_count ||= 0
0
-    $query_count  += 1 unless IGNORED_SQL.any? { |r| sql =~ r }
0
-    execute_without_counting(sql, name, &block)
0
+  def execute_with_query_record(sql, name = nil, &block)
0
+    $queries_executed ||= []
0
+    $queries_executed << sql unless IGNORED_SQL.any? { |r| sql =~ r }
0
+    execute_without_query_record(sql, name, &block)
0
   end
0
 
0
-  alias_method_chain :execute, :counting
0
+  alias_method_chain :execute, :query_record
0
 end
0
 
0
 # Make with_scope public for tests

Comments