You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
125 lines
4.4 KiB
125 lines
4.4 KiB
from django.contrib.auth.models import Group
|
|
from django.urls import reverse
|
|
from rest_framework import status
|
|
from rest_framework.authtoken.models import Token
|
|
from rest_framework.test import APITestCase
|
|
|
|
from apps.account.models import User
|
|
|
|
|
|
class AdminPanelAccessTests(APITestCase):
|
|
def setUp(self):
|
|
self.student_group = Group.objects.create(name="Student Group")
|
|
self.professor_group = Group.objects.create(name="Professor Group")
|
|
self.admin_group = Group.objects.create(name="Admin Group")
|
|
self.super_admin_group = Group.objects.create(name="Super Admin Group")
|
|
|
|
self.super_admin = User.objects.create_superuser(
|
|
email="superadmin@example.com",
|
|
password="SuperSecret123!",
|
|
fullname="Super Admin",
|
|
)
|
|
self.super_admin.language = None
|
|
self.super_admin.save()
|
|
self.super_admin_token = Token.objects.create(user=self.super_admin)
|
|
|
|
def _create_user(self, **kwargs):
|
|
password = kwargs.pop("password")
|
|
user = User.objects.create_user(password=password, **kwargs)
|
|
user.language = None
|
|
user.save()
|
|
return user
|
|
|
|
def test_student_with_staff_flag_cannot_login_to_admin_panel(self):
|
|
user = self._create_user(
|
|
email="student@example.com",
|
|
password="StudentPass123!",
|
|
fullname="Student User",
|
|
user_type=User.UserType.STUDENT,
|
|
is_staff=True,
|
|
)
|
|
|
|
response = self.client.post(
|
|
reverse("admin-login"),
|
|
{"email": user.email, "password": "StudentPass123!"},
|
|
format="json",
|
|
)
|
|
|
|
self.assertEqual(response.status_code, status.HTTP_401_UNAUTHORIZED)
|
|
|
|
def test_professor_can_login_to_admin_panel(self):
|
|
professor = self._create_user(
|
|
email="professor@example.com",
|
|
password="ProfessorPass123!",
|
|
fullname="Professor User",
|
|
user_type=User.UserType.PROFESSOR,
|
|
)
|
|
professor.add_role("professor")
|
|
|
|
response = self.client.post(
|
|
reverse("admin-login"),
|
|
{"email": professor.email, "password": "ProfessorPass123!"},
|
|
format="json",
|
|
)
|
|
|
|
self.assertEqual(response.status_code, status.HTTP_201_CREATED)
|
|
self.assertEqual(response.data["user_type"], "professor")
|
|
|
|
def test_admin_can_login_to_admin_panel(self):
|
|
admin = self._create_user(
|
|
email="admin@example.com",
|
|
password="AdminPass123!",
|
|
fullname="Admin User",
|
|
user_type=User.UserType.ADMIN,
|
|
)
|
|
admin.add_role("admin")
|
|
|
|
response = self.client.post(
|
|
reverse("admin-login"),
|
|
{"email": admin.email, "password": "AdminPass123!"},
|
|
format="json",
|
|
)
|
|
|
|
self.assertEqual(response.status_code, status.HTTP_201_CREATED)
|
|
self.assertEqual(response.data["user_type"], "admin")
|
|
|
|
def test_updating_user_to_student_revokes_panel_access(self):
|
|
target_user = self._create_user(
|
|
email="target@example.com",
|
|
password="TargetPass123!",
|
|
fullname="Target User",
|
|
user_type=User.UserType.PROFESSOR,
|
|
is_staff=True,
|
|
)
|
|
target_user.add_role("professor")
|
|
target_user.add_role("admin")
|
|
target_user.is_superuser = True
|
|
target_user.save(update_fields=["is_superuser", "is_staff"])
|
|
|
|
self.client.credentials(HTTP_AUTHORIZATION=f"Token {self.super_admin_token.key}")
|
|
update_response = self.client.patch(
|
|
reverse("admin-users-detail", args=[target_user.id]),
|
|
{
|
|
"user_type": User.UserType.STUDENT,
|
|
"is_staff": True,
|
|
"is_superuser": True,
|
|
},
|
|
format="json",
|
|
)
|
|
|
|
self.assertEqual(update_response.status_code, status.HTTP_200_OK)
|
|
|
|
target_user.refresh_from_db()
|
|
self.assertEqual(target_user.user_type, User.UserType.STUDENT)
|
|
self.assertFalse(target_user.is_staff)
|
|
self.assertFalse(target_user.is_superuser)
|
|
self.assertFalse(target_user.has_role("professor"))
|
|
self.assertFalse(target_user.has_role("admin"))
|
|
|
|
self.client.credentials()
|
|
login_response = self.client.post(
|
|
reverse("admin-login"),
|
|
{"email": target_user.email, "password": "TargetPass123!"},
|
|
format="json",
|
|
)
|
|
self.assertEqual(login_response.status_code, status.HTTP_401_UNAUTHORIZED)
|