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.
 
 

240 lines
9.2 KiB

"""
تست‌های سیستم نقش‌های چندگانه
"""
from django.test import TestCase
from django.contrib.auth.models import Group
from apps.account.models import User
from apps.course.models import Course, CourseCategory, Participant
from apps.transaction.models import TransactionParticipant
class MultipleRolesTestCase(TestCase):
def setUp(self):
"""راه‌اندازی داده‌های تست"""
# ایجاد گروه‌ها
self.professor_group = Group.objects.create(name="Professor Group")
self.student_group = Group.objects.create(name="Student Group")
self.client_group = Group.objects.create(name="Client Group")
# ایجاد کاربر
self.user = User.objects.create_user(
email='test@example.com',
fullname='Test User',
password='testpass123'
)
# حذف language برای جلوگیری از خطای foreign key
self.user.language = None
self.user.save()
# ایجاد دسته‌بندی دوره
self.category = CourseCategory.objects.create(
name='Test Category',
slug='test-category'
)
def test_user_can_have_multiple_roles(self):
"""تست اینکه کاربر می‌تواند چندین نقش داشته باشد"""
# اضافه کردن نقش professor
self.user.add_role('professor')
self.assertTrue(self.user.has_role('professor'))
self.assertEqual(self.user.primary_role, User.UserType.PROFESSOR)
# اضافه کردن نقش student
self.user.add_role('student')
self.assertTrue(self.user.has_role('student'))
self.assertTrue(self.user.has_role('professor')) # نقش قبلی حفظ شده
# نقش اصلی باید professor باشد (اولویت بالاتر)
self.assertEqual(self.user.primary_role, User.UserType.PROFESSOR)
# لیست تمام نقش‌ها
roles = self.user.get_all_roles()
self.assertIn('professor', roles)
self.assertIn('student', roles)
def test_remove_role(self):
"""تست حذف نقش"""
# اضافه کردن دو نقش
self.user.add_role('professor')
self.user.add_role('student')
# حذف نقش professor
self.user.remove_role('professor')
self.assertFalse(self.user.has_role('professor'))
self.assertTrue(self.user.has_role('student'))
# نقش اصلی باید student شود
self.assertEqual(self.user.primary_role, User.UserType.STUDENT)
def test_course_creation_and_enrollment(self):
"""تست ایجاد دوره و ثبت‌نام در دوره دیگر"""
# کاربر نقش professor می‌گیرد
self.user.add_role('professor')
# ایجاد دوره
course1 = Course.objects.create(
title='Test Course 1',
slug='test-course-1',
category=self.category,
professor=self.user,
level='beginner',
duration=10,
lessons_count=5,
description='Test description'
)
# بررسی اینکه کاربر می‌تواند دوره را مدیریت کند
self.assertTrue(self.user.can_manage_course(course1))
# کاربر دیگری دوره دیگری می‌سازد
other_user = User.objects.create_user(
email='other@example.com',
fullname='Other User',
password='testpass123'
)
other_user.language = None
other_user.save()
other_user.add_role('professor')
course2 = Course.objects.create(
title='Test Course 2',
slug='test-course-2',
category=self.category,
professor=other_user,
level='beginner',
duration=10,
lessons_count=5,
description='Test description 2'
)
# کاربر اول در دوره دوم شرکت می‌کند
self.user.add_role('student')
participant = Participant.objects.create(
student=self.user,
course=course2
)
# بررسی نقش‌ها
self.assertTrue(self.user.has_role('professor')) # هنوز استاد است
self.assertTrue(self.user.has_role('student')) # و دانش‌آموز هم هست
# بررسی دسترسی‌ها
self.assertTrue(self.user.can_manage_course(course1)) # دوره خودش
self.assertFalse(self.user.can_manage_course(course2)) # دوره دیگری
def test_transaction_preserves_professor_role(self):
"""تست اینکه transaction نقش professor را حفظ می‌کند"""
# کاربر استاد می‌شود
self.user.add_role('professor')
# ایجاد دوره
course = Course.objects.create(
title='Test Course',
slug='test-course',
category=self.category,
professor=self.user,
level='beginner',
duration=10,
lessons_count=5,
description='Test description',
is_free=True
)
# شبیه‌سازی transaction (کاربر در دوره‌ای شرکت می‌کند)
if not self.user.has_role('student'):
self.user.add_role('student')
# بررسی اینکه هر دو نقش حفظ شده‌اند
self.assertTrue(self.user.has_role('professor'))
self.assertTrue(self.user.has_role('student'))
# نقش اصلی باید professor باشد
self.assertEqual(self.user.primary_role, User.UserType.PROFESSOR)
def test_permissions(self):
"""تست دسترسی‌ها"""
# کاربر بدون نقش خاص
self.assertFalse(self.user.can_teach_course())
self.assertTrue(self.user.can_enroll_course())
# اضافه کردن نقش professor
self.user.add_role('professor')
self.assertTrue(self.user.can_teach_course())
self.assertTrue(self.user.can_enroll_course())
# حذف نقش professor
self.user.remove_role('professor')
self.assertFalse(self.user.can_teach_course())
self.assertTrue(self.user.can_enroll_course())
def test_user_type_based_on_groups_compatibility(self):
"""تست سازگاری با property قدیمی"""
# اضافه کردن نقش student
self.user.add_role('student')
self.user.refresh_from_db() # بروزرسانی از دیتابیس
self.assertEqual(self.user.user_type_based_on_groups, User.UserType.STUDENT)
# اضافه کردن نقش professor
self.user.add_role('professor')
self.user.refresh_from_db() # بروزرسانی از دیتابیس
# property قدیمی بر اساس اولویت کار می‌کند - student اول چک می‌شود
# پس باید student برگرداند نه professor
self.assertEqual(self.user.user_type_based_on_groups, User.UserType.STUDENT)
# حذف نقش student
self.user.remove_role('student')
self.user.refresh_from_db()
self.assertEqual(self.user.user_type_based_on_groups, User.UserType.PROFESSOR)
# حذف همه نقش‌ها
self.user.remove_role('professor')
self.user.refresh_from_db()
self.assertEqual(self.user.user_type_based_on_groups, User.UserType.CLIENT)
def test_admin_priority_over_professor(self):
"""تست اولویت admin بر professor"""
# کاربر هم admin و هم professor است
self.user.add_role('admin')
self.user.add_role('professor')
self.user.is_staff = True
self.user.save()
# ایجاد دوره
course = Course.objects.create(
title='Test Course',
slug='test-course',
category=self.category,
professor=self.user,
level='beginner',
duration=10,
lessons_count=5,
description='Test description'
)
# admin باید دسترسی کامل داشته باشد
self.assertTrue(self.user.can_manage_course(course))
self.assertTrue(self.user.can_teach_course())
# حتی اگر دوره متعلق به کس دیگری باشد
other_user = User.objects.create_user(
email='other@example.com',
fullname='Other User',
password='testpass123'
)
other_user.language = None
other_user.save()
other_user.add_role('professor')
other_course = Course.objects.create(
title='Other Course',
slug='other-course',
category=self.category,
professor=other_user,
level='beginner',
duration=10,
lessons_count=5,
description='Other description'
)
# admin باید به دوره دیگران هم دسترسی داشته باشد
self.assertTrue(self.user.can_manage_course(other_course))