spec/zdm_spec.rb in zdm-1.0.3 vs spec/zdm_spec.rb in zdm-1.0.4
- old
+ new
@@ -3,10 +3,15 @@
describe Zdm do
before(:example) {
Zdm.io = false
Zdm.cleanup
+
+ conn = ActiveRecord::Base.connection
+ conn.execute(%[TRUNCATE people])
+ conn.execute(%[INSERT INTO people(account_id, name, code, created_at) VALUES (10,'foo','bar','2017-03-01 23:59:59')])
+ conn.execute(%[INSERT INTO people(account_id, name, code, created_at) VALUES (20,'foo2','bar2','2017-03-02 23:59:59')])
}
it 'requires an autoincrement primary key `id` field' do
expect{Zdm.change_table(:people_teams) {}}.to raise_error('Cannot migrate table `people_teams`, missing auto increment primary key `id`')
end
@@ -84,7 +89,52 @@
EOS
archive_tables = conn.send(Zdm.tables_method).select { |name| name.starts_with?('zdma_') }
expect(archive_tables.length).to eq(2)
end
+
+ context 'execute_in_batches' do
+ before(:example) do
+ @conn = ActiveRecord::Base.connection
+ (1..20).each do |idx|
+ @conn.execute(%[INSERT INTO people(account_id, name, code, created_at) VALUES (10,'person-#{idx}','P#{idx}','2017-03-01 23:59:59')])
+ end
+ Zdm.io = StringIO.new
+ @sql = "UPDATE people SET code = CONCAT(code, 'U') WHERE id BETWEEN %s AND %s"
+ end
+
+ after(:example) do
+ @conn.execute(%[DELETE FROM people WHERE name LIKE 'person%'])
+ end
+
+ it 'updates a table in batches' do
+ Zdm.execute_in_batches('people', batch_size: 4, progress_every: 1) do |batch_start, batch_end|
+ sleep(0.6)
+ @sql % [batch_start, batch_end]
+ end
+ expect(Zdm.io.string).to eq(%[people: 36.36% (8/22)\npeople: 72.73% (16/22)\npeople: Completed (3 secs)\n])
+ expect(@conn.select_value(%[SELECT COUNT(*) FROM people WHERE code LIKE '%U'])).to eq(22)
+ end
+
+ it 'updates part of a table in batches' do
+ batches = []
+ Zdm.execute_in_batches('people', start: 5, finish: 18, batch_size: 4, progress_every: 1) do |batch_start, batch_end|
+ sleep(0.6)
+ batches << @sql % [batch_start, batch_end]
+ @sql % [batch_start, batch_end]
+ end
+ expect(Zdm.io.string).to eq(%[people: 57.14% (8/14)\npeople: Completed (2 secs)\n])
+ expect(batches).to eq([
+ %[UPDATE people SET code = CONCAT(code, 'U') WHERE id BETWEEN 5 AND 8],
+ %[UPDATE people SET code = CONCAT(code, 'U') WHERE id BETWEEN 9 AND 12],
+ %[UPDATE people SET code = CONCAT(code, 'U') WHERE id BETWEEN 13 AND 16],
+ %[UPDATE people SET code = CONCAT(code, 'U') WHERE id BETWEEN 17 AND 18],
+ ])
+ expect(@conn.select_values(%[SELECT code FROM people WHERE code LIKE '%U'])).to eq([
+ 'P3U', 'P4U', 'P5U', 'P6U', 'P7U', 'P8U', 'P9U', 'P10U', 'P11U', 'P12U', 'P13U', 'P14U', 'P15U', 'P16U'
+ ])
+ end
+
+ end
+
end
\ No newline at end of file