Module: ActiveRecord::Assertions::QueryAssertions
- Defined in:
- lib/active_record/testing/query_assertions.rb
Defined Under Namespace
Classes: SQLCounter
Instance Method Summary collapse
-
#assert_no_queries(include_schema: false, &block) ⇒ Object
Asserts that no SQL queries are executed in the given block.
-
#assert_no_queries_match(match, include_schema: false, &block) ⇒ Object
Asserts that no SQL queries matching the pattern are executed in the given block.
-
#assert_queries_count(count = nil, include_schema: false, &block) ⇒ Object
Asserts that the number of SQL queries executed in the given block matches the expected count.
-
#assert_queries_match(match, count: nil, include_schema: false, &block) ⇒ Object
Asserts that the SQL queries executed in the given block match expected pattern.
Instance Method Details
#assert_no_queries(include_schema: false, &block) ⇒ Object
Asserts that no SQL queries are executed in the given block.
assert_no_queries { post.comments }
If the :include_schema
option is provided, any queries (including schema related) are counted.
assert_no_queries(include_schema: true) { Post.columns }
42 43 44 |
# File 'lib/active_record/testing/query_assertions.rb', line 42 def assert_no_queries(include_schema: false, &block) assert_queries_count(0, include_schema: include_schema, &block) end |
#assert_no_queries_match(match, include_schema: false, &block) ⇒ Object
Asserts that no SQL queries matching the pattern are executed in the given block.
assert_no_queries_match(/SELECT/i) { post.comments }
If the :include_schema
option is provided, any queries (including schema related) that match the matcher are counted.
assert_no_queries_match(/FROM pg_attribute/i, include_schema: true) { Post.columns }
87 88 89 |
# File 'lib/active_record/testing/query_assertions.rb', line 87 def assert_no_queries_match(match, include_schema: false, &block) assert_queries_match(match, count: 0, include_schema: include_schema, &block) end |
#assert_queries_count(count = nil, include_schema: false, &block) ⇒ Object
Asserts that the number of SQL queries executed in the given block matches the expected count.
# Check for exact number of queries
assert_queries_count(1) { Post.first }
# Check for any number of queries
assert_queries_count { Post.first }
If the :include_schema
option is provided, any queries (including schema related) are counted.
assert_queries_count(1, include_schema: true) { Post.columns }
18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
# File 'lib/active_record/testing/query_assertions.rb', line 18 def assert_queries_count(count = nil, include_schema: false, &block) ActiveRecord::Base.lease_connection.materialize_transactions counter = SQLCounter.new ActiveSupport::Notifications.subscribed(counter, "sql.active_record") do result = _assert_nothing_raised_or_warn("assert_queries_count", &block) queries = include_schema ? counter.log_all : counter.log if count assert_equal count, queries.size, "#{queries.size} instead of #{count} queries were executed. Queries: #{queries.join("\n\n")}" else assert_operator queries.size, :>=, 1, "1 or more queries expected, but none were executed.#{queries.empty? ? '' : "\nQueries:\n#{queries.join("\n")}"}" end result end end |
#assert_queries_match(match, count: nil, include_schema: false, &block) ⇒ Object
Asserts that the SQL queries executed in the given block match expected pattern.
# Check for exact number of queries
assert_queries_match(/LIMIT \?/, count: 1) { Post.first }
# Check for any number of queries
assert_queries_match(/LIMIT \?/) { Post.first }
If the :include_schema
option is provided, any queries (including schema related) that match the matcher are considered.
assert_queries_match(/FROM pg_attribute/i, include_schema: true) { Post.columns }
59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 |
# File 'lib/active_record/testing/query_assertions.rb', line 59 def assert_queries_match(match, count: nil, include_schema: false, &block) ActiveRecord::Base.lease_connection.materialize_transactions counter = SQLCounter.new ActiveSupport::Notifications.subscribed(counter, "sql.active_record") do result = _assert_nothing_raised_or_warn("assert_queries_match", &block) queries = include_schema ? counter.log_all : counter.log matched_queries = queries.select { |query| match === query } if count assert_equal count, matched_queries.size, "#{matched_queries.size} instead of #{count} queries were executed.#{queries.empty? ? '' : "\nQueries:\n#{queries.join("\n")}"}" else assert_operator matched_queries.size, :>=, 1, "1 or more queries expected, but none were executed.#{queries.empty? ? '' : "\nQueries:\n#{queries.join("\n")}"}" end result end end |