from django.test import TestCase from django.contrib.auth import get_user_model from apps.account.models import StudentUser from apps.course.models import Course, CourseCategory, Participant from apps.transaction.models import TransactionParticipant from apps.account.models import ProfessorUser User = get_user_model() class TransactionParticipantSignalTest(TestCase): def setUp(self): """تنظیمات اولیه برای تست""" # ایجاد کاربر self.user = User.objects.create_user( email='test@example.com', password='testpass123' ) # ایجاد استاد self.professor = ProfessorUser.objects.create( email='professor@example.com', password='testpass123' ) # ایجاد دسته‌بندی دوره self.category = CourseCategory.objects.create( name='Test Category', slug='test-category' ) # ایجاد دوره self.course = Course.objects.create( title='Test Course', slug='test-course', category=self.category, professor=self.professor, video_type='youtube_link', level='beginner', duration=10, lessons_count=5, description='Test course description', is_free=False, price=100.00, final_price=100.00 ) def test_participant_created_on_success_status(self): """تست ایجاد participant هنگام تغییر وضعیت به SUCCESS""" # ایجاد تراکنش با وضعیت PENDING transaction = TransactionParticipant.objects.create( user=self.user, course=self.course, price=100.00, status=TransactionParticipant.TransactionStatus.PENDING ) # بررسی که participant ایجاد نشده self.assertFalse( Participant.objects.filter(student=self.user, course=self.course).exists() ) # تغییر وضعیت به SUCCESS transaction.status = TransactionParticipant.TransactionStatus.SUCCESS transaction.save() # بررسی که participant ایجاد شده self.assertTrue( Participant.objects.filter(student=self.user, course=self.course).exists() ) # بررسی که کاربر نقش student دارد self.assertTrue(self.user.has_role('student')) def test_participant_created_on_direct_success(self): """تست ایجاد participant هنگام ایجاد تراکنش با وضعیت SUCCESS""" # ایجاد تراکنش مستقیماً با وضعیت SUCCESS transaction = TransactionParticipant.objects.create( user=self.user, course=self.course, price=100.00, status=TransactionParticipant.TransactionStatus.SUCCESS ) # بررسی که participant ایجاد شده self.assertTrue( Participant.objects.filter(student=self.user, course=self.course).exists() ) # بررسی که کاربر نقش student دارد self.assertTrue(self.user.has_role('student')) def test_no_duplicate_participant(self): """تست عدم ایجاد participant تکراری""" # ایجاد participant دستی existing_participant = Participant.objects.create( student=self.user, course=self.course ) # ایجاد تراکنش با وضعیت SUCCESS transaction = TransactionParticipant.objects.create( user=self.user, course=self.course, price=100.00, status=TransactionParticipant.TransactionStatus.SUCCESS ) # بررسی که فقط یک participant وجود دارد self.assertEqual( Participant.objects.filter(student=self.user, course=self.course).count(), 1 ) def test_model_helper_methods(self): """تست متدهای کمکی مدل""" # ایجاد تراکنش transaction = TransactionParticipant.objects.create( user=self.user, course=self.course, price=100.00, status=TransactionParticipant.TransactionStatus.PENDING ) # بررسی که participant وجود ندارد self.assertFalse(transaction.is_participant_enrolled()) self.assertIsNone(transaction.get_participant()) # ایجاد participant participant = Participant.objects.create( student=self.user, course=self.course ) # بررسی که participant وجود دارد self.assertTrue(transaction.is_participant_enrolled()) self.assertEqual(transaction.get_participant(), participant)