policies: fix test API not working, add tests
Signed-off-by: Jens Langhammer <jens.langhammer@beryju.org>
This commit is contained in:
		| @ -1,6 +1,5 @@ | ||||
| """policy API Views""" | ||||
| from django.core.cache import cache | ||||
| from django.http.response import HttpResponseBadRequest | ||||
| from django.urls import reverse | ||||
| from drf_yasg.utils import no_body, swagger_auto_schema | ||||
| from guardian.shortcuts import get_objects_for_user | ||||
| @ -127,8 +126,6 @@ class PolicyViewSet( | ||||
|     @action(detail=False, methods=["POST"]) | ||||
|     def cache_clear(self, request: Request) -> Response: | ||||
|         """Clear policy cache""" | ||||
|         if not request.user.is_superuser: | ||||
|             return HttpResponseBadRequest() | ||||
|         keys = cache.keys("policy_*") | ||||
|         cache.delete_many(keys) | ||||
|         LOGGER.debug("Cleared Policy cache", keys=len(keys)) | ||||
| @ -143,16 +140,17 @@ class PolicyViewSet( | ||||
|         responses={200: PolicyTestResultSerializer()}, | ||||
|     ) | ||||
|     @action(detail=True, methods=["POST"]) | ||||
|     def test(self, request: Request) -> Response: | ||||
|     # pylint: disable=unused-argument, invalid-name | ||||
|     def test(self, request: Request, pk: str) -> Response: | ||||
|         """Test policy""" | ||||
|         policy = self.get_object() | ||||
|         test_params = PolicyTestSerializer(request.data) | ||||
|         test_params = PolicyTestSerializer(data=request.data) | ||||
|         if not test_params.is_valid(): | ||||
|             return Response(test_params.errors, status=400) | ||||
|  | ||||
|         # User permission check, only allow policy testing for users that are readable | ||||
|         users = get_objects_for_user(request.user, "authentik_core.view_user").filter( | ||||
|             pk=test_params["user"] | ||||
|             pk=test_params.validated_data["user"].pk | ||||
|         ) | ||||
|         if not users.exists(): | ||||
|             raise PermissionDenied() | ||||
| @ -165,4 +163,4 @@ class PolicyViewSet( | ||||
|         proc = PolicyProcess(PolicyBinding(policy=policy), p_request, None) | ||||
|         result = proc.execute() | ||||
|         response = PolicyTestResultSerializer(result) | ||||
|         return Response(response) | ||||
|         return Response(response.data) | ||||
|  | ||||
							
								
								
									
										28
									
								
								authentik/policies/tests/test_api.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								authentik/policies/tests/test_api.py
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,28 @@ | ||||
| """Test policies API""" | ||||
| from django.urls import reverse | ||||
| from rest_framework.test import APITestCase | ||||
|  | ||||
| from authentik.core.models import User | ||||
| from authentik.policies.dummy.models import DummyPolicy | ||||
|  | ||||
|  | ||||
| class TestPoliciesAPI(APITestCase): | ||||
|     """Test policies API""" | ||||
|  | ||||
|     def setUp(self) -> None: | ||||
|         super().setUp() | ||||
|         self.policy = DummyPolicy.objects.create(name="dummy", result=True) | ||||
|         self.user = User.objects.get(username="akadmin") | ||||
|         self.client.force_login(self.user) | ||||
|  | ||||
|     def test_test_call(self): | ||||
|         """Test Policy's test endpoint""" | ||||
|         response = self.client.post( | ||||
|             reverse("authentik_api:policy-test", kwargs={"pk": self.policy.pk}), | ||||
|             data={ | ||||
|                 "user": self.user.pk, | ||||
|             }, | ||||
|         ) | ||||
|         self.assertJSONEqual( | ||||
|             response.content.decode(), {"passing": True, "messages": ["dummy"]} | ||||
|         ) | ||||
		Reference in New Issue
	
	Block a user
	 Jens Langhammer
					Jens Langhammer