diff --git a/flashcards/serializers.py b/flashcards/serializers.py index 30f72a0..d97e0f6 100644 --- a/flashcards/serializers.py +++ b/flashcards/serializers.py @@ -239,7 +239,7 @@ class QuizAnswerRequestSerializer(ModelSerializer): correct = BooleanField(required=False, help_text="The user's self-evaluation of their response") def __init__(self, instance=None, data=empty, **kwargs): - assert isinstance(instance, UserFlashcardQuiz) or instance is None + assert isinstance(instance, UserFlashcardQuiz) super(QuizAnswerRequestSerializer, self).__init__(instance=instance, data=data, **kwargs) def validate_response(self, response): diff --git a/flashcards/tests/test_api.py b/flashcards/tests/test_api.py index a48ec1b..47ecd3b 100644 --- a/flashcards/tests/test_api.py +++ b/flashcards/tests/test_api.py @@ -1,6 +1,7 @@ from django.core import mail from flashcards.models import * -from rest_framework.status import HTTP_204_NO_CONTENT, HTTP_201_CREATED, HTTP_200_OK, HTTP_403_FORBIDDEN +from rest_framework.status import HTTP_204_NO_CONTENT, HTTP_201_CREATED, HTTP_200_OK, \ + HTTP_403_FORBIDDEN, HTTP_400_BAD_REQUEST from rest_framework.test import APITestCase from re import search from datetime import datetime @@ -382,7 +383,7 @@ class UserFlashcardQuizTests(APITestCase): self.flashcard.save() self.flashcard.refresh_from_db() self.user_flashcard = UserFlashcard(flashcard=self.flashcard, user=self.user, - mask=self.flashcard.mask, pulled=datetime.now()) + mask=None, pulled=datetime.now()) self.user_flashcard.save() def test_quiz_create(self): @@ -394,3 +395,48 @@ class UserFlashcardQuizTests(APITestCase): self.assertEqual(response.data['section'], self.section.pk) self.assertEqual(response.data['text'], self.flashcard.text) self.assertIn(response.data['mask'], [[0, 4], [5, 7]]) + + def test_quiz_response(self): + url = '/api/study/{}/' + word = 'This' + user_flashcard_quiz = UserFlashcardQuiz(user_flashcard=self.user_flashcard, blanked_word=word) + user_flashcard_quiz.save() + + self.assertIsNone(user_flashcard_quiz.response) + self.assertIsNone(user_flashcard_quiz.correct) + + data = {'correct': True} + response = self.client.patch(url.format(user_flashcard_quiz.pk), data, format='json') + self.assertEqual(response.status_code, HTTP_400_BAD_REQUEST) + + data = {'response': word, 'correct': True} + response = self.client.patch(url.format(user_flashcard_quiz.pk), data, format='json') + self.assertEqual(response.status_code, HTTP_204_NO_CONTENT) + user_flashcard_quiz.refresh_from_db() + self.assertEqual(user_flashcard_quiz.response, data['response']) + self.assertEqual(user_flashcard_quiz.correct, data['correct']) + + data = {'response': word, 'correct': True} + response = self.client.patch(url.format(user_flashcard_quiz.pk), data, format='json') + self.assertEqual(response.status_code, HTTP_400_BAD_REQUEST) + + UserFlashcardQuiz.delete(user_flashcard_quiz) + user_flashcard_quiz = UserFlashcardQuiz(user_flashcard=self.user_flashcard, blanked_word=word) + user_flashcard_quiz.save() + + data = {'response': word} + response = self.client.patch(url.format(user_flashcard_quiz.pk), data, format='json') + self.assertEqual(response.status_code, HTTP_204_NO_CONTENT) + user_flashcard_quiz.refresh_from_db() + self.assertEqual(user_flashcard_quiz.response, data['response']) + self.assertIsNone(user_flashcard_quiz.correct) + + data = {'correct': True} + response = self.client.patch(url.format(user_flashcard_quiz.pk), data, format='json') + self.assertEqual(response.status_code, HTTP_204_NO_CONTENT) + user_flashcard_quiz.refresh_from_db() + self.assertEqual(user_flashcard_quiz.correct, data['correct']) + + data = {'response': word, 'correct': True} + response = self.client.patch(url.format(user_flashcard_quiz.pk), data, format='json') + self.assertEqual(response.status_code, HTTP_400_BAD_REQUEST) diff --git a/flashcards/tests/test_models.py b/flashcards/tests/test_models.py index 57429c2..26666a7 100644 --- a/flashcards/tests/test_models.py +++ b/flashcards/tests/test_models.py @@ -187,8 +187,10 @@ class UserFlashcardQuizTests(TestCase): flashcard__material_date__gte=validated_data['material_date_begin'], flashcard__material_date__lte=validated_data['material_date_end']) self.assertTrue(user_flashcard.exists()) + user_flashcard = user_flashcard.first() self.assertEqual(user_flashcard, self.user_flashcard) + mask = user_flashcard.mask.get_random_blank() word = user_flashcard.flashcard.text[slice(*mask)] user_flashcard_quiz = UserFlashcardQuiz(user_flashcard=user_flashcard, @@ -196,9 +198,11 @@ class UserFlashcardQuizTests(TestCase): user_flashcard_quiz.save() self.assertTrue(isinstance(user_flashcard_quiz, UserFlashcardQuiz)) self.assertIn(mask, [[24, 33], [0, 4]]) + user_flashcard_quiz.blanked_word = user_flashcard_quiz.user_flashcard.flashcard.text[slice(*mask)] self.assertIn(user_flashcard_quiz.blanked_word, ["This", "Flashcard"]) user_flashcard_quiz.save() + response = QuizResponseSerializer(instance=user_flashcard_quiz, mask=mask).data self.assertEqual(response['pk'], 1) self.assertEqual(response['section'], 1) @@ -215,6 +219,7 @@ class UserFlashcardQuizTests(TestCase): serializer.is_valid() serializer.update(user_flashcard_quiz, serializer.validated_data) self.assertEqual(user_flashcard_quiz.response, data['response']) + data = {'correct': True} serializer = QuizAnswerRequestSerializer(instance=user_flashcard_quiz, data=data) serializer.is_valid() diff --git a/flashcards/views.py b/flashcards/views.py index 624ac61..2e4e750 100644 --- a/flashcards/views.py +++ b/flashcards/views.py @@ -391,6 +391,6 @@ class UserFlashcardQuizViewSet(GenericViewSet, CreateModelMixin, UpdateModelMixi """ user_flashcard_quiz = self.get_object() serializer = QuizAnswerRequestSerializer(instance=user_flashcard_quiz, data=request.data) - serializer.is_valid() + serializer.is_valid(raise_exception=True) serializer.update(user_flashcard_quiz, serializer.validated_data) return Response(status=HTTP_204_NO_CONTENT)