describe DownloadableFileService do let(:procedure) { create(:procedure, :published) } let(:service) { ProcedureArchiveService.new(procedure) } before do FileUtils.mkdir_p('/tmp/test_archive_creation') stub_const("DownloadableFileService::ARCHIVE_CREATION_DIR", '/tmp/test_archive_creation') end describe '#download_and_zip' do let(:archive) { build(:archive, id: '3') } let(:filename) { service.send(:zip_root_folder, archive) } it 'create a tmpdir while block is running' do previous_dir_list = Dir.entries(DownloadableFileService::ARCHIVE_CREATION_DIR) DownloadableFileService.download_and_zip(procedure, [], filename) do |_zip_file| new_dir_list = Dir.entries(DownloadableFileService::ARCHIVE_CREATION_DIR) expect(previous_dir_list).not_to eq(new_dir_list) end end it 'cleans up its tmpdir after block execution' do expect { DownloadableFileService.download_and_zip(procedure, [], filename) { |zip_file| } } .not_to change { Dir.entries(DownloadableFileService::ARCHIVE_CREATION_DIR) } end it 'creates a zip with zip utility' do expected_zip_path = File.join(DownloadableFileService::ARCHIVE_CREATION_DIR, "#{service.send(:zip_root_folder, archive)}.zip") expect(DownloadableFileService).to receive(:system).with('zip', '-0', '-r', expected_zip_path, an_instance_of(String)) DownloadableFileService.download_and_zip(procedure, [], filename) { |zip_path| } end it 'cleans up its generated zip' do expected_zip_path = File.join(DownloadableFileService::ARCHIVE_CREATION_DIR, "#{service.send(:zip_root_folder, archive)}.zip") DownloadableFileService.download_and_zip(procedure, [], filename) do |_zip_path| expect(File.exist?(expected_zip_path)).to be_truthy end expect(File.exist?(expected_zip_path)).to be_falsey end end end