Skip to content

Commit e8255d3

Browse files
committed
Monkey-patch assert_queries_count
1 parent 559c8e5 commit e8255d3

File tree

3 files changed

+37
-3
lines changed

3 files changed

+37
-3
lines changed

lib/active_record/connection_adapters/sqlserver/savepoints.rb

+3-2
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,9 @@ def exec_rollback_to_savepoint(name = current_savepoint_name)
1616
internal_execute("ROLLBACK TRANSACTION #{name}", "TRANSACTION")
1717
end
1818

19-
def release_savepoint(name)
20-
internal_execute("/* release #{name} savepoint */", "TRANSACTION")
19+
# SQL Server does require save-points to be explicitly released.
20+
# See https://stackoverflow.com/questions/3101312/sql-server-2008-no-release-savepoint-for-current-transaction
21+
def release_savepoint(_name)
2122
end
2223
end
2324
end

test/cases/helper_sqlserver.rb

+3-1
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
require "support/load_schema_sqlserver"
1212
require "support/coerceable_test_sqlserver"
1313
require "support/connection_reflection"
14+
require "support/query_assertions"
1415
require "mocha/minitest"
1516

1617
module ActiveRecord
@@ -19,7 +20,8 @@ class TestCase < ActiveSupport::TestCase
1920

2021
include ARTest::SQLServer::CoerceableTest,
2122
ARTest::SQLServer::ConnectionReflection,
22-
ActiveSupport::Testing::Stream
23+
ActiveSupport::Testing::Stream,
24+
ARTest::SQLServer::QueryAssertions
2325

2426
let(:logger) { ActiveRecord::Base.logger }
2527

test/support/query_assertions.rb

+31
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
module ARTest
2+
module SQLServer
3+
module QueryAssertions
4+
def assert_queries_count(count = nil, include_schema: false, &block)
5+
ActiveRecord::Base.lease_connection.materialize_transactions
6+
7+
counter = ActiveRecord::Assertions::QueryAssertions::SQLCounter.new
8+
ActiveSupport::Notifications.subscribed(counter, "sql.active_record") do
9+
result = _assert_nothing_raised_or_warn("assert_queries_count", &block)
10+
queries = include_schema ? counter.log_all : counter.log
11+
12+
# Start of monkey-patch
13+
# Rails tests expect a save-point to be released at the end of the test. SQL Server does not release
14+
# save-points and so the number of queries will be off by one. This monkey patch adds a placeholder query
15+
# to the end of the queries array to account for the missing save-point release.
16+
if queries.any? { |query| query =~ /SAVE TRANSACTION \S+/ }
17+
queries.append "/* release savepoint placeholder for testing */"
18+
end
19+
# End of monkey-patch
20+
21+
if count
22+
assert_equal count, queries.size, "#{queries.size} instead of #{count} queries were executed. Queries: #{queries.join("\n\n")}"
23+
else
24+
assert_operator queries.size, :>=, 1, "1 or more queries expected, but none were executed.#{queries.empty? ? '' : "\nQueries:\n#{queries.join("\n")}"}"
25+
end
26+
result
27+
end
28+
end
29+
end
30+
end
31+
end

0 commit comments

Comments
 (0)