from django.core.files.uploadedfile import SimpleUploadedFile from django.urls import reverse from rest_framework.test import APITestCase from apps.account.models import ProfessorUser from apps.course.models import Course, CourseCategory, CourseLesson, Lesson class TestProfessorAPI(APITestCase): def setUp(self): self.professor = ProfessorUser.objects.create( email='professor@example.com', fullname='استاد نمونه', experience_years=7, ) self.category = CourseCategory.objects.create(name='General', slug='general') thumbnail = SimpleUploadedFile('thumb.jpg', b'filecontent', content_type='image/jpeg') self.course = Course.objects.create( title='Test Course', slug='test-course', category=self.category, professor=self.professor, thumbnail=thumbnail, video_type=Course.VedioTypeChoices.YOUTUBE_LINK, video_link='https://example.com/video', is_online=True, online_link='https://example.com/classroom', level=Course.LevelChoices.BEGINNER, duration=10, lessons_count=1, description='Sample description', short_description='Short description', status=Course.StatusChoices.ONGOING, is_free=True, ) lesson = Lesson.objects.create( title='Lesson 1', content_type=Lesson.ContentTypeChoices.VIDEO_FILE, duration=5, ) CourseLesson.objects.create(course=self.course, lesson=lesson, priority=1, is_active=True) self.professor.refresh_from_db() def test_professor_list_api(self): url = reverse('course-professor-list') response = self.client.get(url) self.assertEqual(response.status_code, 200) self.assertEqual(response.data['count'], 1) item = response.data['results'][0] self.assertEqual(item['slug'], self.professor.slug) self.assertEqual(item['fullname'], self.professor.fullname) self.assertEqual(item['experience_years'], 7) self.assertEqual(item['course_count'], 1) self.assertEqual(item['lesson_count'], 1) def test_professor_detail_api(self): url = reverse('course-professor-detail', kwargs={'slug': self.professor.slug}) response = self.client.get(url) self.assertEqual(response.status_code, 200) data = response.data self.assertEqual(data['slug'], self.professor.slug) self.assertEqual(data['fullname'], self.professor.fullname) self.assertEqual(data['experience_years'], 7) self.assertEqual(data['course_count'], 1) self.assertEqual(data['lesson_count'], 1) def test_professor_courses_api(self): url = reverse('course-professor-course-list', kwargs={'slug': self.professor.slug}) response = self.client.get(url) self.assertEqual(response.status_code, 200) self.assertEqual(response.data['count'], 1) course_data = response.data['results'][0] self.assertEqual(course_data['id'], self.course.id) self.assertEqual(course_data['title'], self.course.title) def test_professor_slug_generated_without_fullname(self): professor = ProfessorUser.objects.create( email='slugless@example.com', fullname='', ) self.assertTrue(professor.slug) def test_course_creation_promotes_professor_user(self): professor = ProfessorUser.objects.create( email='pending@example.com', fullname='کاربر موقت', ) professor.user_type = ProfessorUser.UserType.CLIENT professor.slug = None professor.save(update_fields=['user_type', 'slug']) thumbnail = SimpleUploadedFile('thumb2.jpg', b'filecontent', content_type='image/jpeg') Course.objects.create( title='Auto Promote Course', slug='auto-promote-course', category=self.category, professor=professor, thumbnail=thumbnail, video_type=Course.VedioTypeChoices.YOUTUBE_LINK, video_link='https://example.com/video2', is_online=False, level=Course.LevelChoices.BEGINNER, duration=5, lessons_count=0, description='Test', short_description='Test', status=Course.StatusChoices.REGISTERING, is_free=True, ) professor.refresh_from_db() self.assertEqual(professor.user_type, ProfessorUser.UserType.PROFESSOR) self.assertTrue(professor.slug)