test_pagure_flask_api_pr_flag.py 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817
  1. # -*- coding: utf-8 -*-
  2. """
  3. (c) 2018 - Copyright Red Hat Inc
  4. Authors:
  5. Pierre-Yves Chibon <pingou@pingoured.fr>
  6. """
  7. from __future__ import unicode_literals
  8. import unittest
  9. import sys
  10. import os
  11. import json
  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 # noqa
  16. import pagure.config # noqa
  17. import pagure.lib # noqa
  18. import tests # noqa
  19. class PagureFlaskApiPRFlagtests(tests.Modeltests):
  20. """ Tests for the flask API of pagure for flagging pull-requests """
  21. maxDiff = None
  22. @patch('pagure.lib.notify.send_email', MagicMock(return_value=True))
  23. def setUp(self):
  24. """ Set up the environnment, ran before every tests. """
  25. super(PagureFlaskApiPRFlagtests, self).setUp()
  26. pagure.config.config['REQUESTS_FOLDER'] = None
  27. tests.create_projects(self.session)
  28. tests.create_tokens(self.session)
  29. tests.create_tokens_acl(self.session)
  30. # Create a pull-request
  31. repo = pagure.lib.get_authorized_project(self.session, 'test')
  32. forked_repo = pagure.lib.get_authorized_project(self.session, 'test')
  33. req = pagure.lib.new_pull_request(
  34. session=self.session,
  35. repo_from=forked_repo,
  36. branch_from='master',
  37. repo_to=repo,
  38. branch_to='master',
  39. title='test pull-request',
  40. user='pingou',
  41. requestfolder=None,
  42. )
  43. self.session.commit()
  44. self.assertEqual(req.id, 1)
  45. self.assertEqual(req.title, 'test pull-request')
  46. # Check flags before
  47. self.session.commit()
  48. request = pagure.lib.search_pull_requests(
  49. self.session, project_id=1, requestid=1)
  50. self.assertEqual(len(request.flags), 0)
  51. def test_invalid_project(self):
  52. """ Test the flagging a PR on an invalid project. """
  53. headers = {'Authorization': 'token aaabbbcccddd'}
  54. # Invalid project
  55. output = self.app.post(
  56. '/api/0/foo/pull-request/1/flag', headers=headers)
  57. self.assertEqual(output.status_code, 404)
  58. data = json.loads(output.get_data(as_text=True))
  59. self.assertDictEqual(
  60. data,
  61. {
  62. "error": "Project not found",
  63. "error_code": "ENOPROJECT",
  64. }
  65. )
  66. def test_incorrect_project(self):
  67. """ Test the flagging a PR on the wrong project. """
  68. headers = {'Authorization': 'token aaabbbcccddd'}
  69. # Valid token, wrong project
  70. output = self.app.post(
  71. '/api/0/test2/pull-request/1/flag', headers=headers)
  72. self.assertEqual(output.status_code, 401)
  73. data = json.loads(output.get_data(as_text=True))
  74. self.assertEqual(pagure.api.APIERROR.EINVALIDTOK.name,
  75. data['error_code'])
  76. self.assertEqual(pagure.api.APIERROR.EINVALIDTOK.value, data['error'])
  77. def test_no_pr(self):
  78. """ Test the flagging a PR when the PR doesn't exist. """
  79. headers = {'Authorization': 'token aaabbbcccddd'}
  80. # No PR
  81. output = self.app.post(
  82. '/api/0/test/pull-request/10/flag', headers=headers)
  83. self.assertEqual(output.status_code, 404)
  84. data = json.loads(output.get_data(as_text=True))
  85. self.assertDictEqual(
  86. data,
  87. {
  88. "error": "Pull-Request not found",
  89. "error_code": "ENOREQ",
  90. }
  91. )
  92. def test_no_input(self):
  93. """ Test the flagging an existing PR but with no data. """
  94. headers = {'Authorization': 'token aaabbbcccddd'}
  95. # No input
  96. output = self.app.post(
  97. '/api/0/test/pull-request/1/flag', headers=headers)
  98. self.assertEqual(output.status_code, 400)
  99. data = json.loads(output.get_data(as_text=True))
  100. self.assertDictEqual(
  101. data,
  102. {
  103. 'error': 'Invalid or incomplete input submitted',
  104. 'error_code': 'EINVALIDREQ',
  105. 'errors': {
  106. 'comment': ['This field is required.'],
  107. 'url': ['This field is required.'],
  108. 'username': ['This field is required.']
  109. }
  110. }
  111. )
  112. def test_no_comment(self):
  113. """ Test the flagging an existing PR but with incomplete data. """
  114. headers = {'Authorization': 'token aaabbbcccddd'}
  115. data = {
  116. 'username': 'Jenkins',
  117. 'percent': 100,
  118. 'url': 'http://jenkins.cloud.fedoraproject.org/',
  119. 'uid': 'jenkins_build_pagure_100+seed',
  120. }
  121. # Incomplete request
  122. output = self.app.post(
  123. '/api/0/test/pull-request/1/flag', data=data, headers=headers)
  124. self.assertEqual(output.status_code, 400)
  125. data = json.loads(output.get_data(as_text=True))
  126. self.assertDictEqual(
  127. data,
  128. {
  129. "error": "Invalid or incomplete input submitted",
  130. "error_code": "EINVALIDREQ",
  131. "errors": {"comment": ["This field is required."]}
  132. }
  133. )
  134. # No change
  135. self.session.commit()
  136. request = pagure.lib.search_pull_requests(
  137. self.session, project_id=1, requestid=1)
  138. self.assertEqual(len(request.flags), 0)
  139. @patch('pagure.lib.notify.send_email')
  140. def test_flagging_a_pul_request_with_notification(self, mock_email):
  141. """ Test the flagging a PR. """
  142. headers = {'Authorization': 'token aaabbbcccddd'}
  143. # Enable PR notifications
  144. repo = pagure.lib.get_authorized_project(self.session, 'test')
  145. settings = repo.settings
  146. settings['notify_on_pull-request_flag'] = True
  147. repo.settings = settings
  148. self.session.add(repo)
  149. self.session.commit()
  150. data = {
  151. 'username': 'Jenkins',
  152. 'comment': 'Tests running',
  153. 'url': 'http://jenkins.cloud.fedoraproject.org/',
  154. 'uid': 'jenkins_build_pagure_100+seed',
  155. }
  156. # Valid request
  157. output = self.app.post(
  158. '/api/0/test/pull-request/1/flag', data=data, headers=headers)
  159. self.assertEqual(output.status_code, 200)
  160. data = json.loads(output.get_data(as_text=True))
  161. data['flag']['date_created'] = '1510742565'
  162. pr_uid = data['flag']['pull_request_uid']
  163. data['flag']['pull_request_uid'] = '62b49f00d489452994de5010565fab81'
  164. self.assertDictEqual(
  165. data,
  166. {
  167. 'flag': {
  168. 'comment': 'Tests running',
  169. 'date_created': '1510742565',
  170. 'percent': None,
  171. 'pull_request_uid': '62b49f00d489452994de5010565fab81',
  172. 'status': 'pending',
  173. 'url': 'http://jenkins.cloud.fedoraproject.org/',
  174. 'user': {
  175. 'default_email': 'bar@pingou.com',
  176. 'emails': ['bar@pingou.com', 'foo@pingou.com'],
  177. 'fullname': 'PY C',
  178. 'name': 'pingou'
  179. },
  180. 'username': 'Jenkins'},
  181. 'message': 'Flag added',
  182. 'uid': 'jenkins_build_pagure_100+seed'
  183. }
  184. )
  185. # One flag added
  186. self.session.commit()
  187. request = pagure.lib.search_pull_requests(
  188. self.session, project_id=1, requestid=1)
  189. self.assertEqual(len(request.flags), 1)
  190. self.assertEqual(request.flags[0].comment, 'Tests running')
  191. self.assertEqual(request.flags[0].percent, None)
  192. # Check the notification sent
  193. mock_email.assert_called_once_with(
  194. '\nJenkins flagged the pull-request `test pull-request` '
  195. 'as pending: Tests running\n\n'
  196. 'https://pagure.org/test/pull-request/1\n',
  197. 'PR #1 - Jenkins: pending',
  198. 'bar@pingou.com',
  199. in_reply_to='test-pull-request-' + pr_uid,
  200. mail_id='test-pull-request-' + pr_uid + '-1',
  201. project_name='test',
  202. user_from='Jenkins'
  203. )
  204. def test_updating_flag(self):
  205. """ Test the updating the flag of a PR. """
  206. headers = {'Authorization': 'token aaabbbcccddd'}
  207. data = {
  208. 'username': 'Jenkins',
  209. 'comment': 'Tests running',
  210. 'url': 'http://jenkins.cloud.fedoraproject.org/',
  211. 'uid': 'jenkins_build_pagure_100+seed',
  212. }
  213. # Valid request
  214. output = self.app.post(
  215. '/api/0/test/pull-request/1/flag', data=data, headers=headers)
  216. self.assertEqual(output.status_code, 200)
  217. data = json.loads(output.get_data(as_text=True))
  218. data['flag']['date_created'] = '1510742565'
  219. data['flag']['pull_request_uid'] = '62b49f00d489452994de5010565fab81'
  220. self.assertDictEqual(
  221. data,
  222. {
  223. 'flag': {
  224. 'comment': 'Tests running',
  225. 'date_created': '1510742565',
  226. 'percent': None,
  227. 'pull_request_uid': '62b49f00d489452994de5010565fab81',
  228. 'status': 'pending',
  229. 'url': 'http://jenkins.cloud.fedoraproject.org/',
  230. 'user': {
  231. 'default_email': 'bar@pingou.com',
  232. 'emails': ['bar@pingou.com', 'foo@pingou.com'],
  233. 'fullname': 'PY C',
  234. 'name': 'pingou'
  235. },
  236. 'username': 'Jenkins'},
  237. 'message': 'Flag added',
  238. 'uid': 'jenkins_build_pagure_100+seed'
  239. }
  240. )
  241. # One flag added
  242. self.session.commit()
  243. request = pagure.lib.search_pull_requests(
  244. self.session, project_id=1, requestid=1)
  245. self.assertEqual(len(request.flags), 1)
  246. self.assertEqual(request.flags[0].comment, 'Tests running')
  247. self.assertEqual(request.flags[0].percent, None)
  248. # Update flag - w/o providing the status
  249. data = {
  250. 'username': 'Jenkins',
  251. 'percent': 100,
  252. 'comment': 'Tests passed',
  253. 'url': 'http://jenkins.cloud.fedoraproject.org/',
  254. 'uid': 'jenkins_build_pagure_100+seed',
  255. }
  256. output = self.app.post(
  257. '/api/0/test/pull-request/1/flag', data=data, headers=headers)
  258. self.assertEqual(output.status_code, 200)
  259. data = json.loads(output.get_data(as_text=True))
  260. data['flag']['date_created'] = '1510742565'
  261. data['flag']['pull_request_uid'] = '62b49f00d489452994de5010565fab81'
  262. self.assertDictEqual(
  263. data,
  264. {
  265. 'flag': {
  266. 'comment': 'Tests passed',
  267. 'date_created': '1510742565',
  268. 'percent': 100,
  269. 'pull_request_uid': '62b49f00d489452994de5010565fab81',
  270. 'status': 'success',
  271. 'url': 'http://jenkins.cloud.fedoraproject.org/',
  272. 'user': {
  273. 'default_email': 'bar@pingou.com',
  274. 'emails': ['bar@pingou.com', 'foo@pingou.com'],
  275. 'fullname': 'PY C',
  276. 'name': 'pingou'
  277. },
  278. 'username': 'Jenkins'},
  279. 'message': 'Flag updated',
  280. 'uid': 'jenkins_build_pagure_100+seed'
  281. }
  282. )
  283. # One flag added
  284. self.session.commit()
  285. request = pagure.lib.search_pull_requests(
  286. self.session, project_id=1, requestid=1)
  287. self.assertEqual(len(request.flags), 1)
  288. self.assertEqual(request.flags[0].comment, 'Tests passed')
  289. self.assertEqual(request.flags[0].percent, 100)
  290. def test_adding_two_flags(self):
  291. """ Test the adding two flags to a PR. """
  292. headers = {'Authorization': 'token aaabbbcccddd'}
  293. data = {
  294. 'username': 'Jenkins',
  295. 'comment': 'Tests passed',
  296. 'status': 'success',
  297. 'percent': '100',
  298. 'url': 'http://jenkins.cloud.fedoraproject.org/',
  299. 'uid': 'jenkins_build_pagure_100+seed',
  300. }
  301. # Valid request
  302. output = self.app.post(
  303. '/api/0/test/pull-request/1/flag', data=data, headers=headers)
  304. self.assertEqual(output.status_code, 200)
  305. data = json.loads(output.get_data(as_text=True))
  306. data['flag']['date_created'] = '1510742565'
  307. data['flag']['pull_request_uid'] = '62b49f00d489452994de5010565fab81'
  308. self.assertDictEqual(
  309. data,
  310. {
  311. 'flag': {
  312. 'comment': 'Tests passed',
  313. 'date_created': '1510742565',
  314. 'percent': 100,
  315. 'pull_request_uid': '62b49f00d489452994de5010565fab81',
  316. 'status': 'success',
  317. 'url': 'http://jenkins.cloud.fedoraproject.org/',
  318. 'user': {
  319. 'default_email': 'bar@pingou.com',
  320. 'emails': ['bar@pingou.com', 'foo@pingou.com'],
  321. 'fullname': 'PY C',
  322. 'name': 'pingou'
  323. },
  324. 'username': 'Jenkins'},
  325. 'message': 'Flag added',
  326. 'uid': 'jenkins_build_pagure_100+seed'
  327. }
  328. )
  329. # One flag added
  330. self.session.commit()
  331. request = pagure.lib.search_pull_requests(
  332. self.session, project_id=1, requestid=1)
  333. self.assertEqual(len(request.flags), 1)
  334. self.assertEqual(request.flags[0].comment, 'Tests passed')
  335. self.assertEqual(request.flags[0].percent, 100)
  336. data = {
  337. 'username': 'Jenkins',
  338. 'comment': 'Tests running again',
  339. 'url': 'http://jenkins.cloud.fedoraproject.org/',
  340. }
  341. # Valid request
  342. output = self.app.post(
  343. '/api/0/test/pull-request/1/flag', data=data, headers=headers)
  344. self.assertEqual(output.status_code, 200)
  345. data = json.loads(output.get_data(as_text=True))
  346. data['flag']['date_created'] = '1510742565'
  347. data['flag']['pull_request_uid'] = '62b49f00d489452994de5010565fab81'
  348. self.assertNotEqual(
  349. data['uid'], 'jenkins_build_pagure_100+seed')
  350. data['uid'] = 'jenkins_build_pagure_100+seed'
  351. self.assertDictEqual(
  352. data,
  353. {
  354. 'flag': {
  355. 'comment': 'Tests running again',
  356. 'date_created': '1510742565',
  357. 'percent': None,
  358. 'pull_request_uid': '62b49f00d489452994de5010565fab81',
  359. 'status': 'pending',
  360. 'url': 'http://jenkins.cloud.fedoraproject.org/',
  361. 'user': {
  362. 'default_email': 'bar@pingou.com',
  363. 'emails': ['bar@pingou.com', 'foo@pingou.com'],
  364. 'fullname': 'PY C',
  365. 'name': 'pingou'
  366. },
  367. 'username': 'Jenkins'},
  368. 'message': 'Flag added',
  369. 'uid': 'jenkins_build_pagure_100+seed'
  370. }
  371. )
  372. # Two flag added
  373. self.session.commit()
  374. request = pagure.lib.search_pull_requests(
  375. self.session, project_id=1, requestid=1)
  376. self.assertEqual(len(request.flags), 2)
  377. self.assertEqual(request.flags[0].comment, 'Tests passed')
  378. self.assertEqual(request.flags[0].percent, 100)
  379. self.assertEqual(request.flags[1].comment, 'Tests running again')
  380. self.assertEqual(request.flags[1].percent, None)
  381. @patch.dict('pagure.config.config',
  382. {
  383. 'FLAG_STATUSES_LABELS':
  384. {
  385. 'pend!': 'label-info',
  386. 'succeed!': 'label-success',
  387. 'fail!': 'label-danger',
  388. 'what?': 'label-warning',
  389. },
  390. 'FLAG_PENDING': 'pend!',
  391. 'FLAG_SUCCESS': 'succeed!',
  392. 'FLAG_FAILURE': 'fail!',
  393. })
  394. def test_flagging_a_pull_request_while_having_custom_statuses(self):
  395. """ Test flagging a PR while having custom statuses. """
  396. headers = {'Authorization': 'token aaabbbcccddd'}
  397. # No status and no percent => should use FLAG_PENDING
  398. send_data = {
  399. 'username': 'Jenkins',
  400. 'comment': 'Tests running',
  401. 'url': 'http://jenkins.cloud.fedoraproject.org/',
  402. 'uid': 'jenkins_build_pagure_100+seed',
  403. }
  404. output = self.app.post(
  405. '/api/0/test/pull-request/1/flag', data=send_data, headers=headers)
  406. data = json.loads(output.get_data(as_text=True))
  407. self.assertEqual(output.status_code, 200)
  408. self.assertEqual(data['flag']['status'], 'pend!')
  409. # No status and 50 % => should use FLAG_SUCCESS
  410. send_data['percent'] = 50
  411. output = self.app.post(
  412. '/api/0/test/pull-request/1/flag', data=send_data, headers=headers)
  413. data = json.loads(output.get_data(as_text=True))
  414. self.assertEqual(output.status_code, 200)
  415. self.assertEqual(data['flag']['status'], 'succeed!')
  416. # No status and 0 % => should use FLAG_FAILURE
  417. send_data['percent'] = 0
  418. output = self.app.post(
  419. '/api/0/test/pull-request/1/flag', data=send_data, headers=headers)
  420. data = json.loads(output.get_data(as_text=True))
  421. self.assertEqual(output.status_code, 200)
  422. self.assertEqual(data['flag']['status'], 'fail!')
  423. # Explicitly set status
  424. send_data['status'] = 'what?'
  425. output = self.app.post(
  426. '/api/0/test/pull-request/1/flag', data=send_data, headers=headers)
  427. data = json.loads(output.get_data(as_text=True))
  428. self.assertEqual(output.status_code, 200)
  429. self.assertEqual(data['flag']['status'], 'what?')
  430. # Explicitly set wrong status
  431. send_data['status'] = 'nooo.....'
  432. output = self.app.post(
  433. '/api/0/test/pull-request/1/flag', data=send_data, headers=headers)
  434. data = json.loads(output.get_data(as_text=True))
  435. self.assertEqual(output.status_code, 400)
  436. self.assertDictEqual(
  437. data,
  438. {
  439. "error": "Invalid or incomplete input submitted",
  440. "error_code": "EINVALIDREQ",
  441. "errors": {"status": ["Not a valid choice"]}
  442. }
  443. )
  444. class PagureFlaskApiPRFlagUserTokentests(tests.Modeltests):
  445. """ Tests for the flask API of pagure for flagging pull-requests using
  446. an user token (ie: not restricted to a specific project).
  447. """
  448. maxDiff = None
  449. @patch('pagure.lib.notify.send_email', MagicMock(return_value=True))
  450. def setUp(self):
  451. """ Set up the environnment, ran before every tests. """
  452. super(PagureFlaskApiPRFlagUserTokentests, self).setUp()
  453. pagure.config.config['REQUESTS_FOLDER'] = None
  454. tests.create_projects(self.session)
  455. tests.create_tokens(self.session, project_id=None)
  456. tests.create_tokens_acl(self.session)
  457. # Create a pull-request
  458. repo = pagure.lib.get_authorized_project(self.session, 'test')
  459. forked_repo = pagure.lib.get_authorized_project(self.session, 'test')
  460. req = pagure.lib.new_pull_request(
  461. session=self.session,
  462. repo_from=forked_repo,
  463. branch_from='master',
  464. repo_to=repo,
  465. branch_to='master',
  466. title='test pull-request',
  467. user='pingou',
  468. requestfolder=None,
  469. )
  470. self.session.commit()
  471. self.assertEqual(req.id, 1)
  472. self.assertEqual(req.title, 'test pull-request')
  473. # Check flags before
  474. self.session.commit()
  475. request = pagure.lib.search_pull_requests(
  476. self.session, project_id=1, requestid=1)
  477. self.assertEqual(len(request.flags), 0)
  478. def test_no_pr(self):
  479. """ Test flagging a non-existing PR. """
  480. headers = {'Authorization': 'token aaabbbcccddd'}
  481. # Invalid project
  482. output = self.app.post(
  483. '/api/0/foo/pull-request/1/flag', headers=headers)
  484. self.assertEqual(output.status_code, 404)
  485. data = json.loads(output.get_data(as_text=True))
  486. self.assertDictEqual(
  487. data,
  488. {
  489. "error": "Project not found",
  490. "error_code": "ENOPROJECT",
  491. }
  492. )
  493. def test_no_pr_other_project(self):
  494. """ Test flagging a non-existing PR on a different project. """
  495. headers = {'Authorization': 'token aaabbbcccddd'}
  496. # Valid token, wrong project
  497. output = self.app.post(
  498. '/api/0/test2/pull-request/1/flag', headers=headers)
  499. self.assertEqual(output.status_code, 404)
  500. data = json.loads(output.get_data(as_text=True))
  501. self.assertDictEqual(
  502. data,
  503. {
  504. "error": "Pull-Request not found",
  505. "error_code": "ENOREQ",
  506. }
  507. )
  508. def test_no_input(self):
  509. """ Test flagging an existing PR but without submitting any data. """
  510. headers = {'Authorization': 'token aaabbbcccddd'}
  511. # No input
  512. output = self.app.post(
  513. '/api/0/test/pull-request/1/flag', headers=headers)
  514. self.assertEqual(output.status_code, 400)
  515. data = json.loads(output.get_data(as_text=True))
  516. self.assertDictEqual(
  517. data,
  518. {
  519. 'error': 'Invalid or incomplete input submitted',
  520. 'error_code': 'EINVALIDREQ',
  521. 'errors': {
  522. 'comment': ['This field is required.'],
  523. 'url': ['This field is required.'],
  524. 'username': ['This field is required.']
  525. }
  526. }
  527. )
  528. def test_no_comment(self):
  529. """ Test flagging an existing PR but without all the required info.
  530. """
  531. headers = {'Authorization': 'token aaabbbcccddd'}
  532. data = {
  533. 'username': 'Jenkins',
  534. 'percent': 100,
  535. 'url': 'http://jenkins.cloud.fedoraproject.org/',
  536. 'uid': 'jenkins_build_pagure_100+seed',
  537. }
  538. # Incomplete request
  539. output = self.app.post(
  540. '/api/0/test/pull-request/1/flag', data=data, headers=headers)
  541. self.assertEqual(output.status_code, 400)
  542. data = json.loads(output.get_data(as_text=True))
  543. self.assertDictEqual(
  544. data,
  545. {
  546. "error": "Invalid or incomplete input submitted",
  547. "error_code": "EINVALIDREQ",
  548. "errors": {"comment": ["This field is required."]}
  549. }
  550. )
  551. # No change
  552. self.session.commit()
  553. request = pagure.lib.search_pull_requests(
  554. self.session, project_id=1, requestid=1)
  555. self.assertEqual(len(request.flags), 0)
  556. def test_invalid_status(self):
  557. """ Test flagging an existing PR but with an invalid status.
  558. """
  559. headers = {'Authorization': 'token aaabbbcccddd'}
  560. data = {
  561. 'username': 'Jenkins',
  562. 'status': 'failed',
  563. 'comment': 'Failed to run the tests',
  564. 'url': 'http://jenkins.cloud.fedoraproject.org/',
  565. 'uid': 'jenkins_build_pagure_100+seed',
  566. }
  567. # Invalid status submitted
  568. output = self.app.post(
  569. '/api/0/test/pull-request/1/flag', data=data, headers=headers)
  570. self.assertEqual(output.status_code, 400)
  571. data = json.loads(output.get_data(as_text=True))
  572. self.assertDictEqual(
  573. data,
  574. {
  575. "error": "Invalid or incomplete input submitted",
  576. "error_code": "EINVALIDREQ",
  577. "errors": {"status": ["Not a valid choice"]}
  578. }
  579. )
  580. # No change
  581. self.session.commit()
  582. request = pagure.lib.search_pull_requests(
  583. self.session, project_id=1, requestid=1)
  584. self.assertEqual(len(request.flags), 0)
  585. @patch('pagure.lib.notify.send_email')
  586. def test_flag_pr_no_status(self, mock_email):
  587. """ Test flagging an existing PR without providing a status.
  588. Also check that no notifications have been sent.
  589. """
  590. headers = {'Authorization': 'token aaabbbcccddd'}
  591. data = {
  592. 'username': 'Jenkins',
  593. 'percent': 0,
  594. 'comment': 'Tests failed',
  595. 'url': 'http://jenkins.cloud.fedoraproject.org/',
  596. 'uid': 'jenkins_build_pagure_100+seed',
  597. }
  598. # Valid request - w/o providing the status
  599. output = self.app.post(
  600. '/api/0/test/pull-request/1/flag', data=data, headers=headers)
  601. self.assertEqual(output.status_code, 200)
  602. data = json.loads(output.get_data(as_text=True))
  603. data['flag']['date_created'] = '1510742565'
  604. data['flag']['pull_request_uid'] = '62b49f00d489452994de5010565fab81'
  605. self.assertDictEqual(
  606. data,
  607. {
  608. 'flag': {
  609. 'comment': 'Tests failed',
  610. 'date_created': '1510742565',
  611. 'percent': 0,
  612. 'pull_request_uid': '62b49f00d489452994de5010565fab81',
  613. 'status': 'failure',
  614. 'url': 'http://jenkins.cloud.fedoraproject.org/',
  615. 'user': {
  616. 'default_email': 'bar@pingou.com',
  617. 'emails': ['bar@pingou.com', 'foo@pingou.com'],
  618. 'fullname': 'PY C',
  619. 'name': 'pingou'
  620. },
  621. 'username': 'Jenkins'},
  622. 'message': 'Flag added',
  623. 'uid': 'jenkins_build_pagure_100+seed'
  624. }
  625. )
  626. # One flag added
  627. self.session.commit()
  628. request = pagure.lib.search_pull_requests(
  629. self.session, project_id=1, requestid=1)
  630. self.assertEqual(len(request.flags), 1)
  631. self.assertEqual(request.flags[0].comment, 'Tests failed')
  632. self.assertEqual(request.flags[0].percent, 0)
  633. # no notifications sent
  634. mock_email.assert_not_called()
  635. def test_editing_flag(self):
  636. """ Test flagging an existing PR without providing a status.
  637. """
  638. headers = {'Authorization': 'token aaabbbcccddd'}
  639. data = {
  640. 'username': 'Jenkins',
  641. 'status': 'failure',
  642. 'comment': 'Tests failed',
  643. 'url': 'http://jenkins.cloud.fedoraproject.org/',
  644. 'uid': 'jenkins_build_pagure_100+seed',
  645. }
  646. # Valid request - w/o providing the status
  647. output = self.app.post(
  648. '/api/0/test/pull-request/1/flag', data=data, headers=headers)
  649. self.assertEqual(output.status_code, 200)
  650. data = json.loads(output.get_data(as_text=True))
  651. data['flag']['date_created'] = '1510742565'
  652. data['flag']['pull_request_uid'] = '62b49f00d489452994de5010565fab81'
  653. self.assertDictEqual(
  654. data,
  655. {
  656. 'flag': {
  657. 'comment': 'Tests failed',
  658. 'date_created': '1510742565',
  659. 'percent': None,
  660. 'pull_request_uid': '62b49f00d489452994de5010565fab81',
  661. 'status': 'failure',
  662. 'url': 'http://jenkins.cloud.fedoraproject.org/',
  663. 'user': {
  664. 'default_email': 'bar@pingou.com',
  665. 'emails': ['bar@pingou.com', 'foo@pingou.com'],
  666. 'fullname': 'PY C',
  667. 'name': 'pingou'
  668. },
  669. 'username': 'Jenkins'},
  670. 'message': 'Flag added',
  671. 'uid': 'jenkins_build_pagure_100+seed'
  672. }
  673. )
  674. # One flag added
  675. self.session.commit()
  676. request = pagure.lib.search_pull_requests(
  677. self.session, project_id=1, requestid=1)
  678. self.assertEqual(len(request.flags), 1)
  679. self.assertEqual(request.flags[0].comment, 'Tests failed')
  680. self.assertEqual(request.flags[0].percent, None)
  681. # Update flag
  682. data = {
  683. 'username': 'Jenkins',
  684. 'percent': 100,
  685. 'comment': 'Tests passed',
  686. 'url': 'http://jenkins.cloud.fedoraproject.org/',
  687. 'uid': 'jenkins_build_pagure_100+seed',
  688. 'status': 'success',
  689. }
  690. output = self.app.post(
  691. '/api/0/test/pull-request/1/flag', data=data, headers=headers)
  692. self.assertEqual(output.status_code, 200)
  693. data = json.loads(output.get_data(as_text=True))
  694. data['flag']['date_created'] = '1510742565'
  695. data['flag']['pull_request_uid'] = '62b49f00d489452994de5010565fab81'
  696. self.assertDictEqual(
  697. data,
  698. {
  699. 'flag': {
  700. 'comment': 'Tests passed',
  701. 'date_created': '1510742565',
  702. 'percent': 100,
  703. 'pull_request_uid': '62b49f00d489452994de5010565fab81',
  704. 'status': 'success',
  705. 'url': 'http://jenkins.cloud.fedoraproject.org/',
  706. 'user': {
  707. 'default_email': 'bar@pingou.com',
  708. 'emails': ['bar@pingou.com', 'foo@pingou.com'],
  709. 'fullname': 'PY C',
  710. 'name': 'pingou'
  711. },
  712. 'username': 'Jenkins'},
  713. 'message': 'Flag updated',
  714. 'uid': 'jenkins_build_pagure_100+seed'
  715. }
  716. )
  717. # Still only one flag
  718. self.session.commit()
  719. request = pagure.lib.search_pull_requests(
  720. self.session, project_id=1, requestid=1)
  721. self.assertEqual(len(request.flags), 1)
  722. self.assertEqual(request.flags[0].comment, 'Tests passed')
  723. self.assertEqual(request.flags[0].percent, 100)
  724. if __name__ == '__main__':
  725. unittest.main(verbosity=2)