Module: ActiveRecord::TestFixtures
- Extended by:
- ActiveSupport::Concern
- Defined in:
- lib/active_record/test_fixtures.rb
Defined Under Namespace
Modules: ClassMethods
Instance Method Summary collapse
-
#after_teardown ⇒ Object
:nodoc:.
-
#before_setup ⇒ Object
:nodoc:.
- #enlist_fixture_connections ⇒ Object
-
#fixture_path ⇒ Object
:nodoc:.
- #run_in_transaction? ⇒ Boolean
- #setup_fixtures(config = ActiveRecord::Base) ⇒ Object
- #teardown_fixtures ⇒ Object
Dynamic Method Handling
This class handles dynamic methods through the method_missing method
#method_missing(name, *args, **kwargs, &block) ⇒ Object (private)
274 275 276 277 278 279 280 |
# File 'lib/active_record/test_fixtures.rb', line 274 def method_missing(name, *args, **kwargs, &block) if fs_name = fixture_sets[name.to_s] access_fixture(fs_name, *args, **kwargs, &block) else super end end |
Instance Method Details
#after_teardown ⇒ Object
:nodoc:
14 15 16 17 |
# File 'lib/active_record/test_fixtures.rb', line 14 def after_teardown # :nodoc: super teardown_fixtures end |
#before_setup ⇒ Object
:nodoc:
9 10 11 12 |
# File 'lib/active_record/test_fixtures.rb', line 9 def before_setup # :nodoc: setup_fixtures super end |
#enlist_fixture_connections ⇒ Object
205 206 207 208 209 |
# File 'lib/active_record/test_fixtures.rb', line 205 def enlist_fixture_connections setup_shared_connection_pool ActiveRecord::Base.connection_handler.connection_pool_list(:writing).map(&:connection) end |
#fixture_path ⇒ Object
:nodoc:
112 113 114 115 116 117 118 119 |
# File 'lib/active_record/test_fixtures.rb', line 112 def fixture_path # :nodoc: ActiveRecord.deprecator.warn(<<~WARNING) TestFixtures#fixture_path is deprecated and will be removed in Rails 7.2. Use #fixture_paths instead. If multiple fixture paths have been configured with #fixture_paths, then #fixture_path will just return the first path. WARNING fixture_paths.first end |
#run_in_transaction? ⇒ Boolean
121 122 123 124 |
# File 'lib/active_record/test_fixtures.rb', line 121 def run_in_transaction? use_transactional_tests && !self.class.uses_transaction?(name) end |
#setup_fixtures(config = ActiveRecord::Base) ⇒ Object
126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 |
# File 'lib/active_record/test_fixtures.rb', line 126 def setup_fixtures(config = ActiveRecord::Base) if pre_loaded_fixtures && !use_transactional_tests raise RuntimeError, "pre_loaded_fixtures requires use_transactional_tests" end @fixture_cache = {} @fixture_connections = [] @@already_loaded_fixtures ||= {} @connection_subscriber = nil @saved_pool_configs = Hash.new { |hash, key| hash[key] = {} } # Load fixtures once and begin transaction. if run_in_transaction? if @@already_loaded_fixtures[self.class] @loaded_fixtures = @@already_loaded_fixtures[self.class] else @loaded_fixtures = load_fixtures(config) @@already_loaded_fixtures[self.class] = @loaded_fixtures end # Begin transactions for connections already established @fixture_connections = enlist_fixture_connections @fixture_connections.each do |connection| connection.begin_transaction joinable: false, _lazy: false connection.pool.lock_thread = true if lock_threads end # When connections are established in the future, begin a transaction too @connection_subscriber = ActiveSupport::Notifications.subscribe("!connection.active_record") do |_, _, _, _, payload| connection_name = payload[:connection_name] if payload.key?(:connection_name) shard = payload[:shard] if payload.key?(:shard) if connection_name begin connection = ActiveRecord::Base.connection_handler.retrieve_connection(connection_name, shard: shard) rescue ConnectionNotEstablished connection = nil end if connection setup_shared_connection_pool if !@fixture_connections.include?(connection) connection.begin_transaction joinable: false, _lazy: false connection.pool.lock_thread = true if lock_threads @fixture_connections << connection end end end end # Load fixtures for every test. else ActiveRecord::FixtureSet.reset_cache @@already_loaded_fixtures[self.class] = nil @loaded_fixtures = load_fixtures(config) end # Instantiate fixtures for every test if requested. instantiate_fixtures if use_instantiated_fixtures end |
#teardown_fixtures ⇒ Object
188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 |
# File 'lib/active_record/test_fixtures.rb', line 188 def teardown_fixtures # Rollback changes if a transaction is active. if run_in_transaction? ActiveSupport::Notifications.unsubscribe(@connection_subscriber) if @connection_subscriber @fixture_connections.each do |connection| connection.rollback_transaction if connection.transaction_open? connection.pool.lock_thread = false end @fixture_connections.clear teardown_shared_connection_pool else ActiveRecord::FixtureSet.reset_cache end ActiveRecord::Base.connection_handler.clear_active_connections!(:all) end |