authentik.endpoints.tests.test_api

 1from unittest.mock import PropertyMock, patch
 2
 3from django.urls import reverse
 4from rest_framework.test import APITestCase
 5
 6from authentik.core.tests.utils import create_test_admin_user
 7from authentik.endpoints.connectors.agent.models import AgentConnector
 8from authentik.endpoints.controller import BaseController
 9from authentik.endpoints.models import StageMode
10from authentik.lib.generators import generate_id
11
12
13class TestAPI(APITestCase):
14    def setUp(self):
15        self.user = create_test_admin_user()
16        self.client.force_login(self.user)
17
18    def test_endpoint_stage_agent(self):
19        connector = AgentConnector.objects.create(name=generate_id())
20        res = self.client.post(
21            reverse("authentik_api:stages-endpoint-list"),
22            data={
23                "name": generate_id(),
24                "connector": str(connector.pk),
25                "mode": StageMode.REQUIRED,
26            },
27        )
28        self.assertEqual(res.status_code, 201)
29
30    def test_endpoint_stage_agent_no_stage(self):
31        connector = AgentConnector.objects.create(name=generate_id())
32
33        class controller(BaseController):
34            def capabilities(self):
35                return []
36
37        with patch.object(AgentConnector, "controller", PropertyMock(return_value=controller)):
38            res = self.client.post(
39                reverse("authentik_api:stages-endpoint-list"),
40                data={
41                    "name": generate_id(),
42                    "connector": str(connector.pk),
43                    "mode": StageMode.REQUIRED,
44                },
45            )
46        self.assertEqual(res.status_code, 400)
47        self.assertJSONEqual(
48            res.content, {"connector": ["Selected connector is not compatible with this stage."]}
49        )
class TestAPI(rest_framework.test.APITestCase):
14class TestAPI(APITestCase):
15    def setUp(self):
16        self.user = create_test_admin_user()
17        self.client.force_login(self.user)
18
19    def test_endpoint_stage_agent(self):
20        connector = AgentConnector.objects.create(name=generate_id())
21        res = self.client.post(
22            reverse("authentik_api:stages-endpoint-list"),
23            data={
24                "name": generate_id(),
25                "connector": str(connector.pk),
26                "mode": StageMode.REQUIRED,
27            },
28        )
29        self.assertEqual(res.status_code, 201)
30
31    def test_endpoint_stage_agent_no_stage(self):
32        connector = AgentConnector.objects.create(name=generate_id())
33
34        class controller(BaseController):
35            def capabilities(self):
36                return []
37
38        with patch.object(AgentConnector, "controller", PropertyMock(return_value=controller)):
39            res = self.client.post(
40                reverse("authentik_api:stages-endpoint-list"),
41                data={
42                    "name": generate_id(),
43                    "connector": str(connector.pk),
44                    "mode": StageMode.REQUIRED,
45                },
46            )
47        self.assertEqual(res.status_code, 400)
48        self.assertJSONEqual(
49            res.content, {"connector": ["Selected connector is not compatible with this stage."]}
50        )

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):
15    def setUp(self):
16        self.user = create_test_admin_user()
17        self.client.force_login(self.user)

Hook method for setting up the test fixture before exercising it.

def test_endpoint_stage_agent(self):
19    def test_endpoint_stage_agent(self):
20        connector = AgentConnector.objects.create(name=generate_id())
21        res = self.client.post(
22            reverse("authentik_api:stages-endpoint-list"),
23            data={
24                "name": generate_id(),
25                "connector": str(connector.pk),
26                "mode": StageMode.REQUIRED,
27            },
28        )
29        self.assertEqual(res.status_code, 201)
def test_endpoint_stage_agent_no_stage(self):
31    def test_endpoint_stage_agent_no_stage(self):
32        connector = AgentConnector.objects.create(name=generate_id())
33
34        class controller(BaseController):
35            def capabilities(self):
36                return []
37
38        with patch.object(AgentConnector, "controller", PropertyMock(return_value=controller)):
39            res = self.client.post(
40                reverse("authentik_api:stages-endpoint-list"),
41                data={
42                    "name": generate_id(),
43                    "connector": str(connector.pk),
44                    "mode": StageMode.REQUIRED,
45                },
46            )
47        self.assertEqual(res.status_code, 400)
48        self.assertJSONEqual(
49            res.content, {"connector": ["Selected connector is not compatible with this stage."]}
50        )