summaryrefslogtreecommitdiff
path: root/spec/lib/gitlab/middleware/go_spec.rb
blob: 6af1564da190a1127a9621cd159f9e4927f72a68 (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
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
105
106
107
require 'spec_helper'

describe Gitlab::Middleware::Go do
  let(:app) { double(:app) }
  let(:middleware) { described_class.new(app) }

  describe '#call' do
    describe 'when go-get=0' do
      it 'skips go-import generation' do
        env = { 'rack.input' => '',
                'QUERY_STRING' => 'go-get=0' }
        expect(app).to receive(:call).with(env).and_return('no-go')
        middleware.call(env)
      end
    end

    describe 'when go-get=1' do
      let(:current_user) { nil }

      context 'with simple 2-segment project path' do
        let!(:project) { create(:project, :private) }

        context 'with subpackages' do
          let(:path) { "#{project.full_path}/subpackage" }

          it 'returns the full project path' do
            expect_response_with_path(go, project.full_path)
          end
        end

        context 'without subpackages' do
          let(:path) { project.full_path }

          it 'returns the full project path' do
            expect_response_with_path(go, project.full_path)
          end
        end
      end

      context 'with a nested project path' do
        let(:group) { create(:group, :nested) }
        let!(:project) { create(:project, :public, namespace: group) }

        shared_examples 'a nested project' do
          context 'when the project is public' do
            it 'returns the full project path' do
              expect_response_with_path(go, project.full_path)
            end
          end

          context 'when the project is private' do
            before do
              project.update_attribute(:visibility_level, Project::PRIVATE)
            end

            context 'with access to the project' do
              let(:current_user) { project.creator }

              before do
                project.team.add_master(current_user)
              end

              it 'returns the full project path' do
                expect_response_with_path(go, project.full_path)
              end
            end

            context 'without access to the project' do
              it 'returns the 2-segment group path' do
                expect_response_with_path(go, group.full_path)
              end
            end
          end
        end

        context 'with subpackages' do
          let(:path) { "#{project.full_path}/subpackage" }

          it_behaves_like 'a nested project'
        end

        context 'without subpackages' do
          let(:path) { project.full_path }

          it_behaves_like 'a nested project'
        end
      end
    end

    def go
      env = {
        'rack.input' => '',
        'QUERY_STRING' => 'go-get=1',
        'PATH_INFO' => "/#{path}",
        'warden' => double(authenticate: current_user)
      }
      middleware.call(env)
    end

    def expect_response_with_path(response, path)
      expect(response[0]).to eq(200)
      expect(response[1]['Content-Type']).to eq('text/html')
      expected_body = "<!DOCTYPE html><html><head><meta content='#{Gitlab.config.gitlab.host}/#{path} git http://#{Gitlab.config.gitlab.host}/#{path}.git' name='go-import'></head></html>\n"
      expect(response[2].body).to eq([expected_body])
    end
  end
end