123456789_123456789_123456789_123456789_123456789_

Module: ActiveRecord::TestFixtures

Relationships & Source Files
Namespace Children
Modules:
Super Chains via Extension / Inclusion / Inheritance
Class Chain:
Defined in: activerecord/lib/active_record/test_fixtures.rb

Class Method Summary

::ActiveSupport::Concern - Extended

class_methods

Define class methods from given block.

included

Evaluate given block in context of base class, so that you can write class macros here.

prepended

Evaluate given block in context of base class, so that you can write class macros here.

Instance Attribute Summary

Instance Method Summary

DSL Calls

included

[ GitHub ]


19
20
21
22
23
24
25
26
27
# File 'activerecord/lib/active_record/test_fixtures.rb', line 19

included do
  class_attribute :fixture_path, instance_writer: false
  class_attribute :fixture_table_names, default: []
  class_attribute :fixture_class_names, default: {}
  class_attribute :use_transactional_tests, default: true
  class_attribute :use_instantiated_fixtures, default: false # true, false, or :no_instances
  class_attribute :pre_loaded_fixtures, default: false
  class_attribute :lock_threads, default: true
end

Instance Attribute Details

#run_in_transaction?Boolean (readonly)

[ GitHub ]

  
# File 'activerecord/lib/active_record/test_fixtures.rb', line 100

def run_in_transaction?
  use_transactional_tests &&
    !self.class.uses_transaction?(name)
end

Instance Method Details

#enlist_fixture_connections

[ GitHub ]

  
# File 'activerecord/lib/active_record/test_fixtures.rb', line 186

def enlist_fixture_connections
  setup_shared_connection_pool

  ActiveRecord::Base.connection_handler.connection_pool_list.map(&:connection)
end

#setup_fixtures(config = ActiveRecord::Base)

[ GitHub ]

  
# File 'activerecord/lib/active_record/test_fixtures.rb', line 105

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
  @legacy_saved_pool_configs = Hash.new { |hash, key| hash[key] = {} }
  @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|
      spec_name = payload[:spec_name] if payload.key?(:spec_name)
      shard = payload[:shard] if payload.key?(:shard)
      setup_shared_connection_pool if ActiveRecord::Base.legacy_connection_handling

      if spec_name
        begin
          connection = ActiveRecord::Base.connection_handler.retrieve_connection(spec_name, shard: shard)
        rescue ConnectionNotEstablished
          connection = nil
        end

        if connection
          setup_shared_connection_pool unless ActiveRecord::Base.legacy_connection_handling

          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

[ GitHub ]

  
# File 'activerecord/lib/active_record/test_fixtures.rb', line 169

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.clear_active_connections!
end