# Python Imports import json # Django Imports from django.test import TestCase, Client from django.contrib.auth.models import User, Group from django.urls import reverse # Local Imports from stats.models import TrackLesson from yaksh.models import Course, Lesson, LearningUnit, LearningModule class TestTrackLesson(TestCase): def setUp(self): self.client = Client() self.mod_group, created = Group.objects.get_or_create(name='moderator') self.user_plaintext_pass = 'demo' self.user = User.objects.create_user( username='demo_user', password=self.user_plaintext_pass, first_name='first_name', last_name='last_name', email='demo@test.com', ) # Create Student self.student_plaintext_pass = 'demo_student' self.student = User.objects.create_user( username='demo_student', password=self.student_plaintext_pass, first_name='student_first_name', last_name='student_last_name', email='demo_student@test.com' ) # Add to moderator group self.mod_group.user_set.add(self.user) self.course = Course.objects.create( name="Test_course", enrollment="Open Enrollment", creator=self.user ) self.lesson = Lesson.objects.create( name="Test_lesson", description="test description", creator=self.user) self.learning_unit = LearningUnit.objects.create( order=0, type="lesson", lesson=self.lesson ) self.learning_module = LearningModule.objects.create( order=0, name="Test_module", description="Demo module", check_prerequisite=False, creator=self.user ) self.learning_module.learning_unit.add(self.learning_unit.id) self.track = TrackLesson.objects.create( user_id=self.student.id, course_id=self.course.id, lesson_id=self.lesson.id ) def tearDown(self): self.client.logout() self.mod_group.delete() self.user.delete() self.student.delete() self.course.delete() self.learning_unit.delete() self.learning_module.delete() def test_add_video_track(self): self.client.login( username=self.student.username, password=self.student_plaintext_pass ) # Student not enrolled in the course fails to add the tracking response = self.client.post( reverse('stats:add_tracker', kwargs={"tracker_id": self.track.id}), data={'video_duration': '00:05:00'} ) self.assertEqual(response.status_code, 404) self.course.students.add(self.student.id) # No current time given in the post data response = self.client.post( reverse('stats:add_tracker', kwargs={"tracker_id": self.track.id}), data={'video_duration': '00:05:00'} ) self.assertEqual(response.status_code, 200) self.assertFalse(response.json().get('success')) # Valid post data response = self.client.post( reverse('stats:add_tracker', kwargs={"tracker_id": self.track.id}), data={'video_duration': '00:05:00', 'current_video_time': '00:01:00'} ) self.assertEqual(response.status_code, 200) self.assertTrue(response.json().get('success')) def test_disallow_student_view_tracking(self): self.client.login( username=self.student.username, password=self.student_plaintext_pass ) # Fails to view the lesson data for student response = self.client.get( reverse('stats:view_lesson_watch_stats', kwargs={"course_id": self.course.id, "lesson_id": self.lesson.id}) ) self.assertEqual(response.status_code, 404) def test_allow_moderator_view_tracking(self): self.client.login( username=self.user.username, password=self.user_plaintext_pass ) # Course creator can view the lesson data response = self.client.get( reverse('stats:view_lesson_watch_stats', kwargs={"course_id": self.course.id, "lesson_id": self.lesson.id}) ) response_data = response.context self.assertEqual(response.status_code, 200) self.assertEqual(response_data.get('total'), 1) expected_tracker = list(TrackLesson.objects.filter( user_id=self.student.id, course_id=self.course.id, lesson_id=self.lesson.id).values_list("id", flat=True)) obtained_tracker = list(response_data.get( 'objects').object_list.values_list("id", flat=True)) self.assertEqual(obtained_tracker, expected_tracker)