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