test_pagure_flask_ui_issues.py 71 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829
  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. from unittest.case import SkipTest
  10. import json
  11. import unittest
  12. import shutil
  13. import sys
  14. import os
  15. try:
  16. import pyclamd
  17. except:
  18. pyclamd = None
  19. import tempfile
  20. import pygit2
  21. from mock import patch
  22. sys.path.insert(0, os.path.join(os.path.dirname(
  23. os.path.abspath(__file__)), '..'))
  24. import pagure.lib
  25. import tests
  26. class PagureFlaskIssuestests(tests.Modeltests):
  27. """ Tests for flask issues controller of pagure """
  28. def setUp(self):
  29. """ Set up the environnment, ran before every tests. """
  30. super(PagureFlaskIssuestests, self).setUp()
  31. pagure.APP.config['TESTING'] = True
  32. # TODO: Figure a way to enable this test on jenkins
  33. if not os.environ.get('BUILD_ID'):
  34. pagure.APP.config['VIRUS_SCAN_ATTACHMENTS'] = True
  35. pagure.SESSION = self.session
  36. pagure.ui.SESSION = self.session
  37. pagure.ui.app.SESSION = self.session
  38. pagure.ui.issues.SESSION = self.session
  39. pagure.ui.repo.SESSION = self.session
  40. pagure.ui.filters.SESSION = self.session
  41. pagure.APP.config['GIT_FOLDER'] = self.path
  42. pagure.APP.config['FORK_FOLDER'] = os.path.join(
  43. self.path, 'forks')
  44. pagure.APP.config['TICKETS_FOLDER'] = os.path.join(
  45. self.path, 'tickets')
  46. pagure.APP.config['DOCS_FOLDER'] = os.path.join(
  47. self.path, 'docs')
  48. self.app = pagure.APP.test_client()
  49. @patch('pagure.lib.git.update_git')
  50. @patch('pagure.lib.notify.send_email')
  51. def test_new_issue(self, p_send_email, p_ugt):
  52. """ Test the new_issue endpoint. """
  53. p_send_email.return_value = True
  54. p_ugt.return_value = True
  55. # No Git repo
  56. output = self.app.get('/foo/new_issue')
  57. self.assertEqual(output.status_code, 404)
  58. user = tests.FakeUser()
  59. with tests.user_set(pagure.APP, user):
  60. output = self.app.get('/foo/new_issue')
  61. self.assertEqual(output.status_code, 404)
  62. tests.create_projects(self.session)
  63. tests.create_projects_git(
  64. os.path.join(self.path), bare=True)
  65. output = self.app.get('/test/new_issue')
  66. self.assertEqual(output.status_code, 200)
  67. self.assertTrue(
  68. '<div class="card-header">\n New issue'
  69. in output.get_data(as_text=True))
  70. csrf_token = output.get_data(as_text=True).split(
  71. 'name="csrf_token" type="hidden" value="')[1].split('">')[0]
  72. data = {
  73. }
  74. # Insufficient input
  75. output = self.app.post('/test/new_issue', data=data)
  76. self.assertEqual(output.status_code, 200)
  77. self.assertTrue(
  78. '<div class="card-header">\n New issue'
  79. in output.get_data(as_text=True))
  80. self.assertEqual(output.get_data(as_text=True).count(
  81. 'This field is required.'), 2)
  82. data['title'] = 'Test issue'
  83. output = self.app.post('/test/new_issue', data=data)
  84. self.assertEqual(output.status_code, 200)
  85. self.assertTrue(
  86. '<div class="card-header">\n New issue'
  87. in output.get_data(as_text=True))
  88. self.assertEqual(output.get_data(as_text=True).count(
  89. 'This field is required.'), 1)
  90. data['issue_content'] = 'We really should improve on this issue'
  91. data['status'] = 'Open'
  92. output = self.app.post('/test/new_issue', data=data)
  93. self.assertEqual(output.status_code, 200)
  94. self.assertTrue(
  95. '<div class="card-header">\n New issue'
  96. in output.get_data(as_text=True))
  97. self.assertEqual(output.get_data(as_text=True).count(
  98. '</button>\n This field is required.'),
  99. 0)
  100. # Invalid user
  101. data['csrf_token'] = csrf_token
  102. output = self.app.post('/test/new_issue', data=data)
  103. self.assertEqual(output.status_code, 404)
  104. self.assertIn(
  105. '<p>No such user found in the database: username</p>',
  106. output.data.decode('utf-8'))
  107. # User not logged in
  108. output = self.app.get('/test/new_issue')
  109. self.assertEqual(output.status_code, 302)
  110. user.username = 'pingou'
  111. with tests.user_set(pagure.APP, user):
  112. output = self.app.post(
  113. '/test/new_issue', data=data, follow_redirects=True)
  114. self.assertEqual(output.status_code, 200)
  115. self.assertIn(
  116. '<title>Issue #1: Test issue - test - Pagure</title>',
  117. output.get_data(as_text=True))
  118. self.assertIn(
  119. '<a class="btn btn-primary btn-sm" '
  120. 'href="/test/issue/1/edit" title="Edit this issue">',
  121. output.get_data(as_text=True))
  122. # Project w/o issue tracker
  123. repo = pagure.lib.get_project(self.session, 'test')
  124. repo.settings = {'issue_tracker': False}
  125. self.session.add(repo)
  126. self.session.commit()
  127. user.username = 'pingou'
  128. with tests.user_set(pagure.APP, user):
  129. output = self.app.post(
  130. '/test/new_issue', data=data, follow_redirects=True)
  131. self.assertEqual(output.status_code, 404)
  132. @patch('pagure.lib.git.update_git')
  133. @patch('pagure.lib.notify.send_email')
  134. def test_new_issue_w_file(self, p_send_email, p_ugt):
  135. """ Test the new_issue endpoint with a file. """
  136. p_send_email.return_value = True
  137. p_ugt.return_value = True
  138. tests.create_projects(self.session)
  139. tests.create_projects_git(
  140. os.path.join(self.path), bare=True)
  141. tests.create_projects_git(
  142. os.path.join(self.path, 'tickets'), bare=True)
  143. user = tests.FakeUser()
  144. user.username = 'pingou'
  145. with tests.user_set(pagure.APP, user):
  146. output = self.app.get('/test/new_issue')
  147. self.assertEqual(output.status_code, 200)
  148. self.assertTrue(
  149. '<div class="card-header">\n New issue'
  150. in output.get_data(as_text=True))
  151. csrf_token = output.get_data(as_text=True).split(
  152. 'name="csrf_token" type="hidden" value="')[1].split('">')[0]
  153. with open(os.path.join(tests.HERE, 'placebo.png'), 'rb') as stream:
  154. data = {
  155. 'title': 'Test issue',
  156. 'issue_content': 'We really should improve on this issue\n'
  157. '<!!image>',
  158. 'status': 'Open',
  159. 'filestream': stream,
  160. 'enctype': 'multipart/form-data',
  161. 'csrf_token': csrf_token,
  162. }
  163. output = self.app.post(
  164. '/test/new_issue', data=data, follow_redirects=True)
  165. self.assertEqual(output.status_code, 200)
  166. self.assertIn(
  167. '<title>Issue #1: Test issue - test - Pagure</title>',
  168. output.get_data(as_text=True))
  169. self.assertIn(
  170. '<a class="btn btn-primary btn-sm" '
  171. 'href="/test/issue/1/edit" title="Edit this issue">',
  172. output.get_data(as_text=True))
  173. # Project w/o issue tracker
  174. repo = pagure.lib.get_project(self.session, 'test')
  175. repo.settings = {'issue_tracker': False}
  176. self.session.add(repo)
  177. self.session.commit()
  178. user.username = 'pingou'
  179. with tests.user_set(pagure.APP, user):
  180. with open(os.path.join(tests.HERE, 'placebo.png'), 'rb') as stream:
  181. data = {
  182. 'title': 'Test issue',
  183. 'issue_content': 'We really should improve on this issue',
  184. 'status': 'Open',
  185. 'filestream': stream,
  186. 'enctype': 'multipart/form-data',
  187. 'csrf_token': csrf_token,
  188. }
  189. output = self.app.post(
  190. '/test/new_issue', data=data, follow_redirects=True)
  191. self.assertEqual(output.status_code, 404)
  192. @patch('pagure.lib.git.update_git')
  193. @patch('pagure.lib.notify.send_email')
  194. def test_view_issues(self, p_send_email, p_ugt):
  195. """ Test the view_issues endpoint. """
  196. p_send_email.return_value = True
  197. p_ugt.return_value = True
  198. output = self.app.get('/foo/issues')
  199. self.assertEqual(output.status_code, 404)
  200. tests.create_projects(self.session)
  201. tests.create_projects_git(
  202. os.path.join(self.path), bare=True)
  203. output = self.app.get('/test/issues')
  204. self.assertEqual(output.status_code, 200)
  205. self.assertIn(
  206. 'div class="projectinfo m-t-1 m-b-1">\ntest project #1 '
  207. '</div>', output.get_data(as_text=True))
  208. self.assertTrue(
  209. '<h2>\n 0 Open Issues' in output.get_data(as_text=True))
  210. # Create issues to play with
  211. repo = pagure.lib.get_project(self.session, 'test')
  212. msg = pagure.lib.new_issue(
  213. session=self.session,
  214. repo=repo,
  215. title='Test issue',
  216. content='We should work on this',
  217. user='pingou',
  218. ticketfolder=None
  219. )
  220. self.session.commit()
  221. self.assertEqual(msg.title, 'Test issue')
  222. msg = pagure.lib.new_issue(
  223. session=self.session,
  224. repo=repo,
  225. title='Test invalid issue',
  226. content='This really is not related',
  227. user='pingou',
  228. status='Closed',
  229. close_status='Invalid',
  230. ticketfolder=None
  231. )
  232. self.session.commit()
  233. self.assertEqual(msg.title, 'Test invalid issue')
  234. # Whole list
  235. output = self.app.get('/test/issues')
  236. self.assertEqual(output.status_code, 200)
  237. self.assertIn(
  238. '<title>Issues - test - Pagure</title>',
  239. output.get_data(as_text=True))
  240. self.assertIn(
  241. '<h2>\n 1 Open Issues', output.get_data(as_text=True))
  242. # Status = closed (all but open)
  243. output = self.app.get('/test/issues?status=cloSED')
  244. self.assertEqual(output.status_code, 200)
  245. self.assertIn(
  246. '<title>Issues - test - Pagure</title>',
  247. output.get_data(as_text=True))
  248. self.assertIn(
  249. '<h2>\n 1 Closed Issues', output.get_data(as_text=True))
  250. # Status = fixed
  251. output = self.app.get('/test/issues?status=fixed')
  252. self.assertEqual(output.status_code, 200)
  253. self.assertIn(
  254. '<title>Issues - test - Pagure</title>',
  255. output.get_data(as_text=True))
  256. self.assertIn(
  257. '<h2>\n 0 Closed Issues', output.get_data(as_text=True))
  258. # Status = Invalid
  259. output = self.app.get('/test/issues?status=Invalid')
  260. self.assertEqual(output.status_code, 200)
  261. self.assertIn(
  262. '<title>Issues - test - Pagure</title>',
  263. output.get_data(as_text=True))
  264. self.assertIn(
  265. '<h2>\n 1 Closed Issues', output.get_data(as_text=True))
  266. # All tickets
  267. output = self.app.get('/test/issues?status=all')
  268. self.assertEqual(output.status_code, 200)
  269. self.assertIn(
  270. '<title>Issues - test - Pagure</title>',
  271. output.get_data(as_text=True))
  272. self.assertIn(
  273. '<h2>\n 2 Issues', output.get_data(as_text=True))
  274. # New issue button is shown
  275. user = tests.FakeUser()
  276. with tests.user_set(pagure.APP, user):
  277. output = self.app.get('/test')
  278. self.assertEqual(output.status_code, 200)
  279. self.assertIn(
  280. 'class="btn btn-success btn-sm">New Issue</a>',
  281. output.get_data(as_text=True))
  282. # Project w/o issue tracker
  283. repo = pagure.lib.get_project(self.session, 'test')
  284. repo.settings = {'issue_tracker': False}
  285. self.session.add(repo)
  286. self.session.commit()
  287. output = self.app.get('/test/issues')
  288. self.assertEqual(output.status_code, 404)
  289. # New issue button is hidden
  290. user = tests.FakeUser()
  291. with tests.user_set(pagure.APP, user):
  292. output = self.app.get('/test')
  293. self.assertEqual(output.status_code, 200)
  294. self.assertNotIn(
  295. 'class="btn btn-success btn-sm">New Issue</a>',
  296. output.get_data(as_text=True))
  297. @patch('pagure.lib.git.update_git')
  298. @patch('pagure.lib.notify.send_email')
  299. def test_view_issue(self, p_send_email, p_ugt):
  300. """ Test the view_issue endpoint. """
  301. p_send_email.return_value = True
  302. p_ugt.return_value = True
  303. output = self.app.get('/foo/issue/1')
  304. self.assertEqual(output.status_code, 404)
  305. tests.create_projects(self.session)
  306. tests.create_projects_git(
  307. os.path.join(self.path), bare=True)
  308. output = self.app.get('/test/issue/1')
  309. self.assertEqual(output.status_code, 404)
  310. # Create issues to play with
  311. repo = pagure.lib.get_project(self.session, 'test')
  312. msg = pagure.lib.new_issue(
  313. session=self.session,
  314. repo=repo,
  315. title='Test issue',
  316. content='We should work on this',
  317. user='pingou',
  318. ticketfolder=None
  319. )
  320. self.session.commit()
  321. self.assertEqual(msg.title, 'Test issue')
  322. output = self.app.get('/test/issue/1')
  323. self.assertEqual(output.status_code, 200)
  324. # Not authentified = No edit
  325. self.assertNotIn(
  326. '<a class="btn btn-primary btn-sm" href="/test/issue/1/edit" '
  327. 'title="Edit this issue">',
  328. output.get_data(as_text=True))
  329. self.assertTrue(
  330. '<a href="/login/?next=http%3A%2F%2Flocalhost%2Ftest%2Fissue%2F1">'
  331. 'Login</a>\n to comment on this ticket.'
  332. in output.get_data(as_text=True))
  333. user = tests.FakeUser()
  334. with tests.user_set(pagure.APP, user):
  335. output = self.app.get('/test/issue/1')
  336. self.assertEqual(output.status_code, 200)
  337. # Not author nor admin = No edit
  338. self.assertNotIn(
  339. '<a class="btn btn-primary btn-sm" '
  340. 'href="/test/issue/1/edit" title="Edit this issue">',
  341. output.get_data(as_text=True))
  342. self.assertNotIn(
  343. '<button class="btn btn-danger btn-sm" type="submit"',
  344. output.get_data(as_text=True))
  345. self.assertNotIn('title="Delete this ticket">', output.get_data(as_text=True))
  346. self.assertFalse(
  347. '<a href="/login/">Login</a> to comment on this ticket.'
  348. in output.get_data(as_text=True))
  349. user.username = 'pingou'
  350. with tests.user_set(pagure.APP, user):
  351. output = self.app.get('/test/issue/1')
  352. self.assertEqual(output.status_code, 200)
  353. self.assertIn(
  354. '<a class="btn btn-primary btn-sm" '
  355. 'href="/test/issue/1/edit" title="Edit this issue">',
  356. output.get_data(as_text=True))
  357. self.assertIn(
  358. '<button class="btn btn-danger btn-sm" type="submit"',
  359. output.get_data(as_text=True))
  360. self.assertIn('title="Delete this ticket">', output.get_data(as_text=True))
  361. csrf_token = output.get_data(as_text=True).split(
  362. 'name="csrf_token" type="hidden" value="')[1].split('">')[0]
  363. # Create private issue
  364. repo = pagure.lib.get_project(self.session, 'test')
  365. msg = pagure.lib.new_issue(
  366. session=self.session,
  367. repo=repo,
  368. title='Test issue',
  369. content='We should work on this',
  370. user='pingou',
  371. ticketfolder=None,
  372. private=True,
  373. )
  374. self.session.commit()
  375. self.assertEqual(msg.title, 'Test issue')
  376. # Not logged in
  377. output = self.app.get('/test/issue/2')
  378. self.assertEqual(output.status_code, 403)
  379. # Wrong user
  380. user = tests.FakeUser()
  381. with tests.user_set(pagure.APP, user):
  382. output = self.app.get('/test/issue/2')
  383. self.assertEqual(output.status_code, 403)
  384. # reporter
  385. user.username = 'pingou'
  386. with tests.user_set(pagure.APP, user):
  387. output = self.app.get('/test/issue/2')
  388. self.assertEqual(output.status_code, 200)
  389. self.assertIn(
  390. '<title>Issue #2: Test issue - test - Pagure</title>',
  391. output.get_data(as_text=True))
  392. self.assertIn(
  393. '<span class="oi red-icon" data-glyph="lock-locked" '
  394. 'title="Private issue"></span>', output.get_data(as_text=True))
  395. self.assertIn(
  396. '<a class="btn btn-primary btn-sm" '
  397. 'href="/test/issue/2/edit" title="Edit this issue">',
  398. output.get_data(as_text=True))
  399. # Project w/o issue tracker
  400. repo = pagure.lib.get_project(self.session, 'test')
  401. repo.settings = {'issue_tracker': False}
  402. self.session.add(repo)
  403. self.session.commit()
  404. output = self.app.get('/test/issue/1')
  405. self.assertEqual(output.status_code, 404)
  406. @patch('pagure.lib.git.update_git')
  407. @patch('pagure.lib.notify.send_email')
  408. def test_update_issue(self, p_send_email, p_ugt):
  409. """ Test the update_issue endpoint. """
  410. p_send_email.return_value = True
  411. p_ugt.return_value = True
  412. # No Git repo
  413. output = self.app.get('/foo/issue/1/update')
  414. self.assertEqual(output.status_code, 404)
  415. tests.create_projects(self.session)
  416. tests.create_projects_git(
  417. os.path.join(self.path), bare=True)
  418. output = self.app.get('/test/issue/1/update')
  419. self.assertEqual(output.status_code, 302)
  420. # Create issues to play with
  421. repo = pagure.lib.get_project(self.session, 'test')
  422. msg = pagure.lib.new_issue(
  423. session=self.session,
  424. repo=repo,
  425. title='Test issue',
  426. content='We should work on this',
  427. user='pingou',
  428. ticketfolder=None
  429. )
  430. self.session.commit()
  431. self.assertEqual(msg.title, 'Test issue')
  432. user = tests.FakeUser()
  433. user.username = 'pingou'
  434. with tests.user_set(pagure.APP, user):
  435. output = self.app.get('/test/issue/1')
  436. self.assertEqual(output.status_code, 200)
  437. self.assertIn(
  438. '<title>Issue #1: Test issue - test - Pagure</title>',
  439. output.get_data(as_text=True))
  440. self.assertIn(
  441. '<a class="btn btn-primary btn-sm" '
  442. 'href="/test/issue/1/edit" title="Edit this issue">',
  443. output.get_data(as_text=True))
  444. csrf_token = output.get_data(as_text=True).split(
  445. 'name="csrf_token" type="hidden" value="')[1].split('">')[0]
  446. data = {
  447. 'status': 'Closed',
  448. 'close_status': 'fixed'
  449. }
  450. # Invalid repo
  451. output = self.app.post('/bar/issue/1/update', data=data)
  452. self.assertEqual(output.status_code, 404)
  453. # Non-existing issue
  454. output = self.app.post('/test/issue/100/update', data=data)
  455. self.assertEqual(output.status_code, 404)
  456. output = self.app.post(
  457. '/test/issue/1/update', data=data, follow_redirects=True)
  458. self.assertEqual(output.status_code, 200)
  459. self.assertIn(
  460. '<title>Issue #1: Test issue - test - Pagure</title>',
  461. output.get_data(as_text=True))
  462. self.assertIn(
  463. '<a class="btn btn-primary btn-sm" '
  464. 'href="/test/issue/1/edit" title="Edit this issue">',
  465. output.get_data(as_text=True))
  466. self.assertFalse(
  467. '<option selected value="Fixed">Fixed</option>'
  468. in output.get_data(as_text=True))
  469. # Right status, wrong csrf
  470. data['close_status'] = 'Fixed'
  471. output = self.app.post(
  472. '/test/issue/1/update', data=data, follow_redirects=True)
  473. self.assertEqual(output.status_code, 200)
  474. self.assertIn(
  475. '<title>Issue #1: Test issue - test - Pagure</title>',
  476. output.get_data(as_text=True))
  477. self.assertIn(
  478. '<a class="btn btn-primary btn-sm" '
  479. 'href="/test/issue/1/edit" title="Edit this issue">',
  480. output.get_data(as_text=True))
  481. self.assertFalse(
  482. '<option selected value="Fixed">Fixed</option>'
  483. in output.get_data(as_text=True))
  484. # working status update
  485. data['csrf_token'] = csrf_token
  486. output = self.app.post(
  487. '/test/issue/1/update', data=data, follow_redirects=True)
  488. self.assertEqual(output.status_code, 200)
  489. self.assertIn(
  490. '<title>Issue #1: Test issue - test - Pagure</title>',
  491. output.get_data(as_text=True))
  492. self.assertIn(
  493. '<a class="btn btn-primary btn-sm" '
  494. 'href="/test/issue/1/edit" title="Edit this issue">',
  495. output.get_data(as_text=True))
  496. self.assertIn(
  497. '</button>\n'
  498. ' Successfully edited issue #1',
  499. output.get_data(as_text=True))
  500. self.assertTrue(
  501. '<option selected value="Fixed">Fixed</option>'
  502. in output.get_data(as_text=True))
  503. self.assertIn(
  504. '<small><p><a href="{app_url}/user/pingou"> '
  505. '@pingou</a> changed the status to <code>Closed</code>'
  506. '</p></small>'.format(
  507. app_url=pagure.APP.config['APP_URL'].rstrip('/')),
  508. output.data.decode('utf-8'))
  509. # Add new comment
  510. data = {
  511. 'csrf_token': csrf_token,
  512. 'status': 'Closed',
  513. 'close_status': 'Fixed',
  514. 'comment': 'Woohoo a second comment !',
  515. }
  516. output = self.app.post(
  517. '/test/issue/1/update', data=data, follow_redirects=True)
  518. self.assertEqual(output.status_code, 200)
  519. self.assertIn(
  520. '<title>Issue #1: Test issue - test - Pagure</title>',
  521. output.get_data(as_text=True))
  522. self.assertIn(
  523. '<a class="btn btn-primary btn-sm" '
  524. 'href="/test/issue/1/edit" title="Edit this issue">',
  525. output.get_data(as_text=True))
  526. self.assertIn(
  527. '</button>\n Comment added',
  528. output.get_data(as_text=True))
  529. self.assertNotIn(
  530. '</button>\n No changes to edit',
  531. output.get_data(as_text=True))
  532. self.assertTrue(
  533. '<p>Woohoo a second comment !</p>' in output.get_data(as_text=True))
  534. self.assertEqual(output.get_data(as_text=True).count('comment_body">'), 2)
  535. self.assertTrue(
  536. '<option selected value="Fixed">Fixed</option>'
  537. in output.get_data(as_text=True))
  538. # Add new tag
  539. data = {
  540. 'csrf_token': csrf_token,
  541. 'status': 'Closed',
  542. 'close_status': 'Fixed',
  543. 'tag': 'tag2',
  544. }
  545. output = self.app.post(
  546. '/test/issue/1/update', data=data, follow_redirects=True)
  547. self.assertEqual(output.status_code, 200)
  548. self.assertIn(
  549. '<title>Issue #1: Test issue - test - Pagure</title>',
  550. output.get_data(as_text=True))
  551. self.assertIn(
  552. '<a class="btn btn-primary btn-sm" '
  553. 'href="/test/issue/1/edit" title="Edit this issue">',
  554. output.get_data(as_text=True))
  555. self.assertTrue(
  556. '<p>Woohoo a second comment !</p>' in output.get_data(as_text=True))
  557. self.assertEqual(output.get_data(as_text=True).count('comment_body">'), 2)
  558. self.assertTrue(
  559. '<option selected value="Fixed">Fixed</option>'
  560. in output.get_data(as_text=True))
  561. # Assign issue to an non-existent user
  562. data = {
  563. 'csrf_token': csrf_token,
  564. 'status': 'Closed',
  565. 'close_status': 'Fixed',
  566. 'assignee': 'ralph',
  567. }
  568. output = self.app.post(
  569. '/test/issue/1/update', data=data, follow_redirects=True)
  570. self.assertEqual(output.status_code, 200)
  571. self.assertIn(
  572. '<title>Issue #1: Test issue - test - Pagure</title>',
  573. output.get_data(as_text=True))
  574. self.assertIn(
  575. '<a class="btn btn-primary btn-sm" '
  576. 'href="/test/issue/1/edit" title="Edit this issue">',
  577. output.get_data(as_text=True))
  578. self.assertIn(
  579. '</button>\n No user &#34;ralph&#34; found',
  580. output.get_data(as_text=True))
  581. self.assertTrue(
  582. '<p>Woohoo a second comment !</p>' in output.get_data(as_text=True))
  583. self.assertEqual(output.get_data(as_text=True).count('comment_body">'), 2)
  584. self.assertTrue(
  585. '<option selected value="Fixed">Fixed</option>'
  586. in output.get_data(as_text=True))
  587. # Assign issue properly
  588. data = {
  589. 'csrf_token': csrf_token,
  590. 'status': 'Closed',
  591. 'close_status': 'Fixed',
  592. 'assignee': 'pingou',
  593. }
  594. output = self.app.post(
  595. '/test/issue/1/update', data=data, follow_redirects=True)
  596. self.assertEqual(output.status_code, 200)
  597. self.assertIn(
  598. '<title>Issue #1: Test issue - test - Pagure</title>',
  599. output.get_data(as_text=True))
  600. self.assertIn(
  601. '<a class="btn btn-primary btn-sm" '
  602. 'href="/test/issue/1/edit" title="Edit this issue">',
  603. output.get_data(as_text=True))
  604. self.assertIn(
  605. '</button>\n Issue assigned',
  606. output.get_data(as_text=True))
  607. self.assertTrue(
  608. '<a href="/test/issues?assignee=pingou">' in output.get_data(as_text=True))
  609. self.assertTrue(
  610. '<p>Woohoo a second comment !</p>' in output.get_data(as_text=True))
  611. self.assertEqual(output.get_data(as_text=True).count('comment_body">'), 2)
  612. self.assertTrue(
  613. '<option selected value="Fixed">Fixed</option>'
  614. in output.get_data(as_text=True))
  615. # Create another issue with a dependency
  616. repo = pagure.lib.get_project(self.session, 'test')
  617. msg = pagure.lib.new_issue(
  618. session=self.session,
  619. repo=repo,
  620. title='Test issue',
  621. content='We should work on this',
  622. user='pingou',
  623. ticketfolder=None
  624. )
  625. self.session.commit()
  626. self.assertEqual(msg.title, 'Test issue')
  627. # Reset the status of the first issue
  628. parent_issue = pagure.lib.search_issues(
  629. self.session, repo, issueid=1)
  630. parent_issue.status = 'Open'
  631. self.session.add(parent_issue)
  632. # Add the dependency relationship
  633. self.session.add(parent_issue)
  634. issue = pagure.lib.search_issues(self.session, repo, issueid=2)
  635. issue.parents.append(parent_issue)
  636. self.session.add(issue)
  637. self.session.commit()
  638. with tests.user_set(pagure.APP, user):
  639. data['csrf_token'] = csrf_token
  640. output = self.app.post(
  641. '/test/issue/2/update', data=data, follow_redirects=True)
  642. self.assertEqual(output.status_code, 200)
  643. self.assertIn(
  644. '<title>Issue #2: Test issue - test - Pagure</title>',
  645. output.get_data(as_text=True))
  646. self.assertIn(
  647. '<a class="btn btn-primary btn-sm" '
  648. 'href="/test/issue/2/edit" title="Edit this issue">',
  649. output.get_data(as_text=True))
  650. self.assertIn(
  651. '</button>\n You cannot close a ticket '
  652. 'that has ticket depending that are still open.',
  653. output.get_data(as_text=True))
  654. self.assertTrue(
  655. '<option selected value="Open">Open</option>'
  656. in output.get_data(as_text=True))
  657. # Create private issue
  658. repo = pagure.lib.get_project(self.session, 'test')
  659. msg = pagure.lib.new_issue(
  660. session=self.session,
  661. repo=repo,
  662. title='Test issue',
  663. content='We should work on this',
  664. user='pingou',
  665. ticketfolder=None,
  666. private=True,
  667. )
  668. self.session.commit()
  669. self.assertEqual(msg.title, 'Test issue')
  670. # Wrong user
  671. user = tests.FakeUser()
  672. with tests.user_set(pagure.APP, user):
  673. output = self.app.post(
  674. '/test/issue/3/update', data=data, follow_redirects=True)
  675. self.assertEqual(output.status_code, 403)
  676. # Project w/o issue tracker
  677. repo = pagure.lib.get_project(self.session, 'test')
  678. repo.settings = {'issue_tracker': False}
  679. self.session.add(repo)
  680. self.session.commit()
  681. with tests.user_set(pagure.APP, user):
  682. output = self.app.get('/test/issue/1/update')
  683. self.assertEqual(output.status_code, 302)
  684. # Repo not set-up for issue tracker
  685. output = self.app.post('/test/issue/1/update', data=data)
  686. self.assertEqual(output.status_code, 404)
  687. @patch('pagure.lib.git.update_git')
  688. @patch('pagure.lib.notify.send_email')
  689. def test_update_issue_drop_comment(self, p_send_email, p_ugt):
  690. """ Test droping comment via the update_issue endpoint. """
  691. p_send_email.return_value = True
  692. p_ugt.return_value = True
  693. tests.create_projects(self.session)
  694. tests.create_projects_git(
  695. os.path.join(self.path), bare=True)
  696. # Create issues to play with
  697. repo = pagure.lib.get_project(self.session, 'test')
  698. msg = pagure.lib.new_issue(
  699. session=self.session,
  700. repo=repo,
  701. title='Test issue',
  702. content='We should work on this',
  703. user='pingou',
  704. ticketfolder=None
  705. )
  706. self.session.commit()
  707. self.assertEqual(msg.title, 'Test issue')
  708. user = tests.FakeUser()
  709. user.username = 'pingou'
  710. with tests.user_set(pagure.APP, user):
  711. output = self.app.get('/test/issue/1')
  712. self.assertEqual(output.status_code, 200)
  713. self.assertIn(
  714. '<title>Issue #1: Test issue - test - Pagure</title>',
  715. output.get_data(as_text=True))
  716. self.assertIn(
  717. '<a class="btn btn-primary btn-sm" '
  718. 'href="/test/issue/1/edit" title="Edit this issue">',
  719. output.get_data(as_text=True))
  720. csrf_token = output.get_data(as_text=True).split(
  721. 'name="csrf_token" type="hidden" value="')[1].split('">')[0]
  722. # Add new comment
  723. data = {
  724. 'csrf_token': csrf_token,
  725. 'comment': 'Woohoo a second comment !',
  726. }
  727. output = self.app.post(
  728. '/test/issue/1/update', data=data, follow_redirects=True)
  729. self.assertEqual(output.status_code, 200)
  730. self.assertIn(
  731. '<title>Issue #1: Test issue - test - Pagure</title>',
  732. output.get_data(as_text=True))
  733. self.assertIn(
  734. '<a class="btn btn-primary btn-sm" '
  735. 'href="/test/issue/1/edit" title="Edit this issue">',
  736. output.get_data(as_text=True))
  737. self.assertIn(
  738. '</button>\n Comment added',
  739. output.get_data(as_text=True))
  740. self.assertTrue(
  741. '<p>Woohoo a second comment !</p>' in output.get_data(as_text=True))
  742. self.assertEqual(output.get_data(as_text=True).count('comment_body">'), 2)
  743. repo = pagure.lib.get_project(self.session, 'test')
  744. issue = pagure.lib.search_issues(self.session, repo, issueid=1)
  745. self.assertEqual(len(issue.comments), 1)
  746. data = {
  747. 'csrf_token': csrf_token,
  748. 'drop_comment': 1,
  749. }
  750. user = tests.FakeUser()
  751. with tests.user_set(pagure.APP, user):
  752. # Wrong issue id
  753. output = self.app.post(
  754. '/test/issue/3/update', data=data, follow_redirects=True)
  755. self.assertEqual(output.status_code, 404)
  756. # Wrong user
  757. output = self.app.post(
  758. '/test/issue/1/update', data=data, follow_redirects=True)
  759. self.assertEqual(output.status_code, 403)
  760. user = tests.FakeUser()
  761. user.username = 'pingou'
  762. with tests.user_set(pagure.APP, user):
  763. # Drop the new comment
  764. output = self.app.post(
  765. '/test/issue/1/update', data=data, follow_redirects=True)
  766. self.assertEqual(output.status_code, 200)
  767. self.assertIn(
  768. '<title>Issue #1: Test issue - test - Pagure</title>',
  769. output.get_data(as_text=True))
  770. self.assertIn(
  771. '<a class="btn btn-primary btn-sm" '
  772. 'href="/test/issue/1/edit" title="Edit this issue">',
  773. output.get_data(as_text=True))
  774. self.assertIn(
  775. '</button>\n Comment removed',
  776. output.get_data(as_text=True))
  777. # Drop non-existant comment
  778. output = self.app.post(
  779. '/test/issue/1/update', data=data, follow_redirects=True)
  780. self.assertEqual(output.status_code, 404)
  781. repo = pagure.lib.get_project(self.session, 'test')
  782. issue = pagure.lib.search_issues(self.session, repo, issueid=1)
  783. self.assertEqual(len(issue.comments), 0)
  784. @patch('pagure.lib.git.update_git')
  785. @patch('pagure.lib.notify.send_email')
  786. def test_update_issue_depend(self, p_send_email, p_ugt):
  787. """ Test adding dependency via the update_issue endpoint. """
  788. p_send_email.return_value = True
  789. p_ugt.return_value = True
  790. tests.create_projects(self.session)
  791. tests.create_projects_git(
  792. os.path.join(self.path), bare=True)
  793. # Create issues to play with
  794. repo = pagure.lib.get_project(self.session, 'test')
  795. msg = pagure.lib.new_issue(
  796. session=self.session,
  797. repo=repo,
  798. title='Test issue',
  799. content='We should work on this',
  800. user='pingou',
  801. ticketfolder=None
  802. )
  803. self.session.commit()
  804. self.assertEqual(msg.title, 'Test issue')
  805. repo = pagure.lib.get_project(self.session, 'test')
  806. msg = pagure.lib.new_issue(
  807. session=self.session,
  808. repo=repo,
  809. title='Test issue #2',
  810. content='We should work on this again',
  811. user='foo',
  812. ticketfolder=None
  813. )
  814. self.session.commit()
  815. self.assertEqual(msg.title, 'Test issue #2')
  816. user = tests.FakeUser()
  817. user.username = 'pingou'
  818. with tests.user_set(pagure.APP, user):
  819. output = self.app.get('/test/issue/1')
  820. self.assertEqual(output.status_code, 200)
  821. self.assertIn(
  822. '<title>Issue #1: Test issue - test - Pagure</title>',
  823. output.get_data(as_text=True))
  824. self.assertIn(
  825. '<a class="btn btn-primary btn-sm" '
  826. 'href="/test/issue/1/edit" title="Edit this issue">',
  827. output.get_data(as_text=True))
  828. csrf_token = output.get_data(as_text=True).split(
  829. 'name="csrf_token" type="hidden" value="')[1].split('">')[0]
  830. # Add a dependent ticket
  831. data = {
  832. 'csrf_token': csrf_token,
  833. 'depends': '2',
  834. }
  835. output = self.app.post(
  836. '/test/issue/1/update', data=data, follow_redirects=True)
  837. self.assertEqual(output.status_code, 200)
  838. self.assertIn(
  839. '<title>Issue #1: Test issue - test - Pagure</title>',
  840. output.get_data(as_text=True))
  841. self.assertIn(
  842. '<a class="btn btn-primary btn-sm" '
  843. 'href="/test/issue/1/edit" title="Edit this issue">',
  844. output.get_data(as_text=True))
  845. # Add an invalid dependent ticket
  846. data = {
  847. 'csrf_token': csrf_token,
  848. 'depends': '2,abc',
  849. }
  850. output = self.app.post(
  851. '/test/issue/1/update', data=data, follow_redirects=True)
  852. self.assertEqual(output.status_code, 200)
  853. self.assertIn(
  854. '<title>Issue #1: Test issue - test - Pagure</title>',
  855. output.get_data(as_text=True))
  856. self.assertIn(
  857. '<a class="btn btn-primary btn-sm" '
  858. 'href="/test/issue/1/edit" title="Edit this issue">',
  859. output.get_data(as_text=True))
  860. self.assertNotIn(
  861. '</button>\n '
  862. 'Successfully edited issue #1',
  863. output.get_data(as_text=True))
  864. repo = pagure.lib.get_project(self.session, 'test')
  865. issue = pagure.lib.search_issues(self.session, repo, issueid=1)
  866. self.assertEqual(issue.depends_text, [2])
  867. self.assertEqual(issue.blocks_text, [])
  868. @patch('pagure.lib.git.update_git')
  869. @patch('pagure.lib.notify.send_email')
  870. def test_update_issue_block(self, p_send_email, p_ugt):
  871. """ Test adding blocked issue via the update_issue endpoint. """
  872. p_send_email.return_value = True
  873. p_ugt.return_value = True
  874. tests.create_projects(self.session)
  875. tests.create_projects_git(
  876. os.path.join(self.path), bare=True)
  877. # Create issues to play with
  878. repo = pagure.lib.get_project(self.session, 'test')
  879. msg = pagure.lib.new_issue(
  880. session=self.session,
  881. repo=repo,
  882. title='Test issue',
  883. content='We should work on this',
  884. user='pingou',
  885. ticketfolder=None
  886. )
  887. self.session.commit()
  888. self.assertEqual(msg.title, 'Test issue')
  889. repo = pagure.lib.get_project(self.session, 'test')
  890. msg = pagure.lib.new_issue(
  891. session=self.session,
  892. repo=repo,
  893. title='Test issue #2',
  894. content='We should work on this again',
  895. user='foo',
  896. ticketfolder=None
  897. )
  898. self.session.commit()
  899. self.assertEqual(msg.title, 'Test issue #2')
  900. user = tests.FakeUser()
  901. user.username = 'pingou'
  902. with tests.user_set(pagure.APP, user):
  903. output = self.app.get('/test/issue/1')
  904. self.assertEqual(output.status_code, 200)
  905. self.assertIn(
  906. '<title>Issue #1: Test issue - test - Pagure</title>',
  907. output.get_data(as_text=True))
  908. self.assertIn(
  909. '<a class="btn btn-primary btn-sm" '
  910. 'href="/test/issue/1/edit" title="Edit this issue">',
  911. output.get_data(as_text=True))
  912. csrf_token = output.get_data(as_text=True).split(
  913. 'name="csrf_token" type="hidden" value="')[1].split('">')[0]
  914. # Add a dependent ticket
  915. data = {
  916. 'csrf_token': csrf_token,
  917. 'blocks': '2',
  918. }
  919. output = self.app.post(
  920. '/test/issue/1/update', data=data, follow_redirects=True)
  921. self.assertEqual(output.status_code, 200)
  922. self.assertIn(
  923. '<title>Issue #1: Test issue - test - Pagure</title>',
  924. output.get_data(as_text=True))
  925. self.assertIn(
  926. '<a class="btn btn-primary btn-sm" '
  927. 'href="/test/issue/1/edit" title="Edit this issue">',
  928. output.get_data(as_text=True))
  929. # Add an invalid dependent ticket
  930. data = {
  931. 'csrf_token': csrf_token,
  932. 'blocks': '2,abc',
  933. }
  934. output = self.app.post(
  935. '/test/issue/1/update', data=data, follow_redirects=True)
  936. self.assertEqual(output.status_code, 200)
  937. self.assertIn(
  938. '<title>Issue #1: Test issue - test - Pagure</title>',
  939. output.get_data(as_text=True))
  940. self.assertIn(
  941. '<a class="btn btn-primary btn-sm" '
  942. 'href="/test/issue/1/edit" title="Edit this issue">',
  943. output.get_data(as_text=True))
  944. self.assertNotIn(
  945. '</button>\n '
  946. 'Successfully edited issue #1',
  947. output.get_data(as_text=True))
  948. repo = pagure.lib.get_project(self.session, 'test')
  949. issue = pagure.lib.search_issues(self.session, repo, issueid=1)
  950. self.assertEqual(issue.depends_text, [])
  951. self.assertEqual(issue.blocks_text, [2])
  952. @patch('pagure.lib.git.update_git')
  953. @patch('pagure.lib.notify.send_email')
  954. def test_upload_issue(self, p_send_email, p_ugt):
  955. """ Test the upload_issue endpoint. """
  956. if not pyclamd:
  957. raise SkipTest()
  958. p_send_email.return_value = True
  959. p_ugt.return_value = True
  960. tests.create_projects(self.session)
  961. tests.create_projects_git(
  962. os.path.join(self.path), bare=True)
  963. tests.create_projects_git(
  964. os.path.join(self.path, 'tickets'), bare=True)
  965. # Create issues to play with
  966. repo = pagure.lib.get_project(self.session, 'test')
  967. msg = pagure.lib.new_issue(
  968. session=self.session,
  969. repo=repo,
  970. title='Test issue',
  971. content='We should work on this',
  972. user='pingou',
  973. ticketfolder=None
  974. )
  975. self.session.commit()
  976. self.assertEqual(msg.title, 'Test issue')
  977. user = tests.FakeUser()
  978. user.username = 'pingou'
  979. with tests.user_set(pagure.APP, user):
  980. output = self.app.get('/test/issue/1')
  981. self.assertEqual(output.status_code, 200)
  982. self.assertIn(
  983. '<title>Issue #1: Test issue - test - Pagure</title>',
  984. output.get_data(as_text=True))
  985. self.assertIn(
  986. '<a class="btn btn-primary btn-sm" '
  987. 'href="/test/issue/1/edit" title="Edit this issue">',
  988. output.get_data(as_text=True))
  989. csrf_token = output.get_data(as_text=True).split(
  990. 'name="csrf_token" type="hidden" value="')[1].split('">')[0]
  991. output = self.app.post('/foo/issue/1/upload')
  992. self.assertEqual(output.status_code, 404)
  993. output = self.app.post('/test/issue/100/upload')
  994. self.assertEqual(output.status_code, 404)
  995. # Invalid upload
  996. data = {
  997. 'enctype': 'multipart/form-data',
  998. }
  999. output = self.app.post(
  1000. '/test/issue/1/upload', data=data, follow_redirects=True)
  1001. self.assertEqual(output.status_code, 200)
  1002. json_data = json.loads(output.get_data(as_text=True))
  1003. exp = {'output': 'notok'}
  1004. self.assertDictEqual(json_data, exp)
  1005. # TODO: Figure a way to enable this test on jenkins
  1006. # Try to attach a virus
  1007. if not os.environ.get('BUILD_ID'):
  1008. with tempfile.NamedTemporaryFile() as eicarfile:
  1009. eicarfile.write(pyclamd.ClamdUnixSocket().EICAR())
  1010. eicarfile.flush()
  1011. with open(eicarfile.name, 'rb') as stream:
  1012. data = {
  1013. 'csrf_token': csrf_token,
  1014. 'filestream': stream,
  1015. 'enctype': 'multipart/form-data',
  1016. }
  1017. output = self.app.post(
  1018. '/test/issue/1/upload', data=data, follow_redirects=True)
  1019. self.assertEqual(output.status_code, 200)
  1020. json_data = json.loads(output.data)
  1021. exp = {
  1022. 'output': 'notok',
  1023. }
  1024. self.assertDictEqual(json_data, exp)
  1025. # Attach a file to a ticket
  1026. with open(os.path.join(tests.HERE, 'placebo.png'), 'rb') as stream:
  1027. data = {
  1028. 'csrf_token': csrf_token,
  1029. 'filestream': stream,
  1030. 'enctype': 'multipart/form-data',
  1031. }
  1032. output = self.app.post(
  1033. '/test/issue/1/upload', data=data, follow_redirects=True)
  1034. self.assertEqual(output.status_code, 200)
  1035. json_data = json.loads(output.get_data(as_text=True))
  1036. folder = os.path.dirname(
  1037. os.path.abspath(__file__))[1:].replace('/', '_')
  1038. exp = {
  1039. 'output': 'ok',
  1040. 'filelocation': '/test/issue/raw/files/8a06845923010b27bfd8'
  1041. 'e7e75acff7badc40d1021b4994e01f5e11ca40bc3a'
  1042. 'be-%s_placebo.png' % folder,
  1043. 'filename': '%s_placebo.png' % folder,
  1044. }
  1045. self.assertDictEqual(json_data, exp)
  1046. # Project w/o issue tracker
  1047. repo = pagure.lib.get_project(self.session, 'test')
  1048. repo.settings = {'issue_tracker': False}
  1049. self.session.add(repo)
  1050. self.session.commit()
  1051. with tests.user_set(pagure.APP, user):
  1052. output = self.app.post('/test/issue/1/upload')
  1053. self.assertEqual(output.status_code, 404)
  1054. def test_view_issue_raw_file_empty(self):
  1055. """ Test the view_issue_raw_file endpoint. """
  1056. # Create the project and git repos
  1057. tests.create_projects(self.session)
  1058. tests.create_projects_git(
  1059. os.path.join(self.path, 'tickets'), bare=True)
  1060. # Create issues to play with
  1061. repo = pagure.lib.get_project(self.session, 'test')
  1062. msg = pagure.lib.new_issue(
  1063. session=self.session,
  1064. repo=repo,
  1065. title='Test issue',
  1066. content='We should work on this',
  1067. user='pingou',
  1068. ticketfolder=None
  1069. )
  1070. self.session.commit()
  1071. self.assertEqual(msg.title, 'Test issue')
  1072. url = '/issue/raw/files/8a06845923010b27bfd8'\
  1073. 'e7e75acff7badc40d1021b4994e01f5e11ca40bc3a'\
  1074. 'be-home_pierrey_repos_gitrepo_pagure_tests'\
  1075. '_placebo.png'
  1076. output = self.app.get('/foo' + url)
  1077. self.assertEqual(output.status_code, 404)
  1078. output = self.app.get('/test' + url)
  1079. self.assertEqual(output.status_code, 404)
  1080. # Project w/o issue tracker
  1081. repo = pagure.lib.get_project(self.session, 'test')
  1082. repo.settings = {'issue_tracker': False}
  1083. self.session.add(repo)
  1084. self.session.commit()
  1085. output = self.app.get('/test' + url)
  1086. self.assertEqual(output.status_code, 404)
  1087. def test_view_issue_raw_file(self):
  1088. """ Test the view_issue_raw_file endpoint. """
  1089. # Create the issue and upload to it
  1090. self.test_upload_issue()
  1091. # Project w/ issue tracker
  1092. repo = pagure.lib.get_project(self.session, 'test')
  1093. repo.settings = {'issue_tracker': True}
  1094. self.session.add(repo)
  1095. self.session.commit()
  1096. url = '/issue/raw/files/8a06845923010b27bfd8'\
  1097. 'e7e75acff7badc40d1021b4994e01f5e11ca40bc3a'\
  1098. 'be-%s_placebo.png' % os.path.dirname(
  1099. os.path.abspath(__file__))[1:].replace('/', '_')
  1100. output = self.app.get('/foo' + url)
  1101. self.assertEqual(output.status_code, 404)
  1102. output = self.app.get('/test/issue/raw/files/test.png')
  1103. self.assertEqual(output.status_code, 404)
  1104. # Access file by name
  1105. output = self.app.get('/test' + url)
  1106. self.assertEqual(output.status_code, 200)
  1107. # Project w/o issue tracker
  1108. repo = pagure.lib.get_project(self.session, 'test')
  1109. repo.settings = {'issue_tracker': False}
  1110. self.session.add(repo)
  1111. self.session.commit()
  1112. output = self.app.get('/test' + url)
  1113. self.assertEqual(output.status_code, 404)
  1114. @patch('pagure.lib.git.update_git')
  1115. @patch('pagure.lib.notify.send_email')
  1116. def test_edit_issue(self, p_send_email, p_ugt):
  1117. """ Test the edit_issue endpoint. """
  1118. p_send_email.return_value = True
  1119. p_ugt.return_value = True
  1120. # No Git repo
  1121. output = self.app.get('/foo/issue/1/edit')
  1122. self.assertEqual(output.status_code, 404)
  1123. user = tests.FakeUser()
  1124. with tests.user_set(pagure.APP, user):
  1125. output = self.app.get('/foo/issue/1/edit')
  1126. self.assertEqual(output.status_code, 404)
  1127. tests.create_projects(self.session)
  1128. tests.create_projects_git(
  1129. os.path.join(self.path), bare=True)
  1130. output = self.app.get('/test/issue/1/edit')
  1131. self.assertEqual(output.status_code, 404)
  1132. # User not logged in
  1133. output = self.app.get('/foo/issue/1/edit')
  1134. self.assertEqual(output.status_code, 404)
  1135. user.username = 'pingou'
  1136. with tests.user_set(pagure.APP, user):
  1137. output = self.app.get('/test/issue/1/edit')
  1138. self.assertEqual(output.status_code, 404)
  1139. # Create issues to play with
  1140. repo = pagure.lib.get_project(self.session, 'test')
  1141. msg = pagure.lib.new_issue(
  1142. session=self.session,
  1143. repo=repo,
  1144. title='Test issue',
  1145. content='We should work on this',
  1146. user='pingou',
  1147. ticketfolder=None
  1148. )
  1149. self.session.commit()
  1150. self.assertEqual(msg.title, 'Test issue')
  1151. user = tests.FakeUser()
  1152. with tests.user_set(pagure.APP, user):
  1153. output = self.app.get('/test/issue/1/edit')
  1154. self.assertEqual(output.status_code, 403)
  1155. user.username = 'pingou'
  1156. with tests.user_set(pagure.APP, user):
  1157. output = self.app.get('/test/issue/1/edit')
  1158. self.assertEqual(output.status_code, 200)
  1159. self.assertTrue(
  1160. '<div class="card-header">\n Edit '
  1161. 'issue #1\n </div>' in output.get_data(as_text=True))
  1162. csrf_token = output.get_data(as_text=True).split(
  1163. 'name="csrf_token" type="hidden" value="')[1].split('">')[0]
  1164. data = {
  1165. 'issue_content': 'We should work on this!'
  1166. }
  1167. output = self.app.post('/test/issue/1/edit', data=data)
  1168. self.assertEqual(output.status_code, 200)
  1169. self.assertTrue(
  1170. '<div class="card-header">\n Edit '
  1171. 'issue #1\n </div>' in output.get_data(as_text=True))
  1172. self.assertEqual(output.get_data(as_text=True).count(
  1173. '<small>\n This field is required.&nbsp;\n'
  1174. ' </small>'), 1)
  1175. self.assertEqual(output.get_data(as_text=True).count(
  1176. '<small>\n Not a valid choice&nbsp;'
  1177. '\n </small>'), 1)
  1178. data['status'] = 'Open'
  1179. data['title'] = 'Test issue #1'
  1180. output = self.app.post('/test/issue/1/edit', data=data)
  1181. self.assertEqual(output.status_code, 200)
  1182. self.assertTrue(
  1183. '<div class="card-header">\n Edit '
  1184. 'issue #1\n </div>' in output.get_data(as_text=True))
  1185. self.assertEqual(output.get_data(as_text=True).count(
  1186. '<small>\n This field is required.&nbsp;\n'
  1187. ' </small>'), 0)
  1188. self.assertEqual(output.get_data(as_text=True).count(
  1189. '<small>\n Not a valid choice&nbsp;'
  1190. '\n </small>'), 0)
  1191. data['csrf_token'] = csrf_token
  1192. output = self.app.post(
  1193. '/test/issue/1/edit', data=data, follow_redirects=True)
  1194. self.assertEqual(output.status_code, 200)
  1195. self.assertIn(
  1196. '</button>\n Successfully edited issue #1',
  1197. output.get_data(as_text=True))
  1198. self.assertIn(
  1199. '<span class="issueid label label-default">#1</span>\n'
  1200. ' <span id="issuetitle">Test issue #1</span>',
  1201. output.get_data(as_text=True))
  1202. self.assertEqual(output.get_data(as_text=True).count(
  1203. '<option selected value="Open">Open</option>'), 1)
  1204. self.assertEqual(output.get_data(as_text=True).count('comment_body">'), 1)
  1205. self.assertEqual(output.get_data(as_text=True).count(
  1206. '<p>We should work on this!</p>'), 1)
  1207. # Project w/o issue tracker
  1208. repo = pagure.lib.get_project(self.session, 'test')
  1209. repo.settings = {'issue_tracker': False}
  1210. self.session.add(repo)
  1211. self.session.commit()
  1212. user.username = 'pingou'
  1213. with tests.user_set(pagure.APP, user):
  1214. output = self.app.post('/test/issue/1/edit', data=data)
  1215. self.assertEqual(output.status_code, 404)
  1216. @patch('pagure.lib.git.update_git')
  1217. @patch('pagure.lib.notify.send_email')
  1218. def test_edit_tag(self, p_send_email, p_ugt):
  1219. """ Test the edit_tag endpoint. """
  1220. p_send_email.return_value = True
  1221. p_ugt.return_value = True
  1222. # No Git repo
  1223. output = self.app.get('/foo/tag/foo/edit')
  1224. self.assertEqual(output.status_code, 404)
  1225. user = tests.FakeUser()
  1226. with tests.user_set(pagure.APP, user):
  1227. output = self.app.get('/foo/tag/foo/edit')
  1228. self.assertEqual(output.status_code, 404)
  1229. tests.create_projects(self.session)
  1230. tests.create_projects_git(self.path)
  1231. output = self.app.get('/test/tag/foo/edit')
  1232. self.assertEqual(output.status_code, 403)
  1233. # User not logged in
  1234. output = self.app.get('/test/tag/foo/edit')
  1235. self.assertEqual(output.status_code, 302)
  1236. # Create issues to play with
  1237. repo = pagure.lib.get_project(self.session, 'test')
  1238. msg = pagure.lib.new_issue(
  1239. session=self.session,
  1240. repo=repo,
  1241. title='Test issue',
  1242. content='We should work on this',
  1243. user='pingou',
  1244. ticketfolder=None
  1245. )
  1246. self.session.commit()
  1247. self.assertEqual(msg.title, 'Test issue')
  1248. # Add a tag to the issue
  1249. issue = pagure.lib.search_issues(self.session, repo, issueid=1)
  1250. msg = pagure.lib.add_tag_obj(
  1251. session=self.session,
  1252. obj=issue,
  1253. tags='tag1',
  1254. user='pingou',
  1255. ticketfolder=None)
  1256. self.session.commit()
  1257. self.assertEqual(msg, 'Tag added: tag1')
  1258. # Before edit, list tags
  1259. tags = pagure.lib.get_tags_of_project(self.session, repo)
  1260. self.assertEqual([tag.tag for tag in tags], ['tag1'])
  1261. # Edit tag
  1262. user.username = 'pingou'
  1263. with tests.user_set(pagure.APP, user):
  1264. #Edit a tag that doesn't exit
  1265. output = self.app.get('/test/tag/does_not_exist/edit')
  1266. self.assertEqual(output.status_code, 404)
  1267. output = self.app.get('/test/tag/tag1/edit')
  1268. self.assertEqual(output.status_code, 200)
  1269. self.assertTrue('<h2>Edit tag: tag1</h2>' in output.get_data(as_text=True))
  1270. self.assertTrue(
  1271. '<p>Enter in the field below the new name for the tag: '
  1272. '"tag1"</p>' in output.get_data(as_text=True))
  1273. csrf_token = output.get_data(as_text=True).split(
  1274. 'name="csrf_token" type="hidden" value="')[1].split('">')[0]
  1275. data = {'tag': 'tag2'}
  1276. output = self.app.post('/test/tag/tag1/edit', data=data)
  1277. self.assertEqual(output.status_code, 200)
  1278. self.assertTrue('<h2>Edit tag: tag1</h2>' in output.get_data(as_text=True))
  1279. self.assertTrue(
  1280. '<p>Enter in the field below the new name for the tag: '
  1281. '"tag1"</p>' in output.get_data(as_text=True))
  1282. data['csrf_token'] = csrf_token
  1283. output = self.app.post(
  1284. '/test/tag/tag1/edit', data=data, follow_redirects=True)
  1285. self.assertEqual(output.status_code, 200)
  1286. self.assertIn(
  1287. '<title>Settings - test - Pagure</title>', output.get_data(as_text=True))
  1288. self.assertIn(
  1289. '</button>\n Edited tag: tag1 to tag2',
  1290. output.get_data(as_text=True))
  1291. # After edit, list tags
  1292. tags = pagure.lib.get_tags_of_project(self.session, repo)
  1293. self.assertEqual([tag.tag for tag in tags], ['tag2'])
  1294. @patch('pagure.lib.git.update_git')
  1295. @patch('pagure.lib.notify.send_email')
  1296. def test_remove_tag(self, p_send_email, p_ugt):
  1297. """ Test the remove_tag endpoint. """
  1298. p_send_email.return_value = True
  1299. p_ugt.return_value = True
  1300. # No Git repo
  1301. output = self.app.post('/foo/droptag/')
  1302. self.assertEqual(output.status_code, 404)
  1303. user = tests.FakeUser()
  1304. with tests.user_set(pagure.APP, user):
  1305. output = self.app.post('/foo/droptag/')
  1306. self.assertEqual(output.status_code, 404)
  1307. tests.create_projects(self.session)
  1308. tests.create_projects_git(self.path)
  1309. output = self.app.post('/test/droptag/')
  1310. self.assertEqual(output.status_code, 403)
  1311. # User not logged in
  1312. output = self.app.post('/test/droptag/')
  1313. self.assertEqual(output.status_code, 302)
  1314. # Create issues to play with
  1315. repo = pagure.lib.get_project(self.session, 'test')
  1316. msg = pagure.lib.new_issue(
  1317. session=self.session,
  1318. repo=repo,
  1319. title='Test issue',
  1320. content='We should work on this',
  1321. user='pingou',
  1322. ticketfolder=None
  1323. )
  1324. self.session.commit()
  1325. self.assertEqual(msg.title, 'Test issue')
  1326. # Add a tag to the issue
  1327. issue = pagure.lib.search_issues(self.session, repo, issueid=1)
  1328. msg = pagure.lib.add_tag_obj(
  1329. session=self.session,
  1330. obj=issue,
  1331. tags='tag1',
  1332. user='pingou',
  1333. ticketfolder=None)
  1334. self.session.commit()
  1335. self.assertEqual(msg, 'Tag added: tag1')
  1336. # Before edit, list tags
  1337. tags = pagure.lib.get_tags_of_project(self.session, repo)
  1338. self.assertEqual([tag.tag for tag in tags], ['tag1'])
  1339. # Edit tag
  1340. user.username = 'pingou'
  1341. with tests.user_set(pagure.APP, user):
  1342. output = self.app.post(
  1343. '/test/droptag/', data={}, follow_redirects=True)
  1344. self.assertEqual(output.status_code, 200)
  1345. self.assertTrue(
  1346. '<title>Settings - test - Pagure</title>' in output.get_data(as_text=True))
  1347. self.assertTrue("<h3>Settings for test</h3>" in output.get_data(as_text=True))
  1348. csrf_token = output.get_data(as_text=True).split(
  1349. 'name="csrf_token" type="hidden" value="')[1].split('">')[0]
  1350. data = {'tag': 'tag1'}
  1351. output = self.app.post(
  1352. '/test/droptag/', data=data, follow_redirects=True)
  1353. self.assertEqual(output.status_code, 200)
  1354. self.assertTrue("<h3>Settings for test</h3>" in output.get_data(as_text=True))
  1355. data['csrf_token'] = csrf_token
  1356. output = self.app.post(
  1357. '/test/droptag/', data=data, follow_redirects=True)
  1358. self.assertEqual(output.status_code, 200)
  1359. self.assertTrue("<h3>Settings for test</h3>" in output.get_data(as_text=True))
  1360. self.assertIn(
  1361. '</button>\n Removed tag: tag1',
  1362. output.get_data(as_text=True))
  1363. @patch('pagure.lib.git.update_git')
  1364. @patch('pagure.lib.notify.send_email')
  1365. def test_delete_issue(self, p_send_email, p_ugt):
  1366. """ Test the delete_issue endpoint. """
  1367. p_send_email.return_value = True
  1368. p_ugt.return_value = True
  1369. tests.create_projects(self.session)
  1370. tests.create_projects_git(self.path)
  1371. tests.create_projects_git(os.path.join(self.path, 'tickets'))
  1372. # Create issues to play with
  1373. repo = pagure.lib.get_project(self.session, 'test')
  1374. msg = pagure.lib.new_issue(
  1375. session=self.session,
  1376. repo=repo,
  1377. title='Test issue',
  1378. content='We should work on this',
  1379. user='pingou',
  1380. ticketfolder=None
  1381. )
  1382. self.session.commit()
  1383. self.assertEqual(msg.title, 'Test issue')
  1384. user = tests.FakeUser()
  1385. with tests.user_set(pagure.APP, user):
  1386. output = self.app.post(
  1387. '/foo/issue/1/drop', follow_redirects=True)
  1388. self.assertEqual(output.status_code, 404)
  1389. output = self.app.post(
  1390. '/test/issue/100/drop', follow_redirects=True)
  1391. self.assertEqual(output.status_code, 404)
  1392. output = self.app.post(
  1393. '/test/issue/1/drop', follow_redirects=True)
  1394. self.assertEqual(output.status_code, 403)
  1395. user.username = 'pingou'
  1396. with tests.user_set(pagure.APP, user):
  1397. output = self.app.post(
  1398. '/test/issue/1/drop', follow_redirects=True)
  1399. self.assertEqual(output.status_code, 200)
  1400. self.assertIn(
  1401. '<title>Issue #1: Test issue - test - Pagure</title>',
  1402. output.get_data(as_text=True))
  1403. csrf_token = output.get_data(as_text=True).split(
  1404. 'name="csrf_token" type="hidden" value="')[1].split('">')[0]
  1405. data = {
  1406. }
  1407. # No CSRF token
  1408. output = self.app.post(
  1409. '/test/issue/1/drop', data=data, follow_redirects=True)
  1410. self.assertEqual(output.status_code, 200)
  1411. self.assertIn(
  1412. '<title>Issue #1: Test issue - test - Pagure</title>',
  1413. output.get_data(as_text=True))
  1414. data['csrf_token'] = csrf_token
  1415. output = self.app.post(
  1416. '/test/issue/1/drop', data=data, follow_redirects=True)
  1417. self.assertEqual(output.status_code, 200)
  1418. self.assertIn(
  1419. '<title>Issues - test - Pagure</title>', output.get_data(as_text=True))
  1420. self.assertIn(
  1421. '</button>\n Issue deleted',
  1422. output.get_data(as_text=True))
  1423. # Project w/o issue tracker
  1424. repo = pagure.lib.get_project(self.session, 'test')
  1425. repo.settings = {'issue_tracker': False}
  1426. self.session.add(repo)
  1427. self.session.commit()
  1428. user.username = 'pingou'
  1429. with tests.user_set(pagure.APP, user):
  1430. output = self.app.post('/test/issue/1/drop', data=data)
  1431. self.assertEqual(output.status_code, 404)
  1432. @patch('pagure.lib.git.update_git')
  1433. @patch('pagure.lib.notify.send_email')
  1434. def test_update_issue_edit_comment(self, p_send_email, p_ugt):
  1435. """ Test the issues edit comment endpoint """
  1436. p_send_email.return_value = True
  1437. p_ugt.return_value = True
  1438. tests.create_projects(self.session)
  1439. tests.create_projects_git(
  1440. os.path.join(self.path), bare=True)
  1441. # Create issues to play with
  1442. repo = pagure.lib.get_project(self.session, 'test')
  1443. msg = pagure.lib.new_issue(
  1444. session=self.session,
  1445. repo=repo,
  1446. title='Test issue',
  1447. content='We should work on this',
  1448. user='pingou',
  1449. ticketfolder=None
  1450. )
  1451. self.session.commit()
  1452. self.assertEqual(msg.title, 'Test issue')
  1453. user = tests.FakeUser()
  1454. user.username = 'pingou'
  1455. with tests.user_set(pagure.APP, user):
  1456. output = self.app.get('/test/issue/1')
  1457. self.assertEqual(output.status_code, 200)
  1458. self.assertIn(
  1459. '<title>Issue #1: Test issue - test - Pagure</title>',
  1460. output.get_data(as_text=True))
  1461. self.assertIn(
  1462. '<a class="btn btn-primary btn-sm" '
  1463. 'href="/test/issue/1/edit" title="Edit this issue">',
  1464. output.get_data(as_text=True))
  1465. csrf_token = output.get_data(as_text=True).split(
  1466. 'name="csrf_token" type="hidden" value="')[1].split('">')[0]
  1467. # Add new comment
  1468. data = {
  1469. 'csrf_token': csrf_token,
  1470. 'comment': 'Woohoo a second comment !',
  1471. }
  1472. output = self.app.post(
  1473. '/test/issue/1/update', data=data, follow_redirects=True)
  1474. self.assertEqual(output.status_code, 200)
  1475. self.assertIn(
  1476. '<title>Issue #1: Test issue - test - Pagure</title>',
  1477. output.get_data(as_text=True))
  1478. self.assertIn(
  1479. '<a class="btn btn-primary btn-sm" '
  1480. 'href="/test/issue/1/edit" title="Edit this issue">',
  1481. output.get_data(as_text=True))
  1482. self.assertIn(
  1483. '</button>\n Comment added',
  1484. output.get_data(as_text=True))
  1485. self.assertTrue(
  1486. '<p>Woohoo a second comment !</p>' in output.get_data(as_text=True))
  1487. self.assertEqual(output.get_data(as_text=True).count('comment_body">'), 2)
  1488. repo = pagure.lib.get_project(self.session, 'test')
  1489. issue = pagure.lib.search_issues(self.session, repo, issueid=1)
  1490. self.assertEqual(len(issue.comments), 1)
  1491. self.assertEqual(
  1492. issue.comments[0].comment,
  1493. 'Woohoo a second comment !')
  1494. data = {
  1495. 'csrf_token': csrf_token,
  1496. 'edit_comment': 1,
  1497. 'update_comment': 'Updated comment',
  1498. }
  1499. user = tests.FakeUser()
  1500. with tests.user_set(pagure.APP, user):
  1501. # Wrong issue id
  1502. output = self.app.post(
  1503. '/test/issue/3/update', data=data, follow_redirects=True)
  1504. self.assertEqual(output.status_code, 404)
  1505. # Wrong user
  1506. output = self.app.post(
  1507. '/test/issue/1/update', data=data, follow_redirects=True)
  1508. self.assertEqual(output.status_code, 403)
  1509. user = tests.FakeUser()
  1510. user.username = 'pingou'
  1511. with tests.user_set(pagure.APP, user):
  1512. # Edit comment
  1513. output = self.app.post(
  1514. '/test/issue/1/update', data=data, follow_redirects=True)
  1515. self.assertEqual(output.status_code, 200)
  1516. self.assertIn(
  1517. '<title>Issue #1: Test issue - test - Pagure</title>',
  1518. output.get_data(as_text=True))
  1519. self.assertIn(
  1520. '<a class="btn btn-primary btn-sm" '
  1521. 'href="/test/issue/1/edit" title="Edit this issue">',
  1522. output.get_data(as_text=True))
  1523. self.assertIn(
  1524. '</button>\n Comment updated',
  1525. output.get_data(as_text=True))
  1526. repo = pagure.lib.get_project(self.session, 'test')
  1527. issue = pagure.lib.search_issues(self.session, repo, issueid=1)
  1528. self.assertEqual(len(issue.comments), 1)
  1529. self.assertEqual(issue.comments[0].comment, 'Updated comment')
  1530. with tests.user_set(pagure.APP, user):
  1531. output = self.app.get('/test/issue/1/comment/1/edit')
  1532. self.assertIn(
  1533. '<title>test - Pagure</title>', output.get_data(as_text=True))
  1534. self.assertTrue('<div id="edit">' in output.get_data(as_text=True))
  1535. self.assertTrue('<section class="edit_comment">' in output.get_data(as_text=True))
  1536. self.assertTrue(
  1537. '<textarea class="form-control" id="update_comment"'
  1538. in output.get_data(as_text=True))
  1539. csrf_token = output.get_data(as_text=True).split(
  1540. 'name="csrf_token" type="hidden" value="')[1].split('">')[0]
  1541. data['csrf_token'] = csrf_token
  1542. data['update_comment'] = 'Second update'
  1543. # Edit the comment with the other endpoint
  1544. output = self.app.post(
  1545. '/test/issue/1/comment/1/edit',
  1546. data=data,
  1547. follow_redirects=True)
  1548. self.assertEqual(output.status_code, 200)
  1549. self.assertIn(
  1550. '<title>Issue #1: Test issue - test - Pagure</title>',
  1551. output.get_data(as_text=True))
  1552. self.assertIn(
  1553. '<a class="btn btn-primary btn-sm" '
  1554. 'href="/test/issue/1/edit" title="Edit this issue">',
  1555. output.get_data(as_text=True))
  1556. self.assertIn(
  1557. '</button>\n Comment updated',
  1558. output.get_data(as_text=True))
  1559. repo = pagure.lib.get_project(self.session, 'test')
  1560. issue = pagure.lib.search_issues(self.session, repo, issueid=1)
  1561. self.assertEqual(len(issue.comments), 1)
  1562. self.assertEqual(issue.comments[0].comment, 'Second update')
  1563. @patch('pagure.lib.git.update_git')
  1564. @patch('pagure.lib.notify.send_email')
  1565. def test_git_urls(self, p_send_email, p_ugt):
  1566. """ Check that the url to the git repo for issues is present/absent when
  1567. it should.
  1568. """
  1569. p_send_email.return_value = True
  1570. p_ugt.return_value = True
  1571. self.test_view_issues()
  1572. user = tests.FakeUser()
  1573. user.username = 'pingou'
  1574. with tests.user_set(pagure.APP, user):
  1575. # Check that the git issue URL is present
  1576. output = self.app.get('/test')
  1577. self.assertNotIn(
  1578. b'<h5><strong>Issues GIT URLs</strong></h5>', output.data)
  1579. # Project w/o issue tracker
  1580. repo = pagure.lib.get_project(self.session, 'test')
  1581. repo.settings = {'issue_tracker': True}
  1582. self.session.add(repo)
  1583. self.session.commit()
  1584. # Check that the git issue URL is gone
  1585. output = self.app.get('/test')
  1586. self.assertIn(
  1587. b'<h5><strong>Issues GIT URLs</strong></h5>', output.data)
  1588. if __name__ == '__main__':
  1589. SUITE = unittest.TestLoader().loadTestsFromTestCase(PagureFlaskIssuestests)
  1590. unittest.TextTestRunner(verbosity=2).run(SUITE)