diff options
-rw-r--r-- | .sampleenv | 13 | ||||
-rw-r--r-- | .travis.yml | 1 | ||||
-rw-r--r-- | stats/tests.py | 139 | ||||
-rw-r--r-- | stats/views.py | 1 |
4 files changed, 152 insertions, 2 deletions
diff --git a/.sampleenv b/.sampleenv new file mode 100644 index 0000000..a31ec1f --- /dev/null +++ b/.sampleenv @@ -0,0 +1,13 @@ +# Django settings +SECRET_KEY=dUmMy_s3cR3t_k3y +#DB_ENGINE=mysql +#DB_NAME=yaksh +#DB_USER=root +#DB_PASSWORD=root +#DB_HOST=yaksh-db +#DB_PORT=3306 +# Yaksh settings +N_CODE_SERVERS=5 +#SERVER_POOL_PORT=53579 +#SERVER_HOST_NAME=http://yaksh-codeserver +#SERVER_TIMEOUT=4 diff --git a/.travis.yml b/.travis.yml index fd0746c..d7e63e8 100644 --- a/.travis.yml +++ b/.travis.yml @@ -29,6 +29,7 @@ before_script: script: - coverage erase - coverage run -p manage.py test -v 2 yaksh + - coverage run -p manage.py test -v 2 stats - coverage run -p manage.py test -v 2 grades - coverage run -p manage.py test -v 2 yaksh.live_server_tests.load_test - coverage run -p manage.py test -v 2 api diff --git a/stats/tests.py b/stats/tests.py index 7ce503c..c256feb 100644 --- a/stats/tests.py +++ b/stats/tests.py @@ -1,3 +1,138 @@ -from django.test import TestCase +# 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) -# Create your tests here. diff --git a/stats/views.py b/stats/views.py index ddbc1b3..3bfe9c3 100644 --- a/stats/views.py +++ b/stats/views.py @@ -4,6 +4,7 @@ from django.http import JsonResponse from django.utils import timezone from django.contrib.auth.decorators import login_required from django.core.paginator import Paginator +from django.http import Http404 # Local Imports from stats.models import TrackLesson |