# frozen_string_literal: true require 'rails_helper' describe Compression::Engine do let(:available_size) { SiteSetting.decompressed_theme_max_file_size_mb } before do @temp_folder = "#{Pathname.new(Dir.tmpdir).realpath}/#{SecureRandom.hex}" @folder_name = 'test' FileUtils.mkdir(@temp_folder) Dir.chdir(@temp_folder) do FileUtils.mkdir_p("#{@folder_name}/a") File.write("#{@folder_name}/hello.txt", 'hello world') File.write("#{@folder_name}/a/inner", 'hello world inner') end end after { FileUtils.rm_rf @temp_folder } it 'raises an exception when the file is not supported' do unknown_extension = 'a_file.crazyext' expect { described_class.engine_for(unknown_extension) }.to raise_error Compression::Engine::UnsupportedFileExtension end describe 'compressing and decompressing files' do before do Dir.chdir(@temp_folder) do @compressed_path = Compression::Engine.engine_for("#{@folder_name}#{extension}").compress(@temp_folder, @folder_name) FileUtils.rm_rf("#{@folder_name}/") end end context 'working with zip files' do let(:extension) { '.zip' } it 'decompress the folder and inspect files correctly' do engine = described_class.engine_for(@compressed_path) engine.decompress(@temp_folder, "#{@temp_folder}/#{@folder_name}.zip", available_size) expect(read_file("test/hello.txt")).to eq("hello world") expect(read_file("test/a/inner")).to eq("hello world inner") end end context 'working with .tar.gz files' do let(:extension) { '.tar.gz' } it 'decompress the folder and inspect files correctly' do engine = described_class.engine_for(@compressed_path) engine.decompress(@temp_folder, "#{@temp_folder}/#{@folder_name}.tar.gz", available_size) expect(read_file("test/hello.txt")).to eq("hello world") expect(read_file("test/a/inner")).to eq("hello world inner") end end context 'working with .tar files' do let(:extension) { '.tar' } it 'decompress the folder and inspect files correctly' do engine = described_class.engine_for(@compressed_path) engine.decompress(@temp_folder, "#{@temp_folder}/#{@folder_name}.tar", available_size) expect(read_file("test/hello.txt")).to eq("hello world") expect(read_file("test/a/inner")).to eq("hello world inner") end end end def read_file(relative_path) File.read("#{@temp_folder}/#{relative_path}") end end