discourse/spec/lib/backup_restore/backuper_spec.rb
marstall 0513865c3c
FEATURE: Delete backups based on time window (#24296)
* FEATURE: core code, tests for feature to allow backups to removed based on a time window

* FEATURE: getting tests working for time-based backup

* FEATURE: getting tests running

* FEATURE: linting
2023-12-13 13:00:27 -05:00

97 lines
3.0 KiB
Ruby

# frozen_string_literal: true
RSpec.describe BackupRestore::Backuper do
describe "#get_parameterized_title" do
it "returns a non-empty parameterized title when site title contains unicode" do
SiteSetting.title = "Ɣ"
backuper = BackupRestore::Backuper.new(Discourse.system_user.id)
expect(backuper.send(:get_parameterized_title)).to eq("discourse")
end
it "returns a valid parameterized site title" do
SiteSetting.title = "Coding Horror"
backuper = BackupRestore::Backuper.new(Discourse.system_user.id)
expect(backuper.send(:get_parameterized_title)).to eq("coding-horror")
end
end
describe "#notify_user" do
before { freeze_time Time.zone.parse("2010-01-01 12:00") }
it "includes logs if short" do
SiteSetting.max_export_file_size_kb = 1
SiteSetting.export_authorized_extensions = "tar.gz"
silence_stdout do
backuper = BackupRestore::Backuper.new(Discourse.system_user.id)
expect { backuper.send(:notify_user) }.to change { Topic.private_messages.count }.by(
1,
).and not_change { Upload.count }
end
expect(Topic.last.first_post.raw).to include(
"```text\n[2010-01-01 12:00:00] Notifying 'system' of the end of the backup...\n```",
)
end
it "include upload if log is long" do
SiteSetting.max_post_length = 250
silence_stdout do
backuper = BackupRestore::Backuper.new(Discourse.system_user.id)
expect { backuper.send(:notify_user) }.to change { Topic.private_messages.count }.by(
1,
).and change { Upload.where(original_filename: "log.txt.zip").count }.by(1)
end
expect(Topic.last.first_post.raw).to include("[log.txt.zip|attachment]")
end
it "includes trimmed logs if log is long and upload cannot be saved" do
SiteSetting.max_post_length = 348
SiteSetting.max_export_file_size_kb = 1
SiteSetting.export_authorized_extensions = "tar.gz"
silence_stdout do
backuper = BackupRestore::Backuper.new(Discourse.system_user.id)
1.upto(10).each { |i| backuper.send(:log, "Line #{i}") }
expect { backuper.send(:notify_user) }.to change { Topic.private_messages.count }.by(
1,
).and not_change { Upload.count }
end
expect(Topic.last.first_post.raw).to include(
"```text\n...\n[2010-01-01 12:00:00] Line 10\n[2010-01-01 12:00:00] Notifying 'system' of the end of the backup...\n```",
)
end
end
describe "#run" do
subject(:run) { backup.run }
let(:backup) { described_class.new(user.id) }
let(:user) { Discourse.system_user }
let(:store) { backup.store }
before { backup.stubs(:success).returns(success) }
context "when the result is successful" do
let(:success) { true }
it "refreshes disk stats" do
store.expects(:reset_cache).at_least_once
run
end
it "deletes any old backups" do
store.expects(:delete_prior_to_n_days)
run
end
end
end
end