BigW Consortium Gitlab

blob_spec.rb 9.3 KB
Newer Older
1
# encoding: utf-8
2 3 4
require 'rails_helper'

describe Blob do
Douwe Maan committed
5 6
  include FakeBlobHelpers

7
  let(:project) { build(:project, lfs_enabled: true) }
Douwe Maan committed
8 9 10 11 12

  before do
    allow(Gitlab.config.lfs).to receive(:enabled).and_return(true)
  end

13 14 15 16 17 18
  describe '.decorate' do
    it 'returns NilClass when given nil' do
      expect(described_class.decorate(nil)).to be_nil
    end
  end

19 20 21 22
  describe '#data' do
    context 'using a binary blob' do
      it 'returns the data as-is' do
        data = "\n\xFF\xB9\xC3"
Douwe Maan committed
23
        blob = fake_blob(binary: true, data: data)
24 25 26 27 28 29 30

        expect(blob.data).to eq(data)
      end
    end

    context 'using a text blob' do
      it 'converts the data to UTF-8' do
Douwe Maan committed
31
        blob = fake_blob(binary: false, data: "\n\xFF\xB9\xC3")
32 33 34 35 36 37

        expect(blob.data).to eq("\n���")
      end
    end
  end

38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 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
  describe '#external_storage_error?' do
    context 'if the blob is stored in LFS' do
      let(:blob) { fake_blob(path: 'file.pdf', lfs: true) }

      context 'when the project has LFS enabled' do
        it 'returns false' do
          expect(blob.external_storage_error?).to be_falsey
        end
      end

      context 'when the project does not have LFS enabled' do
        before do
          project.lfs_enabled = false
        end

        it 'returns true' do
          expect(blob.external_storage_error?).to be_truthy
        end
      end
    end

    context 'if the blob is not stored in LFS' do
      let(:blob) { fake_blob(path: 'file.md') }

      it 'returns false' do
        expect(blob.external_storage_error?).to be_falsey
      end
    end
  end

  describe '#stored_externally?' do
    context 'if the blob is stored in LFS' do
      let(:blob) { fake_blob(path: 'file.pdf', lfs: true) }

      context 'when the project has LFS enabled' do
        it 'returns true' do
          expect(blob.stored_externally?).to be_truthy
        end
      end

      context 'when the project does not have LFS enabled' do
        before do
          project.lfs_enabled = false
        end

        it 'returns false' do
          expect(blob.stored_externally?).to be_falsey
        end
      end
    end

    context 'if the blob is not stored in LFS' do
      let(:blob) { fake_blob(path: 'file.md') }

      it 'returns false' do
        expect(blob.stored_externally?).to be_falsey
      end
    end
  end

Douwe Maan committed
98
  describe '#raw_binary?' do
99
    context 'if the blob is stored externally' do
Douwe Maan committed
100 101
      context 'if the extension has a rich viewer' do
        context 'if the viewer is binary' do
Douwe Maan committed
102
          it 'returns true' do
Douwe Maan committed
103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118
            blob = fake_blob(path: 'file.pdf', lfs: true)

            expect(blob.raw_binary?).to be_truthy
          end
        end

        context 'if the viewer is text-based' do
          it 'return false' do
            blob = fake_blob(path: 'file.md', lfs: true)

            expect(blob.raw_binary?).to be_falsey
          end
        end
      end

      context "if the extension doesn't have a rich viewer" do
119 120 121 122
        context 'if the extension has a text mime type' do
          context 'if the extension is for a programming language' do
            it 'returns false' do
              blob = fake_blob(path: 'file.txt', lfs: true)
Douwe Maan committed
123

124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170
              expect(blob.raw_binary?).to be_falsey
            end
          end

          context 'if the extension is not for a programming language' do
            it 'returns false' do
              blob = fake_blob(path: 'file.ics', lfs: true)

              expect(blob.raw_binary?).to be_falsey
            end
          end
        end

        context 'if the extension has a binary mime type' do
          context 'if the extension is for a programming language' do
            it 'returns false' do
              blob = fake_blob(path: 'file.rb', lfs: true)

              expect(blob.raw_binary?).to be_falsey
            end
          end

          context 'if the extension is not for a programming language' do
            it 'returns true' do
              blob = fake_blob(path: 'file.exe', lfs: true)

              expect(blob.raw_binary?).to be_truthy
            end
          end
        end

        context 'if the extension has an unknown mime type' do
          context 'if the extension is for a programming language' do
            it 'returns false' do
              blob = fake_blob(path: 'file.ini', lfs: true)

              expect(blob.raw_binary?).to be_falsey
            end
          end

          context 'if the extension is not for a programming language' do
            it 'returns true' do
              blob = fake_blob(path: 'file.wtf', lfs: true)

              expect(blob.raw_binary?).to be_truthy
            end
          end
Douwe Maan committed
171 172 173 174
        end
      end
    end

175
    context 'if the blob is not stored externally' do
Douwe Maan committed
176
      context 'if the blob is binary' do
Douwe Maan committed
177
        it 'returns true' do
Douwe Maan committed
178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201
          blob = fake_blob(path: 'file.pdf', binary: true)

          expect(blob.raw_binary?).to be_truthy
        end
      end

      context 'if the blob is text-based' do
        it 'return false' do
          blob = fake_blob(path: 'file.md')

          expect(blob.raw_binary?).to be_falsey
        end
      end
    end
  end

  describe '#extension' do
    it 'returns the extension' do
      blob = fake_blob(path: 'file.md')

      expect(blob.extension).to eq('md')
    end
  end

202 203 204 205 206 207 208 209
  describe '#file_type' do
    it 'returns the file type' do
      blob = fake_blob(path: 'README.md')

      expect(blob.file_type).to eq(:readme)
    end
  end

Douwe Maan committed
210 211 212
  describe '#simple_viewer' do
    context 'when the blob is empty' do
      it 'returns an empty viewer' do
213
        blob = fake_blob(data: '', size: 0)
Douwe Maan committed
214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236

        expect(blob.simple_viewer).to be_a(BlobViewer::Empty)
      end
    end

    context 'when the file represented by the blob is binary' do
      it 'returns a download viewer' do
        blob = fake_blob(binary: true)

        expect(blob.simple_viewer).to be_a(BlobViewer::Download)
      end
    end

    context 'when the file represented by the blob is text-based' do
      it 'returns a text viewer' do
        blob = fake_blob

        expect(blob.simple_viewer).to be_a(BlobViewer::Text)
      end
    end
  end

  describe '#rich_viewer' do
237
    context 'when the blob has an external storage error' do
Douwe Maan committed
238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256
      before do
        project.lfs_enabled = false
      end

      it 'returns nil' do
        blob = fake_blob(path: 'file.pdf', lfs: true)

        expect(blob.rich_viewer).to be_nil
      end
    end

    context 'when the blob is empty' do
      it 'returns nil' do
        blob = fake_blob(data: '')

        expect(blob.rich_viewer).to be_nil
      end
    end

257
    context 'when the blob is stored externally' do
Douwe Maan committed
258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281
      it 'returns a matching viewer' do
        blob = fake_blob(path: 'file.pdf', lfs: true)

        expect(blob.rich_viewer).to be_a(BlobViewer::PDF)
      end
    end

    context 'when the blob is binary' do
      it 'returns a matching binary viewer' do
        blob = fake_blob(path: 'file.pdf', binary: true)

        expect(blob.rich_viewer).to be_a(BlobViewer::PDF)
      end
    end

    context 'when the blob is text-based' do
      it 'returns a matching text-based viewer' do
        blob = fake_blob(path: 'file.md')

        expect(blob.rich_viewer).to be_a(BlobViewer::Markup)
      end
    end
  end

282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327
  describe '#auxiliary_viewer' do
    context 'when the blob has an external storage error' do
      before do
        project.lfs_enabled = false
      end

      it 'returns nil' do
        blob = fake_blob(path: 'LICENSE', lfs: true)

        expect(blob.auxiliary_viewer).to be_nil
      end
    end

    context 'when the blob is empty' do
      it 'returns nil' do
        blob = fake_blob(data: '')

        expect(blob.auxiliary_viewer).to be_nil
      end
    end

    context 'when the blob is stored externally' do
      it 'returns a matching viewer' do
        blob = fake_blob(path: 'LICENSE', lfs: true)

        expect(blob.auxiliary_viewer).to be_a(BlobViewer::License)
      end
    end

    context 'when the blob is binary' do
      it 'returns nil' do
        blob = fake_blob(path: 'LICENSE', binary: true)

        expect(blob.auxiliary_viewer).to be_nil
      end
    end

    context 'when the blob is text-based' do
      it 'returns a matching text-based viewer' do
        blob = fake_blob(path: 'LICENSE')

        expect(blob.auxiliary_viewer).to be_a(BlobViewer::License)
      end
    end
  end

Douwe Maan committed
328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364
  describe '#rendered_as_text?' do
    context 'when ignoring errors' do
      context 'when the simple viewer is text-based' do
        it 'returns true' do
          blob = fake_blob(path: 'file.md', size: 100.megabytes)

          expect(blob.rendered_as_text?).to be_truthy
        end
      end

      context 'when the simple viewer is binary' do
        it 'returns false' do
          blob = fake_blob(path: 'file.pdf', binary: true, size: 100.megabytes)

          expect(blob.rendered_as_text?).to be_falsey
        end
      end
    end

    context 'when not ignoring errors' do
      context 'when the viewer has render errors' do
        it 'returns false' do
          blob = fake_blob(path: 'file.md', size: 100.megabytes)

          expect(blob.rendered_as_text?(ignore_errors: false)).to be_falsey
        end
      end

      context "when the viewer doesn't have render errors" do
        it 'returns true' do
          blob = fake_blob(path: 'file.md')

          expect(blob.rendered_as_text?(ignore_errors: false)).to be_truthy
        end
      end
    end
  end
365
end