test_perms.py 29.1 KB
Newer Older
1
2
3
from django.test import TestCase
from django.utils.timezone import now
from backend import const
4
from backend.unittest import ExpectedSets, TestSet
5
import process.models as pmodels
6
from process.unittest import ProcessFixtureMixin
7
8
9


class ProcExpected(object):
10
    def __init__(self, testcase):
11
        self.starts = TestSet()
Enrico Zini's avatar
Enrico Zini committed
12
13
14
15
16
17
18
19
20
21
22
23
        self.proc = ExpectedSets(
                testcase, "{visitor} visiting app's process", "{problem} permissions {mismatch}")
        self.intent = ExpectedSets(
                testcase, "{visitor} visiting app's intent requirement", "{problem} permissions {mismatch}")
        self.sc_dmup = ExpectedSets(
                testcase, "{visitor} visiting app's sc_dmup requirement", "{problem} permissions {mismatch}")
        self.advocate = ExpectedSets(
                testcase, "{visitor} visiting app's advocate requirement", "{problem} permissions {mismatch}")
        self.keycheck = ExpectedSets(
                testcase, "{visitor} visiting app's keycheck requirement", "{problem} permissions {mismatch}")
        self.am_ok = ExpectedSets(
                testcase, "{visitor} visiting app's am_ok requirement", "{problem} permissions {mismatch}")
24

25
    def patch_generic_process_started(self):
26
        self.proc.set("app dd_nu dd_u oldam activeam fd dam", "update_keycheck view_person_audit_log")
27
        self.proc.patch("dd_nu dd_u oldam activeam fd dam", "+endorse_key")
28
        self.proc.patch("activeam fd dam app", "+edit_bio +edit_ldap +view_mbox")
Enrico Zini's avatar
Enrico Zini committed
29
        self.proc.patch("fd dam app", "+request_new_status +edit_email +proc_close")
30
        self.proc.patch("fd dam", "+proc_freeze +fd_comments +am_assign +view_private_log +edit_fpr")
31
        self.proc.patch("dc dc_ga dm dm_ga dd_nu dd_u oldam dd_e dd_r activeam fd dam app", "+add_log")
32
        if self.intent is not None:
33
34
            self.intent.patch(
                    "- pending dc dc_ga dm dm_ga dd_nu dd_u oldam dd_e dd_r activeam fd dam app", "+req_view")
35
36
37
            self.intent.patch("fd dam app", "+edit_statements")
            self.intent.patch("activeam fd dam dd_nu dd_u oldam", "+req_approve")
        if self.sc_dmup is not None:
38
39
            self.sc_dmup.patch(
                    "- pending dc dc_ga dm dm_ga dd_nu dd_u oldam dd_e dd_r activeam fd dam app", "+req_view")
40
41
            self.sc_dmup.patch("fd dam app", "+edit_statements")
            self.sc_dmup.patch("activeam fd dam dd_nu dd_u oldam", "+req_approve")
Enrico Zini's avatar
Enrico Zini committed
42
        if self.advocate is not None:
43
44
            self.advocate.patch(
                    "- pending dc dc_ga dm dm_ga dd_nu dd_u oldam dd_e dd_r activeam fd dam app", "+req_view")
45
            self.advocate.patch("activeam fd dam dd_nu dd_u oldam", "+edit_statements +req_approve")
Enrico Zini's avatar
Enrico Zini committed
46
        if self.keycheck is not None:
47
48
            self.keycheck.patch(
                    "- pending dc dc_ga dm dm_ga dd_nu dd_u oldam dd_e dd_r activeam fd dam app", "+req_view")
49
            self.keycheck.patch("fd dam", "+req_approve")
Enrico Zini's avatar
Enrico Zini committed
50
        if self.am_ok is not None:
Enrico Zini's avatar
Enrico Zini committed
51
52
53
            self.proc.patch(
                "am",
                "+update_keycheck +view_person_audit_log +edit_bio"
54
                " +edit_ldap +view_mbox +add_log +endorse_key")
55
56
57
            self.intent.patch("am", "+req_approve +req_view")
            self.sc_dmup.patch("am", "+req_approve +req_view")
            self.keycheck.patch("am", "+req_view")
Enrico Zini's avatar
Enrico Zini committed
58
            if self.advocate:
59
60
61
                self.advocate.patch("am", "+edit_statements +req_approve +req_view")
            self.am_ok.patch(
                    "- pending dc dc_ga dm dm_ga dd_nu dd_u am oldam dd_e dd_r activeam fd dam app", "+req_view")
Enrico Zini's avatar
Enrico Zini committed
62
            self.am_ok.patch("fd dam", "+edit_statements +req_approve")
63

64
    def patch_generic_process_am_assigned(self):
65
66
        self.proc.patch("fd dam", "-am_assign +am_unassign +proc_pause")
        self.proc.patch("am", "+fd_comments +am_unassign +view_private_log +proc_pause")
67
68
69
        self.am_ok.patch("am", "+edit_statements")
        self.am_ok.patch("activeam", "+req_approve")

70
    def patch_generic_process_frozen(self):
Enrico Zini's avatar
Enrico Zini committed
71
72
        self.proc.patch(
                "fd dam", "-proc_freeze +proc_unfreeze +proc_approve -am_assign -am_unassign -proc_pause -proc_unpause")
73
        self.proc.patch("activeam app", "-edit_bio -edit_ldap -edit_fpr")
74
75
76
77
78
79
        if self.intent is not None:
            self.intent.patch("app", "-edit_statements")
            self.intent.patch("activeam dd_nu dd_u oldam", "-req_approve")
        if self.sc_dmup is not None:
            self.sc_dmup.patch("app", "-edit_statements")
            self.sc_dmup.patch("activeam dd_nu dd_u oldam", "-req_approve")
Enrico Zini's avatar
Enrico Zini committed
80
        if self.advocate is not None:
81
82
            self.advocate.patch("activeam dd_nu dd_u oldam dm dm_ga", "-edit_statements")
            self.advocate.patch("activeam dd_nu dd_u oldam", "-req_approve")
Enrico Zini's avatar
Enrico Zini committed
83
        if self.keycheck is not None:
84
            pass
Enrico Zini's avatar
Enrico Zini committed
85
        if self.am_ok is not None:
86
            self.proc.patch("am", "-edit_bio -edit_ldap -edit_fpr -am_unassign -proc_pause -proc_unpause")
Enrico Zini's avatar
Enrico Zini committed
87
88
89
90
91
            self.intent.patch("am", "-req_approve")
            self.sc_dmup.patch("am", "-req_approve")
            self.advocate.patch("am", "-edit_statements -req_approve")
            self.am_ok.patch("am", "-edit_statements")
            self.am_ok.patch("activeam", "-req_approve")
92
93
94
95
96

    def patch_generic_process_approved(self):
        self.proc.patch("fd dam", "-proc_unfreeze -proc_approve +proc_unapprove")

    def patch_generic_process_closed(self):
Enrico Zini's avatar
Enrico Zini committed
97
        self.proc.patch("fd dam app", "-proc_close")
Enrico Zini's avatar
Enrico Zini committed
98
        self.proc.patch("activeam app", "+edit_bio")
99
        self.proc.patch("fd dam", "-proc_unapprove")
100
        self.proc.patch("dc dc_ga dm dm_ga dd_nu dd_u oldam dd_e dd_r activeam fd dam app", "-add_log")
101
102
103
104
        if self.intent is not None:
            self.intent.patch("fd dam", "-edit_statements -req_approve")
        if self.sc_dmup is not None:
            self.sc_dmup.patch("fd dam", "-edit_statements -req_approve")
Enrico Zini's avatar
Enrico Zini committed
105
106
107
        if self.advocate is not None:
            self.advocate.patch("fd dam", "-edit_statements -req_approve")
        if self.keycheck is not None:
108
            self.keycheck.patch("fd dam", "-req_approve")
Enrico Zini's avatar
Enrico Zini committed
109
        if self.am_ok is not None:
Enrico Zini's avatar
Enrico Zini committed
110
            self.proc.patch("am", "-add_log +edit_bio")
Enrico Zini's avatar
Enrico Zini committed
111
            self.am_ok.patch("fd dam", "-edit_statements -req_approve")
112
113
114
115
116


class TestVisitApplicant(ProcessFixtureMixin, TestCase):
    def assertPerms(self, perms):
        # Check advocacy targets
117
118
119
120
121
        can_start = set(self.persons.app.possible_new_statuses)
        if can_start != perms.starts:
            extra = can_start - perms.starts
            missing = perms.starts - can_start
            msgs = []
122
123
124
125
            if missing:
                msgs.append("missing: {}".format(", ".join(missing)))
            if extra:
                msgs.append("extra: {}".format(", ".join(extra)))
126
127
128
            self.fail("adv startable processes mismatch: " + "; ".join(msgs))

        # If the process has not yet been created, we skip testing it
129
130
        if "app" not in self.processes:
            return
131
132

        # Check process permissions
133
        perms.proc.assertMatches(self.processes.app)
134
135
136
137

        # Check requirements
        for req in ("intent", "sc_dmup", "advocate", "keycheck", "am_ok"):
            p = getattr(perms, req, None)
138
139
            if p is None:
                continue
140
141
142
            wanted = p.combine(perms.proc)

            requirement = pmodels.Requirement.objects.get(process=self.processes.app, type=req)
143
            wanted.assertMatches(requirement)
144

Enrico Zini's avatar
Enrico Zini committed
145
    def _assign_am(self, visitor):
Enrico Zini's avatar
Enrico Zini committed
146
147
        pmodels.AMAssignment.objects.create(
                process=self.processes.app, am=self.ams.am, assigned_by=self.persons[visitor], assigned_time=now())
Enrico Zini's avatar
Enrico Zini committed
148

149
150
151
152
153
154
155
156
    def _freeze_process(self, visitor):
        """
        Set a process as frozen for FD/DAM review
        """
        self.processes.app.frozen_by = self.persons[visitor]
        self.processes.app.frozen_time = now()
        self.processes.app.save()

157
158
159
160
161
162
163
164
    def _approve_process(self, visitor):
        """
        Set a process as approved by DAM
        """
        self.processes.app.approved_by = self.persons[visitor]
        self.processes.app.approved_time = now()
        self.processes.app.save()

165
    def _close_process(self, visitor):
166
167
168
        """
        Finalize a process
        """
169
170
        self.processes.app.closed_by = self.persons[visitor]
        self.processes.app.closed_time = now()
171
172
173
174
        self.processes.app.save()
        self.persons.app.status = self.processes.app.applying_for
        self.persons.app.save(audit_skip=True)

175
    def test_dc_dcga(self):
176
        """
177
        Test all visit combinations for an applicant from dc to dc_ga
178
        """
179
        expected = ProcExpected(self)
180
181
182
183
184
        expected.keycheck = None
        expected.am_ok = None

        # Apply
        self.persons.create("app", status=const.STATUS_DC)
185
        expected.starts.set("dc_ga dm dd_u dd_nu")
186
        self.assertPerms(expected)
187
        self.processes.create("app", person=self.persons.app, applying_for=const.STATUS_DC_GA)
188
        expected.patch_generic_process_started()
189
        expected.starts.patch("-dc_ga")
190
191
        expected.proc.patch("fd dam", "+edit_ldap +edit_fpr -am_assign")
        expected.proc.patch("app", "+edit_ldap +edit_fpr")
192
        expected.proc.patch("activeam", "+edit_fpr")
193
        expected.advocate.patch("dm dm_ga", "+edit_statements")
194
195
196
197
        self.assertPerms(expected)

        # Freeze for review
        self._freeze_process("fd")
198
199
        expected.patch_generic_process_frozen()
        expected.advocate.patch("dm dm_ga", "-edit_statements")
200
201
        self.assertPerms(expected)

202
203
        # Approve
        self._approve_process("dam")
204
        expected.patch_generic_process_approved()
205

206
        # Finalize
207
        self._close_process("dam")
208
        expected.patch_generic_process_closed()
209
        expected.starts.patch("-dc_ga -dm +dm_ga")
210
        expected.proc.patch("fd dam", "-edit_ldap -edit_fpr")
211
212
        self.assertPerms(expected)

Enrico Zini's avatar
Enrico Zini committed
213
214
215
216
    def test_dm_dmga(self):
        """
        Test all visit combinations for an applicant from dm to dm_ga
        """
217
        expected = ProcExpected(self)
Enrico Zini's avatar
Enrico Zini committed
218
219
220
221
222
223
        expected.advocate = None
        expected.keycheck = None
        expected.am_ok = None

        # Apply
        self.persons.create("app", status=const.STATUS_DM)
224
        expected.starts.set("dm_ga dd_nu dd_u")
Enrico Zini's avatar
Enrico Zini committed
225
226
227
228
        self.assertPerms(expected)
        self.processes.create("app", person=self.persons.app, applying_for=const.STATUS_DM_GA)
        expected.patch_generic_process_started()
        expected.starts.patch("-dm_ga")
229
230
        expected.proc.patch("fd dam", "+edit_ldap +edit_fpr -am_assign +view_certificate")
        expected.proc.patch("app", "+edit_ldap +view_certificate")
Enrico Zini's avatar
Enrico Zini committed
231
232
233
234
235
236
237
238
239
240
241
242
        self.assertPerms(expected)

        # Freeze for review
        self._freeze_process("fd")
        expected.patch_generic_process_frozen()
        self.assertPerms(expected)

        # Approve
        self._approve_process("dam")
        expected.patch_generic_process_approved()

        # Finalize
243
        self._close_process("dam")
Enrico Zini's avatar
Enrico Zini committed
244
245
        expected.patch_generic_process_closed()
        expected.starts.patch("-dm_ga")
246
        expected.proc.patch("fd dam", "-edit_ldap -edit_fpr")
Enrico Zini's avatar
Enrico Zini committed
247
248
249
250
251
252
        self.assertPerms(expected)

    def test_dc_dm(self):
        """
        Test all visit combinations for an applicant from dc to dm
        """
253
        expected = ProcExpected(self)
Enrico Zini's avatar
Enrico Zini committed
254
255
256
257
        expected.am_ok = None

        # Apply
        self.persons.create("app", status=const.STATUS_DC)
258
        expected.starts.set("dc_ga dm dd_u dd_nu")
Enrico Zini's avatar
Enrico Zini committed
259
260
261
262
        self.assertPerms(expected)
        self.processes.create("app", person=self.persons.app, applying_for=const.STATUS_DM)
        expected.patch_generic_process_started()
        expected.starts.patch("-dm")
263
        expected.proc.patch("fd dam", "+edit_ldap +edit_fpr -am_assign")
264
        expected.proc.patch("activeam", "+edit_fpr")
265
        expected.proc.patch("app", "+edit_ldap +edit_fpr")
Enrico Zini's avatar
Enrico Zini committed
266
267
268
269
270
271
272
273
274
275
276
277
        self.assertPerms(expected)

        # Freeze for review
        self._freeze_process("fd")
        expected.patch_generic_process_frozen()
        self.assertPerms(expected)

        # Approve
        self._approve_process("dam")
        expected.patch_generic_process_approved()

        # Finalize
278
        self._close_process("dam")
Enrico Zini's avatar
Enrico Zini committed
279
        expected.patch_generic_process_closed()
280
        expected.proc.patch("app activeam", "+edit_ldap")
281
        expected.proc.patch("app fd dam", "+view_certificate")
Enrico Zini's avatar
Enrico Zini committed
282
        expected.starts.patch("-dc_ga -dm +dm_ga")
Enrico Zini's avatar
Enrico Zini committed
283
284
285
286
287
288
        self.assertPerms(expected)

    def test_dc_ddnu(self):
        """
        Test all visit combinations for an applicant from dc to dd_nu
        """
289
        expected = ProcExpected(self)
Enrico Zini's avatar
Enrico Zini committed
290
291
292
293
294

        # Apply
        self.persons.create("app", status=const.STATUS_DC)
        self.persons.create("am", status=const.STATUS_DD_NU)
        self.ams.create("am", person=self.persons.am)
295
        expected.starts.set("dc_ga dm dd_u dd_nu")
Enrico Zini's avatar
Enrico Zini committed
296
297
298
        self.assertPerms(expected)
        self.processes.create("app", person=self.persons.app, applying_for=const.STATUS_DD_NU)
        expected.patch_generic_process_started()
299
        expected.starts.patch("-dd_u -dd_nu")
300
        expected.proc.patch("fd dam", "+edit_ldap +edit_fpr")
301
        expected.proc.patch("am activeam", "+edit_fpr")
302
        expected.proc.patch("app", "+edit_ldap +edit_fpr")
Enrico Zini's avatar
Enrico Zini committed
303
304
305
306
        self.assertPerms(expected)

        # Assign manager
        self._assign_am("fd")
307
        expected.patch_generic_process_am_assigned()
308
        expected.proc.patch("am", "+edit_bio +edit_ldap +edit_fpr")
Enrico Zini's avatar
Enrico Zini committed
309
310
311
312
313
314
315
316
317
318
319
320
        self.assertPerms(expected)

        # Freeze for review
        self._freeze_process("fd")
        expected.patch_generic_process_frozen()
        self.assertPerms(expected)

        # Approve
        self._approve_process("dam")
        expected.patch_generic_process_approved()

        # Finalize
321
        self._close_process("dam")
Enrico Zini's avatar
Enrico Zini committed
322
        expected.patch_generic_process_closed()
323
        expected.starts.patch("-dc_ga -dm -dd_nu +dd_u +dd_e")
324
325
        expected.proc.patch("fd dam", "-edit_ldap -edit_fpr +view_certificate")
        expected.proc.patch("app", "+view_certificate")
Enrico Zini's avatar
Enrico Zini committed
326
327
        self.assertPerms(expected)

328
329
330
331
    def test_dcga_ddnu(self):
        """
        Test all visit combinations for an applicant from dc_ga to dd_nu
        """
332
        expected = ProcExpected(self)
Enrico Zini's avatar
Enrico Zini committed
333

334
335
336
337
338
339
340
341
        # Apply
        self.persons.create("app", status=const.STATUS_DC_GA)
        self.persons.create("am", status=const.STATUS_DD_NU)
        self.ams.create("am", person=self.persons.am)
        expected.starts.set("dm_ga dd_u dd_nu")
        self.assertPerms(expected)
        self.processes.create("app", person=self.persons.app, applying_for=const.STATUS_DD_NU)
        expected.patch_generic_process_started()
Enrico Zini's avatar
Enrico Zini committed
342
        expected.starts.patch("-dd_nu -dd_u")
343
        expected.proc.patch("app am activeam fd dam", "-edit_ldap -edit_fpr")
344
        self.assertPerms(expected)
Enrico Zini's avatar
Enrico Zini committed
345

346
347
        # Assign manager
        self._assign_am("fd")
348
        expected.patch_generic_process_am_assigned()
349
350
        expected.proc.patch("am", "+edit_bio")
        self.assertPerms(expected)
Enrico Zini's avatar
Enrico Zini committed
351

352
353
354
355
        # Freeze for review
        self._freeze_process("fd")
        expected.patch_generic_process_frozen()
        self.assertPerms(expected)
Enrico Zini's avatar
Enrico Zini committed
356

357
358
359
        # Approve
        self._approve_process("dam")
        expected.patch_generic_process_approved()
Enrico Zini's avatar
Enrico Zini committed
360

361
        # Finalize
362
        self._close_process("dam")
363
        expected.patch_generic_process_closed()
364
        expected.starts.patch("-dm_ga -dd_nu +dd_u +dd_e")
365
366
        expected.proc.patch("fd dam", "+view_certificate")
        expected.proc.patch("app", "+view_certificate")
367
        self.assertPerms(expected)
Enrico Zini's avatar
Enrico Zini committed
368

369
370
371
372
    def test_dc_ddu(self):
        """
        Test all visit combinations for an applicant from dc to dd_u
        """
373
        expected = ProcExpected(self)
Enrico Zini's avatar
Enrico Zini committed
374

375
376
377
378
379
380
381
382
        # Apply
        self.persons.create("app", status=const.STATUS_DC)
        self.persons.create("am", status=const.STATUS_DD_NU)
        self.ams.create("am", person=self.persons.am)
        expected.starts.set("dc_ga dm dd_u dd_nu")
        self.assertPerms(expected)
        self.processes.create("app", person=self.persons.app, applying_for=const.STATUS_DD_U)
        expected.patch_generic_process_started()
Enrico Zini's avatar
Enrico Zini committed
383
        expected.starts.patch("-dd_u -dd_nu")
384
        expected.proc.patch("fd dam", "+edit_ldap +edit_fpr")
385
        expected.proc.patch("am activeam", "+edit_fpr")
386
        expected.proc.patch("app", "+edit_ldap +edit_fpr")
387
        self.assertPerms(expected)
Enrico Zini's avatar
Enrico Zini committed
388

389
390
        # Assign manager
        self._assign_am("fd")
391
        expected.patch_generic_process_am_assigned()
392
        expected.proc.patch("am", "+edit_bio +edit_ldap +edit_fpr")
393
        self.assertPerms(expected)
Enrico Zini's avatar
Enrico Zini committed
394

395
396
397
398
        # Freeze for review
        self._freeze_process("fd")
        expected.patch_generic_process_frozen()
        self.assertPerms(expected)
Enrico Zini's avatar
Enrico Zini committed
399

400
401
402
        # Approve
        self._approve_process("dam")
        expected.patch_generic_process_approved()
Enrico Zini's avatar
Enrico Zini committed
403

404
        # Finalize
405
        self._close_process("dam")
406
        expected.patch_generic_process_closed()
407
        expected.starts.patch("-dc_ga -dm -dd_nu -dd_u +dd_e +dd_nu")
408
        expected.proc.patch("fd dam", "-edit_ldap -edit_fpr")
409
        expected.proc.patch("app fd dam", "-edit_ldap -edit_fpr +view_certificate")
410
411
412
413
414
415
        self.assertPerms(expected)

    def test_dcga_ddu(self):
        """
        Test all visit combinations for an applicant from dc_ga to dd_u
        """
416
        expected = ProcExpected(self)
417
418
419
420
421
422
423
424
425

        # Apply
        self.persons.create("app", status=const.STATUS_DC_GA)
        self.persons.create("am", status=const.STATUS_DD_NU)
        self.ams.create("am", person=self.persons.am)
        expected.starts.set("dm_ga dd_u dd_nu")
        self.assertPerms(expected)
        self.processes.create("app", person=self.persons.app, applying_for=const.STATUS_DD_U)
        expected.patch_generic_process_started()
Enrico Zini's avatar
Enrico Zini committed
426
        expected.starts.patch("-dd_u -dd_nu")
427
        expected.proc.patch("app am activeam fd dam", "-edit_ldap -edit_fpr")
428
429
430
431
        self.assertPerms(expected)

        # Assign manager
        self._assign_am("fd")
432
        expected.patch_generic_process_am_assigned()
433
434
435
436
437
438
439
440
441
442
443
444
445
        expected.proc.patch("am", "+edit_bio")
        self.assertPerms(expected)

        # Freeze for review
        self._freeze_process("fd")
        expected.patch_generic_process_frozen()
        self.assertPerms(expected)

        # Approve
        self._approve_process("dam")
        expected.patch_generic_process_approved()

        # Finalize
446
        self._close_process("dam")
447
448
        expected.patch_generic_process_closed()
        expected.starts.patch("-dm_ga -dd_nu -dd_u")
449
        expected.proc.patch("app fd dam", "-edit_ldap -edit_fpr +view_certificate")
450
        expected.starts.patch("+dd_e +dd_nu")
451
452
453
454
455
456
        self.assertPerms(expected)

    def test_dm_ddu(self):
        """
        Test all visit combinations for an applicant from dm to dd_u
        """
457
        expected = ProcExpected(self)
458
459
460
461
462

        # Apply
        self.persons.create("app", status=const.STATUS_DM)
        self.persons.create("am", status=const.STATUS_DD_NU)
        self.ams.create("am", person=self.persons.am)
Enrico Zini's avatar
Enrico Zini committed
463
        expected.starts.set("dm_ga dd_nu dd_u")
464
465
466
        self.assertPerms(expected)
        self.processes.create("app", person=self.persons.app, applying_for=const.STATUS_DD_U)
        expected.patch_generic_process_started()
Enrico Zini's avatar
Enrico Zini committed
467
        expected.starts.patch("-dd_u -dd_nu")
468
469
        expected.proc.patch("fd dam", "+edit_ldap +edit_fpr +view_certificate")
        expected.proc.patch("app", "+edit_ldap +view_certificate")
470
471
472
473
        self.assertPerms(expected)

        # Assign manager
        self._assign_am("fd")
474
        expected.proc.patch("am", "+edit_bio +edit_ldap")
475
        expected.patch_generic_process_am_assigned()
476
477
478
479
480
481
482
483
484
485
486
487
        self.assertPerms(expected)

        # Freeze for review
        self._freeze_process("fd")
        expected.patch_generic_process_frozen()
        self.assertPerms(expected)

        # Approve
        self._approve_process("dam")
        expected.patch_generic_process_approved()

        # Finalize
488
        self._close_process("dam")
489
        expected.patch_generic_process_closed()
Enrico Zini's avatar
Enrico Zini committed
490
        expected.starts.patch("-dm_ga -dd_nu -dd_u")
491
        expected.proc.patch("app am activeam fd dam", "-edit_ldap -edit_fpr")
492
        expected.starts.patch("+dd_e +dd_nu")
493
494
495
496
497
498
        self.assertPerms(expected)

    def test_dmga_ddu(self):
        """
        Test all visit combinations for an applicant from dm to dd_u
        """
499
        expected = ProcExpected(self)
500
501
502
503
504

        # Apply
        self.persons.create("app", status=const.STATUS_DM_GA)
        self.persons.create("am", status=const.STATUS_DD_NU)
        self.ams.create("am", person=self.persons.am)
Enrico Zini's avatar
Enrico Zini committed
505
        expected.starts.set("dd_nu dd_u")
506
507
508
        self.assertPerms(expected)
        self.processes.create("app", person=self.persons.app, applying_for=const.STATUS_DD_U)
        expected.patch_generic_process_started()
Enrico Zini's avatar
Enrico Zini committed
509
        expected.starts.patch("-dd_u -dd_nu")
510
        expected.proc.patch("app am activeam fd dam", "-edit_ldap -edit_fpr")
511
        expected.proc.patch("app fd dam", "-edit_ldap -edit_fpr -request_new_status +view_certificate")
512
513
514
515
        self.assertPerms(expected)

        # Assign manager
        self._assign_am("fd")
516
        expected.patch_generic_process_am_assigned()
517
518
519
520
521
522
523
524
525
526
527
528
529
        expected.proc.patch("am", "+edit_bio")
        self.assertPerms(expected)

        # Freeze for review
        self._freeze_process("fd")
        expected.patch_generic_process_frozen()
        self.assertPerms(expected)

        # Approve
        self._approve_process("dam")
        expected.patch_generic_process_approved()

        # Finalize
530
        self._close_process("dam")
531
        expected.patch_generic_process_closed()
532
        expected.proc.patch("app fd dam", "+request_new_status")
533
        expected.starts.patch("+dd_e +dd_nu")
534
        self.assertPerms(expected)
Enrico Zini's avatar
Enrico Zini committed
535

536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
    def test_ddnu_dde(self):
        """
        Test all visit combinations for an applicant from dd_nu to dd_e
        """
        expected = ProcExpected(self)
        expected.sc_dmup = None
        expected.keycheck = None
        expected.advocate = None
        expected.am_ok = None

        # Apply
        self.persons.create("app", status=const.STATUS_DD_NU)
        expected.starts.set("dd_u dd_e")
        self.assertPerms(expected)
        self.processes.create("app", person=self.persons.app, applying_for=const.STATUS_EMERITUS_DD)
        expected.patch_generic_process_started()
        expected.starts.patch("-dd_u -dd_e")
553
        expected.proc.patch("app activeam fd dam", "-edit_ldap -edit_fpr")
554
        expected.proc.patch("app fd dam", "-edit_ldap -edit_fpr -request_new_status +view_certificate")
555
        expected.proc.patch("fd dam", "-am_assign")
556
        expected.intent.patch("app", "+req_approve")
557
        expected.intent.patch("- pending dc dc_ga dm dm_ga dd_e dd_r", "-req_view")
558
559
560
561
562
        self.assertPerms(expected)

        # Freeze for review
        self._freeze_process("fd")
        expected.patch_generic_process_frozen()
563
        expected.intent.patch("app", "-req_approve")
564
565
566
567
568
569
570
        self.assertPerms(expected)

        # Approve
        self._approve_process("dam")
        expected.patch_generic_process_approved()

        # Finalize
571
        self._close_process("dam")
572
        expected.patch_generic_process_closed()
573
        expected.proc.patch("app fd dam", "+request_new_status +edit_fpr -view_certificate")
574
        expected.proc.patch("activeam", "+edit_fpr")
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
        expected.starts.patch("+dd_u +dd_nu")
        self.assertPerms(expected)

    def test_ddu_dde(self):
        """
        Test all visit combinations for an applicant from dd_u to dd_e
        """
        expected = ProcExpected(self)
        expected.sc_dmup = None
        expected.keycheck = None
        expected.advocate = None
        expected.am_ok = None

        # Apply
        self.persons.create("app", status=const.STATUS_DD_U)
590
        expected.starts.set("dd_e dd_nu")
591
592
593
        self.assertPerms(expected)
        self.processes.create("app", person=self.persons.app, applying_for=const.STATUS_EMERITUS_DD)
        expected.patch_generic_process_started()
594
        expected.starts.patch("-dd_e -dd_nu")
595
        expected.proc.patch("app activeam fd dam", "-edit_ldap -edit_fpr")
596
        expected.proc.patch("app fd dam", "-edit_ldap -edit_fpr -request_new_status +view_certificate")
597
        expected.proc.patch("fd dam", "-am_assign")
598
        expected.intent.patch("app", "+req_approve")
599
        expected.intent.patch("- pending dc dc_ga dm dm_ga dd_e dd_r", "-req_view")
600
601
602
603
604
        self.assertPerms(expected)

        # Freeze for review
        self._freeze_process("fd")
        expected.patch_generic_process_frozen()
605
        expected.intent.patch("app", "-req_approve")
606
607
608
609
610
611
612
        self.assertPerms(expected)

        # Approve
        self._approve_process("dam")
        expected.patch_generic_process_approved()

        # Finalize
613
        self._close_process("dam")
614
        expected.patch_generic_process_closed()
615
        expected.proc.patch("app fd dam", "+request_new_status +edit_fpr -view_certificate")
616
        expected.proc.patch("activeam", "+edit_fpr")
617
618
619
        expected.starts.patch("+dd_u +dd_nu")
        self.assertPerms(expected)

620
621
622
623
624
625
626
627
628
629
630
631
    def test_ddu_ddr(self):
        """
        Test all visit combinations for an applicant from dd_u to dd_e
        """
        expected = ProcExpected(self)
        expected.sc_dmup = None
        expected.keycheck = None
        expected.advocate = None
        expected.am_ok = None

        # Apply
        self.persons.create("app", status=const.STATUS_DD_U)
632
        expected.starts.set("dd_e dd_nu")
633
634
635
        self.assertPerms(expected)
        self.processes.create("app", person=self.persons.app, applying_for=const.STATUS_REMOVED_DD)
        expected.patch_generic_process_started()
636
        expected.starts.patch("-dd_e -dd_nu")
637
        expected.proc.patch("app activeam fd dam", "-edit_ldap -edit_fpr")
638
        expected.proc.patch("app fd dam", "-edit_ldap -edit_fpr -request_new_status +view_certificate")
639
640
        expected.proc.patch("fd dam", "-am_assign")
        expected.intent.patch("app", "+req_approve")
641
        expected.intent.patch("- pending dc dc_ga dm dm_ga dd_e dd_r", "-req_view")
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
        self.assertPerms(expected)

        # Freeze for review
        self._freeze_process("fd")
        expected.patch_generic_process_frozen()
        expected.intent.patch("app", "-req_approve")
        self.assertPerms(expected)

        # Approve
        self._approve_process("dam")
        expected.patch_generic_process_approved()

        # Finalize
        self._close_process("dam")
        expected.patch_generic_process_closed()
657
        expected.proc.patch("app fd dam", "+request_new_status +edit_fpr -view_certificate")
658
        expected.proc.patch("activeam", "+edit_fpr")
659
660
661
        expected.starts.patch("+dd_u +dd_nu")
        self.assertPerms(expected)

662
663
664
665
666
    def test_dc_ddu_aborted(self):
        """
        Test all visit combinations for an applicant from dc to dd_u
        """
        expected = ProcExpected(self)
667

668
669
670
671
672
673
674
675
676
677
678
679
680
        # TODO: process closed but not frozen and approved (aborted)

        # Apply
        self.persons.create("app", status=const.STATUS_DC)
        self.persons.create("am", status=const.STATUS_DD_NU)
        self.ams.create("am", person=self.persons.am)
        expected.starts.set("dc_ga dm dd_u dd_nu")
        self.assertPerms(expected)
        self.processes.create("app", person=self.persons.app, applying_for=const.STATUS_DD_U)
        expected.patch_generic_process_started()
        expected.starts.patch("-dd_u -dd_nu")
        expected.proc.patch("fd dam", "+edit_ldap +edit_fpr")
        expected.proc.patch("app", "+edit_ldap +edit_fpr")
681
        expected.proc.patch("am activeam", "+edit_fpr")
682
683
684
685
686
687
688
689
690
691
692
693
694
695
        self.assertPerms(expected)

        # Assign manager
        self._assign_am("fd")
        expected.patch_generic_process_am_assigned()
        expected.proc.patch("am", "+edit_bio +edit_ldap +edit_fpr")
        self.assertPerms(expected)

        # Close
        self.processes.app.closed_by = self.persons.fd
        self.processes.app.closed_time = now()
        self.processes.app.save()

        expected.starts.patch("+dd_u +dd_nu")
Enrico Zini's avatar
Enrico Zini committed
696
        expected.proc.set("- pending dc dc_ga dm dm_ga dd_nu dd_u am oldam dd_e dd_r activeam fd dam app", "")
697
698
699
700
        expected.proc.patch("app am dd_nu dd_u oldam activeam fd dam", "+update_keycheck +view_person_audit_log")
        expected.proc.patch("am activeam fd dam app", "+edit_bio +edit_ldap +edit_fpr +view_mbox")
        expected.proc.patch("fd dam app", "+edit_email +request_new_status")
        expected.proc.patch("fd dam am", "+fd_comments +view_private_log")
701
        expected.proc.patch("oldam am dd_u dd_nu activeam fd dam", "+endorse_key")
702
        expected.proc.patch("fd dam", "+fd_comments +view_private_log")
703
704

        expected.intent.set("- pending dc dc_ga dm dm_ga dd_nu dd_u am oldam dd_e dd_r activeam fd dam app",
705
                            "req_view")
706
        expected.sc_dmup.set("- pending dc dc_ga dm dm_ga dd_nu dd_u am oldam dd_e dd_r activeam fd dam app",
707
                             "req_view")
708
        expected.advocate.set("- pending dc dc_ga dm dm_ga dd_nu dd_u am oldam dd_e dd_r activeam fd dam app",
709
                              "req_view")
710
        expected.keycheck.set("- pending dc dc_ga dm dm_ga dd_nu dd_u am oldam dd_e dd_r activeam fd dam app",
711
                              "req_view")
712
        expected.am_ok.set("- pending dc dc_ga dm dm_ga dd_nu dd_u am oldam dd_e dd_r activeam fd dam app",
713
                           "req_view")
714
        self.assertPerms(expected)