PageRenderTime 43ms CodeModel.GetById 17ms RepoModel.GetById 0ms app.codeStats 0ms

/spec/helpers/submodule_helper_spec.rb

https://gitlab.com/nulldoxyz/gitlab-ce
Ruby | 214 lines | 173 code | 41 blank | 0 comment | 0 complexity | 22b47b784d88181e145d03239971fdb8 MD5 | raw file
  1. require 'spec_helper'
  2. describe SubmoduleHelper do
  3. include RepoHelpers
  4. describe 'submodule links' do
  5. let(:submodule_item) { double(id: 'hash', path: 'rack') }
  6. let(:config) { Gitlab.config.gitlab }
  7. let(:repo) { double() }
  8. before do
  9. self.instance_variable_set(:@repository, repo)
  10. end
  11. context 'submodule on self' do
  12. before do
  13. allow(Gitlab.config.gitlab).to receive(:protocol).and_return('http') # set this just to be sure
  14. end
  15. it 'detects ssh on standard port' do
  16. allow(Gitlab.config.gitlab_shell).to receive(:ssh_port).and_return(22) # set this just to be sure
  17. allow(Gitlab.config.gitlab_shell).to receive(:ssh_path_prefix).and_return(Settings.send(:build_gitlab_shell_ssh_path_prefix))
  18. stub_url([config.user, '@', config.host, ':gitlab-org/gitlab-ce.git'].join(''))
  19. expect(submodule_links(submodule_item)).to eq([namespace_project_path('gitlab-org', 'gitlab-ce'), namespace_project_tree_path('gitlab-org', 'gitlab-ce', 'hash')])
  20. end
  21. it 'detects ssh on non-standard port' do
  22. allow(Gitlab.config.gitlab_shell).to receive(:ssh_port).and_return(2222)
  23. allow(Gitlab.config.gitlab_shell).to receive(:ssh_path_prefix).and_return(Settings.send(:build_gitlab_shell_ssh_path_prefix))
  24. stub_url(['ssh://', config.user, '@', config.host, ':2222/gitlab-org/gitlab-ce.git'].join(''))
  25. expect(submodule_links(submodule_item)).to eq([namespace_project_path('gitlab-org', 'gitlab-ce'), namespace_project_tree_path('gitlab-org', 'gitlab-ce', 'hash')])
  26. end
  27. it 'detects http on standard port' do
  28. allow(Gitlab.config.gitlab).to receive(:port).and_return(80)
  29. allow(Gitlab.config.gitlab).to receive(:url).and_return(Settings.send(:build_gitlab_url))
  30. stub_url(['http://', config.host, '/gitlab-org/gitlab-ce.git'].join(''))
  31. expect(submodule_links(submodule_item)).to eq([namespace_project_path('gitlab-org', 'gitlab-ce'), namespace_project_tree_path('gitlab-org', 'gitlab-ce', 'hash')])
  32. end
  33. it 'detects http on non-standard port' do
  34. allow(Gitlab.config.gitlab).to receive(:port).and_return(3000)
  35. allow(Gitlab.config.gitlab).to receive(:url).and_return(Settings.send(:build_gitlab_url))
  36. stub_url(['http://', config.host, ':3000/gitlab-org/gitlab-ce.git'].join(''))
  37. expect(submodule_links(submodule_item)).to eq([namespace_project_path('gitlab-org', 'gitlab-ce'), namespace_project_tree_path('gitlab-org', 'gitlab-ce', 'hash')])
  38. end
  39. it 'works with relative_url_root' do
  40. allow(Gitlab.config.gitlab).to receive(:port).and_return(80) # set this just to be sure
  41. allow(Gitlab.config.gitlab).to receive(:relative_url_root).and_return('/gitlab/root')
  42. allow(Gitlab.config.gitlab).to receive(:url).and_return(Settings.send(:build_gitlab_url))
  43. stub_url(['http://', config.host, '/gitlab/root/gitlab-org/gitlab-ce.git'].join(''))
  44. expect(submodule_links(submodule_item)).to eq([namespace_project_path('gitlab-org', 'gitlab-ce'), namespace_project_tree_path('gitlab-org', 'gitlab-ce', 'hash')])
  45. end
  46. it 'works with subgroups' do
  47. allow(Gitlab.config.gitlab).to receive(:port).and_return(80) # set this just to be sure
  48. allow(Gitlab.config.gitlab).to receive(:relative_url_root).and_return('/gitlab/root')
  49. allow(Gitlab.config.gitlab).to receive(:url).and_return(Settings.send(:build_gitlab_url))
  50. stub_url(['http://', config.host, '/gitlab/root/gitlab-org/sub/gitlab-ce.git'].join(''))
  51. 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')])
  52. end
  53. end
  54. context 'submodule on github.com' do
  55. it 'detects ssh' do
  56. stub_url('git@github.com:gitlab-org/gitlab-ce.git')
  57. expect(submodule_links(submodule_item)).to eq(['https://github.com/gitlab-org/gitlab-ce', 'https://github.com/gitlab-org/gitlab-ce/tree/hash'])
  58. end
  59. it 'detects http' do
  60. stub_url('http://github.com/gitlab-org/gitlab-ce.git')
  61. expect(submodule_links(submodule_item)).to eq(['https://github.com/gitlab-org/gitlab-ce', 'https://github.com/gitlab-org/gitlab-ce/tree/hash'])
  62. end
  63. it 'detects https' do
  64. stub_url('https://github.com/gitlab-org/gitlab-ce.git')
  65. expect(submodule_links(submodule_item)).to eq(['https://github.com/gitlab-org/gitlab-ce', 'https://github.com/gitlab-org/gitlab-ce/tree/hash'])
  66. end
  67. it 'handles urls with no .git on the end' do
  68. stub_url('http://github.com/gitlab-org/gitlab-ce')
  69. expect(submodule_links(submodule_item)).to eq(['https://github.com/gitlab-org/gitlab-ce', 'https://github.com/gitlab-org/gitlab-ce/tree/hash'])
  70. end
  71. it 'returns original with non-standard url' do
  72. stub_url('http://github.com/another/gitlab-org/gitlab-ce.git')
  73. expect(submodule_links(submodule_item)).to eq([repo.submodule_url_for, nil])
  74. end
  75. end
  76. context 'in-repository submodule' do
  77. let(:group) { create(:group, name: "Master Project", path: "master-project") }
  78. let(:project) { create(:project, group: group) }
  79. before do
  80. self.instance_variable_set(:@project, project)
  81. end
  82. it 'in-repository' do
  83. stub_url('./')
  84. expect(submodule_links(submodule_item)).to eq(["/master-project/#{project.path}", "/master-project/#{project.path}/tree/hash"])
  85. end
  86. end
  87. context 'submodule on gitlab.com' do
  88. it 'detects ssh' do
  89. stub_url('git@gitlab.com:gitlab-org/gitlab-ce.git')
  90. expect(submodule_links(submodule_item)).to eq(['https://gitlab.com/gitlab-org/gitlab-ce', 'https://gitlab.com/gitlab-org/gitlab-ce/tree/hash'])
  91. end
  92. it 'detects http' do
  93. stub_url('http://gitlab.com/gitlab-org/gitlab-ce.git')
  94. expect(submodule_links(submodule_item)).to eq(['https://gitlab.com/gitlab-org/gitlab-ce', 'https://gitlab.com/gitlab-org/gitlab-ce/tree/hash'])
  95. end
  96. it 'detects https' do
  97. stub_url('https://gitlab.com/gitlab-org/gitlab-ce.git')
  98. expect(submodule_links(submodule_item)).to eq(['https://gitlab.com/gitlab-org/gitlab-ce', 'https://gitlab.com/gitlab-org/gitlab-ce/tree/hash'])
  99. end
  100. it 'handles urls with no .git on the end' do
  101. stub_url('http://gitlab.com/gitlab-org/gitlab-ce')
  102. expect(submodule_links(submodule_item)).to eq(['https://gitlab.com/gitlab-org/gitlab-ce', 'https://gitlab.com/gitlab-org/gitlab-ce/tree/hash'])
  103. end
  104. it 'handles urls with trailing whitespace' do
  105. stub_url('http://gitlab.com/gitlab-org/gitlab-ce.git ')
  106. expect(submodule_links(submodule_item)).to eq(['https://gitlab.com/gitlab-org/gitlab-ce', 'https://gitlab.com/gitlab-org/gitlab-ce/tree/hash'])
  107. end
  108. it 'returns original with non-standard url' do
  109. stub_url('http://gitlab.com/another/gitlab-org/gitlab-ce.git')
  110. expect(submodule_links(submodule_item)).to eq([repo.submodule_url_for, nil])
  111. end
  112. end
  113. context 'submodule on unsupported' do
  114. it 'sanitizes unsupported protocols' do
  115. stub_url('javascript:alert("XSS");')
  116. expect(helper.submodule_links(submodule_item)).to eq([nil, nil])
  117. end
  118. it 'sanitizes unsupported protocols disguised as a repository URL' do
  119. stub_url('javascript:alert("XSS");foo/bar.git')
  120. expect(helper.submodule_links(submodule_item)).to eq([nil, nil])
  121. end
  122. it 'sanitizes invalid URL with extended ASCII' do
  123. stub_url('é')
  124. expect(helper.submodule_links(submodule_item)).to eq([nil, nil])
  125. end
  126. it 'returns original' do
  127. stub_url('http://mygitserver.com/gitlab-org/gitlab-ce')
  128. expect(submodule_links(submodule_item)).to eq([repo.submodule_url_for, nil])
  129. stub_url('http://mygitserver.com/gitlab-org/gitlab-ce.git')
  130. expect(submodule_links(submodule_item)).to eq([repo.submodule_url_for, nil])
  131. end
  132. end
  133. context 'submodules with relative links' do
  134. let(:group) { create(:group, name: "Master Project", path: "master-project") }
  135. let(:project) { create(:project, group: group) }
  136. let(:commit_id) { sample_commit[:id] }
  137. before do
  138. self.instance_variable_set(:@project, project)
  139. end
  140. it 'one level down' do
  141. result = relative_self_links('../test.git', commit_id)
  142. expect(result).to eq(["/#{group.path}/test", "/#{group.path}/test/tree/#{commit_id}"])
  143. end
  144. it 'with trailing whitespace' do
  145. result = relative_self_links('../test.git ', commit_id)
  146. expect(result).to eq(["/#{group.path}/test", "/#{group.path}/test/tree/#{commit_id}"])
  147. end
  148. it 'two levels down' do
  149. result = relative_self_links('../../test.git', commit_id)
  150. expect(result).to eq(["/#{group.path}/test", "/#{group.path}/test/tree/#{commit_id}"])
  151. end
  152. it 'one level down with namespace and repo' do
  153. result = relative_self_links('../foobar/test.git', commit_id)
  154. expect(result).to eq(["/foobar/test", "/foobar/test/tree/#{commit_id}"])
  155. end
  156. it 'two levels down with namespace and repo' do
  157. result = relative_self_links('../foobar/baz/test.git', commit_id)
  158. expect(result).to eq(["/baz/test", "/baz/test/tree/#{commit_id}"])
  159. end
  160. context 'personal project' do
  161. let(:user) { create(:user) }
  162. let(:project) { create(:project, namespace: user.namespace) }
  163. it 'one level down with personal project' do
  164. result = relative_self_links('../test.git', commit_id)
  165. expect(result).to eq(["/#{user.username}/test", "/#{user.username}/test/tree/#{commit_id}"])
  166. end
  167. end
  168. end
  169. end
  170. def stub_url(url)
  171. allow(repo).to receive(:submodule_url_for).and_return(url)
  172. end
  173. end