BigW Consortium Gitlab

submodule_helper_spec.rb 9.68 KB
Newer Older
1 2 3
require 'spec_helper'

describe SubmoduleHelper do
4 5
  include RepoHelpers

6
  describe 'submodule links' do
7
    let(:submodule_item) { double(id: 'hash', path: 'rack') }
8
    let(:config) { Gitlab.config.gitlab }
9 10 11 12 13
    let(:repo) { double() }

    before do
      self.instance_variable_set(:@repository, repo)
    end
14 15 16

    context 'submodule on self' do
      before do
17
        allow(Gitlab.config.gitlab).to receive(:protocol).and_return('http') # set this just to be sure
18 19
      end

20
      it 'detects ssh on standard port' do
21 22
        allow(Gitlab.config.gitlab_shell).to receive(:ssh_port).and_return(22) # set this just to be sure
        allow(Gitlab.config.gitlab_shell).to receive(:ssh_path_prefix).and_return(Settings.send(:build_gitlab_shell_ssh_path_prefix))
23 24
        stub_url([config.user, '@', config.host, ':gitlab-org/gitlab-ce.git'].join(''))
        expect(submodule_links(submodule_item)).to eq([namespace_project_path('gitlab-org', 'gitlab-ce'), namespace_project_tree_path('gitlab-org', 'gitlab-ce', 'hash')])
25
      end
26

27
      it 'detects ssh on non-standard port' do
28 29
        allow(Gitlab.config.gitlab_shell).to receive(:ssh_port).and_return(2222)
        allow(Gitlab.config.gitlab_shell).to receive(:ssh_path_prefix).and_return(Settings.send(:build_gitlab_shell_ssh_path_prefix))
30 31
        stub_url(['ssh://', config.user, '@', config.host, ':2222/gitlab-org/gitlab-ce.git'].join(''))
        expect(submodule_links(submodule_item)).to eq([namespace_project_path('gitlab-org', 'gitlab-ce'), namespace_project_tree_path('gitlab-org', 'gitlab-ce', 'hash')])
32 33
      end

34
      it 'detects http on standard port' do
35 36
        allow(Gitlab.config.gitlab).to receive(:port).and_return(80)
        allow(Gitlab.config.gitlab).to receive(:url).and_return(Settings.send(:build_gitlab_url))
37 38
        stub_url(['http://', config.host, '/gitlab-org/gitlab-ce.git'].join(''))
        expect(submodule_links(submodule_item)).to eq([namespace_project_path('gitlab-org', 'gitlab-ce'), namespace_project_tree_path('gitlab-org', 'gitlab-ce', 'hash')])
39 40
      end

41
      it 'detects http on non-standard port' do
42 43
        allow(Gitlab.config.gitlab).to receive(:port).and_return(3000)
        allow(Gitlab.config.gitlab).to receive(:url).and_return(Settings.send(:build_gitlab_url))
44 45
        stub_url(['http://', config.host, ':3000/gitlab-org/gitlab-ce.git'].join(''))
        expect(submodule_links(submodule_item)).to eq([namespace_project_path('gitlab-org', 'gitlab-ce'), namespace_project_tree_path('gitlab-org', 'gitlab-ce', 'hash')])
46 47
      end

48
      it 'works with relative_url_root' do
49 50 51
        allow(Gitlab.config.gitlab).to receive(:port).and_return(80) # set this just to be sure
        allow(Gitlab.config.gitlab).to receive(:relative_url_root).and_return('/gitlab/root')
        allow(Gitlab.config.gitlab).to receive(:url).and_return(Settings.send(:build_gitlab_url))
52 53
        stub_url(['http://', config.host, '/gitlab/root/gitlab-org/gitlab-ce.git'].join(''))
        expect(submodule_links(submodule_item)).to eq([namespace_project_path('gitlab-org', 'gitlab-ce'), namespace_project_tree_path('gitlab-org', 'gitlab-ce', 'hash')])
54
      end
55 56 57 58 59 60 61 62

      it 'works with subgroups' do
        allow(Gitlab.config.gitlab).to receive(:port).and_return(80) # set this just to be sure
        allow(Gitlab.config.gitlab).to receive(:relative_url_root).and_return('/gitlab/root')
        allow(Gitlab.config.gitlab).to receive(:url).and_return(Settings.send(:build_gitlab_url))
        stub_url(['http://', config.host, '/gitlab/root/gitlab-org/sub/gitlab-ce.git'].join(''))
        expect(submodule_links(submodule_item)).to eq([namespace_project_path('gitlab-org/sub', 'gitlab-ce'), namespace_project_tree_path('gitlab-org/sub', 'gitlab-ce', 'hash')])
      end
63
    end
64

65
    context 'submodule on github.com' do
66
      it 'detects ssh' do
67
        stub_url('git@github.com:gitlab-org/gitlab-ce.git')
68
        expect(submodule_links(submodule_item)).to eq(['https://github.com/gitlab-org/gitlab-ce', 'https://github.com/gitlab-org/gitlab-ce/tree/hash'])
69
      end
70

71
      it 'detects http' do
72
        stub_url('http://github.com/gitlab-org/gitlab-ce.git')
73
        expect(submodule_links(submodule_item)).to eq(['https://github.com/gitlab-org/gitlab-ce', 'https://github.com/gitlab-org/gitlab-ce/tree/hash'])
74
      end
75

76
      it 'detects https' do
77
        stub_url('https://github.com/gitlab-org/gitlab-ce.git')
78
        expect(submodule_links(submodule_item)).to eq(['https://github.com/gitlab-org/gitlab-ce', 'https://github.com/gitlab-org/gitlab-ce/tree/hash'])
79
      end
80

81
      it 'handles urls with no .git on the end' do
82
        stub_url('http://github.com/gitlab-org/gitlab-ce')
83 84
        expect(submodule_links(submodule_item)).to eq(['https://github.com/gitlab-org/gitlab-ce', 'https://github.com/gitlab-org/gitlab-ce/tree/hash'])
      end
85

86
      it 'returns original with non-standard url' do
87
        stub_url('http://github.com/another/gitlab-org/gitlab-ce.git')
88
        expect(submodule_links(submodule_item)).to eq([repo.submodule_url_for, nil])
89 90
      end
    end
91

92 93
    context 'in-repository submodule' do
      let(:group) { create(:group, name: "Master Project", path: "master-project") }
94
      let(:project) { create(:project, group: group) }
95 96 97 98 99 100 101 102 103 104
      before do
        self.instance_variable_set(:@project, project)
      end

      it 'in-repository' do
        stub_url('./')
        expect(submodule_links(submodule_item)).to eq(["/master-project/#{project.path}", "/master-project/#{project.path}/tree/hash"])
      end
    end

105
    context 'submodule on gitlab.com' do
106
      it 'detects ssh' do
107
        stub_url('git@gitlab.com:gitlab-org/gitlab-ce.git')
108
        expect(submodule_links(submodule_item)).to eq(['https://gitlab.com/gitlab-org/gitlab-ce', 'https://gitlab.com/gitlab-org/gitlab-ce/tree/hash'])
109
      end
110

111
      it 'detects http' do
112
        stub_url('http://gitlab.com/gitlab-org/gitlab-ce.git')
113
        expect(submodule_links(submodule_item)).to eq(['https://gitlab.com/gitlab-org/gitlab-ce', 'https://gitlab.com/gitlab-org/gitlab-ce/tree/hash'])
114
      end
115

116
      it 'detects https' do
117
        stub_url('https://gitlab.com/gitlab-org/gitlab-ce.git')
118
        expect(submodule_links(submodule_item)).to eq(['https://gitlab.com/gitlab-org/gitlab-ce', 'https://gitlab.com/gitlab-org/gitlab-ce/tree/hash'])
119
      end
120

121
      it 'handles urls with no .git on the end' do
122
        stub_url('http://gitlab.com/gitlab-org/gitlab-ce')
123 124
        expect(submodule_links(submodule_item)).to eq(['https://gitlab.com/gitlab-org/gitlab-ce', 'https://gitlab.com/gitlab-org/gitlab-ce/tree/hash'])
      end
125

126 127 128 129 130
      it 'handles urls with trailing whitespace' do
        stub_url('http://gitlab.com/gitlab-org/gitlab-ce.git  ')
        expect(submodule_links(submodule_item)).to eq(['https://gitlab.com/gitlab-org/gitlab-ce', 'https://gitlab.com/gitlab-org/gitlab-ce/tree/hash'])
      end

131
      it 'returns original with non-standard url' do
132
        stub_url('http://gitlab.com/another/gitlab-org/gitlab-ce.git')
133
        expect(submodule_links(submodule_item)).to eq([repo.submodule_url_for, nil])
134 135
      end
    end
136

137
    context 'submodule on unsupported' do
138 139 140 141 142 143 144 145 146 147 148 149
      it 'sanitizes unsupported protocols' do
        stub_url('javascript:alert("XSS");')

        expect(helper.submodule_links(submodule_item)).to eq([nil, nil])
      end

      it 'sanitizes unsupported protocols disguised as a repository URL' do
        stub_url('javascript:alert("XSS");foo/bar.git')

        expect(helper.submodule_links(submodule_item)).to eq([nil, nil])
      end

150 151 152 153 154 155
      it 'sanitizes invalid URL with extended ASCII' do
        stub_url('é')

        expect(helper.submodule_links(submodule_item)).to eq([nil, nil])
      end

156
      it 'returns original' do
157
        stub_url('http://mygitserver.com/gitlab-org/gitlab-ce')
158
        expect(submodule_links(submodule_item)).to eq([repo.submodule_url_for, nil])
159

160
        stub_url('http://mygitserver.com/gitlab-org/gitlab-ce.git')
161
        expect(submodule_links(submodule_item)).to eq([repo.submodule_url_for, nil])
162 163
      end
    end
164 165

    context 'submodules with relative links' do
166
      let(:group) { create(:group, name: "Master Project", path: "master-project") }
167
      let(:project) { create(:project, group: group) }
168
      let(:commit_id) { sample_commit[:id] }
169 170 171 172 173 174 175 176 177 178

      before do
        self.instance_variable_set(:@project, project)
      end

      it 'one level down' do
        result = relative_self_links('../test.git', commit_id)
        expect(result).to eq(["/#{group.path}/test", "/#{group.path}/test/tree/#{commit_id}"])
      end

179 180 181 182 183
      it 'with trailing whitespace' do
        result = relative_self_links('../test.git ', commit_id)
        expect(result).to eq(["/#{group.path}/test", "/#{group.path}/test/tree/#{commit_id}"])
      end

184 185 186 187 188 189 190 191 192 193 194 195 196 197
      it 'two levels down' do
        result = relative_self_links('../../test.git', commit_id)
        expect(result).to eq(["/#{group.path}/test", "/#{group.path}/test/tree/#{commit_id}"])
      end

      it 'one level down with namespace and repo' do
        result = relative_self_links('../foobar/test.git', commit_id)
        expect(result).to eq(["/foobar/test", "/foobar/test/tree/#{commit_id}"])
      end

      it 'two levels down with namespace and repo' do
        result = relative_self_links('../foobar/baz/test.git', commit_id)
        expect(result).to eq(["/baz/test", "/baz/test/tree/#{commit_id}"])
      end
198 199 200

      context 'personal project' do
        let(:user) { create(:user) }
201
        let(:project) { create(:project, namespace: user.namespace) }
202 203 204 205 206 207

        it 'one level down with personal project' do
          result = relative_self_links('../test.git', commit_id)
          expect(result).to eq(["/#{user.username}/test", "/#{user.username}/test/tree/#{commit_id}"])
        end
      end
208
    end
209
  end
210 211

  def stub_url(url)
212
    allow(repo).to receive(:submodule_url_for).and_return(url)
213
  end
214
end