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 TestUserExport(authentik.admin.files.tests.utils.FileTestFileBackendMixin, django.test.testcases.TestCase):
14@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)