test_pagure_flask_ui_repo_slash_name.py 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258
  1. # -*- coding: utf-8 -*-
  2. """
  3. (c) 2016-2017 - Copyright Red Hat Inc
  4. Authors:
  5. Pierre-Yves Chibon <pingou@pingoured.fr>
  6. """
  7. from __future__ import unicode_literals
  8. __requires__ = ['SQLAlchemy >= 0.8']
  9. import pkg_resources
  10. import json
  11. import unittest
  12. import shutil
  13. import sys
  14. import tempfile
  15. import os
  16. import pygit2
  17. from mock import patch
  18. sys.path.insert(0, os.path.join(os.path.dirname(
  19. os.path.abspath(__file__)), '..'))
  20. import pagure.lib
  21. import tests
  22. from pagure.lib.repo import PagureRepo
  23. class PagureFlaskSlashInNametests(tests.SimplePagureTest):
  24. """ Tests for flask application when the project contains a '/'.
  25. """
  26. def setUp(self):
  27. """ Set up the environnment, ran before every tests. """
  28. super(PagureFlaskSlashInNametests, self).setUp()
  29. def set_up_git_repo(self, name='test'):
  30. """ Set up the git repo to play with. """
  31. # Create a git repo to play with
  32. gitrepo = os.path.join(self.path, 'repos', '%s.git' % name)
  33. repo = pygit2.init_repository(gitrepo, bare=True)
  34. newpath = tempfile.mkdtemp(prefix='pagure-other-test')
  35. repopath = os.path.join(newpath, 'test')
  36. clone_repo = pygit2.clone_repository(gitrepo, repopath)
  37. # Create a file in that git repo
  38. with open(os.path.join(repopath, 'sources'), 'w') as stream:
  39. stream.write('foo\n bar')
  40. clone_repo.index.add('sources')
  41. clone_repo.index.write()
  42. # Commits the files added
  43. tree = clone_repo.index.write_tree()
  44. author = pygit2.Signature(
  45. 'Alice Author', 'alice@authors.tld')
  46. committer = pygit2.Signature(
  47. 'Cecil Committer', 'cecil@committers.tld')
  48. clone_repo.create_commit(
  49. 'refs/heads/master', # the name of the reference to update
  50. author,
  51. committer,
  52. 'Add sources file for testing',
  53. # binary string representing the tree object ID
  54. tree,
  55. # list of binary strings representing parents of the new commit
  56. []
  57. )
  58. refname = 'refs/heads/master'
  59. ori_remote = clone_repo.remotes[0]
  60. PagureRepo.push(ori_remote, refname)
  61. @patch('pagure.lib.notify.send_email')
  62. def test_view_repo_empty(self, send_email):
  63. """ Test the view_repo endpoint when the project has a slash in its
  64. name.
  65. """
  66. send_email.return_value = True
  67. tests.create_projects(self.session)
  68. # Non-existant git repo
  69. output = self.app.get('/test')
  70. self.assertEqual(output.status_code, 404)
  71. # Create a git repo to play with
  72. gitrepo = os.path.join(self.path, 'repos', 'test.git')
  73. repo = pygit2.init_repository(gitrepo, bare=True)
  74. # With git repo
  75. output = self.app.get('/test')
  76. self.assertEqual(output.status_code, 200)
  77. output_text = output.get_data(as_text=True)
  78. self.assertIn(
  79. '<div class="card-block">\n '
  80. '<h5><strong>Source GIT URLs</strong></h5>', output_text)
  81. self.assertIn(
  82. '<p>The Project Creator has not pushed any code yet</p>',
  83. output_text)
  84. # We can't create the project `forks/test` the normal way
  85. self.assertRaises(
  86. pagure.exceptions.PagureException,
  87. pagure.lib.new_project,
  88. self.session,
  89. name='test',
  90. namespace='forks',
  91. description='test project forks/test',
  92. url='',
  93. avatar_email='',
  94. user='pingou',
  95. blacklist=pagure.config.config['BLACKLISTED_PROJECTS'],
  96. allowed_prefix=pagure.config.config['ALLOWED_PREFIX'],
  97. gitfolder=pagure.config.config['GIT_FOLDER'],
  98. docfolder=pagure.config.config['DOCS_FOLDER'],
  99. ticketfolder=pagure.config.config['TICKETS_FOLDER'],
  100. requestfolder=pagure.config.config['REQUESTS_FOLDER'],
  101. )
  102. # So just put it in the DB
  103. item = pagure.lib.model.Project(
  104. user_id=1, # pingou
  105. name='test',
  106. namespace='forks',
  107. description='test project forks/test',
  108. hook_token='aaabbbcccddd',
  109. )
  110. self.session.add(item)
  111. self.session.commit()
  112. # Create a git repo to play with
  113. gitrepo = os.path.join(self.path, 'repos', 'forks/test.git')
  114. repo = pygit2.init_repository(gitrepo, bare=True)
  115. output = self.app.get('/forks/test')
  116. self.assertEqual(output.status_code, 200)
  117. output_text = output.get_data(as_text=True)
  118. self.assertIn(
  119. '<div class="card-block">\n '
  120. '<h5><strong>Source GIT URLs</strong></h5>', output_text)
  121. self.assertIn(
  122. '<p>The Project Creator has not pushed any code yet</p>',
  123. output_text)
  124. output = self.app.get('/forks/test/issues')
  125. self.assertEqual(output.status_code, 200)
  126. output_text = output.get_data(as_text=True)
  127. self.assertIn(
  128. '<title>Issues - forks/test - Pagure</title>', output_text)
  129. self.assertIn(
  130. '<td colspan="6" class="noresult">No issues found</td>',
  131. output_text)
  132. @patch('pagure.lib.notify.send_email')
  133. def test_view_repo(self, send_email):
  134. """ Test the view_repo endpoint when the project has a slash in its
  135. name.
  136. """
  137. send_email.return_value = True
  138. tests.create_projects(self.session)
  139. # Non-existant git repo
  140. output = self.app.get('/test')
  141. self.assertEqual(output.status_code, 404)
  142. self.set_up_git_repo()
  143. # With git repo
  144. output = self.app.get('/test')
  145. self.assertEqual(output.status_code, 200)
  146. output_text = output.get_data(as_text=True)
  147. self.assertIn(
  148. '<div class="card-block">\n '
  149. '<h5><strong>Source GIT URLs</strong></h5>', output_text)
  150. # We can't create the project `forks/test` the normal way
  151. self.assertRaises(
  152. pagure.exceptions.PagureException,
  153. pagure.lib.new_project,
  154. self.session,
  155. name='test',
  156. namespace='forks',
  157. description='test project forks/test',
  158. url='',
  159. avatar_email='',
  160. user='pingou',
  161. blacklist=pagure.config.config['BLACKLISTED_PROJECTS'],
  162. allowed_prefix=pagure.config.config['ALLOWED_PREFIX'],
  163. gitfolder=pagure.config.config['GIT_FOLDER'],
  164. docfolder=pagure.config.config['DOCS_FOLDER'],
  165. ticketfolder=pagure.config.config['TICKETS_FOLDER'],
  166. requestfolder=pagure.config.config['REQUESTS_FOLDER'],
  167. )
  168. # So just put it in the DB
  169. item = pagure.lib.model.Project(
  170. user_id=1, # pingou
  171. name='test',
  172. namespace='forks',
  173. description='test project forks/test',
  174. hook_token='aaabbbcccddd',
  175. )
  176. self.session.add(item)
  177. self.session.commit()
  178. self.set_up_git_repo(name='forks/test')
  179. # Front page shows fine
  180. output = self.app.get('/forks/test')
  181. self.assertEqual(output.status_code, 200)
  182. output_text = output.get_data(as_text=True)
  183. self.assertIn(
  184. '<div class="card-block">\n '
  185. '<h5><strong>Source GIT URLs</strong></h5>', output_text)
  186. self.assertIn('Add sources file for testing', output_text)
  187. self.assertIn(
  188. '<title>Overview - forks/test - Pagure</title>', output_text)
  189. # Issues list shows fine
  190. output = self.app.get('/forks/test/issues')
  191. self.assertEqual(output.status_code, 200)
  192. output_text = output.get_data(as_text=True)
  193. self.assertIn(
  194. '<title>Issues - forks/test - Pagure</title>', output_text)
  195. self.assertIn(
  196. '<td colspan="6" class="noresult">No issues found</td>',
  197. output_text)
  198. # Try accessing the commit
  199. gitrepo = os.path.join(self.path, 'repos', 'forks/test.git')
  200. repo = pygit2.Repository(gitrepo)
  201. master_branch = repo.lookup_branch('master')
  202. first_commit = master_branch.get_object().hex
  203. output = self.app.get('/forks/test/commits')
  204. self.assertEqual(output.status_code, 200)
  205. output_text = output.get_data(as_text=True)
  206. self.assertIn(first_commit, output_text)
  207. self.assertIn(
  208. '<a href="/forks/test/c/%s?branch=master"' % first_commit,
  209. output_text)
  210. output = self.app.get('/forks/test/c/%s' % first_commit)
  211. self.assertEqual(output.status_code, 200)
  212. output_text = output.get_data(as_text=True)
  213. self.assertIn('<title>Commit - forks/test ', output_text)
  214. self.assertIn(
  215. '<span class="label label-success">+2</span> </span>',
  216. output_text)
  217. if __name__ == '__main__':
  218. unittest.main(verbosity=2)