summaryrefslogtreecommitdiff
path: root/api/tests.py
diff options
context:
space:
mode:
Diffstat (limited to 'api/tests.py')
-rw-r--r--api/tests.py906
1 files changed, 906 insertions, 0 deletions
diff --git a/api/tests.py b/api/tests.py
new file mode 100644
index 0000000..4ef6fa4
--- /dev/null
+++ b/api/tests.py
@@ -0,0 +1,906 @@
+from django.test import TestCase
+from django.urls import reverse
+from django.contrib.auth.models import User
+from rest_framework.test import APIClient
+from rest_framework import status
+from yaksh.models import (
+ Question, Quiz, QuestionPaper, QuestionSet,
+ AnswerPaper, Course, LearningModule, LearningUnit, StandardTestCase,
+ McqTestCase, Profile
+)
+from api.serializers import (
+ QuestionSerializer, QuizSerializer,
+ QuestionPaperSerializer, AnswerPaperSerializer
+)
+from datetime import datetime
+import pytz
+from textwrap import dedent
+from yaksh.settings import SERVER_POOL_PORT
+from yaksh.code_server import ServerPool
+from yaksh import settings
+from threading import Thread
+import time
+import json
+
+
+class QuestionListTestCase(TestCase):
+ """ Test get all questions and create a new question """
+
+ def setUp(self):
+ self.client = APIClient()
+ self.username = 'demo'
+ self.password = 'demo'
+ self.user = User.objects.create_user(username=self.username,
+ password=self.password)
+ Question.objects.create(summary='test question 1', language='python',
+ type='mcq', user=self.user)
+ Question.objects.create(summary='test question 2', language='python',
+ type='mcq', user=self.user)
+
+ def test_get_all_questions_anonymous(self):
+ # When
+ response = self.client.get(reverse('api:questions'))
+ # Then
+ self.assertEqual(response.status_code, status.HTTP_401_UNAUTHORIZED)
+
+ def test_get_all_questions(self):
+ # Given
+ questions = Question.objects.filter(user=self.user)
+ serializer = QuestionSerializer(questions, many=True)
+ # When
+ self.client.login(username=self.username, password=self.password)
+ response = self.client.get(reverse('api:questions'))
+ # Then
+ self.assertEqual(response.status_code, status.HTTP_200_OK)
+ self.assertEqual(len(response.data), 2)
+ self.assertEqual(response.data, serializer.data)
+
+ def test_create_question_invalid_data(self):
+ # Given
+ data = {'summary': 'Add test question', 'user': self.user.id}
+ # When
+ self.client.login(username=self.username, password=self.password)
+ response = self.client.post(reverse('api:questions'), data)
+ # Then
+ self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
+ self.assertFalse(Question.objects.filter(
+ summary='Add test question').exists())
+
+ def test_create_question_valid_data(self):
+ # Given
+ data = {'summary': 'Add test question', 'description': 'test',
+ 'language': 'python', 'type': 'mcq', 'user': self.user.id}
+ # When
+ self.client.login(username=self.username, password=self.password)
+ response = self.client.post(reverse('api:questions'), data)
+ # Then
+ self.assertEqual(response.status_code, status.HTTP_201_CREATED)
+ self.assertTrue(Question.objects.filter(
+ summary='Add test question').exists())
+
+ def tearDown(self):
+ self.client.logout()
+ User.objects.all().delete()
+ Question.objects.all().delete()
+
+
+class QuestionDetailTestCase(TestCase):
+ """ Test get, update or delete a question """
+
+ def setUp(self):
+ self.client = APIClient()
+ self.username = 'demo'
+ self.password = 'demo'
+ self.otherusername = 'otheruser'
+ self.user = User.objects.create_user(username=self.username,
+ password=self.password)
+ self.otheruser = User.objects.create_user(username=self.otherusername,
+ password=self.password)
+ Question.objects.create(summary='test question', language='python',
+ type='mcq', user=self.user)
+ Question.objects.create(summary='delete question', language='python',
+ type='mcq', user=self.user)
+ Question.objects.create(summary='Created by other user',
+ language='python', type='mcq',
+ user=self.otheruser)
+
+ def test_get_question_anonymous(self):
+ # Given
+ question = Question.objects.get(summary='test question')
+ # When
+ response = self.client.get(reverse('api:question',
+ kwargs={'pk': question.id}))
+ # Then
+ self.assertEqual(response.status_code, status.HTTP_401_UNAUTHORIZED)
+
+ def test_get_question_invalid_pk(self):
+ # Given
+ invalid_pk = 3243
+ # When
+ self.client.login(username=self.username, password=self.password)
+ response = self.client.get(reverse('api:question',
+ kwargs={'pk': invalid_pk}))
+ # Then
+ self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)
+
+ def test_get_question(self):
+ # Given
+ question = Question.objects.get(summary='test question')
+ serializer = QuestionSerializer(question)
+ # When
+ self.client.login(username=self.username, password=self.password)
+ response = self.client.get(reverse('api:question',
+ kwargs={'pk': question.id}))
+ # Then
+ self.assertEqual(response.status_code, status.HTTP_200_OK)
+ self.assertEqual(response.data, serializer.data)
+
+ def test_get_question_not_own(self):
+ # Given
+ question = Question.objects.get(summary='Created by other user')
+ # When
+ self.client.login(username=self.username, password=self.password)
+ response = self.client.get(reverse('api:question',
+ kwargs={'pk': question.id}))
+ # Then
+ self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)
+
+ def test_edit_question_anonymous(self):
+ # Given
+ question = Question.objects.get(summary='test question')
+ data = {'summary': 'Edited test question', 'description': 'test',
+ 'language': 'python', 'type': 'mcq', 'user': self.user.id}
+ # When
+ response = self.client.put(reverse('api:question',
+ kwargs={'pk': question.id}), data)
+ # Then
+ self.assertEqual(response.status_code, status.HTTP_401_UNAUTHORIZED)
+
+ def test_edit_question_invalid_data(self):
+ # Given
+ question = Question.objects.get(summary='test question')
+ data = {'summary': 'Edited test question', 'user': self.user.id}
+ # When
+ self.client.login(username=self.username, password=self.password)
+ response = self.client.put(reverse('api:question',
+ kwargs={'pk': question.id}), data)
+ # Then
+ self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
+
+ def test_edit_question(self):
+ # Given
+ question = Question.objects.get(summary='test question')
+ data = {'summary': 'Edited test question', 'description': 'test',
+ 'language': 'python', 'type': 'mcq', 'user': self.user.id}
+ # When
+ self.client.login(username=self.username, password=self.password)
+ response = self.client.put(reverse('api:question',
+ kwargs={'pk': question.id}), data)
+ # Then
+ self.assertEqual(response.status_code, status.HTTP_200_OK)
+ question = Question.objects.get(pk=question.pk)
+ self.assertEqual(question.summary, 'Edited test question')
+
+ def test_delete_question_anonymous(self):
+ # Given
+ question = Question.objects.get(summary='delete question')
+ # When
+ response = self.client.delete(reverse('api:question',
+ kwargs={'pk': question.id}))
+ # Then
+ self.assertEqual(response.status_code, status.HTTP_401_UNAUTHORIZED)
+
+ def test_delete_question_not_own(self):
+ # Given
+ question = Question.objects.get(summary='Created by other user')
+ # When
+ self.client.login(username=self.username, password=self.password)
+ response = self.client.delete(reverse('api:question',
+ kwargs={'pk': question.id}))
+ # Then
+ self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)
+ self.assertTrue(Question.objects.filter(pk=question.id).exists())
+
+ def test_delete_question(self):
+ # Given
+ question = Question.objects.get(summary='delete question')
+ # When
+ self.client.login(username=self.username, password=self.password)
+ response = self.client.delete(reverse('api:question',
+ kwargs={'pk': question.id}))
+ # Then
+ self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT)
+ self.assertFalse(Question.objects.filter(pk=question.id).exists())
+
+ def tearDown(self):
+ self.client.logout()
+ User.objects.all().delete()
+ Question.objects.all().delete()
+
+
+class QuestionPaperListTestCase(TestCase):
+ """ Test get all question paper and create a new question paper """
+
+ def setUp(self):
+ self.client = APIClient()
+ self.username = 'demo'
+ self.otherusername = 'otheruser'
+ self.password = 'demo'
+ self.user = User.objects.create_user(username=self.username,
+ password=self.password)
+ self.otheruser = User.objects.create_user(username=self.otherusername,
+ password=self.password)
+ self.quiz1 = Quiz.objects.create(description='Quiz1',
+ creator=self.user)
+ self.quiz2 = Quiz.objects.create(description='Quiz2',
+ creator=self.user)
+ self.quiz3 = Quiz.objects.create(description='Quiz3',
+ creator=self.otheruser)
+ self.quiz4 = Quiz.objects.create(description='Quiz4',
+ creator=self.user)
+ self.quiz5 = Quiz.objects.create(description='Quiz5',
+ creator=self.user)
+ self.quiz6 = Quiz.objects.create(description='Quiz6',
+ creator=self.otheruser)
+ self.questionpaper = QuestionPaper.objects.create(quiz=self.quiz1)
+ self.questionpaper2 = QuestionPaper.objects.create(quiz=self.quiz2)
+ QuestionPaper.objects.create(quiz=self.quiz3)
+
+ self.question1 = Question.objects.create(summary='Q1', user=self.user,
+ language='python', type='mcq')
+ self.question2 = Question.objects.create(summary='Q2', user=self.user,
+ language='python', type='mcq')
+ self.question3 = Question.objects.create(summary='Q3', user=self.user,
+ language='python', type='mcq')
+ self.question4 = Question.objects.create(summary='Q4', user=self.user,
+ language='python', type='mcq')
+ self.question5 = Question.objects.create(summary='Q5',
+ user=self.otheruser,
+ language='python', type='mcq')
+ self.questionset = QuestionSet.objects.create(marks=1, num_questions=1)
+ self.questionset.questions.add(self.question3)
+ self.questionset.questions.add(self.question4)
+ self.questionset.save()
+ self.questionpaper.fixed_questions.add(self.question1)
+ self.questionpaper.fixed_questions.add(self.question2)
+ self.questionpaper.random_questions.add(self.questionset)
+ self.questionpaper.save()
+ self.questionpaper.update_total_marks()
+
+ def test_get_all_questionpapers_anonymous(self):
+ # When
+ response = self.client.get(reverse('api:questionpapers'))
+ # Then
+ self.assertEqual(response.status_code, status.HTTP_401_UNAUTHORIZED)
+
+ def test_get_all_questionpaper(self):
+ # Given
+ questionpapers = QuestionPaper.objects.filter(
+ quiz__in=[self.quiz1, self.quiz2]
+ )
+ serializer = QuestionPaperSerializer(questionpapers, many=True)
+ # When
+ self.client.login(username=self.username, password=self.password)
+ response = self.client.get(reverse('api:questionpapers'))
+ # Then
+ self.assertEqual(response.status_code, status.HTTP_200_OK)
+ self.assertEqual(len(response.data), 2)
+ self.assertEqual(response.data, serializer.data)
+
+ def test_create_questionpaper_invalid_data(self):
+ # Given
+ data = {'fixed_questions': [self.question1.id], 'user': self.user.id}
+ # When
+ self.client.login(username=self.username, password=self.password)
+ response = self.client.post(reverse('api:questionpapers'), data)
+ # Then
+ self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
+
+ def test_create_questionpaper_valid_data(self):
+ # Given
+ data = {'quiz': self.quiz4.id,
+ 'fixed_questions': [self.question1.id, self.question2.id],
+ 'random_questions': [self.questionset.id]}
+ # When
+ self.client.login(username=self.username, password=self.password)
+ response = self.client.post(reverse('api:questionpapers'), data)
+ # Then
+ self.assertEqual(response.status_code, status.HTTP_201_CREATED)
+ self.assertTrue(QuestionPaper.objects.filter(quiz=self.quiz4).exists())
+
+ def test_create_questionpaper_not_own_quiz(self):
+ # Given
+ data = {'quiz': self.quiz5.id, 'fixed_questions': [self.question1.id],
+ 'random_questions': [self.questionset.id]}
+ # When
+ self.client.login(username=self.otherusername, password=self.password)
+ response = self.client.post(reverse('api:questionpapers'), data)
+ # Then
+ self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)
+
+ def test_create_questionpaper_not_own_questions(self):
+ # Given
+ data = {'quiz': self.quiz6.id,
+ 'fixed_questions': [self.question1.id, self.question5.id],
+ 'random_questions': [self.questionset.id]}
+ # When
+ self.client.login(username=self.otherusername, password=self.password)
+ response = self.client.post(reverse('api:questionpapers'), data)
+ # Then
+ self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)
+
+ def test_create_questionpaper_not_own_questionsets(self):
+ # Given
+ data = {'quiz': self.quiz6.id,
+ 'fixed_questions': [self.question5.id],
+ 'random_questions': [self.questionset.id]}
+ # When
+ self.client.login(username=self.otherusername, password=self.password)
+ response = self.client.post(reverse('api:questionpapers'), data)
+ # Then
+ self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)
+
+ def test_create_questionpaper_already_exists(self):
+ # Given
+ data = {'quiz': self.quiz1.id,
+ 'fixed_questions': [self.question1.id],
+ 'random_questions': [self.questionset.id]}
+ # When
+ self.client.login(username=self.username, password=self.password)
+ response = self.client.post(reverse('api:questionpapers'), data)
+ # Then
+ self.assertEqual(response.status_code, status.HTTP_409_CONFLICT)
+ self.assertEqual(QuestionPaper.objects.filter(
+ quiz=self.quiz1).count(), 1)
+
+ # QuestionPaper Detail Tests
+ def test_get_questionpaper(self):
+ # Given
+ questionpaper = self.questionpaper
+ serializer = QuestionPaperSerializer(questionpaper)
+ # When
+ self.client.login(username=self.username, password=self.password)
+ response = self.client.get(reverse('api:questionpaper',
+ kwargs={'pk': questionpaper.id}))
+ # Then
+ self.assertEqual(response.status_code, status.HTTP_200_OK)
+ self.assertEqual(response.data, serializer.data)
+
+ def test_get_questionpaper_not_own(self):
+ # Given
+ questionpaper = self.questionpaper
+ # When
+ self.client.login(username=self.otherusername, password=self.password)
+ response = self.client.get(reverse('api:questionpaper',
+ kwargs={'pk': questionpaper.id}))
+ # Then
+ self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)
+
+ def test_edit_questionpaper(self):
+ # Given
+ questionpaper = self.questionpaper2
+ data = {'quiz': self.quiz5.id,
+ 'fixed_questions': [self.question1.id, self.question2.id],
+ 'random_questions': [self.questionset.id]}
+ # When
+ self.client.login(username=self.username, password=self.password)
+ response = self.client.put(reverse('api:questionpaper',
+ kwargs={'pk': questionpaper.id}), data)
+ # Then
+ self.assertEqual(response.status_code, status.HTTP_200_OK)
+ questionpaper = QuestionPaper.objects.get(pk=questionpaper.id)
+ self.assertEqual(questionpaper.quiz.id, self.quiz5.id)
+
+ def test_delete_questionpaper(self):
+ # Given
+ questionpaper = self.questionpaper2
+ # When
+ self.client.login(username=self.username, password=self.password)
+ response = self.client.delete(reverse('api:questionpaper',
+ kwargs={'pk': questionpaper.id}))
+ # Then
+ self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT)
+ questionpapers = QuestionPaper.objects.filter(quiz=self.quiz2)
+ self.assertFalse(questionpapers.exists())
+
+ def tearDown(self):
+ self.client.logout()
+ User.objects.all().delete()
+ Question.objects.all().delete()
+ QuestionPaper.objects.all().delete()
+ Quiz.objects.all().delete()
+
+
+class QuizListTestCase(TestCase):
+ """ Test get all quizzes and create a new quiz """
+
+ def setUp(self):
+ self.client = APIClient()
+ self.username = 'demo'
+ self.password = 'demo'
+ self.user = User.objects.create_user(username=self.username,
+ password=self.password)
+ Quiz.objects.create(description='Test Quiz 1', creator=self.user)
+ Quiz.objects.create(description='Test Quiz 2', creator=self.user)
+
+ def test_get_all_quizzes_anonymous(self):
+ # When
+ response = self.client.get(reverse('api:quizzes'))
+ # Then
+ self.assertEqual(response.status_code, status.HTTP_401_UNAUTHORIZED)
+
+ def test_get_all_quizzes(self):
+ # Given
+ quizzes = Quiz.objects.filter(creator=self.user)
+ serializer = QuizSerializer(quizzes, many=True)
+ # When
+ self.client.login(username=self.username, password=self.password)
+ response = self.client.get(reverse('api:quizzes'))
+ # Then
+ self.assertEqual(response.status_code, status.HTTP_200_OK)
+ self.assertEqual(len(response.data), 2)
+ self.assertEqual(response.data, serializer.data)
+
+ def test_create_quiz_invalid_data(self):
+ # Given
+ data = {'creator': self.user.id}
+ # When
+ self.client.login(username=self.username, password=self.password)
+ response = self.client.post(reverse('api:quizzes'), data)
+ # Then
+ self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
+
+ def test_create_quiz_valid_data(self):
+ # Given
+ data = {'description': 'Added quiz', 'creator': self.user.id}
+ # When
+ self.client.login(username=self.username, password=self.password)
+ response = self.client.post(reverse('api:quizzes'), data)
+ # Then
+ self.assertEqual(response.status_code, status.HTTP_201_CREATED)
+ self.assertTrue(Quiz.objects.filter(description='Added quiz').exists())
+
+ def tearDown(self):
+ self.client.logout()
+ User.objects.all().delete()
+ Quiz.objects.all().delete()
+
+
+class QuizDetailTestCase(TestCase):
+ """ Test get, update or delete a quiz """
+
+ def setUp(self):
+ self.client = APIClient()
+ self.username = 'quizuser'
+ self.password = 'demo'
+ self.otherusername = 'quizuser2'
+ self.user = User.objects.create_user(username=self.username,
+ password=self.password)
+ self.otheruser = User.objects.create_user(username=self.otherusername,
+ password=self.password)
+ Quiz.objects.create(description='Quiz1', creator=self.user)
+ Quiz.objects.create(description='Quiz2', creator=self.user)
+ Quiz.objects.create(description='delete quiz', creator=self.user)
+ Quiz.objects.create(description='Quiz3', creator=self.otheruser)
+
+ def test_get_quiz_anonymous(self):
+ # Given
+ quiz = Quiz.objects.get(description='Quiz1')
+ # When
+ response = self.client.get(reverse('api:quiz', kwargs={'pk': quiz.id}))
+ # Then
+ self.assertEqual(response.status_code, status.HTTP_401_UNAUTHORIZED)
+
+ def test_get_quiz_invalid_pk(self):
+ # Given
+ invalid_pk = 3242
+ # When
+ self.client.login(username=self.username, password=self.password)
+ response = self.client.get(reverse('api:quiz',
+ kwargs={'pk': invalid_pk}))
+ # Then
+ self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)
+
+ def test_get_quiz(self):
+ # Given
+ quiz = Quiz.objects.get(description='Quiz1')
+ serializer = QuizSerializer(quiz)
+ # When
+ self.client.login(username=self.username, password=self.password)
+ response = self.client.get(reverse('api:quiz',
+ kwargs={'pk': quiz.id}))
+ # Then
+ self.assertEqual(response.status_code, status.HTTP_200_OK)
+ self.assertEqual(response.data, serializer.data)
+
+ def test_get_quiz_not_own(self):
+ # Given
+ quiz = Quiz.objects.get(description='Quiz3')
+ # When
+ self.client.login(username=self.username, password=self.password)
+ response = self.client.get(reverse('api:quiz', kwargs={'pk': quiz.id}))
+ # Then
+ self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)
+
+ def test_edit_quiz_anonymous(self):
+ # Given
+ quiz = Quiz.objects.get(description='Quiz1')
+ data = {'description': 'Quiz1 Edited', 'creator': self.user.id}
+ # When
+ response = self.client.put(reverse('api:quiz', kwargs={'pk': quiz.id}),
+ data)
+ # Then
+ self.assertEqual(response.status_code, status.HTTP_401_UNAUTHORIZED)
+
+ def test_edit_quiz_invalid_data(self):
+ # Given
+ quiz = Quiz.objects.get(description='Quiz1')
+ data = {'creator': self.user.id}
+ # When
+ self.client.login(username=self.username, password=self.password)
+ response = self.client.put(reverse('api:quiz', kwargs={'pk': quiz.id}),
+ data)
+ # Then
+ self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
+
+ def test_edit_quiz(self):
+ # Given
+ quiz = Quiz.objects.get(description='Quiz2')
+ data = {'description': 'Quiz2 edited', 'creator': self.user.id}
+ # When
+ self.client.login(username=self.username, password=self.password)
+ response = self.client.put(reverse('api:quiz', kwargs={'pk': quiz.id}),
+ data)
+ # Then
+ self.assertEqual(response.status_code, status.HTTP_200_OK)
+ quiz = Quiz.objects.get(pk=quiz.id)
+ self.assertEqual(quiz.description, 'Quiz2 edited')
+
+ def test_delete_quiz_anonymous(self):
+ # Given
+ quiz = Quiz.objects.get(description='delete quiz')
+ # When
+ response = self.client.delete(reverse('api:quiz',
+ kwargs={'pk': quiz.id}))
+ # Then
+ self.assertEqual(response.status_code, status.HTTP_401_UNAUTHORIZED)
+
+ def test_delete_quiz_not_own(self):
+ # Given
+ quiz = Quiz.objects.get(description='Quiz3')
+ # When
+ self.client.login(username=self.username, password=self.password)
+ response = self.client.delete(reverse('api:quiz',
+ kwargs={'pk': quiz.id}))
+ # Then
+ self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)
+ self.assertTrue(Quiz.objects.filter(pk=quiz.id).exists())
+
+ def test_delete_quiz(self):
+ # Given
+ quiz = Quiz.objects.get(description='delete quiz')
+ # When
+ self.client.login(username=self.username, password=self.password)
+ response = self.client.delete(reverse('api:quiz',
+ kwargs={'pk': quiz.id}))
+ # Then
+ self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT)
+ self.assertFalse(Quiz.objects.filter(pk=quiz.id).exists())
+
+ def tearDown(self):
+ self.client.logout()
+ User.objects.all().delete()
+ Quiz.objects.all().delete()
+
+
+class AnswerPaperListTestCase(TestCase):
+
+ def setUp(self):
+ self.client = APIClient()
+ self.username = 'demo'
+ self.otherusername = 'otheruser'
+ self.studentusername = 'student'
+ self.password = 'demo'
+ self.user = User.objects.create_user(username=self.username,
+ password=self.password)
+ self.otheruser = User.objects.create_user(username=self.otherusername,
+ password=self.password)
+ self.student = User.objects.create_user(username=self.studentusername,
+ password='demo')
+ self.quiz1 = Quiz.objects.create(description='Quiz1',
+ creator=self.user)
+ self.quiz2 = Quiz.objects.create(description='Quiz2',
+ creator=self.otheruser)
+ self.questionpaper1 = QuestionPaper.objects.create(quiz=self.quiz1)
+ self.questionpaper2 = QuestionPaper.objects.create(quiz=self.quiz2)
+ self.question1 = Question.objects.create(summary='Q1', user=self.user,
+ language='python', type='mcq')
+ self.question2 = Question.objects.create(summary='Q5',
+ user=self.otheruser,
+ language='python', type='mcq')
+ self.questionpaper1.fixed_questions.add(self.question1)
+ self.questionpaper2.fixed_questions.add(self.question2)
+ self.questionpaper1.save()
+ self.questionpaper2.save()
+ self.questionpaper1.update_total_marks()
+ self.questionpaper2.update_total_marks()
+ self.answerpaper1 = AnswerPaper.objects.create(
+ user=self.user,
+ question_paper=self.questionpaper1, attempt_number=1,
+ start_time=datetime(2015, 10, 9, 10, 8, 15, 0, tzinfo=pytz.utc),
+ end_time=datetime(2015, 10, 9, 10, 28, 15, 0, tzinfo=pytz.utc)
+ )
+ self.answerpaper2 = AnswerPaper.objects.create(
+ user=self.otheruser,
+ question_paper=self.questionpaper2, attempt_number=1,
+ start_time=datetime(2015, 10, 9, 10, 8, 15, 0, tzinfo=pytz.utc),
+ end_time=datetime(2015, 10, 9, 10, 28, 15, 0, tzinfo=pytz.utc)
+ )
+ self.course = Course.objects.create(name="Python Course",
+ enrollment="Enroll Request",
+ creator=self.user)
+ # Learing module
+ learning_module = LearningModule.objects.create(
+ name='LM1', description='module one', creator=self.user
+ )
+ learning_unit_quiz = LearningUnit.objects.create(quiz=self.quiz1,
+ type='quiz', order=1)
+ learning_module.learning_unit.add(learning_unit_quiz)
+ learning_module.save()
+ self.course.learning_module.add(learning_module)
+ self.course.students.add(self.student)
+ self.course.save()
+
+ def test_get_all_answerpapers(self):
+ # Given
+ answerpapers = [self.answerpaper1]
+ serializer = AnswerPaperSerializer(answerpapers, many=True)
+ # When
+ self.client.login(username=self.username, password=self.password)
+ response = self.client.get(reverse('api:answerpapers'))
+ # Then
+ self.assertEqual(response.status_code, status.HTTP_200_OK)
+ self.assertEqual(len(response.data), 1)
+ self.assertEqual(response.data, serializer.data)
+
+ def test_create_answerpaper_valid_data(self):
+ # Given
+ data = {'question_paper': self.questionpaper1.id,
+ 'attempt_number': 1, 'course': self.course.id}
+ # When
+ self.client.login(username=self.studentusername,
+ password=self.password)
+ response = self.client.post(reverse('api:answerpapers'), data)
+ # Then
+ self.assertEqual(response.status_code, status.HTTP_201_CREATED)
+ answerpapers = AnswerPaper.objects.filter(
+ user=self.student, attempt_number=1,
+ question_paper=self.questionpaper1, course=self.course
+ )
+ self.assertTrue(answerpapers.exists())
+ self.assertEqual(answerpapers.count(), 1)
+
+ def test_create_answerpaper_invalid_data(self):
+ # Given
+ data = {'question_paper': self.questionpaper1.id}
+ # When
+ self.client.login(username=self.studentusername,
+ password=self.password)
+ response = self.client.post(reverse('api:answerpapers'), data)
+ # Then
+ self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
+
+ def test_create_answerpaper_not_enrolled(self):
+ # Given
+ data = {'question_paper': self.questionpaper1.id,
+ 'attempt_number': 1, 'course': self.course.id}
+ # When
+ self.client.login(username=self.otherusername, password=self.password)
+ response = self.client.post(reverse('api:answerpapers'), data)
+ # Then
+ self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
+ answerpapers = AnswerPaper.objects.filter(
+ question_paper=self.questionpaper1, user=self.otheruser,
+ attempt_number=1, course=self.course
+ )
+ self.assertFalse(answerpapers.exists())
+ self.assertEqual(answerpapers.count(), 0)
+
+ def tearDown(self):
+ self.client.logout()
+ User.objects.all().delete()
+ Question.objects.all().delete()
+ QuestionPaper.objects.all().delete()
+ Quiz.objects.all().delete()
+ AnswerPaper.objects.all().delete()
+
+
+class AnswerValidatorTestCase(TestCase):
+
+ @classmethod
+ def setUpClass(self):
+ self.client = APIClient()
+ self.username = 'demo'
+ self.password = 'demo'
+ self.user = User.objects.create_user(username=self.username,
+ password=self.password)
+ Profile.objects.create(user=self.user)
+ self.quiz = Quiz.objects.create(description='Quiz', creator=self.user)
+ self.questionpaper = QuestionPaper.objects.create(quiz=self.quiz)
+ self.question1 = Question.objects.create(summary='Q1', user=self.user,
+ points=1.0, language='python',
+ type='code')
+ self.question2 = Question.objects.create(summary='Q2', user=self.user,
+ points=1.0, language='python',
+ type='mcq')
+ self.question3 = Question.objects.create(summary='Q3', user=self.user,
+ points=1.0, language='python',
+ type='mcc')
+ self.question4 = Question.objects.create(summary='Q4', user=self.user,
+ points=1.0, language='python',
+ type='mcq')
+ self.question5 = Question.objects.create(summary='Q5', user=self.user,
+ points=1.0, language='python',
+ type='mcq')
+ self.assertion_testcase = StandardTestCase(
+ question=self.question1,
+ test_case='assert add(1, 3) == 4',
+ type='standardtestcase'
+ )
+ self.assertion_testcase.save()
+ self.mcq_based_testcase1 = McqTestCase(
+ options='a',
+ question=self.question2,
+ correct=True,
+ type='mcqtestcase'
+ )
+ self.mcq_based_testcase1.save()
+ self.mcq_based_testcase2 = McqTestCase(
+ options='b',
+ question=self.question2,
+ correct=False,
+ type='mcqtestcase'
+ )
+ self.mcq_based_testcase2.save()
+ self.mcc_based_testcase = McqTestCase(
+ question=self.question3,
+ options='a',
+ correct=True,
+ type='mcqtestcase'
+ )
+ self.mcc_based_testcase.save()
+ self.questionset = QuestionSet.objects.create(marks=1, num_questions=1)
+ self.questionset.questions.add(self.question3)
+ self.questionset.questions.add(self.question4)
+ self.questionset.save()
+ self.questionpaper.fixed_questions.add(self.question1)
+ self.questionpaper.fixed_questions.add(self.question2)
+ self.questionpaper.random_questions.add(self.questionset)
+ self.questionpaper.save()
+ self.questionpaper.update_total_marks()
+ self.course = Course.objects.create(name="Python Course",
+ enrollment="Enroll Request",
+ creator=self.user)
+ # Learing module
+ learning_module = LearningModule.objects.create(
+ name='LM1', description='module one', creator=self.user
+ )
+ learning_unit_quiz = LearningUnit.objects.create(quiz=self.quiz,
+ type='quiz', order=1)
+ learning_module.learning_unit.add(learning_unit_quiz)
+ learning_module.save()
+ self.course.learning_module.add(learning_module)
+ self.course.students.add(self.user)
+ self.course.save()
+ self.ip = '127.0.0.1'
+ self.answerpaper = self.questionpaper.make_answerpaper(
+ self.user, self.ip, 1, self.course.id
+ )
+
+ settings.code_evaluators['python']['standardtestcase'] = \
+ "yaksh.python_assertion_evaluator.PythonAssertionEvaluator"
+ server_pool = ServerPool(n=1, pool_port=SERVER_POOL_PORT)
+ self.server_pool = server_pool
+ self.server_thread = t = Thread(target=server_pool.run)
+ t.start()
+
+ @classmethod
+ def tearDownClass(self):
+ self.client.logout()
+ User.objects.all().delete()
+ Question.objects.all().delete()
+ QuestionPaper.objects.all().delete()
+ Quiz.objects.all().delete()
+ AnswerPaper.objects.all().delete()
+ self.server_pool.stop()
+ self.server_thread.join()
+ settings.code_evaluators['python']['standardtestcase'] = \
+ "python_assertion_evaluator.PythonAssertionEvaluator"
+
+ def test_correct_mcq(self):
+ # Given
+ data = {'answer': str(self.mcq_based_testcase1.id)}
+ answerpaper_id = self.answerpaper.id
+ question_id = self.question2.id
+ # When
+ self.client.login(username=self.username, password=self.password)
+ response = self.client.post(
+ reverse('api:validators', kwargs={'answerpaper_id': answerpaper_id,
+ 'question_id': question_id}), data
+ )
+ # Then
+ self.assertTrue(response.status_code, status.HTTP_200_OK)
+ self.assertTrue(response.data.get('success'))
+ answerpaper = AnswerPaper.objects.get(
+ user=self.user, course=self.course, attempt_number=1,
+ question_paper=self.questionpaper
+ )
+ self.assertTrue(answerpaper.marks_obtained > 0)
+
+ def test_wrong_mcq(self):
+ # Given
+ data = {'answer': str(self.mcq_based_testcase2.id)}
+ answerpaper_id = self.answerpaper.id
+ question_id = self.question2.id
+ # When
+ self.client.login(username=self.username, password=self.password)
+ response = self.client.post(
+ reverse('api:validators', kwargs={'answerpaper_id': answerpaper_id,
+ 'question_id': question_id}), data
+ )
+ # Then
+ self.assertTrue(response.status_code, status.HTTP_200_OK)
+ self.assertFalse(response.data.get('success'))
+
+ def test_correct_mcc(self):
+ # Given
+ data = {'answer': str(self.mcc_based_testcase.id)}
+ answerpaper_id = self.answerpaper.id
+ question_id = self.question3.id
+ # When
+ self.client.login(username=self.username, password=self.password)
+ response = self.client.post(
+ reverse('api:validators', kwargs={'answerpaper_id': answerpaper_id,
+ 'question_id': question_id}), data
+ )
+ # Then
+ self.assertTrue(response.status_code, status.HTTP_200_OK)
+ self.assertTrue(response.data.get('success'))
+ answerpaper = AnswerPaper.objects.get(
+ user=self.user, course=self.course, attempt_number=1,
+ question_paper=self.questionpaper
+ )
+ self.assertTrue(answerpaper.marks_obtained > 0)
+
+ def test_correct_code(self):
+ # Given
+ answer = dedent("""\
+ def add(a,b):
+ return a+b
+ """)
+ data = {'answer': answer}
+ answerpaper_id = self.answerpaper.id
+ question_id = self.question1.id
+ # When
+ self.client.login(username=self.username, password=self.password)
+ response = self.client.post(
+ reverse('api:validators', kwargs={'answerpaper_id': answerpaper_id,
+ 'question_id': question_id}), data
+ )
+ # Then
+ self.assertTrue(response.status_code, status.HTTP_200_OK)
+ self.assertEqual(response.data.get('status'), 'running')
+ uid = response.data['uid']
+ time.sleep(2)
+ response = self.client.get(reverse('api:validator',
+ kwargs={'uid': uid}))
+ self.assertTrue(response.status_code, status.HTTP_200_OK)
+ answerpaper = AnswerPaper.objects.get(
+ user=self.user, course=self.course, attempt_number=1,
+ question_paper=self.questionpaper
+ )
+ if response.data.get('status') == 'done':
+ result = json.loads(response.data.get('result'))
+ self.assertTrue(result.get('success'))
+ else:
+ self.assertEqual(response.data.get('status'), 'running')