Coverage for cc_modules/tests/cc_user_tests.py: 20%
427 statements
« prev ^ index » next coverage.py v7.6.10, created at 2025-01-30 13:48 +0000
« prev ^ index » next coverage.py v7.6.10, created at 2025-01-30 13:48 +0000
1"""
2camcops_server/cc_modules/tests/cc_user_tests.py
4===============================================================================
6 Copyright (C) 2012, University of Cambridge, Department of Psychiatry.
7 Created by Rudolf Cardinal (rnc1001@cam.ac.uk).
9 This file is part of CamCOPS.
11 CamCOPS is free software: you can redistribute it and/or modify
12 it under the terms of the GNU General Public License as published by
13 the Free Software Foundation, either version 3 of the License, or
14 (at your option) any later version.
16 CamCOPS is distributed in the hope that it will be useful,
17 but WITHOUT ANY WARRANTY; without even the implied warranty of
18 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 GNU General Public License for more details.
21 You should have received a copy of the GNU General Public License
22 along with CamCOPS. If not, see <https://www.gnu.org/licenses/>.
24===============================================================================
26"""
28from pendulum import DateTime as Pendulum
29import phonenumbers
31from camcops_server.cc_modules.cc_constants import (
32 OBSCURE_EMAIL_ASTERISKS,
33 OBSCURE_PHONE_ASTERISKS,
34)
35from camcops_server.cc_modules.cc_group import Group
36from camcops_server.cc_modules.cc_testfactories import (
37 GroupFactory,
38 UserFactory,
39 UserGroupMembershipFactory,
40)
41from camcops_server.cc_modules.cc_unittest import (
42 DemoRequestTestCase,
43)
44from camcops_server.cc_modules.cc_user import (
45 SecurityAccountLockout,
46 SecurityLoginFailure,
47 User,
48)
51# =============================================================================
52# Unit testing
53# =============================================================================
56class UserTests(DemoRequestTestCase):
57 """
58 Unit tests.
59 """
61 def test_user(self) -> None:
62 UserFactory()
63 GroupFactory()
65 req = self.req
67 SecurityAccountLockout.delete_old_account_lockouts(req)
68 self.assertIsInstance(
69 SecurityAccountLockout.is_user_locked_out(req, "dummy_user"), bool
70 )
71 self.assertIsInstanceOrNone(
72 SecurityAccountLockout.user_locked_out_until(req, "dummy_user"),
73 Pendulum,
74 )
76 self.assertIsInstance(
77 SecurityLoginFailure.how_many_login_failures(req, "dummy_user"),
78 int,
79 )
80 SecurityLoginFailure.clear_login_failures_for_nonexistent_users(req)
81 SecurityLoginFailure.clear_dummy_login_failures_if_necessary(req)
82 SecurityLoginFailure.clear_dummy_login_failures_if_necessary(req)
83 # ... do it twice (we had a bug relating to offset-aware vs
84 # offset-naive date/time objects).
86 self.assertIsInstance(User.is_username_permissible("some_user"), bool)
87 User.take_some_time_mimicking_password_encryption()
89 u = self.dbsession.query(User).first() # type: User
90 assert u, "Missing user in demo database!"
92 g = self.dbsession.query(Group).first() # type: Group
93 assert g, "Missing group in demo database!"
95 self.assertIsInstance(u.is_password_correct("dummy_password"), bool)
96 self.assertIsInstance(u.must_agree_terms, bool)
97 u.agree_terms(req)
98 u.clear_login_failures(req)
99 self.assertIsInstance(u.is_locked_out(req), bool)
100 self.assertIsInstanceOrNone(u.locked_out_until(req), Pendulum)
101 u.enable(req)
102 self.assertIsInstance(u.may_login_as_tablet, bool)
103 # TODO: cc_user.UserTests: could do more here
104 self.assertIsInstance(u.authorized_as_groupadmin, bool)
105 self.assertIsInstance(u.may_use_webviewer, bool)
106 self.assertIsInstance(u.authorized_to_add_special_note(g.id), bool)
107 self.assertIsInstance(u.authorized_to_erase_tasks(g.id), bool)
108 self.assertIsInstance(u.authorized_to_dump, bool)
109 self.assertIsInstance(u.authorized_for_reports, bool)
110 self.assertIsInstance(u.may_view_all_patients_when_unfiltered, bool)
111 self.assertIsInstance(u.may_view_no_patients_when_unfiltered, bool)
112 self.assertIsInstance(u.may_upload_to_group(g.id), bool)
113 self.assertIsInstance(u.may_upload, bool)
114 self.assertIsInstance(u.may_register_devices, bool)
116 def test_partial_email(self) -> None:
117 # https://en.wikipedia.org/wiki/Email_address
118 a = OBSCURE_EMAIL_ASTERISKS
119 tests = (
120 ("simple@example.com", f"s{a}e@example.com"),
121 ("very.common@example.com", f"v{a}n@example.com"),
122 (
123 "disposable.style.email.with+symbol@example.com",
124 f"d{a}l@example.com",
125 ),
126 ("other.email-with-hyphen@example.com", f"o{a}n@example.com"),
127 ("x@example.com", f"x{a}x@example.com"),
128 (
129 "example-indeed@strange-example.com",
130 f"e{a}d@strange-example.com",
131 ),
132 ("test/test@test.com", f"t{a}t@test.com"),
133 ("admin@mailserver1", f"a{a}n@mailserver1"),
134 ("example@s.example", f"e{a}e@s.example"),
135 ('" "@example.org', f'"{a}"@example.org'),
136 ('"john..doe"@example.org', f'"{a}"@example.org'),
137 ("mailhost!username@example.org", f"m{a}e@example.org"),
138 ("user%example.com@example.org", f"u{a}m@example.org"),
139 ("user-@example.org", f"u{a}-@example.org"),
140 ("very.unusual.”@”.unusual.com@example.com", f"v{a}m@example.com"),
141 )
143 user = UserFactory()
145 for email, expected_partial in tests:
146 user.email = email
147 self.assertEqual(
148 user.partial_email, expected_partial, msg=f"Failed for {email}"
149 )
151 def test_partial_phone_number(self) -> None:
152 # https://www.ofcom.org.uk/phones-telecoms-and-internet/information-for-industry/numbering/numbers-for-drama # noqa: E501
153 user = UserFactory(phone_number=phonenumbers.parse("+447700900123"))
155 a = OBSCURE_PHONE_ASTERISKS
156 self.assertEqual(user.partial_phone_number, f"{a}23")
159class UserPermissionTests(DemoRequestTestCase):
160 def setUp(self) -> None:
161 super().setUp()
162 # Deliberately not in alphabetical order to test sorting
163 self.group_c = GroupFactory(name="groupc")
164 self.group_b = GroupFactory(name="groupb")
165 self.group_a = GroupFactory(name="groupa")
166 self.group_d = GroupFactory(name="groupd")
168 def test_groups_user_may_manage_patients_in(self) -> None:
169 user = UserFactory()
171 UserGroupMembershipFactory(
172 user_id=user.id, group_id=self.group_d.id, may_manage_patients=True
173 )
174 UserGroupMembershipFactory(
175 user_id=user.id, group_id=self.group_c.id, may_manage_patients=True
176 )
177 UserGroupMembershipFactory(
178 user_id=user.id,
179 group_id=self.group_a.id,
180 may_manage_patients=False,
181 )
183 self.assertEqual(
184 [self.group_c, self.group_d],
185 user.groups_user_may_manage_patients_in,
186 )
188 def test_groups_user_may_email_patients_in(self) -> None:
189 user = UserFactory()
191 UserGroupMembershipFactory(
192 user_id=user.id, group_id=self.group_d.id, may_email_patients=True
193 )
194 UserGroupMembershipFactory(
195 user_id=user.id, group_id=self.group_c.id, may_email_patients=True
196 )
197 UserGroupMembershipFactory(
198 user_id=user.id, group_id=self.group_a.id, may_email_patients=False
199 )
201 self.assertEqual(
202 [self.group_c, self.group_d],
203 user.groups_user_may_email_patients_in,
204 )
206 def test_ids_of_groups_user_may_report_on(self) -> None:
207 user = UserFactory()
209 UserGroupMembershipFactory(
210 user_id=user.id, group_id=self.group_a.id, may_run_reports=False
211 )
212 UserGroupMembershipFactory(
213 user_id=user.id, group_id=self.group_c.id, may_run_reports=True
214 )
215 UserGroupMembershipFactory(
216 user_id=user.id, group_id=self.group_d.id, may_run_reports=True
217 )
219 ids = user.ids_of_groups_user_may_report_on
221 self.assertIn(self.group_c.id, ids)
222 self.assertIn(self.group_d.id, ids)
223 self.assertNotIn(self.group_a.id, ids)
224 self.assertNotIn(self.group_b.id, ids)
226 def test_ids_of_groups_superuser_may_report_on(self) -> None:
227 user = UserFactory(superuser=True)
229 ids = user.ids_of_groups_user_may_report_on
231 self.assertIn(self.group_a.id, ids)
232 self.assertIn(self.group_b.id, ids)
233 self.assertIn(self.group_c.id, ids)
234 self.assertIn(self.group_d.id, ids)
236 def test_ids_of_groups_user_is_admin_for(self) -> None:
237 user = UserFactory()
239 UserGroupMembershipFactory(
240 user_id=user.id, group_id=self.group_a.id, groupadmin=False
241 )
242 UserGroupMembershipFactory(
243 user_id=user.id, group_id=self.group_c.id, groupadmin=True
244 )
245 UserGroupMembershipFactory(
246 user_id=user.id, group_id=self.group_d.id, groupadmin=True
247 )
249 ids = user.ids_of_groups_user_is_admin_for
251 self.assertIn(self.group_c.id, ids)
252 self.assertIn(self.group_d.id, ids)
253 self.assertNotIn(self.group_a.id, ids)
254 self.assertNotIn(self.group_b.id, ids)
256 def test_ids_of_groups_superuser_is_admin_for(self) -> None:
257 user = UserFactory(superuser=True)
259 ids = user.ids_of_groups_user_is_admin_for
261 self.assertIn(self.group_a.id, ids)
262 self.assertIn(self.group_b.id, ids)
263 self.assertIn(self.group_c.id, ids)
264 self.assertIn(self.group_d.id, ids)
266 def test_names_of_groups_user_is_admin_for(self) -> None:
267 user = UserFactory()
269 UserGroupMembershipFactory(
270 user_id=user.id, group_id=self.group_a.id, groupadmin=False
271 )
272 UserGroupMembershipFactory(
273 user_id=user.id, group_id=self.group_c.id, groupadmin=True
274 )
275 UserGroupMembershipFactory(
276 user_id=user.id, group_id=self.group_d.id, groupadmin=True
277 )
279 names = user.names_of_groups_user_is_admin_for
281 self.assertIn(self.group_c.name, names)
282 self.assertIn(self.group_d.name, names)
283 self.assertNotIn(self.group_a.name, names)
284 self.assertNotIn(self.group_b.name, names)
286 def test_names_of_groups_superuser_is_admin_for(self) -> None:
287 user = UserFactory(superuser=True)
289 names = user.names_of_groups_user_is_admin_for
291 self.assertIn(self.group_a.name, names)
292 self.assertIn(self.group_b.name, names)
293 self.assertIn(self.group_c.name, names)
294 self.assertIn(self.group_d.name, names)
296 def test_groups_user_is_admin_for(self) -> None:
297 user = UserFactory()
299 UserGroupMembershipFactory(
300 user_id=user.id, group_id=self.group_a.id, groupadmin=False
301 )
302 UserGroupMembershipFactory(
303 user_id=user.id, group_id=self.group_c.id, groupadmin=True
304 )
305 UserGroupMembershipFactory(
306 user_id=user.id, group_id=self.group_d.id, groupadmin=True
307 )
309 self.assertEqual(
310 [self.group_c, self.group_d], user.groups_user_is_admin_for
311 )
313 def test_user_may_administer_group(self) -> None:
314 user = UserFactory()
316 UserGroupMembershipFactory(
317 user_id=user.id, group_id=self.group_a.id, groupadmin=False
318 )
319 UserGroupMembershipFactory(
320 user_id=user.id, group_id=self.group_c.id, groupadmin=True
321 )
322 UserGroupMembershipFactory(
323 user_id=user.id, group_id=self.group_d.id, groupadmin=True
324 )
326 self.assertFalse(user.may_administer_group(self.group_a.id))
327 self.assertTrue(user.may_administer_group(self.group_c.id))
328 self.assertTrue(user.may_administer_group(self.group_d.id))
330 def test_superuser_may_administer_group(self) -> None:
331 user = UserFactory(superuser=True)
333 self.assertTrue(user.may_administer_group(self.group_a.id))
334 self.assertTrue(user.may_administer_group(self.group_b.id))
335 self.assertTrue(user.may_administer_group(self.group_c.id))
336 self.assertTrue(user.may_administer_group(self.group_d.id))
338 def test_groups_user_may_dump(self) -> None:
339 user = UserFactory()
341 UserGroupMembershipFactory(
342 user_id=user.id, group_id=self.group_d.id, may_dump_data=True
343 )
344 UserGroupMembershipFactory(
345 user_id=user.id, group_id=self.group_c.id, may_dump_data=True
346 )
347 UserGroupMembershipFactory(
348 user_id=user.id, group_id=self.group_a.id, may_dump_data=False
349 )
351 self.assertEqual(
352 [self.group_c, self.group_d], user.groups_user_may_dump
353 )
355 def test_groups_user_may_report_on(self) -> None:
356 user = UserFactory()
358 UserGroupMembershipFactory(
359 user_id=user.id, group_id=self.group_d.id, may_run_reports=True
360 )
361 UserGroupMembershipFactory(
362 user_id=user.id, group_id=self.group_c.id, may_run_reports=True
363 )
364 UserGroupMembershipFactory(
365 user_id=user.id, group_id=self.group_a.id, may_run_reports=False
366 )
368 self.assertEqual(
369 [self.group_c, self.group_d], user.groups_user_may_report_on
370 )
372 def test_groups_user_may_upload_into(self) -> None:
373 user = UserFactory()
375 UserGroupMembershipFactory(
376 user_id=user.id, group_id=self.group_d.id, may_upload=True
377 )
378 UserGroupMembershipFactory(
379 user_id=user.id, group_id=self.group_c.id, may_upload=True
380 )
381 UserGroupMembershipFactory(
382 user_id=user.id, group_id=self.group_a.id, may_upload=False
383 )
385 self.assertEqual(
386 [self.group_c, self.group_d], user.groups_user_may_upload_into
387 )
389 def test_groups_user_may_add_special_notes(self) -> None:
390 user = UserFactory()
392 UserGroupMembershipFactory(
393 user_id=user.id, group_id=self.group_d.id, may_add_notes=True
394 )
395 UserGroupMembershipFactory(
396 user_id=user.id, group_id=self.group_c.id, may_add_notes=True
397 )
398 UserGroupMembershipFactory(
399 user_id=user.id, group_id=self.group_a.id, may_add_notes=False
400 )
402 self.assertEqual(
403 [self.group_c, self.group_d],
404 user.groups_user_may_add_special_notes,
405 )
407 def test_groups_user_may_see_all_pts_when_unfiltered(self) -> None:
408 user = UserFactory()
410 UserGroupMembershipFactory(
411 user_id=user.id,
412 group_id=self.group_d.id,
413 view_all_patients_when_unfiltered=True,
414 )
415 UserGroupMembershipFactory(
416 user_id=user.id,
417 group_id=self.group_c.id,
418 view_all_patients_when_unfiltered=True,
419 )
420 UserGroupMembershipFactory(
421 user_id=user.id,
422 group_id=self.group_a.id,
423 view_all_patients_when_unfiltered=False,
424 )
426 self.assertEqual(
427 [self.group_c, self.group_d],
428 user.groups_user_may_see_all_pts_when_unfiltered,
429 )
431 def test_is_a_group_admin(self) -> None:
432 user = UserFactory()
434 UserGroupMembershipFactory(
435 user_id=user.id, group_id=self.group_d.id, groupadmin=True
436 )
438 self.assertTrue(user.is_a_groupadmin)
440 def test_is_not_a_group_admin(self) -> None:
441 user = UserFactory()
443 UserGroupMembershipFactory(
444 user_id=user.id, group_id=self.group_d.id, groupadmin=False
445 )
447 self.assertFalse(user.is_a_groupadmin)
449 def test_authorized_as_groupadmin(self) -> None:
450 user = UserFactory()
452 UserGroupMembershipFactory(
453 user_id=user.id, group_id=self.group_d.id, groupadmin=True
454 )
456 self.assertTrue(user.authorized_as_groupadmin)
458 def test_not_authorized_as_groupadmin(self) -> None:
459 user = UserFactory()
461 UserGroupMembershipFactory(
462 user_id=user.id, group_id=self.group_d.id, groupadmin=False
463 )
465 self.assertFalse(user.authorized_as_groupadmin)
467 def test_superuser_authorized_as_groupadmin(self) -> None:
468 user = UserFactory(superuser=True)
470 self.assertTrue(user.authorized_as_groupadmin)
472 def test_membership_for_group_id(self) -> None:
473 user = UserFactory()
475 ugm = UserGroupMembershipFactory(
476 user_id=user.id, group_id=self.group_a.id
477 )
479 self.assertEqual(user.membership_for_group_id(self.group_a.id), ugm)
481 def test_no_membership_for_group_id(self) -> None:
482 user = UserFactory()
484 self.assertIsNone(user.membership_for_group_id(self.group_a.id))
486 def test_may_use_webviewer(self) -> None:
487 user = UserFactory()
489 UserGroupMembershipFactory(
490 user_id=user.id, group_id=self.group_a.id, may_use_webviewer=False
491 )
492 UserGroupMembershipFactory(
493 user_id=user.id, group_id=self.group_c.id, may_use_webviewer=True
494 )
496 self.assertTrue(user.may_use_webviewer)
498 def test_may_not_use_webviewer(self) -> None:
499 user = UserFactory()
501 self.assertFalse(user.may_use_webviewer)
503 def test_superuser_may_use_webviewer(self) -> None:
504 user = UserFactory(superuser=True)
506 self.assertTrue(user.may_use_webviewer)
508 def test_authorized_to_add_special_note(self) -> None:
509 user = UserFactory()
511 UserGroupMembershipFactory(
512 user_id=user.id, group_id=self.group_c.id, may_add_notes=True
513 )
515 self.assertTrue(user.authorized_to_add_special_note(self.group_c.id))
517 def test_not_authorized_to_add_special_note(self) -> None:
518 user = UserFactory()
520 UserGroupMembershipFactory(
521 user_id=user.id, group_id=self.group_c.id, may_add_notes=False
522 )
524 self.assertFalse(user.authorized_to_add_special_note(self.group_c.id))
526 def test_superuser_authorized_to_add_special_note(self) -> None:
527 user = UserFactory(superuser=True)
529 self.assertTrue(user.authorized_to_add_special_note(self.group_c.id))
531 def test_groupadmin_authorized_to_erase_tasks(self) -> None:
532 user = UserFactory()
534 UserGroupMembershipFactory(
535 user_id=user.id, group_id=self.group_c.id, groupadmin=True
536 )
538 self.assertTrue(user.authorized_to_erase_tasks(self.group_c.id))
540 def test_non_member_not_authorized_to_erase_tasks(self) -> None:
541 user = UserFactory()
543 UserGroupMembershipFactory(
544 user_id=user.id, group_id=self.group_a.id, groupadmin=True
545 )
547 self.assertFalse(user.authorized_to_erase_tasks(self.group_c.id))
549 def test_non_admin_not_authorized_to_erase_tasks(self) -> None:
550 user = UserFactory()
552 UserGroupMembershipFactory(user_id=user.id, group_id=self.group_c.id)
554 self.assertFalse(user.authorized_to_erase_tasks(self.group_c.id))
556 def test_superuser_authorized_to_erase_tasks(self) -> None:
557 user = UserFactory(superuser=True)
559 self.assertTrue(user.authorized_to_erase_tasks(self.group_c.id))
561 def test_authorized_to_dump(self) -> None:
562 user = UserFactory()
564 UserGroupMembershipFactory(
565 user_id=user.id, group_id=self.group_a.id, may_dump_data=False
566 )
567 UserGroupMembershipFactory(
568 user_id=user.id, group_id=self.group_c.id, may_dump_data=True
569 )
571 self.assertTrue(user.authorized_to_dump)
573 def test_not_authorized_to_dump(self) -> None:
574 user = UserFactory()
576 self.assertFalse(user.authorized_to_dump)
578 def test_superuser_authorized_to_dump(self) -> None:
579 user = UserFactory(superuser=True)
581 self.assertTrue(user.authorized_to_dump)
583 def test_authorized_for_reports(self) -> None:
584 user = UserFactory()
586 UserGroupMembershipFactory(
587 user_id=user.id, group_id=self.group_a.id, may_run_reports=False
588 )
589 UserGroupMembershipFactory(
590 user_id=user.id, group_id=self.group_c.id, may_run_reports=True
591 )
593 self.assertTrue(user.authorized_for_reports)
595 def test_not_authorized_for_reports(self) -> None:
596 user = UserFactory()
598 self.assertFalse(user.authorized_for_reports)
600 def test_superuser_authorized_for_reports(self) -> None:
601 user = UserFactory(superuser=True)
603 self.assertTrue(user.authorized_for_reports)
605 def test_may_view_all_patients_when_unfiltered(self) -> None:
606 user = UserFactory()
608 UserGroupMembershipFactory(
609 user_id=user.id,
610 group_id=self.group_a.id,
611 view_all_patients_when_unfiltered=True,
612 )
613 UserGroupMembershipFactory(
614 user_id=user.id,
615 group_id=self.group_c.id,
616 view_all_patients_when_unfiltered=True,
617 )
619 self.assertTrue(user.may_view_all_patients_when_unfiltered)
621 def test_may_not_view_all_patients_when_unfiltered(self) -> None:
622 user = UserFactory()
624 UserGroupMembershipFactory(
625 user_id=user.id,
626 group_id=self.group_a.id,
627 view_all_patients_when_unfiltered=True,
628 )
629 UserGroupMembershipFactory(
630 user_id=user.id,
631 group_id=self.group_c.id,
632 view_all_patients_when_unfiltered=False,
633 )
635 self.assertFalse(user.may_view_all_patients_when_unfiltered)
637 def test_superuser_may_view_all_patients_when_unfiltered(self) -> None:
638 user = UserFactory(superuser=True)
640 self.assertTrue(user.may_view_all_patients_when_unfiltered)
642 def test_may_view_no_patients_when_unfiltered(self) -> None:
643 user = UserFactory()
645 self.assertTrue(user.may_view_no_patients_when_unfiltered)
647 def test_may_not_view_no_patients_when_unfiltered(self) -> None:
648 user = UserFactory()
650 UserGroupMembershipFactory(
651 user_id=user.id,
652 group_id=self.group_a.id,
653 view_all_patients_when_unfiltered=True,
654 )
655 UserGroupMembershipFactory(
656 user_id=user.id,
657 group_id=self.group_c.id,
658 view_all_patients_when_unfiltered=True,
659 )
661 self.assertFalse(user.may_view_no_patients_when_unfiltered)
663 def test_superuser_may_not_view_no_patients_when_unfiltered(self) -> None:
664 user = UserFactory(superuser=True)
666 self.assertFalse(user.may_view_no_patients_when_unfiltered)
668 def test_group_ids_that_nonsuperuser_may_see_when_unfiltered(self) -> None:
669 user = UserFactory()
671 UserGroupMembershipFactory(
672 user_id=user.id,
673 group_id=self.group_a.id,
674 view_all_patients_when_unfiltered=False,
675 )
676 UserGroupMembershipFactory(
677 user_id=user.id,
678 group_id=self.group_c.id,
679 view_all_patients_when_unfiltered=True,
680 )
681 UserGroupMembershipFactory(
682 user_id=user.id,
683 group_id=self.group_d.id,
684 view_all_patients_when_unfiltered=True,
685 )
687 ids = user.group_ids_nonsuperuser_may_see_when_unfiltered()
689 self.assertIn(self.group_c.id, ids)
690 self.assertIn(self.group_d.id, ids)
691 self.assertNotIn(self.group_a.id, ids)
692 self.assertNotIn(self.group_b.id, ids)
694 def test_may_upload_to_group(self) -> None:
695 user = UserFactory()
697 UserGroupMembershipFactory(
698 user_id=user.id, group_id=self.group_a.id, may_upload=True
699 )
701 self.assertTrue(user.may_upload_to_group(self.group_a.id))
703 def test_may_not_upload_to_group(self) -> None:
704 user = UserFactory()
706 UserGroupMembershipFactory(
707 user_id=user.id, group_id=self.group_a.id, may_upload=False
708 )
710 self.assertFalse(user.may_upload_to_group(self.group_a.id))
712 def test_superuser_may_upload_to_group(self) -> None:
713 user = UserFactory(superuser=True)
715 self.assertTrue(user.may_upload_to_group(self.group_a.id))
717 def test_may_upload_to_upload_group(self) -> None:
718 user = UserFactory(upload_group_id=self.group_a.id)
720 UserGroupMembershipFactory(
721 user_id=user.id, group_id=self.group_a.id, may_upload=True
722 )
724 self.assertTrue(user.may_upload)
726 def test_may_not_upload_with_no_upload_group(self) -> None:
727 user = UserFactory()
729 UserGroupMembershipFactory(
730 user_id=user.id, group_id=self.group_a.id, may_upload=True
731 )
733 self.assertFalse(user.may_upload)
735 def test_may_not_upload_with_upload_group_but_no_permission(self) -> None:
736 user = UserFactory(upload_group_id=self.group_a.id)
738 UserGroupMembershipFactory(
739 user_id=user.id, group_id=self.group_a.id, may_upload=False
740 )
742 self.assertFalse(user.may_upload)
744 def test_may_register_devices_with_upload_group(self) -> None:
745 user = UserFactory(upload_group_id=self.group_a.id)
747 UserGroupMembershipFactory(
748 user_id=user.id,
749 group_id=self.group_a.id,
750 may_register_devices=True,
751 )
753 self.assertTrue(user.may_register_devices)
755 def test_may_not_register_devices_with_no_upload_group(self) -> None:
756 user = UserFactory()
758 self.assertFalse(user.may_register_devices)
760 def test_may_not_register_devices_with_upload_group_but_no_permission(
761 self,
762 ) -> None:
763 user = UserFactory(upload_group_id=self.group_a.id)
765 UserGroupMembershipFactory(
766 user_id=user.id,
767 group_id=self.group_a.id,
768 may_register_devices=False,
769 )
771 self.assertFalse(user.may_register_devices)
773 def test_superuser_may_register_devices_with_upload_group(self) -> None:
774 user = UserFactory(upload_group_id=self.group_a.id, superuser=True)
776 self.assertTrue(user.may_register_devices)
778 def test_superuser_may_not_register_devices_with_no_upload_group(
779 self,
780 ) -> None:
781 user = UserFactory(superuser=True)
783 self.assertFalse(user.may_register_devices)
785 def test_authorized_to_manage_patients(self) -> None:
786 user = UserFactory()
788 UserGroupMembershipFactory(
789 user_id=user.id,
790 group_id=self.group_a.id,
791 may_manage_patients=False,
792 )
793 UserGroupMembershipFactory(
794 user_id=user.id, group_id=self.group_c.id, may_manage_patients=True
795 )
797 self.assertTrue(user.authorized_to_manage_patients)
799 def test_not_authorized_to_manage_patients(self) -> None:
800 user = UserFactory()
802 self.assertFalse(user.authorized_to_manage_patients)
804 def test_groupadmin_authorized_to_manage_patients(self) -> None:
805 user = UserFactory()
807 UserGroupMembershipFactory(
808 user_id=user.id, group_id=self.group_a.id, groupadmin=True
809 )
811 self.assertTrue(user.authorized_to_manage_patients)
813 def test_superuser_authorized_to_manage_patients(self) -> None:
814 user = UserFactory(superuser=True)
816 self.assertTrue(user.authorized_to_manage_patients)
818 def test_user_may_manage_patients_in_group(self) -> None:
819 user = UserFactory()
821 UserGroupMembershipFactory(
822 user_id=user.id,
823 group_id=self.group_a.id,
824 may_manage_patients=False,
825 )
826 UserGroupMembershipFactory(
827 user_id=user.id, group_id=self.group_c.id, may_manage_patients=True
828 )
829 UserGroupMembershipFactory(
830 user_id=user.id, group_id=self.group_d.id, may_manage_patients=True
831 )
833 self.assertFalse(user.may_manage_patients_in_group(self.group_a.id))
834 self.assertTrue(user.may_manage_patients_in_group(self.group_c.id))
835 self.assertTrue(user.may_manage_patients_in_group(self.group_d.id))
837 def test_groupadmin_may_manage_patients_in_group(self) -> None:
838 user = UserFactory()
840 UserGroupMembershipFactory(
841 user_id=user.id, group_id=self.group_a.id, groupadmin=False
842 )
843 UserGroupMembershipFactory(
844 user_id=user.id, group_id=self.group_c.id, groupadmin=True
845 )
846 UserGroupMembershipFactory(
847 user_id=user.id, group_id=self.group_d.id, groupadmin=True
848 )
850 self.assertFalse(user.may_manage_patients_in_group(self.group_a.id))
851 self.assertTrue(user.may_manage_patients_in_group(self.group_c.id))
852 self.assertTrue(user.may_manage_patients_in_group(self.group_d.id))
854 def test_superuser_may_manage_patients_in_group(self) -> None:
855 user = UserFactory(superuser=True)
857 self.assertTrue(user.may_manage_patients_in_group(self.group_a.id))
858 self.assertTrue(user.may_manage_patients_in_group(self.group_b.id))
859 self.assertTrue(user.may_manage_patients_in_group(self.group_c.id))
860 self.assertTrue(user.may_manage_patients_in_group(self.group_d.id))
862 def test_authorized_to_email_patients(self) -> None:
863 user = UserFactory()
865 UserGroupMembershipFactory(
866 user_id=user.id, group_id=self.group_a.id, may_email_patients=False
867 )
868 UserGroupMembershipFactory(
869 user_id=user.id, group_id=self.group_c.id, may_email_patients=True
870 )
872 self.assertTrue(user.authorized_to_email_patients)
874 def test_not_authorized_to_email_patients(self) -> None:
875 user = UserFactory()
877 self.assertFalse(user.authorized_to_email_patients)
879 def test_groupadmin_authorized_to_email_patients(self) -> None:
880 user = UserFactory()
882 UserGroupMembershipFactory(
883 user_id=user.id, group_id=self.group_a.id, groupadmin=True
884 )
886 self.assertTrue(user.authorized_to_email_patients)
888 def test_superuser_authorized_to_email_patients(self) -> None:
889 user = UserFactory(superuser=True)
891 self.assertTrue(user.authorized_to_email_patients)
893 def test_user_may_email_patients_in_group(self) -> None:
894 user = UserFactory()
896 UserGroupMembershipFactory(
897 user_id=user.id, group_id=self.group_a.id, may_email_patients=False
898 )
899 UserGroupMembershipFactory(
900 user_id=user.id, group_id=self.group_c.id, may_email_patients=True
901 )
902 UserGroupMembershipFactory(
903 user_id=user.id, group_id=self.group_d.id, may_email_patients=True
904 )
906 self.assertFalse(user.may_email_patients_in_group(self.group_a.id))
907 self.assertTrue(user.may_email_patients_in_group(self.group_c.id))
908 self.assertTrue(user.may_email_patients_in_group(self.group_d.id))
910 def test_groupadmin_may_email_patients_in_group(self) -> None:
911 user = UserFactory()
913 UserGroupMembershipFactory(
914 user_id=user.id, group_id=self.group_a.id, groupadmin=False
915 )
916 UserGroupMembershipFactory(
917 user_id=user.id, group_id=self.group_c.id, groupadmin=True
918 )
919 UserGroupMembershipFactory(
920 user_id=user.id, group_id=self.group_d.id, groupadmin=True
921 )
923 self.assertFalse(user.may_email_patients_in_group(self.group_a.id))
924 self.assertTrue(user.may_email_patients_in_group(self.group_c.id))
925 self.assertTrue(user.may_email_patients_in_group(self.group_d.id))
927 def test_superuser_may_email_patients_in_group(self) -> None:
928 user = UserFactory(superuser=True)
930 self.assertTrue(user.may_email_patients_in_group(self.group_a.id))
931 self.assertTrue(user.may_email_patients_in_group(self.group_b.id))
932 self.assertTrue(user.may_email_patients_in_group(self.group_c.id))
933 self.assertTrue(user.may_email_patients_in_group(self.group_d.id))
936class SetGroupIdsTests(DemoRequestTestCase):
937 def test_old_group_ids_removed(self) -> None:
938 group_a = GroupFactory()
939 group_b = GroupFactory()
941 user = UserFactory()
943 UserGroupMembershipFactory(user_id=user.id, group_id=group_a.id)
944 UserGroupMembershipFactory(user_id=user.id, group_id=group_b.id)
945 self.assertEqual(len(user.user_group_memberships), 2)
947 user.set_group_ids([])
948 self.dbsession.refresh(user)
950 self.assertEqual(len(user.user_group_memberships), 0)
952 def test_new_group_ids_added(self) -> None:
953 group_a = GroupFactory()
954 group_b = GroupFactory()
956 user = UserFactory()
958 self.assertEqual(len(user.user_group_memberships), 0)
960 user.set_group_ids([group_a.id, group_b.id])
961 self.dbsession.refresh(user)
963 self.assertEqual(len(user.user_group_memberships), 2)