module TestSeeds

Public Instance Methods

load_fixtures() click to toggle source

Load fixture is called once for each test class which is a good place to inject db transactions and to create the seeds.

Calls superclass method
# File lib/test_seeds.rb, line 115
def load_fixtures
  if ActiveRecord::Base.connection.open_transactions != 0
    ActiveRecord::Base.connection.decrement_open_transactions
    ActiveRecord::Base.connection.rollback_db_transaction
  end
  ActiveRecord::Base.clear_active_connections!

  # In Rails 3.0.x, load_fixtures sets the @loades_fixtures instance variable. In Rails 3.1, load_fixtures returns the
  # fixtures which are then assigned to @loaded_fixtures by the caller. The following line ensures compability with
  # Rails 3.1.
  result = super
  @loaded_fixtures = result if result.is_a? Hash

  if run_in_transaction?
    ActiveRecord::Base.connection.begin_db_transaction
    ActiveRecord::Base.connection.increment_open_transactions
    ActiveRecord::Base.connection.transaction_joinable = false
  end
  
  load_seed_fixtures
  
  @loaded_fixtures
end
load_seed_fixtures() click to toggle source
# File lib/test_seeds.rb, line 167
def load_seed_fixtures
  ActiveRecord::Base.connection.transaction(:requires_new => true) do
    _run_seed_callbacks
  end
end
set_seed_fixture(seed_name, seed_model) click to toggle source
# File lib/test_seeds.rb, line 157
def set_seed_fixture(seed_name, seed_model)
  raise "Seed fixture must be an instance of ActiveRecord::Base" unless seed_model.is_a? ActiveRecord::Base
  
  seed_class = seed_model.class
  fixture = { seed_class.primary_key => seed_model.send(seed_class.primary_key) }
  @loaded_fixtures[seed_class.table_name][seed_name.to_s] = SeedFixture.new(fixture, seed_class)
  
  [ seed_class.table_name, seed_name.to_sym ]
end
setup_fixtures() click to toggle source

Re-implement setup_fixtures to use save points instead of transactions.

# File lib/test_seeds.rb, line 58
def setup_fixtures
  return unless defined?(ActiveRecord) && !ActiveRecord::Base.configurations.blank?

  if pre_loaded_fixtures && !use_transactional_fixtures
    raise RuntimeError, 'pre_loaded_fixtures requires use_transactional_fixtures'
  end

  @fixture_cache = {}
  @@already_loaded_fixtures ||= {}

  @loaded_seeds = []

  if run_in_transaction?
    if @@already_loaded_fixtures[self.class]
      @loaded_fixtures = @@already_loaded_fixtures[self.class]
    else
      @loaded_fixtures = load_fixtures
      @@already_loaded_fixtures[self.class] = @loaded_fixtures
    end

    # Use safe points
    ActiveRecord::Base.connection.create_savepoint
    ActiveRecord::Base.connection.increment_open_transactions
    ActiveRecord::Base.connection.transaction_joinable = false
    @created_save_point = true
    
    setup_seeds(nil)
  else
    fixtures_class_in_my_rails.reset_cache
    @@already_loaded_fixtures[self.class] = nil
    @loaded_fixtures = load_fixtures
  end

  instantiate_fixtures if use_instantiated_fixtures
end
setup_seeds(*seeds) click to toggle source
# File lib/test_seeds.rb, line 139
def setup_seeds(*seeds)
  seeds.each do |seed|
    (self.class.defined_seeds[seed] || []).each do |seed_var, seed_accessor|
      instance_variable_set(seed_var, send(*seed_accessor))
    end
    @loaded_seeds << seed
  end
end
teardown_fixtures() click to toggle source

Re-implement setup_fixtures to use save points instead of transactions.

# File lib/test_seeds.rb, line 95
def teardown_fixtures
  teardown_seeds(*@loaded_seeds)
  
  return unless defined?(ActiveRecord) && !ActiveRecord::Base.configurations.blank?

  unless run_in_transaction?
    fixtures_class_in_my_rails.reset_cache
  end

  if run_in_transaction? && @created_save_point
    # Use safe points
    ActiveRecord::Base.connection.decrement_open_transactions
    ActiveRecord::Base.connection.rollback_to_savepoint
    @created_save_point = false
  end
  ActiveRecord::Base.clear_active_connections!
end
teardown_seeds(*seeds) click to toggle source
# File lib/test_seeds.rb, line 148
def teardown_seeds(*seeds)
  seeds.each do |seed|
    (self.class.defined_seeds[seed] || []).each do |seed_var, seed_accessor|
      instance_variable_set(seed_var, nil)
    end
    @loaded_seeds.delete(seed)
  end
end

Private Instance Methods

fixtures_class_in_my_rails() click to toggle source
# File lib/test_seeds.rb, line 175
def fixtures_class_in_my_rails
  ActiveRecord.const_defined?(:Fixtures) ? ActiveRecord::Fixtures : Fixtures
end