test_perms.py 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344
  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 backend import const
  8. from backend import models as bmodels
  9. from backend.unittest import BaseFixtureMixin, PersonFixtureMixin, ExpectedPerms, ExpectedSets, OldProcessFixtureMixin
  10. class TestPersonPermissions(OldProcessFixtureMixin, TestCase):
  11. @classmethod
  12. def setUpClass(cls):
  13. super(TestPersonPermissions, cls).setUpClass()
  14. cls.persons.create("applicant", status=const.STATUS_DC)
  15. cls.persons.create("am", status=const.STATUS_DD_NU)
  16. cls.processes.create("applicant", person=cls.persons.applicant, applying_for=const.STATUS_DD_NU, progress=const.PROGRESS_AM, manager=cls.persons.am)
  17. cls.persons.create("e_dd", status=const.STATUS_EMERITUS_DD)
  18. cls.persons.create("e_dm", status=const.STATUS_EMERITUS_DM)
  19. cls.persons.create("r_dd", status=const.STATUS_REMOVED_DD)
  20. cls.persons.create("r_dm", status=const.STATUS_REMOVED_DM)
  21. cls.persons.create("am_e_dd", status=const.STATUS_EMERITUS_DD)
  22. cls.persons.create("am_r_dd", status=const.STATUS_REMOVED_DD)
  23. cls.persons.create("applicant1", status=const.STATUS_DC)
  24. cls.processes.create("applicant1", person=cls.persons.applicant1, applying_for=const.STATUS_DD_NU, progress=const.PROGRESS_AM, manager=cls.persons.am_e_dd)
  25. cls.persons.create("applicant2", status=const.STATUS_DC)
  26. cls.processes.create("applicant2", person=cls.persons.applicant2, applying_for=const.STATUS_DD_NU, progress=const.PROGRESS_AM, manager=cls.persons.am_r_dd)
  27. def assertPerms(self, pname, perms):
  28. self.assertItemsEqual(self.persons[pname].perms, perms)
  29. def test_person(self):
  30. self.assertPerms("pending", [])
  31. self.assertPerms("dc", [])
  32. self.assertPerms("dc_ga", [])
  33. self.assertPerms("dm", [])
  34. self.assertPerms("dm_ga", [])
  35. self.assertPerms("applicant", [])
  36. self.assertPerms("dd_nu", ["am_candidate", "dd"])
  37. self.assertPerms("dd_u", ["am_candidate", "dd"])
  38. self.assertPerms("am", ["am", "dd"])
  39. self.assertPerms("e_dd", [])
  40. self.assertPerms("e_dm", [])
  41. self.assertPerms("r_dd", [])
  42. self.assertPerms("r_dm", [])
  43. self.assertPerms("am_e_dd", [])
  44. self.assertPerms("am_r_dd", [])
  45. self.assertPerms("fd", ["admin", "am", "dd"])
  46. self.assertPerms("dam", ["admin", "am", "dd"])
  47. class TestVisitPersonNoProcess(OldProcessFixtureMixin, TestCase):
  48. @classmethod
  49. def __add_extra_tests__(cls):
  50. cls._add_method(cls._test_perms, "pending", perms=ExpectedPerms({
  51. "fd dam": "update_keycheck edit_email edit_bio edit_ldap view_person_audit_log fd_comments",
  52. "activeam": "update_keycheck edit_bio edit_ldap view_person_audit_log",
  53. "pending": "update_keycheck edit_email edit_bio",
  54. "dd_nu dd_u": "view_person_audit_log update_keycheck",
  55. }))
  56. cls._add_method(cls._test_perms, "dc", perms=ExpectedPerms({
  57. "fd dam": "update_keycheck edit_email edit_bio edit_ldap view_person_audit_log request_new_status fd_comments",
  58. "dc": "update_keycheck edit_email edit_bio edit_ldap view_person_audit_log request_new_status",
  59. "activeam": "update_keycheck edit_bio edit_ldap view_person_audit_log",
  60. "dd_nu dd_u": "view_person_audit_log update_keycheck",
  61. }))
  62. cls._add_method(cls._test_perms, "dc_ga", perms=ExpectedPerms({
  63. "fd dam": "update_keycheck edit_email edit_bio view_person_audit_log request_new_status fd_comments",
  64. "dc_ga": "update_keycheck edit_email edit_bio view_person_audit_log request_new_status",
  65. "activeam": "update_keycheck edit_bio view_person_audit_log",
  66. "dd_nu dd_u": "view_person_audit_log update_keycheck",
  67. }))
  68. cls._add_method(cls._test_perms, "dm", perms=ExpectedPerms({
  69. "fd dam": "update_keycheck edit_email edit_bio edit_ldap view_person_audit_log request_new_status fd_comments",
  70. "dm": "update_keycheck edit_email edit_bio edit_ldap view_person_audit_log request_new_status",
  71. "activeam": "update_keycheck edit_bio edit_ldap view_person_audit_log",
  72. "dd_nu dd_u": "view_person_audit_log update_keycheck",
  73. }))
  74. cls._add_method(cls._test_perms, "dm_ga", perms=ExpectedPerms({
  75. "fd dam": "update_keycheck edit_email edit_bio view_person_audit_log request_new_status fd_comments",
  76. "dm_ga": "update_keycheck edit_email edit_bio view_person_audit_log request_new_status",
  77. "activeam": "update_keycheck edit_bio view_person_audit_log",
  78. "dd_nu dd_u": "view_person_audit_log update_keycheck",
  79. }))
  80. cls._add_method(cls._test_perms, "dd_nu", perms=ExpectedPerms({
  81. "fd dam": "update_keycheck edit_email edit_bio view_person_audit_log request_new_status fd_comments",
  82. "dd_nu": "update_keycheck edit_email edit_bio view_person_audit_log request_new_status",
  83. "activeam": "update_keycheck edit_bio view_person_audit_log",
  84. "dd_u": "view_person_audit_log update_keycheck",
  85. }))
  86. cls._add_method(cls._test_perms, "dd_u", perms=ExpectedPerms({
  87. "fd dam": "update_keycheck edit_email edit_bio view_person_audit_log fd_comments",
  88. "dd_u": "update_keycheck edit_email edit_bio view_person_audit_log",
  89. "activeam dd_u": "update_keycheck edit_bio view_person_audit_log",
  90. "dd_nu": "view_person_audit_log update_keycheck",
  91. }))
  92. cls._add_method(cls._test_perms, "fd", perms=ExpectedPerms({
  93. "fd dam": "update_keycheck edit_email edit_bio view_person_audit_log request_new_status fd_comments",
  94. "activeam": "update_keycheck edit_bio view_person_audit_log",
  95. "dd_nu dd_u": "view_person_audit_log update_keycheck",
  96. }))
  97. cls._add_method(cls._test_perms, "dam", perms=ExpectedPerms({
  98. "fd dam": "update_keycheck edit_email edit_bio view_person_audit_log fd_comments",
  99. "activeam": "view_person_audit_log update_keycheck edit_bio",
  100. "dd_nu dd_u": "view_person_audit_log update_keycheck",
  101. }))
  102. def assertPermsEqual(self, action, perms_type, wanted, got):
  103. got = set(got)
  104. wanted = set(wanted)
  105. if got == wanted: return
  106. extra = got - wanted
  107. missing = wanted - got
  108. msg = []
  109. if missing: msg.append("misses {} {}".format(perms_type, ", ".join(sorted(missing))))
  110. if extra: msg.append("has extra {} {}".format(perms_type, ", ".join(sorted(extra))))
  111. self.fail(action + " " + " and ".join(msg))
  112. def _test_perms(self, visited, perms):
  113. other_visitors = set(self.persons.keys())
  114. other_visitors.add(None)
  115. for visitor, expected_perms in perms.perms.items():
  116. other_visitors.discard(visitor)
  117. visit_perms = self.persons[visited].permissions_of(self.persons[visitor])
  118. self.assertPermsEqual(
  119. "{} visiting {}".format(visitor, visited), "permissions",
  120. expected_perms, visit_perms)
  121. for visitor in other_visitors:
  122. visit_perms = self.persons[visited].permissions_of(self.persons[visitor] if visitor else None)
  123. self.assertPermsEqual(
  124. "{} visiting {}".format(visitor, visited), "permissions",
  125. [], visit_perms)
  126. class ProcExpected(object):
  127. def __init__(self, testcase):
  128. self.proc = ExpectedSets(testcase, "{visitor} visiting app's process", "{problem} permissions {mismatch}")
  129. def patch_generic_process_started(self):
  130. self.proc.patch("dd_nu dd_u activeam fd dam app adv", "+view_person_audit_log +update_keycheck")
  131. self.proc.patch("fd dam app", "+view_mbox +request_new_status +edit_bio +edit_email")
  132. self.proc.patch("fd dam", "+fd_comments")
  133. self.proc.patch("activeam", "+view_mbox +edit_bio")
  134. def patch_generic_process_has_advocate(self):
  135. self.proc.patch("adv", "+view_mbox +update_keycheck +view_person_audit_log")
  136. def patch_generic_process_am_approved(self):
  137. self.proc.patch("activeam app", "-edit_ldap -edit_bio")
  138. def patch_generic_process_final(self):
  139. self.proc.patch("app activeam", "+edit_bio")
  140. self.proc.patch("fd dam app", "-edit_ldap")
  141. class TestVisitApplicant(OldProcessFixtureMixin, TestCase):
  142. def assertApplicantPerms(self, perms):
  143. perms.proc.assertMatches(self.processes.app)
  144. def assertApplicantPermsInitialProcess(self, expected):
  145. for p in (const.PROGRESS_APP_NEW, const.PROGRESS_APP_RCVD, const.PROGRESS_APP_HOLD, const.PROGRESS_ADV_RCVD, const.PROGRESS_POLL_SENT):
  146. self.processes.app.progress = p
  147. self.processes.app.save()
  148. self.assertApplicantPerms(expected)
  149. def assertApplicantPermsHasAdvocate(self, expected):
  150. for p in (const.PROGRESS_APP_OK,):
  151. self.processes.app.progress = p
  152. self.processes.app.save()
  153. self.assertApplicantPerms(expected)
  154. def assertApplicantPermsAMApproved(self, expected):
  155. for p in (const.PROGRESS_AM_OK, const.PROGRESS_FD_HOLD, const.PROGRESS_FD_OK, const.PROGRESS_DAM_HOLD, const.PROGRESS_DAM_OK):
  156. self.processes.app.progress = p
  157. self.processes.app.save()
  158. self.assertApplicantPerms(expected)
  159. def assertApplicantPermsFinal(self, expected):
  160. for p in (const.PROGRESS_DONE, const.PROGRESS_CANCELLED):
  161. self.processes.app.progress = p
  162. self.processes.app.is_active = False
  163. self.processes.app.save()
  164. self.assertApplicantPerms(expected)
  165. def test_dc_ddnu(self):
  166. """
  167. Test all visit combinations for an applicant from dc to dd_nu, with a dd advocate
  168. """
  169. self.persons.create("app", status=const.STATUS_DC)
  170. self.persons.create("adv", status=const.STATUS_DD_NU)
  171. self.processes.create("app", person=self.persons.app, applying_for=const.STATUS_DD_NU, progress=const.PROGRESS_APP_RCVD)
  172. expected = ProcExpected(self)
  173. expected.patch_generic_process_started()
  174. expected.proc.patch("activeam fd dam app", "+edit_ldap")
  175. self.assertApplicantPermsInitialProcess(expected)
  176. self.processes.app.advocates.add(self.persons.adv)
  177. expected.patch_generic_process_has_advocate()
  178. self.assertApplicantPermsHasAdvocate(expected)
  179. expected.patch_generic_process_am_approved()
  180. self.assertApplicantPermsAMApproved(expected)
  181. self.persons.app.status = self.processes.app.applying_for
  182. self.persons.app.save(audit_skip=True)
  183. expected.patch_generic_process_final()
  184. self.assertApplicantPermsFinal(expected)
  185. def test_dcga_ddnu(self):
  186. """
  187. Test all visit combinations for an applicant from dc_ga to dd_nu, with a dd advocate
  188. """
  189. self.persons.create("app", status=const.STATUS_DC_GA)
  190. self.persons.create("adv", status=const.STATUS_DD_NU)
  191. self.processes.create("app", person=self.persons.app, applying_for=const.STATUS_DD_NU, progress=const.PROGRESS_APP_RCVD)
  192. expected = ProcExpected(self)
  193. expected.patch_generic_process_started()
  194. self.assertApplicantPermsInitialProcess(expected)
  195. self.processes.app.advocates.add(self.persons.adv)
  196. expected.patch_generic_process_has_advocate()
  197. self.assertApplicantPermsHasAdvocate(expected)
  198. expected.patch_generic_process_am_approved()
  199. self.assertApplicantPermsAMApproved(expected)
  200. self.persons.app.status = self.processes.app.applying_for
  201. self.persons.app.save(audit_skip=True)
  202. expected.patch_generic_process_final()
  203. self.assertApplicantPermsFinal(expected)
  204. def test_dc_ddu(self):
  205. """
  206. Test all visit combinations for an applicant from dc to dd_u, with a dd advocate
  207. """
  208. self.persons.create("app", status=const.STATUS_DC)
  209. self.persons.create("adv", status=const.STATUS_DD_NU)
  210. self.processes.create("app", person=self.persons.app, applying_for=const.STATUS_DD_U, progress=const.PROGRESS_APP_RCVD)
  211. expected = ProcExpected(self)
  212. expected.patch_generic_process_started()
  213. expected.proc.patch("activeam fd dam app", "+edit_ldap")
  214. self.assertApplicantPermsInitialProcess(expected)
  215. self.processes.app.advocates.add(self.persons.adv)
  216. expected.patch_generic_process_has_advocate()
  217. self.assertApplicantPermsHasAdvocate(expected)
  218. expected.patch_generic_process_am_approved()
  219. self.assertApplicantPermsAMApproved(expected)
  220. self.persons.app.status = self.processes.app.applying_for
  221. self.persons.app.save(audit_skip=True)
  222. expected.patch_generic_process_final()
  223. expected.proc.patch("fd dam app", "-request_new_status")
  224. self.assertApplicantPermsFinal(expected)
  225. def test_dcga_ddu(self):
  226. """
  227. Test all visit combinations for an applicant from dc_ga to dd_u, with a dd advocate
  228. """
  229. self.persons.create("app", status=const.STATUS_DC_GA)
  230. self.persons.create("adv", status=const.STATUS_DD_NU)
  231. self.processes.create("app", person=self.persons.app, applying_for=const.STATUS_DD_U, progress=const.PROGRESS_APP_RCVD)
  232. expected = ProcExpected(self)
  233. expected.patch_generic_process_started()
  234. self.assertApplicantPermsInitialProcess(expected)
  235. self.processes.app.advocates.add(self.persons.adv)
  236. expected.patch_generic_process_has_advocate()
  237. self.assertApplicantPermsHasAdvocate(expected)
  238. expected.patch_generic_process_am_approved()
  239. self.assertApplicantPermsAMApproved(expected)
  240. self.persons.app.status = self.processes.app.applying_for
  241. self.persons.app.save(audit_skip=True)
  242. expected.patch_generic_process_final()
  243. expected.proc.patch("fd dam app", "-request_new_status")
  244. self.assertApplicantPermsFinal(expected)
  245. def test_dm_ddu(self):
  246. """
  247. Test all visit combinations for an applicant from dm to dd_u, with a dd advocate
  248. """
  249. self.persons.create("app", status=const.STATUS_DM)
  250. self.persons.create("adv", status=const.STATUS_DD_NU)
  251. self.processes.create("app", person=self.persons.app, applying_for=const.STATUS_DD_U, progress=const.PROGRESS_APP_RCVD)
  252. expected = ProcExpected(self)
  253. expected.patch_generic_process_started()
  254. expected.proc.patch("activeam fd dam app", "+edit_ldap")
  255. self.assertApplicantPermsInitialProcess(expected)
  256. self.processes.app.advocates.add(self.persons.adv)
  257. expected.patch_generic_process_has_advocate()
  258. self.assertApplicantPermsHasAdvocate(expected)
  259. expected.patch_generic_process_am_approved()
  260. self.assertApplicantPermsAMApproved(expected)
  261. self.persons.app.status = self.processes.app.applying_for
  262. self.persons.app.save(audit_skip=True)
  263. expected.patch_generic_process_final()
  264. expected.proc.patch("fd dam app", "-request_new_status")
  265. self.assertApplicantPermsFinal(expected)
  266. def test_dmga_ddu(self):
  267. """
  268. Test all visit combinations for an applicant from dm to dd_u, with a dd advocate
  269. """
  270. self.persons.create("app", status=const.STATUS_DM_GA)
  271. self.persons.create("adv", status=const.STATUS_DD_NU)
  272. self.processes.create("app", person=self.persons.app, applying_for=const.STATUS_DD_U, progress=const.PROGRESS_APP_RCVD)
  273. expected = ProcExpected(self)
  274. expected.patch_generic_process_started()
  275. expected.proc.patch("fd dam app", "-request_new_status")
  276. self.assertApplicantPermsInitialProcess(expected)
  277. self.processes.app.advocates.add(self.persons.adv)
  278. expected.patch_generic_process_has_advocate()
  279. self.assertApplicantPermsHasAdvocate(expected)
  280. expected.patch_generic_process_am_approved()
  281. self.assertApplicantPermsAMApproved(expected)
  282. self.persons.app.status = self.processes.app.applying_for
  283. self.persons.app.save(audit_skip=True)
  284. expected.patch_generic_process_final()
  285. self.assertApplicantPermsFinal(expected)