-
Notifications
You must be signed in to change notification settings - Fork 561
Expand file tree
/
Copy pathquery_assertions.rb
More file actions
71 lines (59 loc) · 2.85 KB
/
query_assertions.rb
File metadata and controls
71 lines (59 loc) · 2.85 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
module ARTest
module SQLServer
module QueryAssertions
def assert_queries_count(count = nil, include_schema: false, &block)
ActiveRecord::Base.lease_connection.materialize_transactions
counter = ActiveRecord::Assertions::QueryAssertions::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
# Start of monkey-patch
queries = include_release_savepoint_placeholder_queries(queries)
# End of monkey-patch
if count
assert_equal count, queries.size, "#{queries.size} instead of #{count} queries were executed#{". Queries:\n\n#{queries.join("\n\n")}" unless queries.empty?}"
else
assert_operator queries.size, :>=, 1, "1 or more queries expected, but none were executed"
end
result
end
end
def assert_queries_and_values_match(match, bound_values = [], count: nil, &block)
ActiveRecord::Base.lease_connection.materialize_transactions
counter = ActiveRecord::Assertions::QueryAssertions::SQLCounter.new
ActiveSupport::Notifications.subscribed(counter, "sql.active_record") do
result = _assert_nothing_raised_or_warn("assert_queries_match", &block)
queries = counter.log_full
matched_queries = queries.select do |query, values|
values = values.map { |v| v.respond_to?(:quoted) ? v.quoted : v }
match === query && bound_values === values
end
if count
assert_equal count, matched_queries.size, "#{matched_queries.size} instead of #{count} queries were executed.#{"\nQueries:\n#{counter.log.join("\n")}" unless count.log.empty?}"
else
assert_operator matched_queries.size, :>=, 1, "1 or more queries expected, but none were executed.#{"\nQueries:\n#{counter.log.join("\n")}" unless counter.log.empty?}"
end
result
end
end
private
# Rails tests expect a save-point to be created and released. SQL Server does not release
# save-points and so the number of queries will be off. This monkey patch adds a placeholder queries
# to replace the missing save-point releases.
def include_release_savepoint_placeholder_queries(queries)
grouped_queries = [[]]
queries.each do |query|
if /SAVE TRANSACTION \S+/.match?(query)
grouped_queries << [query]
else
grouped_queries.last << query
end
end
grouped_queries.each do |group|
group.append "/* release savepoint placeholder for testing */" if /SAVE TRANSACTION \S+/.match?(group.first)
end
grouped_queries.flatten
end
end
end
end