""" تست‌های سیستم نقش‌های چندگانه """ 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))