import_export_clean_up_service_spec.rb 2.41 KB
Newer Older
1 2
require 'spec_helper'

3
describe ImportExportCleanUpService do
4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
  describe '#execute' do
    let(:service) { described_class.new }

    let(:tmp_import_export_folder) { 'tmp/project_exports' }

    context 'when the import/export directory does not exist' do
      it 'does not remove any archives' do
        path = '/invalid/path/'
        stub_repository_downloads_path(path)

        expect(service).not_to receive(:clean_up_export_files)

        service.execute
      end
    end

    context 'when the import/export directory exists' do
      it 'removes old files' do
        in_directory_with_files(mtime: 2.days.ago) do |dir, files|
          service.execute

          files.each { |file| expect(File.exist?(file)).to eq false }
          expect(File.directory?(dir)).to eq false
        end
      end

      it 'does not remove new files' do
        in_directory_with_files(mtime: 2.hours.ago) do |dir, files|
          service.execute

          files.each { |file| expect(File.exist?(file)).to eq true }
          expect(File.directory?(dir)).to eq true
        end
      end
    end

40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
    context 'with uploader exports' do
      it 'removes old files' do
        upload = create(:import_export_upload,
                        updated_at: 2.days.ago,
                        export_file: fixture_file_upload('spec/fixtures/project_export.tar.gz'))

        expect { service.execute }.to change { upload.reload.export_file.file.nil? }.to(true)
      end

      it 'does not remove new files' do
        upload = create(:import_export_upload,
                        updated_at: 1.hour.ago,
                        export_file: fixture_file_upload('spec/fixtures/project_export.tar.gz'))

        expect { service.execute }.not_to change { upload.reload.export_file.file.nil? }
      end
    end

58 59 60 61 62 63
    def in_directory_with_files(mtime:)
      Dir.mktmpdir do |tmpdir|
        stub_repository_downloads_path(tmpdir)
        dir = File.join(tmpdir, tmp_import_export_folder, 'subfolder')
        FileUtils.mkdir_p(dir)

James Lopez's avatar
James Lopez committed
64
        files = FileUtils.touch(file_list(dir) + [dir], mtime: mtime.to_time)
65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81

        yield(dir, files)
      end
    end

    def stub_repository_downloads_path(path)
      new_shared_settings = Settings.shared.merge('path' => path)
      allow(Settings).to receive(:shared).and_return(new_shared_settings)
    end

    def file_list(dir)
      Array.new(5) do |num|
        File.join(dir, "random-#{num}.tar.gz")
      end
    end
  end
end