authentik.enterprise.reports.tests.test_user_export
1import csv 2 3from django.contrib.contenttypes.models import ContentType 4from django.test.testcases import TestCase 5 6from authentik.admin.files.tests.utils import FileTestFileBackendMixin 7from authentik.core.models import User 8from authentik.core.tests.utils import create_test_user 9from authentik.enterprise.reports.models import DataExport 10from authentik.enterprise.reports.tests.utils import patch_license 11 12 13@patch_license 14class TestUserExport(FileTestFileBackendMixin, TestCase): 15 def setUp(self) -> None: 16 super().setUp() 17 18 self.u1 = create_test_user(username="a") 19 self.u1.assign_perms_to_managed_role("authentik_core.view_user") 20 self.u2 = create_test_user(username="b", path="abcd") 21 self.u1.assign_perms_to_managed_role("authentik_core.view_user") 22 23 def _read_export(self, filename): 24 with open(f"{self.reports_backend_path}/reports/public/{filename}") as f: 25 reader = csv.DictReader(f) 26 return list(reader) 27 28 def test_generate_user_export(self): 29 export = DataExport.objects.create( 30 content_type=ContentType.objects.get_for_model(User), 31 requested_by=self.u1, 32 query_params={"email": str(self.u1.email)}, 33 ) 34 export.generate() 35 36 self.assertEqual(export.completed, True) 37 data = self._read_export(export.file) 38 self.assertEqual(len(data), 1) 39 self.assertEqual(data[0]["Username"], self.u1.username) 40 41 def test_path_filter(self): 42 export = DataExport.objects.create( 43 content_type=ContentType.objects.get_for_model(User), 44 requested_by=self.u1, 45 query_params={"path": str(self.u2.path)}, 46 ) 47 records = list(export.get_queryset()) 48 self.assertEqual(len(records), 1) 49 self.assertEqual(records[0], self.u2) 50 51 def test_search_filter(self): 52 export = DataExport.objects.create( 53 content_type=ContentType.objects.get_for_model(User), 54 requested_by=self.u1, 55 query_params={"search": f'username = "{self.u2.username}"'}, 56 ) 57 records = list(export.get_queryset()) 58 self.assertEqual(len(records), 1) 59 self.assertEqual(records[0], self.u2) 60 61 def test_ordering(self): 62 export = DataExport.objects.create( 63 content_type=ContentType.objects.get_for_model(User), 64 requested_by=self.u1, 65 query_params={"ordering": "-username"}, 66 ) 67 records = list(export.get_queryset()) 68 self.assertGreaterEqual(records[0].username, records[-1].username) 69 export = DataExport.objects.create( 70 content_type=ContentType.objects.get_for_model(User), 71 requested_by=self.u1, 72 query_params={"ordering": "username"}, 73 ) 74 records = list(export.get_queryset()) 75 self.assertLess(records[0].username, records[-1].username)
@patch_license
class
TestUserExport14@patch_license 15class TestUserExport(FileTestFileBackendMixin, TestCase): 16 def setUp(self) -> None: 17 super().setUp() 18 19 self.u1 = create_test_user(username="a") 20 self.u1.assign_perms_to_managed_role("authentik_core.view_user") 21 self.u2 = create_test_user(username="b", path="abcd") 22 self.u1.assign_perms_to_managed_role("authentik_core.view_user") 23 24 def _read_export(self, filename): 25 with open(f"{self.reports_backend_path}/reports/public/{filename}") as f: 26 reader = csv.DictReader(f) 27 return list(reader) 28 29 def test_generate_user_export(self): 30 export = DataExport.objects.create( 31 content_type=ContentType.objects.get_for_model(User), 32 requested_by=self.u1, 33 query_params={"email": str(self.u1.email)}, 34 ) 35 export.generate() 36 37 self.assertEqual(export.completed, True) 38 data = self._read_export(export.file) 39 self.assertEqual(len(data), 1) 40 self.assertEqual(data[0]["Username"], self.u1.username) 41 42 def test_path_filter(self): 43 export = DataExport.objects.create( 44 content_type=ContentType.objects.get_for_model(User), 45 requested_by=self.u1, 46 query_params={"path": str(self.u2.path)}, 47 ) 48 records = list(export.get_queryset()) 49 self.assertEqual(len(records), 1) 50 self.assertEqual(records[0], self.u2) 51 52 def test_search_filter(self): 53 export = DataExport.objects.create( 54 content_type=ContentType.objects.get_for_model(User), 55 requested_by=self.u1, 56 query_params={"search": f'username = "{self.u2.username}"'}, 57 ) 58 records = list(export.get_queryset()) 59 self.assertEqual(len(records), 1) 60 self.assertEqual(records[0], self.u2) 61 62 def test_ordering(self): 63 export = DataExport.objects.create( 64 content_type=ContentType.objects.get_for_model(User), 65 requested_by=self.u1, 66 query_params={"ordering": "-username"}, 67 ) 68 records = list(export.get_queryset()) 69 self.assertGreaterEqual(records[0].username, records[-1].username) 70 export = DataExport.objects.create( 71 content_type=ContentType.objects.get_for_model(User), 72 requested_by=self.u1, 73 query_params={"ordering": "username"}, 74 ) 75 records = list(export.get_queryset()) 76 self.assertLess(records[0].username, records[-1].username)
Similar to TransactionTestCase, but use transaction.atomic() to achieve
test isolation.
In most situations, TestCase should be preferred to TransactionTestCase as it allows faster execution. However, there are some situations where using TransactionTestCase might be necessary (e.g. testing some transactional behavior).
On database backends with no transaction support, TestCase behaves as TransactionTestCase.
def
setUp(self) -> None:
16 def setUp(self) -> None: 17 super().setUp() 18 19 self.u1 = create_test_user(username="a") 20 self.u1.assign_perms_to_managed_role("authentik_core.view_user") 21 self.u2 = create_test_user(username="b", path="abcd") 22 self.u1.assign_perms_to_managed_role("authentik_core.view_user")
Hook method for setting up the test fixture before exercising it.
def
test_generate_user_export(self):
29 def test_generate_user_export(self): 30 export = DataExport.objects.create( 31 content_type=ContentType.objects.get_for_model(User), 32 requested_by=self.u1, 33 query_params={"email": str(self.u1.email)}, 34 ) 35 export.generate() 36 37 self.assertEqual(export.completed, True) 38 data = self._read_export(export.file) 39 self.assertEqual(len(data), 1) 40 self.assertEqual(data[0]["Username"], self.u1.username)
def
test_path_filter(self):
42 def test_path_filter(self): 43 export = DataExport.objects.create( 44 content_type=ContentType.objects.get_for_model(User), 45 requested_by=self.u1, 46 query_params={"path": str(self.u2.path)}, 47 ) 48 records = list(export.get_queryset()) 49 self.assertEqual(len(records), 1) 50 self.assertEqual(records[0], self.u2)
def
test_search_filter(self):
52 def test_search_filter(self): 53 export = DataExport.objects.create( 54 content_type=ContentType.objects.get_for_model(User), 55 requested_by=self.u1, 56 query_params={"search": f'username = "{self.u2.username}"'}, 57 ) 58 records = list(export.get_queryset()) 59 self.assertEqual(len(records), 1) 60 self.assertEqual(records[0], self.u2)
def
test_ordering(self):
62 def test_ordering(self): 63 export = DataExport.objects.create( 64 content_type=ContentType.objects.get_for_model(User), 65 requested_by=self.u1, 66 query_params={"ordering": "-username"}, 67 ) 68 records = list(export.get_queryset()) 69 self.assertGreaterEqual(records[0].username, records[-1].username) 70 export = DataExport.objects.create( 71 content_type=ContentType.objects.get_for_model(User), 72 requested_by=self.u1, 73 query_params={"ordering": "username"}, 74 ) 75 records = list(export.get_queryset()) 76 self.assertLess(records[0].username, records[-1].username)