mirror of
https://github.com/discourse/discourse.git
synced 2025-02-11 13:55:07 +00:00
This also ensures that restoring a backup works when it was created with the wrong upload paths in the time between ab4c0a4970163506e2c72884ff2ba2d8845eb10c (shortly after v2.6.0.beta1) and this fix.
105 lines
3.7 KiB
Ruby
105 lines
3.7 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
require 'rails_helper'
|
|
require_relative 'shared_context_for_backup_restore'
|
|
|
|
describe BackupRestore::BackupFileHandler do
|
|
include_context "shared stuff"
|
|
|
|
def expect_decompress_and_clean_up_to_work(backup_filename:, expected_dump_filename: "dump.sql",
|
|
require_metadata_file:, require_uploads:, expected_upload_paths: nil)
|
|
|
|
freeze_time(DateTime.parse('2019-12-24 14:31:48'))
|
|
|
|
source_file = File.join(Rails.root, "spec/fixtures/backups", backup_filename)
|
|
target_directory = BackupRestore::LocalBackupStore.base_directory
|
|
target_file = File.join(target_directory, backup_filename)
|
|
FileUtils.copy_file(source_file, target_file)
|
|
|
|
Dir.mktmpdir do |root_directory|
|
|
current_db = RailsMultisite::ConnectionManagement.current_db
|
|
file_handler = BackupRestore::BackupFileHandler.new(logger, backup_filename, current_db, root_directory)
|
|
tmp_directory, db_dump_path = file_handler.decompress
|
|
|
|
expected_tmp_path = File.join(root_directory, "tmp/restores", current_db, "2019-12-24-143148")
|
|
expect(tmp_directory).to eq(expected_tmp_path)
|
|
expect(db_dump_path).to eq(File.join(expected_tmp_path, expected_dump_filename))
|
|
|
|
expect(Dir.exist?(tmp_directory)).to eq(true)
|
|
expect(File.exist?(db_dump_path)).to eq(true)
|
|
|
|
expect(File.exist?(File.join(tmp_directory, "meta.json"))).to eq(require_metadata_file)
|
|
|
|
if require_uploads
|
|
expected_upload_paths ||= ["uploads/default/original/3X/b/d/bd269860bb508aebcb6f08fe7289d5f117830383.png"]
|
|
|
|
expected_upload_paths.each do |upload_path|
|
|
absolute_upload_path = File.join(tmp_directory, upload_path)
|
|
expect(File.exist?(absolute_upload_path)).to eq(true), "expected file #{upload_path} does not exist"
|
|
yield(absolute_upload_path) if block_given?
|
|
end
|
|
else
|
|
expect(Dir.exist?(File.join(tmp_directory, "uploads"))).to eq(false)
|
|
end
|
|
|
|
file_handler.clean_up
|
|
expect(Dir.exist?(tmp_directory)).to eq(false)
|
|
end
|
|
ensure
|
|
FileUtils.rm(target_file)
|
|
|
|
# We don't want to delete the directory unless it is empty, otherwise this could be annoying
|
|
# when tests run for the "default" database in a development environment.
|
|
FileUtils.rmdir(target_directory) rescue nil
|
|
end
|
|
|
|
it "works with old backup file format", type: :multisite do
|
|
test_multisite_connection("second") do
|
|
expect_decompress_and_clean_up_to_work(
|
|
backup_filename: "backup_till_v1.5.tar.gz",
|
|
require_metadata_file: true,
|
|
require_uploads: true
|
|
)
|
|
end
|
|
end
|
|
|
|
it "works with current backup file format" do
|
|
expect_decompress_and_clean_up_to_work(
|
|
backup_filename: "backup_since_v1.6.tar.gz",
|
|
require_metadata_file: false,
|
|
require_uploads: true
|
|
)
|
|
end
|
|
|
|
it "works with SQL only backup file" do
|
|
expect_decompress_and_clean_up_to_work(
|
|
backup_filename: "sql_only_backup.sql.gz",
|
|
expected_dump_filename: "sql_only_backup.sql",
|
|
require_metadata_file: false,
|
|
require_uploads: false
|
|
)
|
|
end
|
|
|
|
it "works with backup file which uses wrong upload path" do
|
|
expect_decompress_and_clean_up_to_work(
|
|
backup_filename: "backup_with_wrong_upload_path.tar.gz",
|
|
require_metadata_file: false,
|
|
require_uploads: true,
|
|
expected_upload_paths: [
|
|
"uploads/default/original/1X/both.txt",
|
|
"uploads/default/original/1X/only-uploads.txt",
|
|
"uploads/default/original/1X/only-var.txt"
|
|
]
|
|
) do |upload_path|
|
|
content = File.read(upload_path).chomp
|
|
|
|
case File.basename(upload_path)
|
|
when "both.txt", "only-var.txt"
|
|
expect(content).to eq("var")
|
|
when "only-uploads.txt"
|
|
expect(content).to eq("uploads")
|
|
end
|
|
end
|
|
end
|
|
end
|