test_pagure_flask_ui_groups.py 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535
  1. # -*- coding: utf-8 -*-
  2. """
  3. (c) 2015-2016 - Copyright Red Hat Inc
  4. Authors:
  5. Pierre-Yves Chibon <pingou@pingoured.fr>
  6. """
  7. __requires__ = ['SQLAlchemy >= 0.8']
  8. import pkg_resources
  9. import unittest
  10. import shutil
  11. import sys
  12. import os
  13. import json
  14. from mock import patch
  15. sys.path.insert(0, os.path.join(os.path.dirname(
  16. os.path.abspath(__file__)), '..'))
  17. import pagure.lib
  18. import tests
  19. class PagureFlaskGroupstests(tests.Modeltests):
  20. """ Tests for flask groups controller of pagure """
  21. def setUp(self):
  22. """ Set up the environnment, ran before every tests. """
  23. super(PagureFlaskGroupstests, self).setUp()
  24. pagure.APP.config['TESTING'] = True
  25. pagure.SESSION = self.session
  26. pagure.ui.SESSION = self.session
  27. pagure.ui.app.SESSION = self.session
  28. pagure.ui.groups.SESSION = self.session
  29. pagure.ui.repo.SESSION = self.session
  30. pagure.ui.filters.SESSION = self.session
  31. pagure.APP.config['GIT_FOLDER'] = self.path
  32. pagure.APP.config['FORK_FOLDER'] = os.path.join(
  33. self.path, 'forks')
  34. pagure.APP.config['TICKETS_FOLDER'] = os.path.join(
  35. self.path, 'tickets')
  36. pagure.APP.config['DOCS_FOLDER'] = os.path.join(
  37. self.path, 'docs')
  38. pagure.APP.config['REQUESTS_FOLDER'] = os.path.join(
  39. self.path, 'requests')
  40. self.app = pagure.APP.test_client()
  41. def test_group_lists(self):
  42. """ Test the group_lists endpoint. """
  43. output = self.app.get('/groups')
  44. self.assertIn(
  45. '<h2 class="m-b-1">\n'
  46. ' Groups <span class="label label-default">0</span>',
  47. output.get_data(as_text=True))
  48. def test_add_group(self):
  49. """ Test the add_group endpoint. """
  50. output = self.app.get('/group/add')
  51. self.assertEqual(output.status_code, 302)
  52. user = tests.FakeUser()
  53. with tests.user_set(pagure.APP, user):
  54. output = self.app.get('/group/add')
  55. self.assertEqual(output.status_code, 403)
  56. user.username = 'pingou'
  57. with tests.user_set(pagure.APP, user):
  58. output = self.app.get('/group/add')
  59. self.assertEqual(output.status_code, 200)
  60. self.assertIn('<h2>Create group</h2>', output.get_data(as_text=True))
  61. self.assertNotIn(
  62. '<option value="admin">admin</option>', output.get_data(as_text=True))
  63. csrf_token = output.get_data(as_text=True).split(
  64. 'name="csrf_token" type="hidden" value="')[1].split('">')[0]
  65. data = {
  66. }
  67. # Insufficient input
  68. output = self.app.post('/group/add', data=data)
  69. self.assertEqual(output.status_code, 200)
  70. self.assertIn(
  71. '<h2>Create group</h2>', output.get_data(as_text=True))
  72. self.assertEqual(output.get_data(as_text=True).count(
  73. 'This field is required.'), 3)
  74. data = {
  75. 'group_name': 'test_group',
  76. 'display_name': 'Test Group',
  77. 'description': 'This is a group for the tests',
  78. }
  79. # Missing CSRF
  80. output = self.app.post('/group/add', data=data)
  81. self.assertEqual(output.status_code, 200)
  82. self.assertIn('<h2>Create group</h2>', output.get_data(as_text=True))
  83. self.assertEqual(output.get_data(as_text=True).count(
  84. 'This field is required.'), 0)
  85. data['csrf_token'] = csrf_token
  86. # All good
  87. output = self.app.post(
  88. '/group/add', data=data, follow_redirects=True)
  89. self.assertEqual(output.status_code, 200)
  90. self.assertIn(
  91. '</button>\n User `pingou` added to '
  92. 'the group `test_group`.', output.get_data(as_text=True))
  93. self.assertIn(
  94. '</button>\n Group `test_group` created.',
  95. output.get_data(as_text=True))
  96. self.assertIn(
  97. '<h2 class="m-b-1">\n'
  98. ' Groups <span class="label label-default">1</span>',
  99. output.get_data(as_text=True))
  100. user = tests.FakeUser(
  101. username='pingou',
  102. groups=pagure.APP.config['ADMIN_GROUP'])
  103. with tests.user_set(pagure.APP, user):
  104. output = self.app.get('/group/add')
  105. self.assertEqual(output.status_code, 200)
  106. self.assertIn('<h2>Create group</h2>', output.get_data(as_text=True))
  107. self.assertIn('<option value="admin">admin</option>', output.get_data(as_text=True))
  108. data = {
  109. 'group_name': 'test_admin_group',
  110. 'group_type': 'admin',
  111. 'display_name': 'Test Admin Group',
  112. 'description': 'This is another group for the tests',
  113. 'csrf_token': csrf_token,
  114. }
  115. # All good
  116. output = self.app.post(
  117. '/group/add', data=data, follow_redirects=True)
  118. self.assertEqual(output.status_code, 200)
  119. self.assertIn(
  120. '</button>\n User `pingou` added to '
  121. 'the group `test_admin_group`.', output.get_data(as_text=True))
  122. self.assertIn(
  123. '</button>\n Group `test_admin_group` '
  124. 'created.',output.get_data(as_text=True))
  125. self.assertIn(
  126. '<h2 class="m-b-1">\n'
  127. ' Groups <span class="label label-default">2</span>',
  128. output.get_data(as_text=True))
  129. def test_edit_group(self):
  130. """ Test the edit_group endpoint. """
  131. output = self.app.get('/group/test_group/edit')
  132. self.assertEqual(output.status_code, 302)
  133. user = tests.FakeUser()
  134. with tests.user_set(pagure.APP, user):
  135. output = self.app.get('/group/test_group/edit')
  136. self.assertEqual(output.status_code, 404)
  137. self.assertIn(
  138. '<p>Group not found</p>', output.get_data(as_text=True))
  139. self.test_add_group()
  140. user.username = 'foo'
  141. with tests.user_set(pagure.APP, user):
  142. output = self.app.get('/group/foo/edit')
  143. self.assertEqual(output.status_code, 404)
  144. self.assertIn(
  145. '<p>Group not found</p>', output.get_data(as_text=True))
  146. output = self.app.get('/group/test_group/edit')
  147. self.assertEqual(output.status_code, 200)
  148. self.assertIn(
  149. '<title>Edit group: test_group - Pagure</title>',
  150. output.get_data(as_text=True))
  151. self.assertIn(
  152. '<form action="/group/test_group/edit" method="post">',
  153. output.get_data(as_text=True))
  154. self.assertIn(
  155. '<strong><label for="description">Description'
  156. '</label></strong>', output.get_data(as_text=True))
  157. csrf_token = output.get_data(as_text=True).split(
  158. 'name="csrf_token" type="hidden" value="')[1].split('">')[0]
  159. # Missing CSRF
  160. data = {
  161. 'group_name': 'test_group',
  162. 'display_name': 'Test Group edited',
  163. 'description': 'This is a group for the tests edited',
  164. }
  165. output = self.app.post(
  166. '/group/test_group/edit', data=data, follow_redirects=True)
  167. #print output.data
  168. self.assertEqual(output.status_code, 200)
  169. self.assertIn(
  170. '<title>Edit group: test_group - Pagure</title>',
  171. output.get_data(as_text=True))
  172. self.assertIn(
  173. '<form action="/group/test_group/edit" method="post">',
  174. output.get_data(as_text=True))
  175. self.assertIn(
  176. '<strong><label for="description">Description'
  177. '</label></strong>', output.get_data(as_text=True))
  178. # User not allowed
  179. data['csrf_token'] = csrf_token
  180. output = self.app.post(
  181. '/group/test_group/edit', data=data, follow_redirects=True)
  182. self.assertEqual(output.status_code, 200)
  183. self.assertIn(
  184. '<title>Group test_group - Pagure</title>',
  185. output.get_data(as_text=True))
  186. self.assertIn(
  187. '</button>\n You are not '
  188. 'allowed to edit this group',
  189. output.get_data(as_text=True))
  190. self.assertIn(
  191. '<span class="oi" data-glyph="people"></span> '
  192. '&nbsp;Test Group', output.get_data(as_text=True))
  193. user.username = 'pingou'
  194. with tests.user_set(pagure.APP, user):
  195. # Invalid repo
  196. output = self.app.post(
  197. '/group/bar/edit', data=data, follow_redirects=True)
  198. self.assertEqual(output.status_code, 404)
  199. self.assertIn(
  200. '<p>Group not found</p>', output.get_data(as_text=True))
  201. output = self.app.post(
  202. '/group/test_group/edit', data=data, follow_redirects=True)
  203. self.assertEqual(output.status_code, 200)
  204. self.assertIn(
  205. '<title>Group test_group - Pagure</title>',
  206. output.get_data(as_text=True))
  207. self.assertIn(
  208. '<span class="oi" data-glyph="people"></span> '
  209. '&nbsp;Test Group', output.get_data(as_text=True))
  210. self.assertIn(
  211. 'Group &#34;Test Group edited&#34; (test_group) edited',
  212. output.get_data(as_text=True))
  213. def test_group_delete(self):
  214. """ Test the group_delete endpoint. """
  215. output = self.app.post('/group/foo/delete')
  216. self.assertEqual(output.status_code, 302)
  217. user = tests.FakeUser()
  218. with tests.user_set(pagure.APP, user):
  219. output = self.app.post('/group/foo/delete', follow_redirects=True)
  220. self.assertEqual(output.status_code, 200)
  221. self.assertIn(
  222. '<p>No groups have been created on this pagure instance '
  223. 'yet</p>', output.get_data(as_text=True))
  224. self.assertIn(
  225. '<h2 class="m-b-1">\n'
  226. ' Groups <span class="label label-default">0</span>',
  227. output.get_data(as_text=True))
  228. self.test_add_group()
  229. with tests.user_set(pagure.APP, user):
  230. output = self.app.post('/group/foo/delete', follow_redirects=True)
  231. self.assertEqual(output.status_code, 200)
  232. self.assertIn(
  233. '<h2 class="m-b-1">\n'
  234. ' Groups <span class="label label-default">1</span>',
  235. output.get_data(as_text=True))
  236. csrf_token = output.get_data(as_text=True).split(
  237. 'name="csrf_token" type="hidden" value="')[1].split('">')[0]
  238. user.username = 'foo'
  239. with tests.user_set(pagure.APP, user):
  240. data = {
  241. 'csrf_token': csrf_token,
  242. }
  243. output = self.app.post(
  244. '/group/bar/delete', data=data, follow_redirects=True)
  245. self.assertEqual(output.status_code, 200)
  246. self.assertIn(
  247. '</button>\n No group `bar` found',
  248. output.get_data(as_text=True))
  249. self.assertIn(
  250. '<h2 class="m-b-1">\n'
  251. ' Groups <span class="label label-default">1</span>',
  252. output.get_data(as_text=True))
  253. output = self.app.post(
  254. '/group/test_group/delete', data=data, follow_redirects=True)
  255. self.assertEqual(output.status_code, 200)
  256. self.assertIn(
  257. '</button>\n You are not allowed to '
  258. 'delete the group test_group', output.get_data(as_text=True))
  259. self.assertIn(
  260. '<h2 class="m-b-1">\n'
  261. ' Groups <span class="label label-default">1</span>',
  262. output.get_data(as_text=True))
  263. user.username = 'bar'
  264. with tests.user_set(pagure.APP, user):
  265. output = self.app.post(
  266. '/group/test_group/delete', data=data, follow_redirects=True)
  267. self.assertEqual(output.status_code, 404)
  268. user.username = 'pingou'
  269. with tests.user_set(pagure.APP, user):
  270. output = self.app.post(
  271. '/group/test_group/delete', data=data, follow_redirects=True)
  272. self.assertEqual(output.status_code, 200)
  273. self.assertIn(
  274. '</button>\n Group `test_group` has '
  275. 'been deleted', output.get_data(as_text=True))
  276. self.assertIn(
  277. '<h2 class="m-b-1">\n'
  278. ' Groups <span class="label label-default">0</span>',
  279. output.get_data(as_text=True))
  280. def test_view_group(self):
  281. """ Test the view_group endpoint. """
  282. output = self.app.get('/group/foo')
  283. self.assertEqual(output.status_code, 404)
  284. self.test_add_group()
  285. user = tests.FakeUser()
  286. with tests.user_set(pagure.APP, user):
  287. output = self.app.get('/group/test_group')
  288. self.assertEqual(output.status_code, 200)
  289. self.assertIn(
  290. '<span class="oi" data-glyph="people"></span> &nbsp;'
  291. 'Test Group', output.get_data(as_text=True))
  292. output = self.app.get('/group/test_admin_group')
  293. self.assertEqual(output.status_code, 404)
  294. user = tests.FakeUser(
  295. username='pingou',
  296. groups=pagure.APP.config['ADMIN_GROUP'])
  297. with tests.user_set(pagure.APP, user):
  298. # Admin can see group of type admins
  299. output = self.app.get('/group/test_admin_group')
  300. self.assertEqual(output.status_code, 200)
  301. self.assertIn(
  302. '<span class="oi" data-glyph="people"></span> &nbsp;'
  303. 'Test Admin Group', output.get_data(as_text=True))
  304. self.assertEqual(output.get_data(as_text=True).count(
  305. '<a href="/user/'), 1)
  306. csrf_token = output.get_data(as_text=True).split(
  307. 'name="csrf_token" type="hidden" value="')[1].split('">')[0]
  308. # No CSRF
  309. data = {
  310. 'user': 'bar'
  311. }
  312. output = self.app.post('/group/test_admin_group', data=data)
  313. self.assertEqual(output.status_code, 200)
  314. self.assertIn(
  315. '<span class="oi" data-glyph="people"></span> &nbsp;'
  316. 'Test Admin Group', output.get_data(as_text=True))
  317. self.assertEqual(output.get_data(as_text=True).count(
  318. '<a href="/user/'), 1)
  319. # Invalid user
  320. data = {
  321. 'user': 'bar',
  322. 'csrf_token': csrf_token,
  323. }
  324. output = self.app.post(
  325. '/group/test_admin_group', data=data, follow_redirects=True)
  326. self.assertEqual(output.status_code, 200)
  327. self.assertIn(
  328. '</button>\n No user `bar` found',
  329. output.get_data(as_text=True))
  330. self.assertIn(
  331. '<span class="oi" data-glyph="people"></span> &nbsp;'
  332. 'Test Admin Group', output.get_data(as_text=True))
  333. self.assertEqual(output.get_data(as_text=True).count(
  334. '<a href="/user/'), 1)
  335. # All good
  336. data = {
  337. 'user': 'foo',
  338. 'csrf_token': csrf_token,
  339. }
  340. output = self.app.post('/group/test_admin_group', data=data)
  341. self.assertEqual(output.status_code, 200)
  342. self.assertIn(
  343. '</button>\n User `foo` added to the '
  344. 'group `test_admin_group`.', output.get_data(as_text=True))
  345. self.assertIn(
  346. '<span class="oi" data-glyph="people"></span> &nbsp;'
  347. 'Test Admin Group', output.get_data(as_text=True))
  348. self.assertEqual(output.get_data(as_text=True).count(
  349. '<a href="/user/'), 2)
  350. def test_group_user_delete(self):
  351. """ Test the group_user_delete endpoint. """
  352. output = self.app.post('/group/foo/bar/delete')
  353. self.assertEqual(output.status_code, 302)
  354. user = tests.FakeUser()
  355. with tests.user_set(pagure.APP, user):
  356. output = self.app.post(
  357. '/group/foo/bar/delete', follow_redirects=True)
  358. self.assertEqual(output.status_code, 404)
  359. self.test_add_group()
  360. user = tests.FakeUser()
  361. with tests.user_set(pagure.APP, user):
  362. output = self.app.post(
  363. '/group/test_group/bar/delete', follow_redirects=True)
  364. self.assertEqual(output.status_code, 200)
  365. self.assertIn(
  366. '<span class="oi" data-glyph="people"></span> &nbsp;'
  367. 'Test Group', output.get_data(as_text=True))
  368. self.assertEqual(output.get_data(as_text=True).count(
  369. '<a href="/user/'), 1)
  370. output = self.app.get('/new/')
  371. csrf_token = output.get_data(as_text=True).split(
  372. 'name="csrf_token" type="hidden" value="')[1].split('">')[0]
  373. data = {'csrf_token': csrf_token}
  374. output = self.app.post(
  375. '/group/test_group/bar/delete', data=data,
  376. follow_redirects=True)
  377. self.assertEqual(output.status_code, 200)
  378. self.assertIn(
  379. '</button>\n No user `bar` found',
  380. output.get_data(as_text=True))
  381. self.assertIn(
  382. '<span class="oi" data-glyph="people"></span> &nbsp;'
  383. 'Test Group', output.get_data(as_text=True))
  384. self.assertEqual(output.get_data(as_text=True).count(
  385. '<a href="/user/'), 1)
  386. output = self.app.post(
  387. '/group/test_group/foo/delete', data=data,
  388. follow_redirects=True)
  389. self.assertEqual(output.status_code, 200)
  390. self.assertIn(
  391. '</button>\n Could not find user '
  392. 'username', output.get_data(as_text=True))
  393. self.assertIn(
  394. '<span class="oi" data-glyph="people"></span> &nbsp;'
  395. 'Test Group', output.get_data(as_text=True))
  396. self.assertEqual(output.get_data(as_text=True).count(
  397. '<a href="/user/'), 1)
  398. user.username = 'pingou'
  399. with tests.user_set(pagure.APP, user):
  400. # User not in the group
  401. output = self.app.post(
  402. '/group/test_group/foo/delete', data=data,
  403. follow_redirects=True)
  404. self.assertEqual(output.status_code, 200)
  405. self.assertIn(
  406. '</button>\n User `foo` could not be '
  407. 'found in the group `test_group`',
  408. output.get_data(as_text=True))
  409. self.assertIn(
  410. '<span class="oi" data-glyph="people"></span> &nbsp;'
  411. 'Test Group', output.get_data(as_text=True))
  412. self.assertEqual(output.get_data(as_text=True).count(
  413. '<a href="/user/'), 1)
  414. # Cannot delete creator
  415. output = self.app.post(
  416. '/group/test_group/foo/delete', data=data,
  417. follow_redirects=True)
  418. self.assertEqual(output.status_code, 200)
  419. self.assertIn(
  420. '</button>\n User `foo` could not be '
  421. 'found in the group `test_group`',
  422. output.get_data(as_text=True))
  423. self.assertIn(
  424. '<span class="oi" data-glyph="people"></span> &nbsp;'
  425. 'Test Group', output.get_data(as_text=True))
  426. self.assertEqual(output.get_data(as_text=True).count(
  427. '<a href="/user/'), 1)
  428. # Add user foo
  429. data = {
  430. 'user': 'foo',
  431. 'csrf_token': csrf_token,
  432. }
  433. output = self.app.post('/group/test_group', data=data)
  434. self.assertEqual(output.status_code, 200)
  435. self.assertIn(
  436. '</button>\n User `foo` added to the '
  437. 'group `test_group`.', output.get_data(as_text=True))
  438. self.assertIn(
  439. '<span class="oi" data-glyph="people"></span> &nbsp;'
  440. 'Test Group', output.get_data(as_text=True))
  441. self.assertEqual(output.get_data(as_text=True).count(
  442. '<a href="/user/'), 2)
  443. output = self.app.post(
  444. '/group/test_group/foo/delete', data=data,
  445. follow_redirects=True)
  446. self.assertEqual(output.status_code, 200)
  447. self.assertIn(
  448. '</button>\n User `foo` removed from '
  449. 'the group `test_group`', output.get_data(as_text=True))
  450. self.assertIn(
  451. '<span class="oi" data-glyph="people"></span> &nbsp;'
  452. 'Test Group', output.get_data(as_text=True))
  453. self.assertEqual(output.get_data(as_text=True).count(
  454. '<a href="/user/'), 1)
  455. if __name__ == '__main__':
  456. SUITE = unittest.TestLoader().loadTestsFromTestCase(
  457. PagureFlaskGroupstests)
  458. unittest.TextTestRunner(verbosity=2).run(SUITE)