test_pagure_flask_dump_load_ticket.py 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220
  1. # -*- coding: utf-8 -*-
  2. """
  3. (c) 2015 - Copyright Red Hat Inc
  4. Authors:
  5. Pierre-Yves Chibon <pingou@pingoured.fr>
  6. """
  7. from __future__ import unicode_literals
  8. __requires__ = ['SQLAlchemy >= 0.8']
  9. import pkg_resources
  10. import json
  11. import unittest
  12. import shutil
  13. import sys
  14. import tempfile
  15. import time
  16. import os
  17. import pygit2
  18. from mock import patch
  19. sys.path.insert(0, os.path.join(os.path.dirname(
  20. os.path.abspath(__file__)), '..'))
  21. import pagure
  22. import pagure.lib
  23. import tests
  24. class PagureFlaskDumpLoadTicketTests(tests.Modeltests):
  25. """ Tests for flask application for dumping and re-loading the JSON of
  26. a ticket.
  27. """
  28. @patch('pagure.lib.notify.send_email')
  29. @patch('pagure.lib.git._maybe_wait')
  30. def test_dumping_reloading_ticket(self, mw, send_email):
  31. """ Test dumping a ticket into a JSON blob. """
  32. mw.side_effect = lambda result: result.get()
  33. send_email.return_value = True
  34. tests.create_projects(self.session)
  35. # Create repo
  36. self.gitrepo = os.path.join(self.path, 'repos', 'tickets', 'test.git')
  37. repopath = os.path.join(self.path, 'repos', 'tickets')
  38. os.makedirs(self.gitrepo)
  39. repo_obj = pygit2.init_repository(self.gitrepo, bare=True)
  40. repo = pagure.lib.get_authorized_project(self.session, 'test')
  41. # Create an issue to play with
  42. msg = pagure.lib.new_issue(
  43. session=self.session,
  44. repo=repo,
  45. title='Test issue',
  46. content='We should work on this',
  47. user='pingou',
  48. ticketfolder=repopath
  49. )
  50. self.assertEqual(msg.title, 'Test issue')
  51. # Need another two issue to test the dependencie chain
  52. msg = pagure.lib.new_issue(
  53. session=self.session,
  54. repo=repo,
  55. title='Test issue #2',
  56. content='Another bug',
  57. user='pingou',
  58. ticketfolder=repopath
  59. )
  60. self.assertEqual(msg.title, 'Test issue #2')
  61. msg = pagure.lib.new_issue(
  62. session=self.session,
  63. repo=repo,
  64. title='Test issue #3',
  65. content='That would be nice feature no?',
  66. user='foo',
  67. ticketfolder=repopath
  68. )
  69. self.assertEqual(msg.title, 'Test issue #3')
  70. issue = pagure.lib.search_issues(self.session, repo, issueid=1)
  71. issue2 = pagure.lib.search_issues(self.session, repo, issueid=2)
  72. issue3 = pagure.lib.search_issues(self.session, repo, issueid=3)
  73. # Add a couple of comment on the ticket
  74. msg = pagure.lib.add_issue_comment(
  75. session=self.session,
  76. issue=issue,
  77. comment='Hey look a comment!',
  78. user='foo',
  79. ticketfolder=repopath,
  80. )
  81. self.session.commit()
  82. self.assertEqual(msg, 'Comment added')
  83. msg = pagure.lib.add_issue_comment(
  84. session=self.session,
  85. issue=issue,
  86. comment='crazy right?',
  87. user='pingou',
  88. ticketfolder=repopath,
  89. )
  90. self.session.commit()
  91. self.assertEqual(msg, 'Comment added')
  92. # Assign the ticket to someone
  93. msg = pagure.lib.add_issue_assignee(
  94. session=self.session,
  95. issue=issue,
  96. assignee='pingou',
  97. user='pingou',
  98. ticketfolder=repopath,
  99. )
  100. self.session.commit()
  101. self.assertEqual(msg, 'Issue assigned to pingou')
  102. # Add a couple of tags on the ticket
  103. msg = pagure.lib.add_tag_obj(
  104. session=self.session,
  105. obj=issue,
  106. tags=[' feature ', 'future '],
  107. user='pingou',
  108. gitfolder=repopath,
  109. )
  110. self.session.commit()
  111. self.assertEqual(msg, 'Issue tagged with: feature, future')
  112. # Add dependencies
  113. msg = pagure.lib.add_issue_dependency(
  114. session=self.session,
  115. issue=issue,
  116. issue_blocked=issue2,
  117. user='pingou',
  118. ticketfolder=repopath,
  119. )
  120. self.session.commit()
  121. self.assertEqual(msg, 'Issue marked as depending on: #2')
  122. msg = pagure.lib.add_issue_dependency(
  123. session=self.session,
  124. issue=issue3,
  125. issue_blocked=issue,
  126. user='foo',
  127. ticketfolder=repopath,
  128. )
  129. self.session.commit()
  130. self.assertEqual(msg, 'Issue marked as depending on: #1')
  131. # Dump the JSON
  132. pagure.lib.git.update_git(issue, repo, repopath).wait()
  133. repo = pygit2.Repository(self.gitrepo)
  134. cnt = len([commit
  135. for commit in repo.walk(
  136. repo.head.target, pygit2.GIT_SORT_TOPOLOGICAL)])
  137. self.assertIn(cnt, (9, 10))
  138. last_commit = repo.revparse_single('HEAD')
  139. patch = pagure.lib.git.commit_to_patch(repo, last_commit)
  140. for line in patch.split('\n'):
  141. if line.startswith('--- a/'):
  142. fileid = line.split('--- a/')[1]
  143. break
  144. newpath = tempfile.mkdtemp(prefix='pagure-dump-load')
  145. clone_repo = pygit2.clone_repository(self.gitrepo, newpath)
  146. self.assertEqual(len(os.listdir(newpath)), 4)
  147. ticket_json = os.path.join(self.path, 'test_ticket.json')
  148. self.assertFalse(os.path.exists(ticket_json))
  149. shutil.copyfile(os.path.join(newpath, fileid), ticket_json)
  150. self.assertTrue(os.path.exists(ticket_json))
  151. jsondata = None
  152. with open(ticket_json) as stream:
  153. jsondata = json.load(stream)
  154. self.assertNotEqual(jsondata, None)
  155. shutil.rmtree(newpath)
  156. # Test reloading the JSON
  157. self.tearDown()
  158. self.setUp()
  159. # Give the worker time to spawn
  160. time.sleep(2)
  161. tests.create_projects(self.session)
  162. # Create repo
  163. self.gitrepo = os.path.join(self.path, 'tickets', 'test.git')
  164. repopath = os.path.join(self.path, 'tickets')
  165. os.makedirs(self.gitrepo)
  166. pygit2.init_repository(self.gitrepo, bare=True)
  167. pagure.lib.git.update_ticket_from_git(
  168. self.session,
  169. reponame='test',
  170. namespace=None,
  171. username=None,
  172. issue_uid='foobar',
  173. json_data=jsondata,
  174. agent='pingou',
  175. )
  176. # Post loading
  177. repo = pagure.lib.get_authorized_project(self.session, 'test')
  178. self.assertEqual(len(repo.issues), 1)
  179. issue = pagure.lib.search_issues(self.session, repo, issueid=1)
  180. # Check after re-loading
  181. self.assertEqual(len(issue.comments), 3)
  182. self.assertEqual(len(issue.tags), 2)
  183. self.assertEqual(sorted(issue.tags_text), sorted(['future', 'feature']))
  184. self.assertEqual(issue.assignee.username, 'pingou')
  185. self.assertEqual(issue.children, [])
  186. self.assertEqual(issue.parents, [])
  187. self.assertEqual(issue.status, 'Open')
  188. if __name__ == '__main__':
  189. unittest.main(verbosity=2)