authentik.outposts.tests.test_api
Test outpost service connection API
1"""Test outpost service connection API""" 2 3from django.urls import reverse 4from rest_framework.test import APITestCase 5 6from authentik.blueprints.tests import reconcile_app 7from authentik.core.models import PropertyMapping 8from authentik.core.tests.utils import create_test_admin_user, create_test_flow 9from authentik.lib.generators import generate_id 10from authentik.outposts.api.outposts import OutpostSerializer 11from authentik.outposts.apps import MANAGED_OUTPOST 12from authentik.outposts.models import Outpost, OutpostType, default_outpost_config 13from authentik.providers.ldap.models import LDAPProvider 14from authentik.providers.proxy.models import ProxyProvider 15 16 17class TestOutpostServiceConnectionsAPI(APITestCase): 18 """Test outpost service connection API""" 19 20 def setUp(self) -> None: 21 super().setUp() 22 self.mapping = PropertyMapping.objects.create( 23 name=generate_id(), expression="""return {'foo': 'bar'}""" 24 ) 25 self.user = create_test_admin_user() 26 self.client.force_login(self.user) 27 28 @reconcile_app("authentik_outposts") 29 def test_managed_name_change(self): 30 """Test name change for embedded outpost""" 31 embedded_outpost = Outpost.objects.filter(managed=MANAGED_OUTPOST).first() 32 self.assertIsNotNone(embedded_outpost) 33 response = self.client.patch( 34 reverse("authentik_api:outpost-detail", kwargs={"pk": embedded_outpost.pk}), 35 {"name": "foo"}, 36 ) 37 self.assertEqual(response.status_code, 400) 38 self.assertJSONEqual( 39 response.content, {"name": ["Embedded outpost's name cannot be changed"]} 40 ) 41 42 @reconcile_app("authentik_outposts") 43 def test_managed_without_managed(self): 44 """Test name change for embedded outpost""" 45 embedded_outpost = Outpost.objects.filter(managed=MANAGED_OUTPOST).first() 46 self.assertIsNotNone(embedded_outpost) 47 embedded_outpost.managed = "" 48 embedded_outpost.save() 49 response = self.client.patch( 50 reverse("authentik_api:outpost-detail", kwargs={"pk": embedded_outpost.pk}), 51 {"name": "foo"}, 52 ) 53 self.assertEqual(response.status_code, 200) 54 embedded_outpost.refresh_from_db() 55 self.assertEqual(embedded_outpost.managed, MANAGED_OUTPOST) 56 57 def test_outpost_validation(self): 58 """Test Outpost validation""" 59 valid = OutpostSerializer( 60 data={ 61 "name": generate_id(), 62 "type": OutpostType.PROXY, 63 "config": default_outpost_config(), 64 "providers": [ 65 ProxyProvider.objects.create( 66 name=generate_id(), authorization_flow=create_test_flow() 67 ).pk 68 ], 69 } 70 ) 71 self.assertTrue(valid.is_valid()) 72 invalid = OutpostSerializer( 73 data={ 74 "name": generate_id(), 75 "type": OutpostType.PROXY, 76 "config": default_outpost_config(), 77 "providers": [ 78 LDAPProvider.objects.create( 79 name=generate_id(), authorization_flow=create_test_flow() 80 ).pk 81 ], 82 } 83 ) 84 self.assertFalse(invalid.is_valid()) 85 self.assertIn("providers", invalid.errors) 86 87 def test_types(self): 88 """Test OutpostServiceConnections's types endpoint""" 89 response = self.client.get( 90 reverse("authentik_api:outpostserviceconnection-types"), 91 ) 92 self.assertEqual(response.status_code, 200) 93 94 def test_outpost_config(self): 95 """Test Outpost's config field""" 96 provider = ProxyProvider.objects.create( 97 name=generate_id(), authorization_flow=create_test_flow() 98 ) 99 invalid = OutpostSerializer( 100 data={"name": generate_id(), "providers": [provider.pk], "config": ""} 101 ) 102 self.assertFalse(invalid.is_valid()) 103 self.assertIn("config", invalid.errors) 104 valid = OutpostSerializer( 105 data={ 106 "name": generate_id(), 107 "providers": [provider.pk], 108 "config": default_outpost_config(generate_id()), 109 "type": OutpostType.PROXY, 110 } 111 ) 112 self.assertTrue(valid.is_valid())
class
TestOutpostServiceConnectionsAPI(rest_framework.test.APITestCase):
18class TestOutpostServiceConnectionsAPI(APITestCase): 19 """Test outpost service connection API""" 20 21 def setUp(self) -> None: 22 super().setUp() 23 self.mapping = PropertyMapping.objects.create( 24 name=generate_id(), expression="""return {'foo': 'bar'}""" 25 ) 26 self.user = create_test_admin_user() 27 self.client.force_login(self.user) 28 29 @reconcile_app("authentik_outposts") 30 def test_managed_name_change(self): 31 """Test name change for embedded outpost""" 32 embedded_outpost = Outpost.objects.filter(managed=MANAGED_OUTPOST).first() 33 self.assertIsNotNone(embedded_outpost) 34 response = self.client.patch( 35 reverse("authentik_api:outpost-detail", kwargs={"pk": embedded_outpost.pk}), 36 {"name": "foo"}, 37 ) 38 self.assertEqual(response.status_code, 400) 39 self.assertJSONEqual( 40 response.content, {"name": ["Embedded outpost's name cannot be changed"]} 41 ) 42 43 @reconcile_app("authentik_outposts") 44 def test_managed_without_managed(self): 45 """Test name change for embedded outpost""" 46 embedded_outpost = Outpost.objects.filter(managed=MANAGED_OUTPOST).first() 47 self.assertIsNotNone(embedded_outpost) 48 embedded_outpost.managed = "" 49 embedded_outpost.save() 50 response = self.client.patch( 51 reverse("authentik_api:outpost-detail", kwargs={"pk": embedded_outpost.pk}), 52 {"name": "foo"}, 53 ) 54 self.assertEqual(response.status_code, 200) 55 embedded_outpost.refresh_from_db() 56 self.assertEqual(embedded_outpost.managed, MANAGED_OUTPOST) 57 58 def test_outpost_validation(self): 59 """Test Outpost validation""" 60 valid = OutpostSerializer( 61 data={ 62 "name": generate_id(), 63 "type": OutpostType.PROXY, 64 "config": default_outpost_config(), 65 "providers": [ 66 ProxyProvider.objects.create( 67 name=generate_id(), authorization_flow=create_test_flow() 68 ).pk 69 ], 70 } 71 ) 72 self.assertTrue(valid.is_valid()) 73 invalid = OutpostSerializer( 74 data={ 75 "name": generate_id(), 76 "type": OutpostType.PROXY, 77 "config": default_outpost_config(), 78 "providers": [ 79 LDAPProvider.objects.create( 80 name=generate_id(), authorization_flow=create_test_flow() 81 ).pk 82 ], 83 } 84 ) 85 self.assertFalse(invalid.is_valid()) 86 self.assertIn("providers", invalid.errors) 87 88 def test_types(self): 89 """Test OutpostServiceConnections's types endpoint""" 90 response = self.client.get( 91 reverse("authentik_api:outpostserviceconnection-types"), 92 ) 93 self.assertEqual(response.status_code, 200) 94 95 def test_outpost_config(self): 96 """Test Outpost's config field""" 97 provider = ProxyProvider.objects.create( 98 name=generate_id(), authorization_flow=create_test_flow() 99 ) 100 invalid = OutpostSerializer( 101 data={"name": generate_id(), "providers": [provider.pk], "config": ""} 102 ) 103 self.assertFalse(invalid.is_valid()) 104 self.assertIn("config", invalid.errors) 105 valid = OutpostSerializer( 106 data={ 107 "name": generate_id(), 108 "providers": [provider.pk], 109 "config": default_outpost_config(generate_id()), 110 "type": OutpostType.PROXY, 111 } 112 ) 113 self.assertTrue(valid.is_valid())
Test outpost service connection API
def
setUp(self) -> None:
21 def setUp(self) -> None: 22 super().setUp() 23 self.mapping = PropertyMapping.objects.create( 24 name=generate_id(), expression="""return {'foo': 'bar'}""" 25 ) 26 self.user = create_test_admin_user() 27 self.client.force_login(self.user)
Hook method for setting up the test fixture before exercising it.
@reconcile_app('authentik_outposts')
def
test_managed_name_change(self):
29 @reconcile_app("authentik_outposts") 30 def test_managed_name_change(self): 31 """Test name change for embedded outpost""" 32 embedded_outpost = Outpost.objects.filter(managed=MANAGED_OUTPOST).first() 33 self.assertIsNotNone(embedded_outpost) 34 response = self.client.patch( 35 reverse("authentik_api:outpost-detail", kwargs={"pk": embedded_outpost.pk}), 36 {"name": "foo"}, 37 ) 38 self.assertEqual(response.status_code, 400) 39 self.assertJSONEqual( 40 response.content, {"name": ["Embedded outpost's name cannot be changed"]} 41 )
Test name change for embedded outpost
@reconcile_app('authentik_outposts')
def
test_managed_without_managed(self):
43 @reconcile_app("authentik_outposts") 44 def test_managed_without_managed(self): 45 """Test name change for embedded outpost""" 46 embedded_outpost = Outpost.objects.filter(managed=MANAGED_OUTPOST).first() 47 self.assertIsNotNone(embedded_outpost) 48 embedded_outpost.managed = "" 49 embedded_outpost.save() 50 response = self.client.patch( 51 reverse("authentik_api:outpost-detail", kwargs={"pk": embedded_outpost.pk}), 52 {"name": "foo"}, 53 ) 54 self.assertEqual(response.status_code, 200) 55 embedded_outpost.refresh_from_db() 56 self.assertEqual(embedded_outpost.managed, MANAGED_OUTPOST)
Test name change for embedded outpost
def
test_outpost_validation(self):
58 def test_outpost_validation(self): 59 """Test Outpost validation""" 60 valid = OutpostSerializer( 61 data={ 62 "name": generate_id(), 63 "type": OutpostType.PROXY, 64 "config": default_outpost_config(), 65 "providers": [ 66 ProxyProvider.objects.create( 67 name=generate_id(), authorization_flow=create_test_flow() 68 ).pk 69 ], 70 } 71 ) 72 self.assertTrue(valid.is_valid()) 73 invalid = OutpostSerializer( 74 data={ 75 "name": generate_id(), 76 "type": OutpostType.PROXY, 77 "config": default_outpost_config(), 78 "providers": [ 79 LDAPProvider.objects.create( 80 name=generate_id(), authorization_flow=create_test_flow() 81 ).pk 82 ], 83 } 84 ) 85 self.assertFalse(invalid.is_valid()) 86 self.assertIn("providers", invalid.errors)
Test Outpost validation
def
test_types(self):
88 def test_types(self): 89 """Test OutpostServiceConnections's types endpoint""" 90 response = self.client.get( 91 reverse("authentik_api:outpostserviceconnection-types"), 92 ) 93 self.assertEqual(response.status_code, 200)
Test OutpostServiceConnections's types endpoint
def
test_outpost_config(self):
95 def test_outpost_config(self): 96 """Test Outpost's config field""" 97 provider = ProxyProvider.objects.create( 98 name=generate_id(), authorization_flow=create_test_flow() 99 ) 100 invalid = OutpostSerializer( 101 data={"name": generate_id(), "providers": [provider.pk], "config": ""} 102 ) 103 self.assertFalse(invalid.is_valid()) 104 self.assertIn("config", invalid.errors) 105 valid = OutpostSerializer( 106 data={ 107 "name": generate_id(), 108 "providers": [provider.pk], 109 "config": default_outpost_config(generate_id()), 110 "type": OutpostType.PROXY, 111 } 112 ) 113 self.assertTrue(valid.is_valid())
Test Outpost's config field