BigW Consortium Gitlab

records_uploads_spec.rb 2.84 KB
Newer Older
1 2 3
require 'rails_helper'

describe RecordsUploads do
4
  let!(:uploader) do
5
    class RecordsUploadsExampleUploader < GitlabUploader
6 7 8 9 10 11 12 13 14
      include RecordsUploads

      storage :file

      def model
        FactoryGirl.build_stubbed(:user)
      end
    end

15
    RecordsUploadsExampleUploader.new
16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
  end

  def upload_fixture(filename)
    fixture_file_upload(Rails.root.join('spec', 'fixtures', filename))
  end

  describe 'callbacks' do
    it 'calls `record_upload` after `store`' do
      expect(uploader).to receive(:record_upload).once

      uploader.store!(upload_fixture('doc_sample.txt'))
    end

    it 'calls `destroy_upload` after `remove`' do
      expect(uploader).to receive(:destroy_upload).once

      uploader.store!(upload_fixture('doc_sample.txt'))

      uploader.remove!
    end
  end

  describe '#record_upload callback' do
    it 'returns early when not using file storage' do
      allow(uploader).to receive(:file_storage?).and_return(false)
      expect(Upload).not_to receive(:record)

      uploader.store!(upload_fixture('rails_sample.jpg'))
    end

    it "returns early when the file doesn't exist" do
      allow(uploader).to receive(:file).and_return(double(exists?: false))
      expect(Upload).not_to receive(:record)

      uploader.store!(upload_fixture('rails_sample.jpg'))
    end

    it 'creates an Upload record after store' do
      expect(Upload).to receive(:record)
        .with(uploader)

      uploader.store!(upload_fixture('rails_sample.jpg'))
    end

60 61 62 63 64 65 66
    it 'does not create an Upload record if model is missing' do
      expect_any_instance_of(RecordsUploadsExampleUploader).to receive(:model).and_return(nil)
      expect(Upload).not_to receive(:record).with(uploader)

      uploader.store!(upload_fixture('rails_sample.jpg'))
    end

67 68
    it 'it destroys Upload records at the same path before recording' do
      existing = Upload.create!(
69
        path: File.join('uploads', 'rails_sample.jpg'),
70 71
        size: 512.kilobytes,
        model: build_stubbed(:user),
72
        uploader: uploader.class.to_s
73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104
      )

      uploader.store!(upload_fixture('rails_sample.jpg'))

      expect { existing.reload }.to raise_error(ActiveRecord::RecordNotFound)
      expect(Upload.count).to eq 1
    end
  end

  describe '#destroy_upload callback' do
    it 'returns early when not using file storage' do
      uploader.store!(upload_fixture('rails_sample.jpg'))

      allow(uploader).to receive(:file_storage?).and_return(false)
      expect(Upload).not_to receive(:remove_path)

      uploader.remove!
    end

    it 'returns early when file is nil' do
      expect(Upload).not_to receive(:remove_path)

      uploader.remove!
    end

    it 'it destroys Upload records at the same path after removal' do
      uploader.store!(upload_fixture('rails_sample.jpg'))

      expect { uploader.remove! }.to change { Upload.count }.from(1).to(0)
    end
  end
end