Skip to content

Commit 999b7ed

Browse files
committed
Transactional fixtures enlist all active database connections.
You can use multiple databases in your tests without disabling transactional fixtures.
1 parent 2e9e647 commit 999b7ed

File tree

7 files changed

+61
-10
lines changed

7 files changed

+61
-10
lines changed

activerecord/CHANGELOG

+5
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
11
*Rails 3.1.1 (unreleased)*
22

3+
* Transactional fixtures enlist all active database connections. You can test
4+
models on different connections without disabling transactional fixtures.
5+
6+
[Jeremy Kemper]
7+
38
* Add deprecation for the preload_associations method. Fixes #3022.
49

510
[Jon Leighton]

activerecord/lib/active_record/fixtures.rb

+18-6
Original file line numberDiff line numberDiff line change
@@ -842,9 +842,12 @@ def setup_fixtures
842842
@loaded_fixtures = load_fixtures
843843
@@already_loaded_fixtures[self.class] = @loaded_fixtures
844844
end
845-
ActiveRecord::Base.connection.increment_open_transactions
846-
ActiveRecord::Base.connection.transaction_joinable = false
847-
ActiveRecord::Base.connection.begin_db_transaction
845+
@fixture_connections = enlist_fixture_connections
846+
@fixture_connections.each do |connection|
847+
connection.increment_open_transactions
848+
connection.transaction_joinable = false
849+
connection.begin_db_transaction
850+
end
848851
# Load fixtures for every test.
849852
else
850853
ActiveRecord::Fixtures.reset_cache
@@ -864,13 +867,22 @@ def teardown_fixtures
864867
end
865868

866869
# Rollback changes if a transaction is active.
867-
if run_in_transaction? && ActiveRecord::Base.connection.open_transactions != 0
868-
ActiveRecord::Base.connection.rollback_db_transaction
869-
ActiveRecord::Base.connection.decrement_open_transactions
870+
if run_in_transaction?
871+
@fixture_connections.each do |connection|
872+
if connection.open_transactions != 0
873+
connection.rollback_db_transaction
874+
connection.decrement_open_transactions
875+
end
876+
end
877+
@fixture_connections.clear
870878
end
871879
ActiveRecord::Base.clear_active_connections!
872880
end
873881

882+
def enlist_fixture_connections
883+
ActiveRecord::Base.connection_handler.connection_pools.values.map(&:connection)
884+
end
885+
874886
private
875887
def load_fixtures
876888
fixtures = ActiveRecord::Fixtures.create_fixtures(fixture_path, fixture_table_names, fixture_class_names)

activerecord/test/cases/adapters/sqlite3/sqlite3_adapter_test.rb

+4
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
module ActiveRecord
66
module ConnectionAdapters
77
class SQLite3AdapterTest < ActiveRecord::TestCase
8+
self.use_transactional_fixtures = false
9+
810
class DualEncoding < ActiveRecord::Base
911
end
1012

@@ -155,6 +157,8 @@ def test_quote_binary_column_escapes_it
155157
binary = DualEncoding.new :name => 'いただきます!', :data => str
156158
binary.save!
157159
assert_equal str, binary.data
160+
161+
DualEncoding.connection.drop_table('dual_encodings')
158162
end
159163

160164
def test_execute

activerecord/test/cases/fixtures_test.rb

+27-3
Original file line numberDiff line numberDiff line change
@@ -451,14 +451,36 @@ def test_named_accessor_of_same_named_fixture
451451
class CustomConnectionFixturesTest < ActiveRecord::TestCase
452452
set_fixture_class :courses => Course
453453
fixtures :courses
454-
# Set to false to blow away fixtures cache and ensure our fixtures are loaded
455-
# and thus takes into account our set_fixture_class
456454
self.use_transactional_fixtures = false
457455

458456
def test_connection
459457
assert_kind_of Course, courses(:ruby)
460458
assert_equal Course.connection, courses(:ruby).connection
461459
end
460+
461+
def test_leaky_destroy
462+
assert_nothing_raised { courses(:ruby) }
463+
courses(:ruby).destroy
464+
end
465+
466+
def test_it_twice_in_whatever_order_to_check_for_fixture_leakage
467+
test_leaky_destroy
468+
end
469+
end
470+
471+
class TransactionalFixturesOnCustomConnectionTest < ActiveRecord::TestCase
472+
set_fixture_class :courses => Course
473+
fixtures :courses
474+
self.use_transactional_fixtures = true
475+
476+
def test_leaky_destroy
477+
assert_nothing_raised { courses(:ruby) }
478+
courses(:ruby).destroy
479+
end
480+
481+
def test_it_twice_in_whatever_order_to_check_for_fixture_leakage
482+
test_leaky_destroy
483+
end
462484
end
463485

464486
class InvalidTableNameFixturesTest < ActiveRecord::TestCase
@@ -496,7 +518,9 @@ def test_this_should_run_cleanly
496518
end
497519

498520
class FixturesBrokenRollbackTest < ActiveRecord::TestCase
499-
def blank_setup; end
521+
def blank_setup
522+
@fixture_connections = [ActiveRecord::Base.connection]
523+
end
500524
alias_method :ar_setup_fixtures, :setup_fixtures
501525
alias_method :setup_fixtures, :blank_setup
502526
alias_method :setup, :blank_setup

activerecord/test/cases/pooled_connections_test.rb

+2
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
require "timeout"
44

55
class PooledConnectionsTest < ActiveRecord::TestCase
6+
self.use_transactional_fixtures = false
7+
68
def setup
79
@per_test_teardown = []
810
@connection = ActiveRecord::Base.remove_connection

activerecord/test/cases/primary_keys_test.rb

+4
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,10 @@ def test_quoted_primary_key_after_set_primary_key
145145
k.set_primary_key "bar"
146146
assert_equal k.connection.quote_column_name("bar"), k.quoted_primary_key
147147
end
148+
end
149+
150+
class PrimaryKeyWithNoConnectionTest < ActiveRecord::TestCase
151+
self.use_transactional_fixtures = false
148152

149153
def test_set_primary_key_with_no_connection
150154
return skip("disconnect wipes in-memory db") if in_memory_db?

activerecord/test/cases/unconnected_test.rb

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ class TestRecord < ActiveRecord::Base
44
end
55

66
class TestUnconnectedAdapter < ActiveRecord::TestCase
7-
self.use_transactional_fixtures = false unless supports_savepoints?
7+
self.use_transactional_fixtures = false
88

99
def setup
1010
@underlying = ActiveRecord::Base.connection

0 commit comments

Comments
 (0)