test_log.py 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287
  1. # coding: utf-8
  2. from __future__ import print_function
  3. from __future__ import absolute_import
  4. from __future__ import division
  5. from __future__ import unicode_literals
  6. from django.test import TestCase
  7. from django.core.urlresolvers import reverse
  8. from django.utils.timezone import now, utc
  9. from django.core import mail
  10. from backend import const
  11. from mock import patch
  12. from .common import ProcessFixtureMixin, get_all_process_types
  13. import process.models as pmodels
  14. import datetime
  15. import uuid
  16. mock_ts = datetime.datetime(2016, 1, 1, 0, 0, 0, tzinfo=utc)
  17. class TestLog(ProcessFixtureMixin, TestCase):
  18. @classmethod
  19. def setUpClass(cls):
  20. super(TestLog, cls).setUpClass()
  21. cls.orig_ts = datetime.datetime(2015, 1, 1, 0, 0, 0, tzinfo=utc)
  22. # Create a process with an AM
  23. cls.persons.create("app", status=const.STATUS_DM)
  24. cls.processes.create("app", person=cls.persons.app, applying_for=const.STATUS_DD_U)
  25. cls.req_intent = pmodels.Requirement.objects.get(process=cls.processes.app, type="intent")
  26. cls.persons.create("am", status="dd_nu")
  27. cls.ams.create("am", person=cls.persons.am)
  28. cls.req_am_ok = pmodels.Requirement.objects.get(process=cls.processes.app, type="am_ok")
  29. cls.processes.app.frozen_by = cls.persons.fd
  30. cls.processes.app.frozen_time = cls.orig_ts
  31. cls.processes.app.approved_by = cls.persons.fd
  32. cls.processes.app.approved_time = cls.orig_ts
  33. cls.processes.app.closed = cls.orig_ts
  34. cls.processes.app.save()
  35. cls.req_intent.approved_by = cls.persons.fd
  36. cls.req_intent.approved_time = cls.orig_ts
  37. cls.req_intent.save()
  38. cls.req_am_ok.approved_by = cls.persons.fd
  39. cls.req_am_ok.approved_time = cls.orig_ts
  40. cls.req_am_ok.save()
  41. cls.url = reverse("process_add_log", args=[cls.processes.app.pk])
  42. cls.visitor = cls.persons.dc
  43. def get_new_log(self, process, logtext):
  44. entry = pmodels.Log.objects.get(process=process, logtext=logtext)
  45. self.assertEqual(entry.changed_by, self.visitor)
  46. self.assertEqual(entry.process, self.processes.app)
  47. return entry
  48. def assertProcUnchanged(self):
  49. self.processes.app.refresh_from_db()
  50. self.assertEqual(self.processes.app.frozen_by, self.persons.fd)
  51. self.assertEqual(self.processes.app.frozen_time, self.orig_ts)
  52. self.assertEqual(self.processes.app.approved_by, self.persons.fd)
  53. self.assertEqual(self.processes.app.approved_time, self.orig_ts)
  54. self.assertEqual(self.processes.app.closed, self.orig_ts)
  55. def assertIntentUnchanged(self):
  56. self.req_intent.refresh_from_db()
  57. self.assertEqual(self.req_intent.approved_by, self.persons.fd)
  58. self.assertEqual(self.req_intent.approved_time, self.orig_ts)
  59. def assertAmOkUnchanged(self):
  60. self.req_am_ok.refresh_from_db()
  61. self.assertEqual(self.req_am_ok.approved_by, self.persons.fd)
  62. self.assertEqual(self.req_am_ok.approved_time, self.orig_ts)
  63. def assertFailed(self, response, logtext):
  64. self.assertPermissionDenied(response)
  65. self.assertFalse(pmodels.Log.objects.filter(process=self.processes.app, logtext=logtext).exists())
  66. self.assertProcUnchanged()
  67. self.assertIntentUnchanged()
  68. self.assertAmOkUnchanged()
  69. def test_process_log_private(self):
  70. client = self.make_test_client(self.visitor)
  71. logtext = uuid.uuid4().hex
  72. with patch.object(pmodels.Process, "permissions_of", return_value=set()):
  73. response = client.post(self.url, data={"logtext": logtext, "add_action": "log_private"})
  74. self.assertFailed(response, logtext)
  75. self.assertEqual(len(mail.outbox), 0)
  76. with patch.object(pmodels.Process, "permissions_of", return_value=set(["add_log"])):
  77. response = client.post(self.url, data={"logtext": logtext, "add_action": "log_private"})
  78. self.assertRedirectMatches(response, self.processes.app.get_absolute_url())
  79. entry = self.get_new_log(self.processes.app, logtext)
  80. self.assertIsNone(entry.requirement)
  81. self.assertFalse(entry.is_public)
  82. self.assertEqual(entry.action, "")
  83. self.assertProcUnchanged()
  84. self.assertIntentUnchanged()
  85. self.assertAmOkUnchanged()
  86. self.assertEqual(len(mail.outbox), 1)
  87. def test_process_log_public(self):
  88. client = self.make_test_client(self.visitor)
  89. logtext = uuid.uuid4().hex
  90. with patch.object(pmodels.Process, "permissions_of", return_value=set()):
  91. response = client.post(self.url, data={"logtext": logtext, "add_action": "log_public"})
  92. self.assertFailed(response, logtext)
  93. self.assertEqual(len(mail.outbox), 0)
  94. with patch.object(pmodels.Process, "permissions_of", return_value=set(["add_log"])):
  95. response = client.post(self.url, data={"logtext": logtext, "add_action": "log_public"})
  96. self.assertRedirectMatches(response, self.processes.app.get_absolute_url())
  97. entry = self.get_new_log(self.processes.app, logtext)
  98. self.assertIsNone(entry.requirement)
  99. self.assertTrue(entry.is_public)
  100. self.assertEqual(entry.action, "")
  101. self.assertProcUnchanged()
  102. self.assertIntentUnchanged()
  103. self.assertAmOkUnchanged()
  104. self.assertEqual(len(mail.outbox), 1)
  105. def test_process_proc_freeze(self):
  106. with patch("process.views.now") as mock_now:
  107. mock_now.return_value = mock_ts
  108. client = self.make_test_client(self.visitor)
  109. logtext = uuid.uuid4().hex
  110. with patch.object(pmodels.Process, "permissions_of", return_value=set()):
  111. response = client.post(self.url, data={"logtext": logtext, "add_action": "proc_freeze"})
  112. self.assertFailed(response, logtext)
  113. self.assertEqual(len(mail.outbox), 0)
  114. with patch.object(pmodels.Process, "permissions_of", return_value=set(["proc_freeze"])):
  115. response = client.post(self.url, data={"logtext": logtext, "add_action": "proc_freeze"})
  116. self.assertRedirectMatches(response, self.processes.app.get_absolute_url())
  117. entry = self.get_new_log(self.processes.app, logtext)
  118. self.assertIsNone(entry.requirement)
  119. self.assertTrue(entry.is_public)
  120. self.assertEqual(entry.action, "proc_freeze")
  121. self.processes.app.refresh_from_db()
  122. self.assertEqual(self.processes.app.frozen_by, self.visitor)
  123. self.assertEqual(self.processes.app.frozen_time, mock_ts)
  124. self.assertEqual(self.processes.app.approved_by, self.persons.fd)
  125. self.assertEqual(self.processes.app.approved_time, self.orig_ts)
  126. self.assertEqual(self.processes.app.closed, self.orig_ts)
  127. self.assertIntentUnchanged()
  128. self.assertAmOkUnchanged()
  129. self.assertEqual(len(mail.outbox), 0)
  130. def test_process_proc_unfreeze(self):
  131. with patch("process.views.now") as mock_now:
  132. mock_now.return_value = mock_ts
  133. client = self.make_test_client(self.visitor)
  134. logtext = uuid.uuid4().hex
  135. with patch.object(pmodels.Process, "permissions_of", return_value=set()):
  136. response = client.post(self.url, data={"logtext": logtext, "add_action": "proc_unfreeze"})
  137. self.assertFailed(response, logtext)
  138. self.assertEqual(len(mail.outbox), 0)
  139. with patch.object(pmodels.Process, "permissions_of", return_value=set(["proc_unfreeze"])):
  140. response = client.post(self.url, data={"logtext": logtext, "add_action": "proc_unfreeze"})
  141. self.assertRedirectMatches(response, self.processes.app.get_absolute_url())
  142. entry = self.get_new_log(self.processes.app, logtext)
  143. self.assertIsNone(entry.requirement)
  144. self.assertTrue(entry.is_public)
  145. self.assertEqual(entry.action, "proc_unfreeze")
  146. self.processes.app.refresh_from_db()
  147. self.assertIsNone(self.processes.app.frozen_by)
  148. self.assertIsNone(self.processes.app.frozen_time)
  149. self.assertEqual(self.processes.app.approved_by, self.persons.fd)
  150. self.assertEqual(self.processes.app.approved_time, self.orig_ts)
  151. self.assertEqual(self.processes.app.closed, self.orig_ts)
  152. self.assertIntentUnchanged()
  153. self.assertAmOkUnchanged()
  154. self.assertEqual(len(mail.outbox), 0)
  155. def test_process_proc_approve(self):
  156. with patch("process.views.now") as mock_now:
  157. mock_now.return_value = mock_ts
  158. client = self.make_test_client(self.visitor)
  159. logtext = uuid.uuid4().hex
  160. with patch.object(pmodels.Process, "permissions_of", return_value=set()):
  161. response = client.post(self.url, data={"logtext": logtext, "add_action": "proc_approve"})
  162. self.assertFailed(response, logtext)
  163. self.assertEqual(len(mail.outbox), 0)
  164. with patch.object(pmodels.Process, "permissions_of", return_value=set(["proc_approve"])):
  165. response = client.post(self.url, data={"logtext": logtext, "add_action": "proc_approve"})
  166. self.assertRedirectMatches(response, self.processes.app.get_absolute_url())
  167. entry = self.get_new_log(self.processes.app, logtext)
  168. self.assertIsNone(entry.requirement)
  169. self.assertTrue(entry.is_public)
  170. self.assertEqual(entry.action, "proc_approve")
  171. self.processes.app.refresh_from_db()
  172. self.assertEqual(self.processes.app.frozen_by, self.persons.fd)
  173. self.assertEqual(self.processes.app.frozen_time, self.orig_ts)
  174. self.assertEqual(self.processes.app.approved_by, self.visitor)
  175. self.assertEqual(self.processes.app.approved_time, mock_ts)
  176. self.assertEqual(self.processes.app.closed, self.orig_ts)
  177. self.assertIntentUnchanged()
  178. self.assertAmOkUnchanged()
  179. self.assertEqual(len(mail.outbox), 0)
  180. def test_process_proc_unapprove(self):
  181. with patch("process.views.now") as mock_now:
  182. mock_now.return_value = mock_ts
  183. client = self.make_test_client(self.visitor)
  184. logtext = uuid.uuid4().hex
  185. with patch.object(pmodels.Process, "permissions_of", return_value=set()):
  186. response = client.post(self.url, data={"logtext": logtext, "add_action": "proc_unapprove"})
  187. self.assertFailed(response, logtext)
  188. self.assertEqual(len(mail.outbox), 0)
  189. with patch.object(pmodels.Process, "permissions_of", return_value=set(["proc_unapprove"])):
  190. response = client.post(self.url, data={"logtext": logtext, "add_action": "proc_unapprove"})
  191. self.assertRedirectMatches(response, self.processes.app.get_absolute_url())
  192. entry = self.get_new_log(self.processes.app, logtext)
  193. self.assertIsNone(entry.requirement)
  194. self.assertTrue(entry.is_public)
  195. self.assertEqual(entry.action, "proc_unapprove")
  196. self.processes.app.refresh_from_db()
  197. self.assertEqual(self.processes.app.frozen_by, self.persons.fd)
  198. self.assertEqual(self.processes.app.frozen_time, self.orig_ts)
  199. self.assertIsNone(self.processes.app.approved_by)
  200. self.assertIsNone(self.processes.app.approved_time)
  201. self.assertEqual(self.processes.app.closed, self.orig_ts)
  202. self.assertIntentUnchanged()
  203. self.assertAmOkUnchanged()
  204. self.assertEqual(len(mail.outbox), 0)
  205. def test_process_req_approve(self):
  206. with patch("process.views.now") as mock_now:
  207. mock_now.return_value = mock_ts
  208. client = self.make_test_client(self.visitor)
  209. logtext = uuid.uuid4().hex
  210. with patch.object(pmodels.Requirement, "permissions_of", return_value=set()):
  211. response = client.post(self.url, data={"logtext": logtext, "add_action": "req_approve", "req_type": "intent"})
  212. self.assertFailed(response, logtext)
  213. self.assertEqual(len(mail.outbox), 0)
  214. with patch.object(pmodels.Requirement, "permissions_of", return_value=set(["req_approve"])):
  215. response = client.post(self.url, data={"logtext": logtext, "add_action": "req_approve", "req_type": "intent"})
  216. self.assertRedirectMatches(response, self.req_intent.get_absolute_url())
  217. entry = self.get_new_log(self.processes.app, logtext)
  218. self.assertEqual(entry.requirement, self.req_intent)
  219. self.assertTrue(entry.is_public)
  220. self.assertEqual(entry.action, "req_approve")
  221. self.processes.app.refresh_from_db()
  222. self.assertProcUnchanged()
  223. self.req_intent.refresh_from_db()
  224. self.assertEqual(self.req_intent.approved_by, self.visitor)
  225. self.assertEqual(self.req_intent.approved_time, mock_ts)
  226. self.assertAmOkUnchanged()
  227. self.assertEqual(len(mail.outbox), 0)
  228. def test_process_req_unapprove(self):
  229. with patch("process.views.now") as mock_now:
  230. mock_now.return_value = mock_ts
  231. client = self.make_test_client(self.visitor)
  232. logtext = uuid.uuid4().hex
  233. with patch.object(pmodels.Requirement, "permissions_of", return_value=set()):
  234. response = client.post(self.url, data={"logtext": logtext, "add_action": "req_unapprove", "req_type": "intent"})
  235. self.assertFailed(response, logtext)
  236. self.assertEqual(len(mail.outbox), 0)
  237. with patch.object(pmodels.Requirement, "permissions_of", return_value=set(["req_unapprove"])):
  238. response = client.post(self.url, data={"logtext": logtext, "add_action": "req_unapprove", "req_type": "intent"})
  239. self.assertRedirectMatches(response, self.processes.app.get_absolute_url())
  240. entry = self.get_new_log(self.processes.app, logtext)
  241. self.assertEqual(entry.requirement, self.req_intent)
  242. self.assertTrue(entry.is_public)
  243. self.assertEqual(entry.action, "req_unapprove")
  244. self.processes.app.refresh_from_db()
  245. self.assertProcUnchanged()
  246. self.req_intent.refresh_from_db()
  247. self.assertIsNone(self.req_intent.approved_by)
  248. self.assertIsNone(self.req_intent.approved_time)
  249. self.assertAmOkUnchanged()
  250. self.assertEqual(len(mail.outbox), 0)