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

Dynamic Method Handling

This class handles dynamic methods through the method_missing method

#method_missing(name, *args, **kwargs, &block) (private)

[ GitHub ]

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

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

DSL Calls

included

[ GitHub ]


20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
# File 'activerecord/lib/active_record/test_fixtures.rb', line 20

included do
  ##
  # :singleton-method: fixture_paths
  #
  # Returns the ActiveRecord::FixtureSet collection

  ##
  # :singleton-method: fixture_paths=
  #
  # :call-seq:
  #   fixture_paths=(fixture_paths)
  class_attribute :fixture_paths, instance_writer: false, default: []
  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
  class_attribute :fixture_sets, default: {}

  ActiveSupport.run_load_hooks(:active_record_fixtures, self)
end

Instance Attribute Details

#run_in_transaction?Boolean (readonly)

[ GitHub ]

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

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 206

def enlist_fixture_connections
  setup_shared_connection_pool

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

#setup_fixtures(config = ActiveRecord::Base)

[ GitHub ]

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

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

[ GitHub ]

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

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