From 1e00b0d30c6bef05ef24d9a1b149986276608afd Mon Sep 17 00:00:00 2001 From: ankitjavalkar Date: Wed, 4 Oct 2017 18:38:41 +0530 Subject: Fix bug to prevent saving a code question answer on skip --- yaksh/views.py | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) (limited to 'yaksh') diff --git a/yaksh/views.py b/yaksh/views.py index e6da2fc..a58b59e 100644 --- a/yaksh/views.py +++ b/yaksh/views.py @@ -506,12 +506,15 @@ def skip(request, q_id, next_q=None, attempt_num=None, questionpaper_id=None): question = get_object_or_404(Question, pk=q_id) if request.method == 'POST' and question.type == 'code': - user_code = request.POST.get('answer') - new_answer = Answer(question=question, answer=user_code, - correct=False, skipped=True, - error=json.dumps([])) - new_answer.save() - paper.answers.add(new_answer) + if not paper.answers.filter(question=question, correct=True).exists(): + user_code = request.POST.get('answer') + new_answer = Answer( + question=question, answer=user_code, + correct=False, skipped=True, + error=json.dumps([]) + ) + new_answer.save() + paper.answers.add(new_answer) if next_q is not None: next_q = get_object_or_404(Question, pk=next_q) else: -- cgit From ba817cda209787e4bc959aac8d16726a8aea1ed9 Mon Sep 17 00:00:00 2001 From: maheshgudi Date: Wed, 4 Oct 2017 18:58:55 +0530 Subject: Update non-code and non-upload answers instead of creating a new one --- yaksh/models.py | 5 +++++ yaksh/views.py | 10 ++++++++-- 2 files changed, 13 insertions(+), 2 deletions(-) (limited to 'yaksh') diff --git a/yaksh/models.py b/yaksh/models.py index d9e07fd..0d67397 100644 --- a/yaksh/models.py +++ b/yaksh/models.py @@ -1284,6 +1284,11 @@ class AnswerPaper(models.Model): }] return q_a + def get_latest_answer(self,question_id): + all_answers = self.answers.filter(question=question_id) + if all_answers: + return all_answers[0] + def get_questions(self): return self.questions.filter(active=True) diff --git a/yaksh/views.py b/yaksh/views.py index a58b59e..c4ddcd1 100644 --- a/yaksh/views.py +++ b/yaksh/views.py @@ -597,11 +597,17 @@ def check(request, q_id, attempt_num=None, questionpaper_id=None): else: user_answer = request.POST.get('answer') if not user_answer: - msg = ["Please submit a valid option or code"] + msg = "Please submit a valid option or code" return show_question( request, current_question, paper, notification=msg ) - new_answer = Answer( + if current_question in paper.get_questions_answered()\ + and current_question.type not in ['code', 'upload']: + new_answer = paper.get_latest_answer(current_question.id) + new_answer.answer = user_answer + new_answer.correct = False + else: + new_answer = Answer( question=current_question, answer=user_answer, correct=False, error=json.dumps([]) ) -- cgit From 88a37e73cabe8f396631132b2cffdddd5bcae17f Mon Sep 17 00:00:00 2001 From: maheshgudi Date: Wed, 4 Oct 2017 21:26:12 +0530 Subject: User can see previously submitted answers for non code questions --- yaksh/models.py | 3 +-- yaksh/templates/yaksh/grade_user.html | 2 +- yaksh/templates/yaksh/question.html | 32 +++++++++++++++++++------------- 3 files changed, 21 insertions(+), 16 deletions(-) (limited to 'yaksh') diff --git a/yaksh/models.py b/yaksh/models.py index 0d67397..49e028b 100644 --- a/yaksh/models.py +++ b/yaksh/models.py @@ -1308,8 +1308,7 @@ class AnswerPaper(models.Model): return self.time_left() > 0 def get_previous_answers(self, question): - if question.type == 'code': - return self.answers.filter(question=question).order_by('-id') + return self.answers.filter(question=question).order_by('-id') def validate_answer(self, user_answer, question, json_data=None, uid=None): """ diff --git a/yaksh/templates/yaksh/grade_user.html b/yaksh/templates/yaksh/grade_user.html index 9cdfb1a..52f319c 100644 --- a/yaksh/templates/yaksh/grade_user.html +++ b/yaksh/templates/yaksh/grade_user.html @@ -114,7 +114,7 @@ Status : Passed
{% for question, answers in paper.get_question_answers.items %} {% with answers|last as answer %} - {{ question.id }} + {{ question.summary }} {{ answer.answer.marks }} {% endwith %} diff --git a/yaksh/templates/yaksh/question.html b/yaksh/templates/yaksh/question.html index 3a3066c..eb6eb3d 100644 --- a/yaksh/templates/yaksh/question.html +++ b/yaksh/templates/yaksh/question.html @@ -53,7 +53,7 @@ function updateClock(){ var ss = ('0' + t.seconds).slice(-2); if(t.total<0){ - + document.forms["code"].submit(); clearInterval(timeinterval); return null; @@ -77,10 +77,7 @@ function validate(){ $("#upload_alert").modal("show"); return false; } - else - { - send_request(); - } + return true; } function call_skip(url) @@ -155,32 +152,44 @@ lang = "{{ question.language }}"
{% if question.type == "mcq" %} {% for test_case in test_cases %} - {{ test_case.options|safe }}
+ {% if last_attempt and last_attempt|safe == test_case.options|safe %} + + {{ test_case.options|safe }}
+ {% else %} + + {{ test_case.options|safe }}
+ {% endif %} {% endfor %} {% endif %} {% if question.type == "integer" %} Enter Integer:
- +

{% endif %} {% if question.type == "string" %} Enter Text:
- +

{% endif %} {% if question.type == "float" %} Enter Decimal Value :
- +

{% endif %} {% if question.type == "mcc" %} {% for test_case in test_cases %} - {{ test_case.options|safe }} + {% if last_attempt and test_case.options|safe in last_attempt|safe %} + {{ test_case.options }}
+ {% else %} + + {{ test_case.options}} +
+ {% endif %} {% endfor %} {% endif %} {% if question.type == "upload" %} @@ -241,6 +250,3 @@ lang = "{{ question.language }}"
{% endblock main %} - - - -- cgit From 81e30ab1b8f9647742695fea578fb4b21820f865 Mon Sep 17 00:00:00 2001 From: adityacp Date: Wed, 4 Oct 2017 19:57:39 +0530 Subject: Add tests to check updated Answerpaper marks --- yaksh/test_views.py | 387 +++++++++++++++++++++++++++++++++++++++++++++++++++- yaksh/urls.py | 4 +- 2 files changed, 388 insertions(+), 3 deletions(-) (limited to 'yaksh') diff --git a/yaksh/test_views.py b/yaksh/test_views.py index 064c39d..e3914ad 100644 --- a/yaksh/test_views.py +++ b/yaksh/test_views.py @@ -22,7 +22,8 @@ from django.core.files.uploadedfile import SimpleUploadedFile from yaksh.models import User, Profile, Question, Quiz, QuestionPaper,\ QuestionSet, AnswerPaper, Answer, Course, StandardTestCase,\ - AssignmentUpload, FileUpload + AssignmentUpload, FileUpload, McqTestCase, IntegerTestCase, StringTestCase,\ + FloatTestCase from yaksh.decorators import user_has_profile @@ -3378,3 +3379,387 @@ class TestShowStatistics(TestCase): [1, 1]) self.assertEqual(response.context['attempts'][0], 1) self.assertEqual(response.context['total'], 1) + + +class TestCheck(TestCase): + def setUp(self): + self.client = Client() + + self.mod_group = Group.objects.create(name='moderator') + tzone = pytz.timezone('UTC') + # Create Moderator with profile + 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' + ) + + Profile.objects.create( + user=self.user, + roll_number=10, + institute='IIT', + department='Chemical', + position='Moderator', + timezone='UTC' + ) + + # Add to moderator group + self.mod_group.user_set.add(self.user) + + self.course = Course.objects.create( + name="Python Course", + enrollment="Open Enrollment", creator=self.user) + + self.quiz = Quiz.objects.create( + start_date_time=datetime(2014, 10, 9, 10, 8, 15, 0, tzone), + end_date_time=datetime(2015, 10, 9, 10, 8, 15, 0, tzone), + duration=30, active=True, instructions="Demo Instructions", + attempts_allowed=-1, time_between_attempts=0, + description='demo quiz', pass_criteria=40, + language='Python', course=self.course + ) + + # Mcq Question + self.question_mcq = Question.objects.create( + summary="Test_mcq_question", description="Test MCQ", + points=1.0, language="python", type="mcq", user=self.user + ) + self.mcq_based_testcase = McqTestCase( + options="a", + question=self.question_mcq, + correct=True, + type='mcqtestcase' + ) + self.mcq_based_testcase.save() + + ordered_questions = str(self.question_mcq.id) + + # Mcc Question + self.question_mcc = Question.objects.create( + summary="Test_mcc_question", description="Test MCC", + points=1.0, language="python", type="mcq", user=self.user + ) + self.mcc_based_testcase = McqTestCase( + options="a", + question=self.question_mcc, + correct=True, + type='mcqtestcase' + ) + self.mcc_based_testcase.save() + + ordered_questions = ordered_questions + str(self.question_mcc.id) + + # Integer Question + self.question_int = Question.objects.create( + summary="Test_mcc_question", description="Test MCC", + points=1.0, language="python", type="integer", user=self.user + ) + self.int_based_testcase = IntegerTestCase( + correct=1, + question=self.question_int, + type='integertestcase' + ) + self.int_based_testcase.save() + + ordered_questions = ordered_questions + str(self.question_int.id) + + # String Question + self.question_str = Question.objects.create( + summary="Test_mcc_question", description="Test MCC", + points=1.0, language="python", type="string", user=self.user + ) + self.str_based_testcase = StringTestCase( + correct="abc", + string_check="lower", + question=self.question_str, + type='stringtestcase' + ) + self.str_based_testcase.save() + + # Float Question + self.question_float = Question.objects.create( + summary="Test_mcc_question", description="Test MCC", + points=1.0, language="python", type="float", user=self.user + ) + self.float_based_testcase = FloatTestCase( + correct=2.0, + error_margin=0, + question=self.question_float, + type='floattestcase' + ) + self.float_based_testcase.save() + + ordered_questions = ordered_questions + str(self.question_float.id) + + questions_list = [self.question_mcq, self.question_mcc, + self.question_int, self.question_str, + self.question_float] + + self.question_paper = QuestionPaper.objects.create( + quiz=self.quiz, + total_marks=5.0, fixed_question_order=ordered_questions + ) + self.question_paper.fixed_questions.add(*questions_list) + self.answerpaper = AnswerPaper.objects.create( + user=self.user, question_paper=self.question_paper, + attempt_number=1, + start_time=datetime(2014, 10, 9, 10, 8, 15, 0, tzone), + end_time=datetime(2014, 10, 9, 10, 15, 15, 0, tzone), + user_ip="127.0.0.1", status="inprogress", passed=False, + percent=0, marks_obtained=0 + ) + self.answerpaper.questions.add(*questions_list) + + def tearDown(self): + self.client.logout() + self.user.delete() + self.quiz.delete() + self.course.delete() + self.answerpaper.delete() + self.question_mcq.delete() + self.question_mcc.delete() + self.question_int.delete() + self.question_paper.delete() + + def test_mcq_attempt_right_after_wrong(self): + """ Case:- Check if answerpaper and answer marks are updated after + attempting same mcq question with wrong answer and then right + answer + """ + self.client.login( + username=self.user.username, + password=self.user_plaintext_pass + ) + + # Given Wrong Answer + wrong_user_answer = "b" + + # When + self.client.post( + reverse('yaksh:check', + kwargs={"q_id": self.question_mcq.id, "attempt_num": 1, + "questionpaper_id": self.question_paper.id}), + data={"answer": wrong_user_answer} + ) + + # Then + wrong_answer_paper = AnswerPaper.objects.get(id=self.answerpaper.id) + self.assertEqual(wrong_answer_paper.marks_obtained, 0) + + # Given Right Answer + right_user_answer = "a" + + # When + self.client.post( + reverse('yaksh:check', + kwargs={"q_id": self.question_mcq.id, "attempt_num": 1, + "questionpaper_id": self.question_paper.id}), + data={"answer": right_user_answer} + ) + + # Then + updated_answerpaper = AnswerPaper.objects.get(id=self.answerpaper.id) + self.assertEqual(updated_answerpaper.marks_obtained, 1) + + def test_mcq_question_attempt_wrong_after_right(self): + """ Case:- Check if answerpaper and answer marks are updated after + attempting same mcq question with right answer and then wrong + answer + """ + self.client.login( + username=self.user.username, + password=self.user_plaintext_pass + ) + + # Given Right Answer + right_user_answer = "a" + + # When + self.client.post( + reverse('yaksh:check', + kwargs={"q_id": self.question_mcq.id, "attempt_num": 1, + "questionpaper_id": self.question_paper.id}), + data={"answer": right_user_answer} + ) + + # Then + updated_answerpaper = AnswerPaper.objects.get(id=self.answerpaper.id) + self.assertEqual(updated_answerpaper.marks_obtained, 1) + + # Given Wrong Answer + wrong_user_answer = "b" + + # When + self.client.post( + reverse('yaksh:check', + kwargs={"q_id": self.question_mcq.id, "attempt_num": 1, + "questionpaper_id": self.question_paper.id}), + data={"answer": wrong_user_answer} + ) + + # Then + wrong_answer_paper = AnswerPaper.objects.get(id=self.answerpaper.id) + self.assertEqual(wrong_answer_paper.marks_obtained, 0) + + def test_mcc_question_attempt_wrong_after_right(self): + """ Case:- Check if answerpaper and answer marks are updated after + attempting same mcc question with right answer and then wrong + answer + """ + self.client.login( + username=self.user.username, + password=self.user_plaintext_pass + ) + + # Given Right Answer + right_user_answer = "a" + + # When + self.client.post( + reverse('yaksh:check', + kwargs={"q_id": self.question_mcc.id, "attempt_num": 1, + "questionpaper_id": self.question_paper.id}), + data={"answer": right_user_answer} + ) + + # Then + updated_answerpaper = AnswerPaper.objects.get(id=self.answerpaper.id) + self.assertEqual(updated_answerpaper.marks_obtained, 1) + + # Given Wrong Answer + wrong_user_answer = "b" + + # When + self.client.post( + reverse('yaksh:check', + kwargs={"q_id": self.question_mcc.id, "attempt_num": 1, + "questionpaper_id": self.question_paper.id}), + data={"answer": wrong_user_answer} + ) + + # Then + wrong_answer_paper = AnswerPaper.objects.get(id=self.answerpaper.id) + self.assertEqual(wrong_answer_paper.marks_obtained, 0) + + def test_integer_question_attempt_wrong_after_right(self): + """ Case:- Check if answerpaper and answer marks are updated after + attempting same integer question with right answer and then wrong + answer + """ + self.client.login( + username=self.user.username, + password=self.user_plaintext_pass + ) + + # Given Right Answer + right_user_answer = 1 + + # When + self.client.post( + reverse('yaksh:check', + kwargs={"q_id": self.question_int.id, "attempt_num": 1, + "questionpaper_id": self.question_paper.id}), + data={"answer": right_user_answer} + ) + + # Then + updated_answerpaper = AnswerPaper.objects.get(id=self.answerpaper.id) + self.assertEqual(updated_answerpaper.marks_obtained, 1) + + # Given Wrong Answer + wrong_user_answer = -1 + + # When + self.client.post( + reverse('yaksh:check', + kwargs={"q_id": self.question_int.id, "attempt_num": 1, + "questionpaper_id": self.question_paper.id}), + data={"answer": wrong_user_answer} + ) + + # Then + wrong_answer_paper = AnswerPaper.objects.get(id=self.answerpaper.id) + self.assertEqual(wrong_answer_paper.marks_obtained, 0) + + def test_string_question_attempt_wrong_after_right(self): + """ Case:- Check if answerpaper and answer marks are updated after + attempting same string question with right answer and then wrong + answer + """ + self.client.login( + username=self.user.username, + password=self.user_plaintext_pass + ) + + # Given Right Answer + right_user_answer = "abc" + + # When + self.client.post( + reverse('yaksh:check', + kwargs={"q_id": self.question_str.id, "attempt_num": 1, + "questionpaper_id": self.question_paper.id}), + data={"answer": right_user_answer} + ) + + # Then + updated_answerpaper = AnswerPaper.objects.get(id=self.answerpaper.id) + self.assertEqual(updated_answerpaper.marks_obtained, 1) + + # Given Wrong Answer + wrong_user_answer = "c" + + # When + self.client.post( + reverse('yaksh:check', + kwargs={"q_id": self.question_str.id, "attempt_num": 1, + "questionpaper_id": self.question_paper.id}), + data={"answer": wrong_user_answer} + ) + + # Then + wrong_answer_paper = AnswerPaper.objects.get(id=self.answerpaper.id) + self.assertEqual(wrong_answer_paper.marks_obtained, 0) + + def test_float_question_attempt_wrong_after_right(self): + """ Case:- Check if answerpaper and answer marks are updated after + attempting same float question with right answer and then wrong + answer + """ + self.client.login( + username=self.user.username, + password=self.user_plaintext_pass + ) + + # Given Right Answer + right_user_answer = 2.0 + + # When + self.client.post( + reverse('yaksh:check', + kwargs={"q_id": self.question_float.id, "attempt_num": 1, + "questionpaper_id": self.question_paper.id}), + data={"answer": right_user_answer} + ) + + # Then + updated_answerpaper = AnswerPaper.objects.get(id=self.answerpaper.id) + self.assertEqual(updated_answerpaper.marks_obtained, 1) + + # Given Wrong Answer + wrong_user_answer = -1 + + # When + self.client.post( + reverse('yaksh:check', + kwargs={"q_id": self.question_float.id, "attempt_num": 1, + "questionpaper_id": self.question_paper.id}), + data={"answer": wrong_user_answer} + ) + + # Then + wrong_answer_paper = AnswerPaper.objects.get(id=self.answerpaper.id) + self.assertEqual(wrong_answer_paper.marks_obtained, 0) diff --git a/yaksh/urls.py b/yaksh/urls.py index c236640..2e25bee 100644 --- a/yaksh/urls.py +++ b/yaksh/urls.py @@ -19,10 +19,10 @@ urlpatterns = [ url(r'^complete/(?P\d+)/(?P\d+)/$',\ views.complete), url(r'^register/$', views.user_register, name="register"), - url(r'^(?P\d+)/check/$', views.check), + url(r'^(?P\d+)/check/$', views.check, name="check"), url(r'^get_result/(?P\d+)/$', views.get_result), url(r'^(?P\d+)/check/(?P\d+)/(?P\d+)/$',\ - views.check), + views.check, name="check"), url(r'^(?P\d+)/skip/(?P\d+)/(?P\d+)/$', views.skip), url(r'^(?P\d+)/skip/(?P\d+)/(?P\d+)/(?P\d+)/$', -- cgit From 81a9490e58db3b68fc1385680a080a89c5d68385 Mon Sep 17 00:00:00 2001 From: adityacp Date: Wed, 4 Oct 2017 23:30:24 +0530 Subject: Change get_latest_answer in Answerpaper model to order by id --- yaksh/models.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) (limited to 'yaksh') diff --git a/yaksh/models.py b/yaksh/models.py index 49e028b..92076ab 100644 --- a/yaksh/models.py +++ b/yaksh/models.py @@ -1284,10 +1284,8 @@ class AnswerPaper(models.Model): }] return q_a - def get_latest_answer(self,question_id): - all_answers = self.answers.filter(question=question_id) - if all_answers: - return all_answers[0] + def get_latest_answer(self, question_id): + return self.answers.filter(question=question_id).order_by("-id").last() def get_questions(self): return self.questions.filter(active=True) -- cgit From 73e6ff974c1bb5bf6c96b73c2eeacdf074e2e8f4 Mon Sep 17 00:00:00 2001 From: adityacp Date: Wed, 4 Oct 2017 23:47:28 +0530 Subject: Rename class TestCheck to TestQuestionPaper in test_views.py --- yaksh/test_views.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'yaksh') diff --git a/yaksh/test_views.py b/yaksh/test_views.py index e3914ad..5ef97d6 100644 --- a/yaksh/test_views.py +++ b/yaksh/test_views.py @@ -3381,7 +3381,7 @@ class TestShowStatistics(TestCase): self.assertEqual(response.context['total'], 1) -class TestCheck(TestCase): +class TestQuestionPaper(TestCase): def setUp(self): self.client = Client() -- cgit From 8ea7f10a84af44af37a5478c389fa040723542ec Mon Sep 17 00:00:00 2001 From: King Date: Thu, 5 Oct 2017 01:05:42 +0530 Subject: Will return the last answer submitted --- yaksh/models.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'yaksh') diff --git a/yaksh/models.py b/yaksh/models.py index 92076ab..68bde48 100644 --- a/yaksh/models.py +++ b/yaksh/models.py @@ -1285,7 +1285,7 @@ class AnswerPaper(models.Model): return q_a def get_latest_answer(self, question_id): - return self.answers.filter(question=question_id).order_by("-id").last() + return self.answers.filter(question=question_id).order_by("id").last() def get_questions(self): return self.questions.filter(active=True) -- cgit From dbacd863cfe3294a1f10f326710c65cfb591c6b2 Mon Sep 17 00:00:00 2001 From: mahesh Date: Thu, 5 Oct 2017 01:00:15 +0530 Subject: Update grade user UI --- yaksh/templates/yaksh/grade_user.html | 22 +++++++++++++++++++--- yaksh/views.py | 2 +- 2 files changed, 20 insertions(+), 4 deletions(-) (limited to 'yaksh') diff --git a/yaksh/templates/yaksh/grade_user.html b/yaksh/templates/yaksh/grade_user.html index 52f319c..2038210 100644 --- a/yaksh/templates/yaksh/grade_user.html +++ b/yaksh/templates/yaksh/grade_user.html @@ -9,6 +9,14 @@ {% block script %} + + {% endblock script %} {% if course_details %} @@ -108,17 +116,25 @@ Status : Passed
{% if paper.answers.count %}

Report


- +
+ + + + + + {% for question, answers in paper.get_question_answers.items %} {% with answers|last as answer %} - + + {% endwith %} {% endfor %} +
Question Id Questions Marks Obtained
{{ question.summary }}{{question.id}}{{ question.summary }} {{ answer.answer.marks }}
@@ -135,7 +151,7 @@ Status : Passed
{% for question, answers in paper.get_question_answers.items %}
-
+
Details: {{forloop.counter}}. {{ question.summary }} Mark(s): {{ question.points }} diff --git a/yaksh/views.py b/yaksh/views.py index c4ddcd1..6abfa2b 100644 --- a/yaksh/views.py +++ b/yaksh/views.py @@ -597,7 +597,7 @@ def check(request, q_id, attempt_num=None, questionpaper_id=None): else: user_answer = request.POST.get('answer') if not user_answer: - msg = "Please submit a valid option or code" + msg = "Please submit a valid answer." return show_question( request, current_question, paper, notification=msg ) -- cgit From 9f4cf9a4e3f51855f31028fbe68bcb992ce29791 Mon Sep 17 00:00:00 2001 From: adityacp Date: Thu, 5 Oct 2017 10:21:14 +0530 Subject: Add test to fetch latest answer from answerpaper --- yaksh/test_models.py | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) (limited to 'yaksh') diff --git a/yaksh/test_models.py b/yaksh/test_models.py index bc7f114..fd31ca2 100644 --- a/yaksh/test_models.py +++ b/yaksh/test_models.py @@ -547,6 +547,12 @@ class AnswerPaperTestCases(unittest.TestCase): self.answerpaper.answers.add(self.answer_right) self.answerpaper.answers.add(self.answer_wrong) + self.answer1 = Answer.objects.create( + question=self.question1, + answer="answer1", correct=False, error=json.dumps([]) + ) + self.answerpaper.answers.add(self.answer1) + self.question1.language = 'python' self.question1.test_case_type = 'standardtestcase' self.question1.summary = "Question1" @@ -834,17 +840,22 @@ class AnswerPaperTestCases(unittest.TestCase): def test_get_previous_answers(self): answers = self.answerpaper.get_previous_answers(self.questions[0]) - self.assertEqual(answers.count(), 1) + self.assertEqual(answers.count(), 2) self.assertTrue(answers[0], self.answer_right) answers = self.answerpaper.get_previous_answers(self.questions[1]) self.assertEqual(answers.count(), 1) self.assertTrue(answers[0], self.answer_wrong) - def test_set_marks (self): + def test_set_marks(self): self.answer_wrong.set_marks(0.5) self.assertEqual(self.answer_wrong.marks, 0.5) self.answer_wrong.set_marks(10.0) - self.assertEqual(self.answer_wrong.marks,1.0) + self.assertEqual(self.answer_wrong.marks, 1.0) + + def test_get_latest_answer(self): + latest_answer = self.answerpaper.get_latest_answer(self.question1.id) + self.assertEqual(latest_answer.id, self.answer1.id) + self.assertEqual(latest_answer.answer, "answer1") ############################################################################### -- cgit