48 lines
1.5 KiB
Ruby
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
|