summaryrefslogtreecommitdiff
path: root/spec/controllers/projects/raw_controller_spec.rb
blob: 4cebe3884bfff774bfd64cd4d6150ac34fe09d46 (plain)
1
2
3
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
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
require 'spec_helper'

describe Projects::RawController do
  let(:public_project) { create(:project, :public, :repository) }

  describe "#show" do
    context 'regular filename' do
      let(:id) { 'master/README.md' }

      it 'delivers ASCII file' do
        get(:show,
            namespace_id: public_project.namespace.to_param,
            project_id: public_project,
            id: id)

        expect(response).to have_http_status(200)
        expect(response.header['Content-Type']).to eq('text/plain; charset=utf-8')
        expect(response.header['Content-Disposition']).
            to eq("inline")
        expect(response.header[Gitlab::Workhorse::SEND_DATA_HEADER]).to start_with("git-blob:")
      end
    end

    context 'image header' do
      let(:id) { 'master/files/images/6049019_460s.jpg' }

      it 'sets image content type header' do
        get(:show,
            namespace_id: public_project.namespace.to_param,
            project_id: public_project,
            id: id)

        expect(response).to have_http_status(200)
        expect(response.header['Content-Type']).to eq('image/jpeg')
        expect(response.header[Gitlab::Workhorse::SEND_DATA_HEADER]).to start_with("git-blob:")
      end
    end

    context 'lfs object' do
      let(:id) { 'be93687/files/lfs/lfs_object.iso' }
      let!(:lfs_object) { create(:lfs_object, oid: '91eff75a492a3ed0dfcb544d7f31326bc4014c8551849c192fd1e48d4dd2c897', size: '1575078') }

      context 'when project has access' do
        before do
          public_project.lfs_objects << lfs_object
          allow_any_instance_of(LfsObjectUploader).to receive(:exists?).and_return(true)
          allow(controller).to receive(:send_file) { controller.head :ok }
        end

        it 'serves the file' do
          expect(controller).to receive(:send_file).with("#{Gitlab.config.shared.path}/lfs-objects/91/ef/f75a492a3ed0dfcb544d7f31326bc4014c8551849c192fd1e48d4dd2c897", filename: "lfs_object.iso", disposition: 'attachment')
          get(:show,
              namespace_id: public_project.namespace.to_param,
              project_id: public_project,
              id: id)

          expect(response).to have_http_status(200)
        end
      end

      context 'when project does not have access' do
        it 'does not serve the file' do
          get(:show,
              namespace_id: public_project.namespace.to_param,
              project_id: public_project,
              id: id)

          expect(response).to have_http_status(404)
        end
      end
    end
  end
end