docbrown/spec/services/bulk_sql_delete_spec.rb
2020-09-08 12:06:47 -04:00

48 lines
1.5 KiB
Ruby

require "rails_helper"
describe BulkSqlDelete, type: :service do
let(:sql) do
<<-SQL.squish
DELETE FROM notifications
WHERE notifications.id IN (
SELECT notifications.id
FROM notifications
WHERE created_at < '#{Time.current}'
LIMIT 1
)
SQL
end
let(:logger) { Rails.logger }
before { allow(Rails).to receive(:logger).and_return(logger) }
describe "#delete_in_batches" do
it "logs batch deletion" do
create_list :notification, 3, created_at: 1.month.ago
allow(logger).to receive(:info)
described_class.delete_in_batches(sql)
expect(logger).to have_received(:info).exactly(4).times.with(
hash_including(:tag, :statement, :duration, :rows_deleted),
)
end
it "logs errors that occur" do
allow(logger).to receive(:error)
# rubocop:disable RSpec/AnyInstance
allow_any_instance_of(ActiveRecord::ConnectionAdapters::PostgreSQLAdapter)
.to(receive(:exec_delete)).and_raise("broken")
# rubocop:enable RSpec/AnyInstance
expect { described_class.delete_in_batches(sql) }.to raise_error("broken")
expect(logger).to have_received(:error).with(
hash_including(:tag, :statement, :exception_message, :backtrace),
)
end
it "deletes all records in batches" do
create_list :notification, 5, created_at: 1.month.ago
result = described_class.delete_in_batches(sql)
expect(result).to eq(5)
end
end
end