From c23ad8570677c5cb1fbfaec34d85389655ac616c Mon Sep 17 00:00:00 2001 From: Tom Walker Date: Thu, 26 Jun 2014 22:49:09 +0100 Subject: [PATCH] Working on the tests for the template tags. Updated to show which selection you chose if you got a question wrong, rather than just seeing the correct answer. --- quiz/templates/correct_answer.html | 27 +-- quiz/templates/question.html | 2 +- quiz/templatetags/quiz_tags.py | 17 +- quiz/tests.py | 285 +++++++++++++++++------------ 4 files changed, 191 insertions(+), 140 deletions(-) diff --git a/quiz/templates/correct_answer.html b/quiz/templates/correct_answer.html index 1edf214..a0a98b6 100644 --- a/quiz/templates/correct_answer.html +++ b/quiz/templates/correct_answer.html @@ -1,37 +1,30 @@ -{% if user_was_incorrect %} -
- - You answered the above question incorrectly - -
- -{% else %} - -
- - You answered the above question correctly - -
- -{% endif %} {% for answer in answers %} + + {% if answer.correct %} + {% else %} - + {% endif %} diff --git a/quiz/templates/question.html b/quiz/templates/question.html index 7cfd37f..a939c61 100644 --- a/quiz/templates/question.html +++ b/quiz/templates/question.html @@ -18,7 +18,7 @@ {% ifequal previous.previous_outcome 'correct' %}
{% else %} -
+
{% endifequal %}

Your answer was {{ previous.previous_outcome }}

diff --git a/quiz/templatetags/quiz_tags.py b/quiz/templatetags/quiz_tags.py index 8543c04..811bf7d 100644 --- a/quiz/templatetags/quiz_tags.py +++ b/quiz/templatetags/quiz_tags.py @@ -1,4 +1,6 @@ from django import template +from django.shortcuts import get_list_or_404 + from multichoice.models import Answer register = template.Library() @@ -17,22 +19,19 @@ def correct_answer(context, previous): if q.__class__.__name__ == "MCQuestion": answers = Answer.objects.filter(question__id=q.id) + previous_answer_id = int(context['previous']['previous_answer']) + return {'answers': answers, + 'question_type': q.__class__.__name__, + 'previous_answer_id': previous_answer_id} if q.__class__.__name__ == "TF_Question": answers = [{'correct': q.check_if_correct('T'), 'content': 'True'}, {'correct': q.check_if_correct('F'), 'content': 'False'}] + return {'answers': answers, + 'question_type': q.__class__.__name__,} - return {'answers': answers, } - -@register.inclusion_tag('correct_answer.html', takes_context=True) -def correct_answer_for_all(context, question): - """ - processes the correct answer based on a given question object - """ - answers = Answer.objects.filter(question__id=question.id) - return {'answers': answers, } @register.inclusion_tag('correct_answer.html', takes_context=True) def correct_answer_for_all_with_users_incorrect(context, question, incorrect_list): diff --git a/quiz/tests.py b/quiz/tests.py index fee8060..06205e2 100644 --- a/quiz/tests.py +++ b/quiz/tests.py @@ -5,6 +5,7 @@ from django.core.urlresolvers import resolve from django.http import HttpRequest from django.test import TestCase from django.test.client import Client, RequestFactory +from django.template import Template, Context from quiz.models import Category, Quiz, Progress, Sitting, Question @@ -14,10 +15,10 @@ from true_false.models import TF_Question class TestCategory(TestCase): def setUp(self): - Category.objects.new_category(category = "elderberries") - Category.objects.new_category(category = "straw.berries") - Category.objects.new_category(category = "black berries") - Category.objects.new_category(category = "squishy berries") + Category.objects.new_category(category = 'elderberries') + Category.objects.new_category(category = 'straw.berries') + Category.objects.new_category(category = 'black berries') + Category.objects.new_category(category = 'squishy berries') def test_categories(self): c1 = Category.objects.get(id = 1) @@ -25,30 +26,30 @@ class TestCategory(TestCase): c3 = Category.objects.get(id = 3) c4 = Category.objects.get(id = 4) - self.assertEqual(c1.category, "elderberries") - self.assertEqual(c2.category, "straw.berries") - self.assertEqual(c3.category, "black-berries") - self.assertEqual(c4.category, "squishy-berries") + self.assertEqual(c1.category, 'elderberries') + self.assertEqual(c2.category, 'straw.berries') + self.assertEqual(c3.category, 'black-berries') + self.assertEqual(c4.category, 'squishy-berries') class TestQuiz(TestCase): def setUp(self): - Category.objects.new_category(category = "elderberries") + Category.objects.new_category(category = 'elderberries') Quiz.objects.create(id = 1, - title = "test quiz 1", - description = "d1", - url = "tq1",) + title = 'test quiz 1', + description = 'd1', + url = 'tq1',) Quiz.objects.create(id = 2, - title = "test quiz 2", - description = "d2", - url = "t q2",) + title = 'test quiz 2', + description = 'd2', + url = 't q2',) Quiz.objects.create(id = 3, - title = "test quiz 3", - description = "d3", - url = "t q3",) + title = 'test quiz 3', + description = 'd3', + url = 't q3',) Quiz.objects.create(id = 4, - title = "test quiz 4", - description = "d4", - url = "t-!£$%^&*q4",) + title = 'test quiz 4', + description = 'd4', + url = 't-!£$%^&*q4',) def test_quiz_url(self): @@ -57,18 +58,18 @@ class TestQuiz(TestCase): q3 = Quiz.objects.get(id = 3) q4 = Quiz.objects.get(id = 4) - self.assertEqual(q1.url, "tq1") - self.assertEqual(q2.url, "t-q2") - self.assertEqual(q3.url, "t-q3") - self.assertEqual(q4.url, "t-q4") + self.assertEqual(q1.url, 'tq1') + self.assertEqual(q2.url, 't-q2') + self.assertEqual(q3.url, 't-q3') + self.assertEqual(q4.url, 't-q4') def test_quiz_options(self): c1 = Category.objects.get(id = 1) q5 = Quiz.objects.create(id = 5, - title = "test quiz 5", - description = "d5", - url = "tq5", + title = 'test quiz 5', + description = 'd5', + url = 'tq5', category = c1, exam_paper = True,) @@ -80,21 +81,21 @@ class TestQuiz(TestCase): class TestProgress(TestCase): def setUp(self): - Category.objects.new_category(category = "elderberries") + Category.objects.new_category(category = 'elderberries') Quiz.objects.create(id = 1, - title = "test quiz 1", - description = "d1", - url = "tq1",) + title = 'test quiz 1', + description = 'd1', + url = 'tq1',) - self.user = User.objects.create_user(username = "jacob", - email = "jacob@jacob.com", - password = "top_secret") + self.user = User.objects.create_user(username = 'jacob', + email = 'jacob@jacob.com', + password = 'top_secret') def test_list_all_empty(self): p1 = Progress.objects.new_progress(self.user) - self.assertEqual(p1.score, "") + self.assertEqual(p1.score, '') category_dict = p1.list_all_cat_scores() @@ -102,69 +103,69 @@ class TestProgress(TestCase): category_dict = p1.list_all_cat_scores() - self.assertIn("elderberries", p1.score) + self.assertIn('elderberries', p1.score) - Category.objects.new_category(category = "cheese") + Category.objects.new_category(category = 'cheese') category_dict = p1.list_all_cat_scores() - self.assertIn("cheese", p1.score) + self.assertIn('cheese', p1.score) def test_check_cat(self): p1 = Progress.objects.new_progress(self.user) - elderberry_score = p1.check_cat_score("elderberries") + elderberry_score = p1.check_cat_score('elderberries') self.assertEqual(elderberry_score, (0, 0)) - fake_score = p1.check_cat_score("monkey") + fake_score = p1.check_cat_score('monkey') - self.assertEqual(fake_score, ("error", "category does not exist")) + self.assertEqual(fake_score, ('error', 'category does not exist')) - Category.objects.new_category(category = "cheese") - cheese_score = p1.check_cat_score("cheese") + Category.objects.new_category(category = 'cheese') + cheese_score = p1.check_cat_score('cheese') self.assertEqual(cheese_score, (0, 0)) - self.assertIn("cheese", p1.score) + self.assertIn('cheese', p1.score) def test_update_score(self): p1 = Progress.objects.new_progress(self.user) p1.list_all_cat_scores() - p1.update_score("elderberries", 1, 2) - elderberry_score = p1.check_cat_score("elderberries") + p1.update_score('elderberries', 1, 2) + elderberry_score = p1.check_cat_score('elderberries') self.assertEqual(elderberry_score, (1, 2)) - Category.objects.new_category(category = "cheese") - p1.update_score("cheese", 3, 4) - cheese_score = p1.check_cat_score("cheese") + Category.objects.new_category(category = 'cheese') + p1.update_score('cheese', 3, 4) + cheese_score = p1.check_cat_score('cheese') self.assertEqual(cheese_score, (3, 4)) - fake_cat = p1.update_score("hamster", 3, 4) + fake_cat = p1.update_score('hamster', 3, 4) self.assertIn('error', str(fake_cat)) - non_int = p1.update_score("hamster", "1", "a") + non_int = p1.update_score('hamster', '1', 'a') self.assertIn('error', str(non_int)) class TestSitting(TestCase): def setUp(self): quiz1 = Quiz.objects.create(id = 1, - title = "test quiz 1", - description = "d1", - url = "tq1",) + title = 'test quiz 1', + description = 'd1', + url = 'tq1',) question1 = MCQuestion.objects.create(id = 1, - content = "squawk",) + content = 'squawk',) question1.quiz.add(quiz1) question2 = MCQuestion.objects.create(id = 2, - content = "squeek",) + content = 'squeek',) question2.quiz.add(quiz1) - self.user = User.objects.create_user(username = "jacob", - email = "jacob@jacob.com", - password = "top_secret") + self.user = User.objects.create_user(username = 'jacob', + email = 'jacob@jacob.com', + password = 'top_secret') Sitting.objects.new_sitting(self.user, quiz1) @@ -203,45 +204,45 @@ class TestSitting(TestCase): question1 = MCQuestion.objects.get(id = 1) s1.add_incorrect_question(question1) - self.assertIn("1", s1.get_incorrect_questions()) + self.assertIn('1', s1.get_incorrect_questions()) question3 = TF_Question.objects.create(id = 3, - content = "oink",) + content = 'oink',) s1.add_incorrect_question(question3) - self.assertIn("3", s1.get_incorrect_questions()) + self.assertIn('3', s1.get_incorrect_questions()) quiz = Quiz.objects.get(id = 1) f_test = s1.add_incorrect_question(quiz) self.assertEqual(f_test, False) - self.assertNotIn("test", s1.get_incorrect_questions()) + self.assertNotIn('test', s1.get_incorrect_questions()) self.assertEqual(s1.complete, False) s1.mark_quiz_complete() self.assertEqual(s1.complete, True) -""" +''' Tests relating to views -""" +''' class TestNonQuestionViews(TestCase): - """ + ''' Starting on questions not directly involved with questions. - """ + ''' def setUp(self): - Category.objects.new_category(category = "elderberries") + Category.objects.new_category(category = 'elderberries') c1 = Category.objects.get(id = 1) - Category.objects.new_category(category = "straw.berries") - Category.objects.new_category(category = "black berries") + Category.objects.new_category(category = 'straw.berries') + Category.objects.new_category(category = 'black berries') Quiz.objects.create(id = 1, - title = "test quiz 1", - description = "d1", - url = "tq1", + title = 'test quiz 1', + description = 'd1', + url = 'tq1', category = c1) Quiz.objects.create(id = 2, - title = "test quiz 2", - description = "d2", - url = "t q2",) + title = 'test quiz 2', + description = 'd2', + url = 't q2',) def test_index(self): @@ -267,56 +268,56 @@ class TestNonQuestionViews(TestCase): self.assertContains(response, 'Sign up') session = self.client.session - session["session_score"] = 1 - session["session_score_possible"] = 2 + session['session_score'] = 1 + session['session_score_possible'] = 2 session.save() response = self.client.get('/q/progress/') self.assertContains(response, '1 out of 2') def test_progress_user(self): - self.user = User.objects.create_user(username = "jacob", - email = "jacob@jacob.com", - password = "top_secret") + self.user = User.objects.create_user(username = 'jacob', + email = 'jacob@jacob.com', + password = 'top_secret') self.client.login(username='jacob', password='top_secret') p1 = Progress.objects.new_progress(self.user) - p1.update_score("elderberries", 1, 2) + p1.update_score('elderberries', 1, 2) response = self.client.get('/q/progress/') - self.assertContains(response, "elderberries") + self.assertContains(response, 'elderberries') class TestQuestionViewsAnon(TestCase): def setUp(self): - Category.objects.new_category(category = "elderberries") + Category.objects.new_category(category = 'elderberries') c1 = Category.objects.get(id = 1) quiz1 = Quiz.objects.create(id = 1, - title = "test quiz 1", - description = "d1", - url = "tq1", + title = 'test quiz 1', + description = 'd1', + url = 'tq1', category = c1) question1 = MCQuestion.objects.create(id = 1, - content = "squawk",) + content = 'squawk',) question1.quiz.add(quiz1) question2 = MCQuestion.objects.create(id = 2, - content = "squeek",) + content = 'squeek',) question2.quiz.add(quiz1) Answer.objects.create(id = 123, question = question1, - content = "bing", + content = 'bing', correct = False,) Answer.objects.create(id = 456, question = question2, - content = "bong", + content = 'bong', correct = True,) def test_quiz_take_anon_view_only(self): @@ -334,8 +335,8 @@ class TestQuestionViewsAnon(TestCase): self.assertEqual(self.client.session['1_score'], 0) self.assertEqual(self.client.session['page_count'], 0) self.assertEqual(response.context['quiz'].id, 1) - self.assertEqual(response.context['question'].content, "squawk") - self.assertEqual(response.context['question_type'], "MCQuestion") + self.assertEqual(response.context['question'].content, 'squawk') + self.assertEqual(response.context['question_type'], 'MCQuestion') self.assertEqual(response.context['previous'], {}) self.assertEqual(response.context['show_advert'], False) self.assertTemplateUsed('question.html') @@ -413,49 +414,49 @@ class TestQuestionViewsAnon(TestCase): class TestQuestionViewsUser(TestCase): def setUp(self): - Category.objects.new_category(category = "elderberries") + Category.objects.new_category(category = 'elderberries') c1 = Category.objects.get(id = 1) quiz1 = Quiz.objects.create(id = 1, - title = "test quiz 1", - description = "d1", - url = "tq1", + title = 'test quiz 1', + description = 'd1', + url = 'tq1', category = c1) quiz2 = Quiz.objects.create(id = 2, - title = "test quiz 2", - description = "d2", - url = "tq2", + title = 'test quiz 2', + description = 'd2', + url = 'tq2', category = c1, answers_at_end = True, exam_paper = True) - self.user = User.objects.create_user(username = "jacob", - email = "jacob@jacob.com", - password = "top_secret") + self.user = User.objects.create_user(username = 'jacob', + email = 'jacob@jacob.com', + password = 'top_secret') question1 = MCQuestion.objects.create(id = 1, - content = "squawk") + content = 'squawk') question1.quiz.add(quiz1) question1.quiz.add(quiz2) question2 = MCQuestion.objects.create(id = 2, - content = "squeek") + content = 'squeek') question2.quiz.add(quiz1) question3 = TF_Question.objects.create(id = 3, - content = "oink", + content = 'oink', correct = True) question3.quiz.add(quiz2) Answer.objects.create(id = 123, question = question1, - content = "bing", + content = 'bing', correct = False,) Answer.objects.create(id = 456, question = question2, - content = "bong", + content = 'bong', correct = True,) def test_quiz_take_user_view_only(self): @@ -474,8 +475,8 @@ class TestQuestionViewsUser(TestCase): self.assertEqual(sitting.current_score, 0) self.assertEqual(self.client.session['page_count'], 0) self.assertEqual(response.context['quiz'].id, 1) - self.assertEqual(response.context['question'].content, "squawk") - self.assertEqual(response.context['question_type'], "MCQuestion") + self.assertEqual(response.context['question'].content, 'squawk') + self.assertEqual(response.context['question_type'], 'MCQuestion') self.assertEqual(response.context['previous'], {}) self.assertEqual(response.context['show_advert'], False) self.assertTemplateUsed('question.html') @@ -524,7 +525,7 @@ class TestQuestionViewsUser(TestCase): self.assertEqual(sitting.question_list, '2,') self.assertEqual(self.client.session['page_count'], 1) self.assertIn('123', response.context['previous']['previous_answer']) - self.assertEqual(response.context['question'].content, "squeek") + self.assertEqual(response.context['question'].content, 'squeek') self.assertTemplateUsed('question.html') response = self.client.get('/q/tq1/', @@ -556,7 +557,7 @@ class TestQuestionViewsUser(TestCase): self.assertIn(question1, response.context['questions']) self.assertIn(question2, response.context['questions']) self.assertContains(response, 'correctly') - self.assertContains(response, 'incorrectly') + self.assertNotContains(response, 'incorrectly') self.assertContains(response, 'True') @@ -568,3 +569,61 @@ class TestQuestionViewsUser(TestCase): self.assertEqual(Sitting.objects.count(), 1) # test that exam result can be recalled later self.assertIn(sitting, progress.show_exams()) + +class TestTemplateTags(TestCase): + + def setUp(self): + self.question1 = MCQuestion.objects.create(id = 1, + content = 'squawk') + + self.answer1 = Answer.objects.create(id = 123, + question = self.question1, + content = 'bing', + correct = False,) + + self.answer2 = Answer.objects.create(id = 456, + question = self.question1, + content = 'bong', + correct = True,) + + self.question2 = TF_Question.objects.create(id = 3, + content = 'oink', + correct = True) + + def test_answers_mc(self): + template = Template( '{% load quiz_tags %}' + + '{% answers_for_mc_question question %}') + context = Context({'question': self.question1}) + + self.assertTemplateUsed('answers_for_mc_question.html') + self.assertIn('bing', template.render(context)) + + def test_correct_answer_MC(self): + template = Template( '{% load quiz_tags %}' + + '{% correct_answer previous %}') + + previous_MC = {'previous_answer': 123, + 'previous_outcome': 'incorrect', + 'previous_question': self.question1} + + context = Context({'previous': previous_MC}) + + self.assertTemplateUsed('correct_answer.html') + self.assertIn('bing', template.render(context)) + self.assertIn('bong', template.render(context)) + self.assertIn('your answer', template.render(context)) + + def test_correct_answer_TF(self): + template = Template( '{% load quiz_tags %}' + + '{% correct_answer previous %}') + + previous_TF = {'previous_answer': 'T', + 'previous_outcome': 'correct', + 'previous_question': self.question2} + + context = Context({'previous': previous_TF}) + + self.assertTemplateUsed('correct_answer.html') + self.assertIn('True', template.render(context)) + self.assertIn('False', template.render(context)) + self.assertNotIn('your answer', template.render(context)) -- 2.39.5
{{ answer.content }} This is the correct answer
{{ answer.content }} + {% ifequal question_type 'MCQuestion' %} + {% if answer.id == previous_answer_id %} + This was your answer. + {% endif %} + {% endifequal %} +