Merge pull request #298 from vrinek/pre_count_on_sequel

Add support for `pre_count` option on Sequel + MySQL
This commit is contained in:
Jon Rowe 2014-12-06 10:13:27 +11:00
commit fddaf0d5b3
2 changed files with 59 additions and 10 deletions

View File

@ -19,20 +19,30 @@ module DatabaseCleaner
db.run "TRUNCATE TABLE #{all_tables};"
end
else
# Truncate each table normally
each_table do |db, table|
db[table].truncate
tables = tables_to_truncate(db)
if pre_count?
# Count rows before truncating
pre_count_truncate_tables(db, tables)
else
# Truncate each table normally
truncate_tables(db, tables)
end
end
end
def each_table
tables_to_truncate(db).each do |table|
yield db, table.to_sym
end
private
def pre_count_truncate_tables(db, tables)
tables = tables.reject { |table| db[table.to_sym].count == 0 }
truncate_tables(db, tables)
end
private
def truncate_tables(db, tables)
tables.each do |table|
db[table.to_sym].truncate
end
end
def tables_to_truncate(db)
(@only || db.tables.map(&:to_s)) - @tables_to_exclude
@ -43,8 +53,9 @@ module DatabaseCleaner
%w[schema_info schema_migrations]
end
def pre_count?
@pre_count == true
end
end
end
end

View File

@ -130,6 +130,44 @@ module DatabaseCleaner
it_behaves_like 'a Sequel truncation strategy'
it_behaves_like 'a truncation strategy that resets autoincrement keys by default'
describe '#pre_count?' do
subject { Truncation.new.tap { |t| t.db = db } }
its(:pre_count?) { should eq false }
it 'should return true if @reset_id is set and non false or nil' do
subject.instance_variable_set(:"@pre_count", true)
subject.send(:pre_count?).should eq true
end
it 'should return false if @reset_id is set to false' do
subject.instance_variable_set(:"@pre_count", false)
subject.send(:pre_count?).should eq false
end
end
describe "relying on #pre_count_truncate_tables if asked to" do
subject { Truncation.new.tap { |t| t.db = db } }
it "should rely on #pre_count_truncate_tables if #pre_count? returns true" do
subject.instance_variable_set(:"@pre_count", true)
subject.should_not_receive(:truncate_tables)
subject.should_receive(:pre_count_truncate_tables)
subject.clean
end
it "should not rely on #pre_count_truncate_tables if #pre_count? return false" do
subject.instance_variable_set(:"@pre_count", false)
subject.should_not_receive(:pre_count_truncate_tables)
subject.should_receive(:truncate_tables)
subject.clean
end
end
end
end
half_supported_configurations.each do |config|