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
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))
|