authentik.core.tests.test_property_mapping

authentik core property mapping tests

 1"""authentik core property mapping tests"""
 2
 3from django.test import RequestFactory, TestCase
 4from guardian.shortcuts import get_anonymous_user
 5
 6from authentik.core.expression.exceptions import (
 7    PropertyMappingExpressionException,
 8    SkipObjectException,
 9)
10from authentik.core.models import PropertyMapping
11from authentik.core.tests.utils import create_test_admin_user
12from authentik.events.models import Event, EventAction
13from authentik.lib.generators import generate_id
14from authentik.policies.expression.models import ExpressionPolicy
15
16
17class TestPropertyMappings(TestCase):
18    """authentik core property mapping tests"""
19
20    def setUp(self) -> None:
21        super().setUp()
22        self.user = create_test_admin_user()
23        self.factory = RequestFactory()
24
25    def test_expression(self):
26        """Test expression"""
27        mapping = PropertyMapping.objects.create(name=generate_id(), expression="return 'test'")
28        self.assertEqual(mapping.evaluate(None, None), "test")
29
30    def test_expression_syntax(self):
31        """Test expression syntax error"""
32        mapping = PropertyMapping.objects.create(name=generate_id(), expression="-")
33        with self.assertRaises(PropertyMappingExpressionException):
34            mapping.evaluate(None, None)
35
36    def test_expression_error_general(self):
37        """Test expression error"""
38        expr = "return aaa"
39        mapping = PropertyMapping.objects.create(name=generate_id(), expression=expr)
40        with self.assertRaises(PropertyMappingExpressionException):
41            mapping.evaluate(None, None)
42        events = Event.objects.filter(
43            action=EventAction.PROPERTY_MAPPING_EXCEPTION, context__expression=expr
44        )
45        self.assertTrue(events.exists())
46        self.assertEqual(len(events), 1)
47
48    def test_expression_skip(self):
49        """Test expression error"""
50        expr = "raise SkipObject"
51        mapping = PropertyMapping.objects.create(name=generate_id(), expression=expr)
52        with self.assertRaises(SkipObjectException):
53            mapping.evaluate(None, None)
54        events = Event.objects.filter(
55            action=EventAction.PROPERTY_MAPPING_EXCEPTION, context__expression=expr
56        )
57        self.assertFalse(events.exists())
58
59    def test_expression_error_extended(self):
60        """Test expression error (with user and http request"""
61        expr = "return aaa"
62        request = self.factory.get("/")
63        mapping = PropertyMapping.objects.create(name=generate_id(), expression=expr)
64        with self.assertRaises(PropertyMappingExpressionException):
65            mapping.evaluate(get_anonymous_user(), request)
66        events = Event.objects.filter(
67            action=EventAction.PROPERTY_MAPPING_EXCEPTION, context__expression=expr
68        )
69        self.assertTrue(events.exists())
70        self.assertEqual(len(events), 1)
71        event = events.first()
72        self.assertEqual(event.user["username"], "AnonymousUser")
73        self.assertEqual(event.client_ip, "127.0.0.1")
74
75    def test_call_policy(self):
76        """test ak_call_policy"""
77        expr = ExpressionPolicy.objects.create(
78            name=generate_id(),
79            execution_logging=True,
80            expression="return request.http_request.path",
81        )
82        http_request = self.factory.get("/")
83        tmpl = f"""
84        res = ak_call_policy('{expr.name}')
85        result = [request.http_request.path, res.raw_result]
86        return result
87        """
88        evaluator = PropertyMapping(expression=tmpl, name=generate_id())
89        res = evaluator.evaluate(self.user, http_request)
90        self.assertEqual(res, ["/", "/"])
class TestPropertyMappings(django.test.testcases.TestCase):
18class TestPropertyMappings(TestCase):
19    """authentik core property mapping tests"""
20
21    def setUp(self) -> None:
22        super().setUp()
23        self.user = create_test_admin_user()
24        self.factory = RequestFactory()
25
26    def test_expression(self):
27        """Test expression"""
28        mapping = PropertyMapping.objects.create(name=generate_id(), expression="return 'test'")
29        self.assertEqual(mapping.evaluate(None, None), "test")
30
31    def test_expression_syntax(self):
32        """Test expression syntax error"""
33        mapping = PropertyMapping.objects.create(name=generate_id(), expression="-")
34        with self.assertRaises(PropertyMappingExpressionException):
35            mapping.evaluate(None, None)
36
37    def test_expression_error_general(self):
38        """Test expression error"""
39        expr = "return aaa"
40        mapping = PropertyMapping.objects.create(name=generate_id(), expression=expr)
41        with self.assertRaises(PropertyMappingExpressionException):
42            mapping.evaluate(None, None)
43        events = Event.objects.filter(
44            action=EventAction.PROPERTY_MAPPING_EXCEPTION, context__expression=expr
45        )
46        self.assertTrue(events.exists())
47        self.assertEqual(len(events), 1)
48
49    def test_expression_skip(self):
50        """Test expression error"""
51        expr = "raise SkipObject"
52        mapping = PropertyMapping.objects.create(name=generate_id(), expression=expr)
53        with self.assertRaises(SkipObjectException):
54            mapping.evaluate(None, None)
55        events = Event.objects.filter(
56            action=EventAction.PROPERTY_MAPPING_EXCEPTION, context__expression=expr
57        )
58        self.assertFalse(events.exists())
59
60    def test_expression_error_extended(self):
61        """Test expression error (with user and http request"""
62        expr = "return aaa"
63        request = self.factory.get("/")
64        mapping = PropertyMapping.objects.create(name=generate_id(), expression=expr)
65        with self.assertRaises(PropertyMappingExpressionException):
66            mapping.evaluate(get_anonymous_user(), request)
67        events = Event.objects.filter(
68            action=EventAction.PROPERTY_MAPPING_EXCEPTION, context__expression=expr
69        )
70        self.assertTrue(events.exists())
71        self.assertEqual(len(events), 1)
72        event = events.first()
73        self.assertEqual(event.user["username"], "AnonymousUser")
74        self.assertEqual(event.client_ip, "127.0.0.1")
75
76    def test_call_policy(self):
77        """test ak_call_policy"""
78        expr = ExpressionPolicy.objects.create(
79            name=generate_id(),
80            execution_logging=True,
81            expression="return request.http_request.path",
82        )
83        http_request = self.factory.get("/")
84        tmpl = f"""
85        res = ak_call_policy('{expr.name}')
86        result = [request.http_request.path, res.raw_result]
87        return result
88        """
89        evaluator = PropertyMapping(expression=tmpl, name=generate_id())
90        res = evaluator.evaluate(self.user, http_request)
91        self.assertEqual(res, ["/", "/"])

authentik core property mapping tests

def setUp(self) -> None:
21    def setUp(self) -> None:
22        super().setUp()
23        self.user = create_test_admin_user()
24        self.factory = RequestFactory()

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

def test_expression(self):
26    def test_expression(self):
27        """Test expression"""
28        mapping = PropertyMapping.objects.create(name=generate_id(), expression="return 'test'")
29        self.assertEqual(mapping.evaluate(None, None), "test")

Test expression

def test_expression_syntax(self):
31    def test_expression_syntax(self):
32        """Test expression syntax error"""
33        mapping = PropertyMapping.objects.create(name=generate_id(), expression="-")
34        with self.assertRaises(PropertyMappingExpressionException):
35            mapping.evaluate(None, None)

Test expression syntax error

def test_expression_error_general(self):
37    def test_expression_error_general(self):
38        """Test expression error"""
39        expr = "return aaa"
40        mapping = PropertyMapping.objects.create(name=generate_id(), expression=expr)
41        with self.assertRaises(PropertyMappingExpressionException):
42            mapping.evaluate(None, None)
43        events = Event.objects.filter(
44            action=EventAction.PROPERTY_MAPPING_EXCEPTION, context__expression=expr
45        )
46        self.assertTrue(events.exists())
47        self.assertEqual(len(events), 1)

Test expression error

def test_expression_skip(self):
49    def test_expression_skip(self):
50        """Test expression error"""
51        expr = "raise SkipObject"
52        mapping = PropertyMapping.objects.create(name=generate_id(), expression=expr)
53        with self.assertRaises(SkipObjectException):
54            mapping.evaluate(None, None)
55        events = Event.objects.filter(
56            action=EventAction.PROPERTY_MAPPING_EXCEPTION, context__expression=expr
57        )
58        self.assertFalse(events.exists())

Test expression error

def test_expression_error_extended(self):
60    def test_expression_error_extended(self):
61        """Test expression error (with user and http request"""
62        expr = "return aaa"
63        request = self.factory.get("/")
64        mapping = PropertyMapping.objects.create(name=generate_id(), expression=expr)
65        with self.assertRaises(PropertyMappingExpressionException):
66            mapping.evaluate(get_anonymous_user(), request)
67        events = Event.objects.filter(
68            action=EventAction.PROPERTY_MAPPING_EXCEPTION, context__expression=expr
69        )
70        self.assertTrue(events.exists())
71        self.assertEqual(len(events), 1)
72        event = events.first()
73        self.assertEqual(event.user["username"], "AnonymousUser")
74        self.assertEqual(event.client_ip, "127.0.0.1")

Test expression error (with user and http request

def test_call_policy(self):
76    def test_call_policy(self):
77        """test ak_call_policy"""
78        expr = ExpressionPolicy.objects.create(
79            name=generate_id(),
80            execution_logging=True,
81            expression="return request.http_request.path",
82        )
83        http_request = self.factory.get("/")
84        tmpl = f"""
85        res = ak_call_policy('{expr.name}')
86        result = [request.http_request.path, res.raw_result]
87        return result
88        """
89        evaluator = PropertyMapping(expression=tmpl, name=generate_id())
90        res = evaluator.evaluate(self.user, http_request)
91        self.assertEqual(res, ["/", "/"])

test ak_call_policy