def setUp(self, consistent=True, urlfetch=False): super(SurveyTests, self).setUp(consistent, urlfetch) self.survey = Survey(1) self.question1 = Question() self.question1.text = 'Fake text' self.question1.category = 'adm' self.question1.question_number = 1 self.question2 = Question() self.question2.text = 'Fake text' self.question2.category = 'fai' self.question2.question_number = 2
class SurveyTests(GaeTestCase): def setUp(self, consistent=True, urlfetch=False): super(SurveyTests, self).setUp(consistent, urlfetch) self.survey = Survey(1) self.question1 = Question() self.question1.text = 'Fake text' self.question1.category = 'adm' self.question1.question_number = 1 self.question2 = Question() self.question2.text = 'Fake text' self.question2.category = 'fai' self.question2.question_number = 2 def test_survey_requires_user_id(self): with self.assertRaises(ValueError): Survey(None) def test_first_page_property_returns_first_20_questions_for_new_user_id(self): QuizAttempt.create(1) self.assertEqual(1, self.survey.first_page) @mock.patch('app.domain.survey.QuizAttempt.get_by_user_id') def test_previous_quiz_attempt_by_user_passed_in_is_retrieved(self, quiz_attempt_get_by_user_id_mock): self.survey.save_user_submitted_answers([]) quiz_attempt_get_by_user_id_mock.assert_called_once_with(1, 'fullform') @mock.patch('app.domain.survey.QuizAttempt.get_by_user_id') def test_saves_all_answers_to_attempt_if_user_attempt_is_empty_for_those_questions(self, quiz_attempt_get_by_user_id_mock ): attempt = QuizAttempt(user_id=1, questions=[]) quiz_attempt_get_by_user_id_mock.return_value = attempt self.survey.save_user_submitted_answers([QuizAttemptAnswer(question_number=1, answer=5)]) self.assertEqual(1, len(attempt.questions)) @mock.patch('app.domain.survey.QuizAttempt.get_by_user_id') def test_saves_answers_over_any_attempt_answers_that_already_exist(self, quiz_attempt_get_by_user_id_mock): attempt = QuizAttempt(user_id=1, questions=[ QuizAttemptAnswer(question_number=1, answer=0, category='adm'), QuizAttemptAnswer(question_number=2, answer=5, category='adm'), ]) quiz_attempt_get_by_user_id_mock.return_value = attempt self.survey.save_user_submitted_answers([ QuizAttemptAnswer(question_number=1, answer=5), QuizAttemptAnswer(question_number=2, answer=2), ]) self.assertEqual(5, attempt.questions[0].answer) self.assertEqual(2, attempt.questions[1].answer) @mock.patch('app.domain.survey.QuizAttempt.get_by_user_id') def test_extends_quiz_attempt_with_any_new_answers(self, quiz_attempt_get_by_user_id_mock): attempt = QuizAttempt(user_id=1, questions=[ QuizAttemptAnswer(question_number=1, answer=0), QuizAttemptAnswer(question_number=2, answer=0), QuizAttemptAnswer(question_number=3, answer=0), QuizAttemptAnswer(question_number=4, answer=0), QuizAttemptAnswer(question_number=5, answer=0), ]) quiz_attempt_get_by_user_id_mock.return_value = attempt self.survey.save_user_submitted_answers([ QuizAttemptAnswer(question_number=5, answer=5), QuizAttemptAnswer(question_number=6, answer=0), QuizAttemptAnswer(question_number=7, answer=5), QuizAttemptAnswer(question_number=8, answer=2), QuizAttemptAnswer(question_number=9, answer=2), QuizAttemptAnswer(question_number=10, answer=5), ]) self.assertEqual(5, attempt.questions[4].answer) self.assertEqual(10, len(attempt.questions)) @mock.patch('app.domain.survey.QuizAttempt.get_by_user_id') def test_answer_not_written_if_question_numbers_dont_match(self, quiz_attempt_get_by_user_id_mock): attempt = QuizAttempt(user_id=1, questions=[ QuizAttemptAnswer(question_number=1, answer=0), QuizAttemptAnswer(question_number=2, answer=0), QuizAttemptAnswer(question_number=3, answer=0), ]) quiz_attempt_get_by_user_id_mock.return_value = attempt self.survey.save_user_submitted_answers([ QuizAttemptAnswer(question_number=1, answer=2), QuizAttemptAnswer(question_number=3, answer=5), QuizAttemptAnswer(question_number=4, answer=5), ]) self.assertEqual(0, attempt.questions[1].answer) self.assertEqual(5, attempt.questions[2].answer) self.assertEqual(5, attempt.questions[3].answer) def test_page_num_is_required(self): with self.assertRaises(ValueError): self.survey._get_questions_for_survey_page(None) def test_page_num_must_be_positive_integer(self): with self.assertRaises(ValueError): self.survey._get_questions_for_survey_page(-1) def test_page_num_can_not_be_string_one(self): with self.assertRaises(ValueError): self.survey._get_questions_for_survey_page("one") @mock.patch('app.domain.survey.Survey._calculate_from_and_to_for_page_number') def test_page_num_is_converted_to_integer(self, calculate_page_number_mock): calculate_page_number_mock.return_value = (1, 15) self.survey._get_questions_for_survey_page("1") calculate_page_number_mock.assert_called_once_with(1) def test_page_num_1_returns_questions_1_to_15(self): actual_from, actual_to = self.survey._calculate_from_and_to_for_page_number(1) self.assertEqual(1, actual_from) self.assertEqual(15, actual_to) def test_page_num_2_returns_questions_16_to_30(self): actual_from, actual_to = self.survey._calculate_from_and_to_for_page_number(2) self.assertEqual(16, actual_from) self.assertEqual(30, actual_to) def test_page_num_5_returns_questions_60_to_75(self): actual_from, actual_to = self.survey._calculate_from_and_to_for_page_number(5) self.assertEqual(61, actual_from) self.assertEqual(75, actual_to) @mock.patch('app.domain.survey.Question.get_questions_by_number_range') def test_page_num_2_returns_questions_16_to_30(self, get_questions_by_number_range_mock): self.survey._get_questions_for_survey_page(2) get_questions_by_number_range_mock.assert_called_once_with(16, 30) @mock.patch('app.domain.survey.Question.get_questions_by_number_range') def test_page_num_4_returns_questions_46_to_60(self, get_questions_by_number_range_mock): self.survey._get_questions_for_survey_page(4) get_questions_by_number_range_mock.assert_called_once_with(46, 60) @mock.patch('app.domain.survey.Survey._get_questions_for_survey_page') def test_get_survey_page_gets_called(self, get_survey_page_mock): self.survey.get_survey_page(1) get_survey_page_mock.assert_called_once_with(1) @mock.patch('app.domain.survey.Survey._get_questions_for_survey_page') def test_answers_are_None_if_user_attempt_is_none(self, questions_mock): questions_mock.return_value = [ self.question1, self.question2 ] actual, _, _ = self.survey.get_survey_page(1) expected = [ {"question_number": 1, "text": "Fake text", "answer": None, "category": "adm"}, {"question_number": 2, "text": "Fake text", "answer": None, "category": "fai"} ] self.assertEqual(expected, actual) @mock.patch('app.domain.survey.Question.get_questions_by_number_range') def test_correct_questions_returned_for_page_higher_than_one(self, questions_mock): question21 = Question() question21.text = "Fake text" question21.category = "adm" question21.question_number = 21 question22 = Question() question22.text = "Fake text" question22.category = "fai" question22.question_number = 22 questions_mock.return_value = [ question21, question22 ] actual, _, _ = self.survey.get_survey_page(2) expected = [ {"question_number": 21, "text": "Fake text", "answer": None, "category": "adm"}, {"question_number": 22, "text": "Fake text", "answer": None, "category": "fai"} ] self.assertEqual(expected, actual) @mock.patch('app.domain.survey.Survey._get_questions_for_survey_page') def test_prevPage_and_nextPage_set_appropriately(self, get_survey_page_mock): get_survey_page_mock.return_value = [] _, prev_p, next_p = self.survey.get_survey_page(1) self.assertEqual(1, prev_p) self.assertEqual(2, next_p) @mock.patch('app.domain.survey.Survey._get_questions_for_survey_page') def test_prevPage_and_nextPage_set_appropriately_when_page_greater_than_one(self, get_survey_page_mock): get_survey_page_mock.return_value = [] _, prev_p, next_p = self.survey.get_survey_page(5) self.assertEqual(4, prev_p) self.assertEqual(6, next_p) @mock.patch('app.domain.survey.Survey._get_questions_for_survey_page') def test_nextPage_is_false_when_no_more_pages_to_return(self, get_survey_page_mock): get_survey_page_mock.return_value = [] _, prev_p, next_p = self.survey.get_survey_page(12) self.assertEqual(11, prev_p) self.assertEqual(False, next_p) @mock.patch('app.domain.survey.ShortASurvey._get_questions_for_survey_page') def test_nextPage_is_false_when_no_more_pages_to_return_on_short_quiz(self, get_survey_page_mock): get_survey_page_mock.return_value = [] _, prev_p, next_p = ShortASurvey(1).get_survey_page(90 / 15) self.assertEqual(5, prev_p) self.assertEqual(False, next_p) def test_normalize_question_numbers_returns_question_list_unchanged(self): questions = [ {'question_number': 1}, {'question_number': 2}, {'question_number': 3}, {'question_number': 4}, {'question_number': 5}, {'question_number': 6}, {'question_number': 7}, {'question_number': 8}, {'question_number': 9}, {'question_number': 10}, {'question_number': 11}, {'question_number': 12}, {'question_number': 13}, {'question_number': 14}, {'question_number': 15} ] normalized = self.survey._normalize_question_numbers(questions, 1) self.assertEqual([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15], [q['question_number'] for q in normalized])