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.
145 lines
5.7 KiB
145 lines
5.7 KiB
from django.core.files.uploadedfile import SimpleUploadedFile
|
|
from django.core.files.uploadedfile import SimpleUploadedFile
|
|
from django.urls import reverse
|
|
from rest_framework import status
|
|
from rest_framework.test import APITestCase
|
|
|
|
from apps.account.models import ProfessorUser, StudentUser
|
|
from apps.course.models.course import Course, CourseCategory
|
|
from apps.course.models.lesson import CourseChapter, CourseLesson, Lesson, LessonCompletion
|
|
from apps.course.models.participant import Participant
|
|
|
|
|
|
class MyCoursesAPITests(APITestCase):
|
|
def setUp(self):
|
|
self.professor = ProfessorUser.objects.create(
|
|
email='prof@example.com',
|
|
fullname='Professor Example',
|
|
experience_years=5,
|
|
)
|
|
self.student = StudentUser.objects.create(
|
|
email='student@example.com',
|
|
fullname='Student Example',
|
|
)
|
|
self.category = CourseCategory.objects.create(
|
|
name='Category',
|
|
slug='category',
|
|
)
|
|
|
|
def _create_course(self, slug, title):
|
|
thumbnail = SimpleUploadedFile('thumb.jpg', b'filecontent', content_type='image/jpeg')
|
|
return Course.objects.create(
|
|
title=title,
|
|
slug=slug,
|
|
category=self.category,
|
|
professor=self.professor,
|
|
thumbnail=thumbnail,
|
|
video_type=Course.VedioTypeChoices.YOUTUBE_LINK,
|
|
video_link='https://example.com/video',
|
|
is_online=False,
|
|
level=Course.LevelChoices.BEGINNER,
|
|
duration=10,
|
|
lessons_count=0,
|
|
description='Description',
|
|
short_description='Short description',
|
|
status=Course.StatusChoices.ONGOING,
|
|
is_free=True,
|
|
)
|
|
|
|
def _attach_lessons(self, course, lesson_specs):
|
|
chapter = CourseChapter.objects.create(
|
|
course=course,
|
|
title=f'{course.title} Chapter',
|
|
priority=1,
|
|
is_active=True,
|
|
)
|
|
|
|
created_lessons = []
|
|
for index, spec in enumerate(lesson_specs, start=1):
|
|
lesson = Lesson.objects.create(
|
|
title=spec['title'],
|
|
content_type=Lesson.ContentTypeChoices.VIDEO_FILE,
|
|
duration=5,
|
|
)
|
|
course_lesson = CourseLesson.objects.create(
|
|
course=course,
|
|
chapter=chapter,
|
|
lesson=lesson,
|
|
priority=index,
|
|
is_active=spec.get('is_active', True),
|
|
)
|
|
created_lessons.append(course_lesson)
|
|
|
|
return created_lessons
|
|
|
|
def test_completed_filter_returns_only_courses_with_all_active_lessons_completed(self):
|
|
completed_course = self._create_course('completed-course', 'Completed Course')
|
|
partial_course = self._create_course('partial-course', 'Partial Course')
|
|
empty_course = self._create_course('empty-course', 'Empty Course')
|
|
|
|
completed_lessons = self._attach_lessons(
|
|
completed_course,
|
|
[
|
|
{'title': 'Completed Lesson 1'},
|
|
{'title': 'Completed Lesson 2'},
|
|
{'title': 'Inactive Lesson', 'is_active': False},
|
|
],
|
|
)
|
|
partial_lessons = self._attach_lessons(
|
|
partial_course,
|
|
[
|
|
{'title': 'Partial Lesson 1'},
|
|
{'title': 'Partial Lesson 2'},
|
|
],
|
|
)
|
|
|
|
Participant.objects.create(student=self.student, course=completed_course)
|
|
Participant.objects.create(student=self.student, course=partial_course)
|
|
Participant.objects.create(student=self.student, course=empty_course)
|
|
|
|
LessonCompletion.objects.create(student=self.student, course_lesson=completed_lessons[0])
|
|
LessonCompletion.objects.create(student=self.student, course_lesson=completed_lessons[1])
|
|
LessonCompletion.objects.create(student=self.student, course_lesson=partial_lessons[0])
|
|
|
|
self.client.force_authenticate(user=self.student)
|
|
url = reverse('course-my-courses-list')
|
|
response = self.client.get(url, {'completed': 'true'}, format='json')
|
|
|
|
self.assertEqual(response.status_code, status.HTTP_200_OK)
|
|
self.assertEqual(response.data['count'], 1)
|
|
self.assertEqual({item['slug'] for item in response.data['results']}, {completed_course.slug})
|
|
|
|
def test_my_courses_without_completed_filter_returns_completed_and_incomplete_courses(self):
|
|
completed_course = self._create_course('all-completed-course', 'All Completed Course')
|
|
partial_course = self._create_course('all-partial-course', 'All Partial Course')
|
|
|
|
completed_lessons = self._attach_lessons(
|
|
completed_course,
|
|
[
|
|
{'title': 'Completed Lesson 1'},
|
|
],
|
|
)
|
|
partial_lessons = self._attach_lessons(
|
|
partial_course,
|
|
[
|
|
{'title': 'Partial Lesson 1'},
|
|
{'title': 'Partial Lesson 2'},
|
|
],
|
|
)
|
|
|
|
Participant.objects.create(student=self.student, course=completed_course)
|
|
Participant.objects.create(student=self.student, course=partial_course)
|
|
|
|
LessonCompletion.objects.create(student=self.student, course_lesson=completed_lessons[0])
|
|
LessonCompletion.objects.create(student=self.student, course_lesson=partial_lessons[0])
|
|
|
|
self.client.force_authenticate(user=self.student)
|
|
url = reverse('course-my-courses-list')
|
|
response = self.client.get(url, format='json')
|
|
|
|
self.assertEqual(response.status_code, status.HTTP_200_OK)
|
|
self.assertEqual(response.data['count'], 2)
|
|
self.assertEqual(
|
|
{item['slug'] for item in response.data['results']},
|
|
{completed_course.slug, partial_course.slug},
|
|
)
|