test_pagure_flask_ui_repo_delete_project.py 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284
  1. # -*- coding: utf-8 -*-
  2. """
  3. (c) 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 sys
  11. import os
  12. from mock import patch, MagicMock
  13. sys.path.insert(0, os.path.join(os.path.dirname(
  14. os.path.abspath(__file__)), '..'))
  15. import pagure
  16. import pagure.lib
  17. import tests
  18. class PagureFlaskDeleteRepotests(tests.Modeltests):
  19. """ Tests for deleting a project in pagure """
  20. def setUp(self):
  21. """ Set up the environnment, ran before every tests. """
  22. super(PagureFlaskDeleteRepotests, self).setUp()
  23. # Create some projects
  24. tests.create_projects(self.session)
  25. tests.create_projects_git(os.path.join(self.path, 'repos'))
  26. self.session.commit()
  27. # Create all the git repos
  28. tests.create_projects_git(os.path.join(self.path, 'repos'))
  29. tests.create_projects_git(os.path.join(self.path, 'repos', 'docs'))
  30. tests.create_projects_git(
  31. os.path.join(self.path, 'repos', 'tickets'), bare=True)
  32. tests.create_projects_git(
  33. os.path.join(self.path, 'repos', 'requests'), bare=True)
  34. project = pagure.lib.get_authorized_project(
  35. self.session, project_name='test')
  36. self.assertIsNotNone(project)
  37. # Ensure the project isn't read-only
  38. project.read_only = False
  39. self.session.add(project)
  40. self.session.commit()
  41. # Create a fork
  42. task = pagure.lib.fork_project(
  43. session=self.session,
  44. user='pingou',
  45. repo=project,
  46. gitfolder=os.path.join(self.path, 'repos'),
  47. docfolder=os.path.join(self.path, 'repos', 'docs'),
  48. ticketfolder=os.path.join(self.path, 'repos', 'tickets'),
  49. requestfolder=os.path.join(self.path, 'repos', 'requests'),
  50. )
  51. task.get()
  52. # Ensure everything was correctly created
  53. projects = pagure.lib.search_projects(self.session)
  54. self.assertEqual(len(projects), 4)
  55. @patch.dict('pagure.config.config', {'ENABLE_DEL_PROJECTS': False})
  56. @patch('pagure.lib.notify.send_email', MagicMock(return_value=True))
  57. @patch('pagure.decorators.admin_session_timedout',
  58. MagicMock(return_value=False))
  59. def test_delete_repo_when_turned_off(self):
  60. """ Test the delete_repo endpoint for a fork when only deleting main
  61. project is forbidden.
  62. """
  63. user = tests.FakeUser(username='pingou')
  64. with tests.user_set(self.app.application, user):
  65. output = self.app.post('/test/delete', follow_redirects=True)
  66. self.assertEqual(output.status_code, 404)
  67. projects = pagure.lib.search_projects(self.session)
  68. self.assertEqual(len(projects), 4)
  69. @patch('pagure.lib.notify.send_email', MagicMock(return_value=True))
  70. @patch('pagure.decorators.admin_session_timedout',
  71. MagicMock(return_value=False))
  72. def test_delete_button_present(self):
  73. """ Test that the delete button is present when deletions are
  74. allowed.
  75. """
  76. user = tests.FakeUser(username='pingou')
  77. with tests.user_set(self.app.application, user):
  78. output = self.app.get('/test/settings')
  79. self.assertEqual(output.status_code, 200)
  80. self.assertIn('<form action="/test/delete"', output.get_data(as_text=True))
  81. self.assertIn('&nbsp; Delete the test project', output.get_data(as_text=True))
  82. projects = pagure.lib.search_projects(self.session)
  83. self.assertEqual(len(projects), 4)
  84. @patch.dict('pagure.config.config', {'ENABLE_DEL_PROJECTS': False})
  85. @patch('pagure.lib.notify.send_email', MagicMock(return_value=True))
  86. @patch('pagure.decorators.admin_session_timedout',
  87. MagicMock(return_value=False))
  88. def test_delete_button_absent(self):
  89. """ Test that the delete button is absent when deletions are not
  90. allowed.
  91. """
  92. user = tests.FakeUser(username='pingou')
  93. with tests.user_set(self.app.application, user):
  94. output = self.app.get('/test/settings')
  95. self.assertEqual(output.status_code, 200)
  96. self.assertNotIn('<form action="/test/delete"', output.get_data(as_text=True))
  97. self.assertNotIn('&nbsp; Delete the test project', output.get_data(as_text=True))
  98. projects = pagure.lib.search_projects(self.session)
  99. self.assertEqual(len(projects), 4)
  100. @patch.dict('pagure.config.config', {'ENABLE_DEL_PROJECTS': False})
  101. @patch.dict('pagure.config.config', {'ENABLE_DEL_FORKS': True})
  102. @patch('pagure.lib.notify.send_email', MagicMock(return_value=True))
  103. @patch('pagure.decorators.admin_session_timedout',
  104. MagicMock(return_value=False))
  105. def test_delete_fork_when_project_off_refreshing(self):
  106. """ Test the delete_repo endpoint for a fork when only deleting main
  107. project is forbidden but the fork is being refreshed in the backend
  108. """
  109. project = pagure.lib.get_authorized_project(
  110. self.session, project_name='test', user='pingou')
  111. self.assertIsNotNone(project)
  112. # Ensure the project isn't read-only
  113. project.read_only = True
  114. self.session.add(project)
  115. self.session.commit()
  116. user = tests.FakeUser(username='pingou')
  117. with tests.user_set(self.app.application, user):
  118. output = self.app.post(
  119. '/fork/pingou/test/delete', follow_redirects=True)
  120. self.assertEqual(output.status_code, 200)
  121. self.assertIn(
  122. '</button>\n The ACLs of this project '
  123. 'are being refreshed in the backend this prevents the '
  124. 'project from being deleted. Please wait for this task to '
  125. 'finish before trying again. Thanks!', output.get_data(as_text=True))
  126. projects = pagure.lib.search_projects(self.session)
  127. self.assertEqual(len(projects), 4)
  128. @patch.dict('pagure.config.config', {'ENABLE_DEL_PROJECTS': False})
  129. @patch.dict('pagure.config.config', {'ENABLE_DEL_FORKS': True})
  130. @patch('pagure.lib.notify.send_email', MagicMock(return_value=True))
  131. @patch('pagure.decorators.admin_session_timedout',
  132. MagicMock(return_value=False))
  133. def test_delete_fork_when_project_off(self):
  134. """ Test the delete_repo endpoint for a fork when only deleting main
  135. project is forbidden.
  136. """
  137. project = pagure.lib.get_authorized_project(
  138. self.session, project_name='test', user='pingou')
  139. self.assertIsNotNone(project)
  140. # Ensure the project isn't read-only
  141. project.read_only = False
  142. self.session.add(project)
  143. self.session.commit()
  144. user = tests.FakeUser(username='pingou')
  145. with tests.user_set(self.app.application, user):
  146. output = self.app.post(
  147. '/fork/pingou/test/delete', follow_redirects=True)
  148. self.assertEqual(output.status_code, 200)
  149. projects = pagure.lib.search_projects(self.session)
  150. self.assertEqual(len(projects), 3)
  151. @patch.dict('pagure.config.config', {'ENABLE_DEL_PROJECTS': False})
  152. @patch.dict('pagure.config.config', {'ENABLE_DEL_FORKS': False})
  153. @patch('pagure.lib.notify.send_email', MagicMock(return_value=True))
  154. @patch('pagure.decorators.admin_session_timedout',
  155. MagicMock(return_value=False))
  156. def test_delete_fork_when_fork_and_project_off(self):
  157. """ Test the delete_repo endpoint for a fork when deleting fork and
  158. project is forbidden.
  159. """
  160. user = tests.FakeUser(username='pingou')
  161. with tests.user_set(self.app.application, user):
  162. output = self.app.post(
  163. '/fork/pingou/test/delete', follow_redirects=True)
  164. self.assertEqual(output.status_code, 404)
  165. projects = pagure.lib.search_projects(self.session)
  166. self.assertEqual(len(projects), 4)
  167. @patch.dict('pagure.config.config', {'ENABLE_DEL_PROJECTS': False})
  168. @patch.dict('pagure.config.config', {'ENABLE_DEL_FORKS': False})
  169. @patch('pagure.lib.notify.send_email', MagicMock(return_value=True))
  170. @patch('pagure.decorators.admin_session_timedout',
  171. MagicMock(return_value=False))
  172. def test_delete_fork_button_absent(self):
  173. """ Test that the delete button is absent when deletions are not
  174. allowed.
  175. """
  176. user = tests.FakeUser(username='pingou')
  177. with tests.user_set(self.app.application, user):
  178. output = self.app.get('/fork/pingou/test/settings')
  179. self.assertEqual(output.status_code, 200)
  180. self.assertNotIn(
  181. '<form action="/fork/pingou/test/delete"', output.get_data(as_text=True))
  182. self.assertNotIn(
  183. '&nbsp; Delete the forks/pingou/test project', output.get_data(as_text=True))
  184. projects = pagure.lib.search_projects(self.session)
  185. self.assertEqual(len(projects), 4)
  186. @patch.dict('pagure.config.config', {'ENABLE_DEL_PROJECTS': False})
  187. @patch.dict('pagure.config.config', {'ENABLE_DEL_FORKS': True})
  188. @patch('pagure.lib.notify.send_email', MagicMock(return_value=True))
  189. @patch('pagure.decorators.admin_session_timedout',
  190. MagicMock(return_value=False))
  191. def test_delete_fork_button_fork_del_allowed(self):
  192. """ Test that the delete button is present when deletions of projects
  193. is not allowed but deletions of forks is.
  194. """
  195. project = pagure.lib.get_authorized_project(
  196. self.session, project_name='test', user='pingou')
  197. self.assertIsNotNone(project)
  198. # Ensure the project isn't read-only
  199. project.read_only = False
  200. self.session.add(project)
  201. self.session.commit()
  202. user = tests.FakeUser(username='pingou')
  203. with tests.user_set(self.app.application, user):
  204. output = self.app.get('/fork/pingou/test/settings')
  205. self.assertEqual(output.status_code, 200)
  206. self.assertIn(
  207. '<form action="/fork/pingou/test/delete"', output.get_data(as_text=True))
  208. self.assertIn(
  209. '&nbsp; Delete the forks/pingou/test project', output.get_data(as_text=True))
  210. projects = pagure.lib.search_projects(self.session)
  211. self.assertEqual(len(projects), 4)
  212. @patch.dict('pagure.config.config', {'ENABLE_DEL_PROJECTS': False})
  213. @patch.dict('pagure.config.config', {'ENABLE_DEL_FORKS': True})
  214. @patch('pagure.lib.notify.send_email', MagicMock(return_value=True))
  215. @patch('pagure.decorators.admin_session_timedout',
  216. MagicMock(return_value=False))
  217. def test_delete_fork_button_fork_del_allowed_read_only(self):
  218. """ Test that the delete button is absent when deletions of projects
  219. is not allowed but deletions of forks is but fork is still being
  220. processed.
  221. """
  222. project = pagure.lib.get_authorized_project(
  223. self.session, project_name='test', user='pingou')
  224. self.assertIsNotNone(project)
  225. # Ensure the project is read-only
  226. project.read_only = True
  227. self.session.add(project)
  228. self.session.commit()
  229. user = tests.FakeUser(username='pingou')
  230. with tests.user_set(self.app.application, user):
  231. output = self.app.get('/fork/pingou/test/settings')
  232. self.assertEqual(output.status_code, 200)
  233. self.assertNotIn(
  234. '<form action="/fork/pingou/test/delete"', output.get_data(as_text=True))
  235. self.assertIn(
  236. 'title="Action disabled while project\'s ACLs are being '
  237. 'refreshed">', output.get_data(as_text=True))
  238. self.assertIn(
  239. '&nbsp; Delete the forks/pingou/test project', output.get_data(as_text=True))