def test_get_all_answers(self): q_graph = create_diamond_plus() session = SessionFactory.create(questionnaire__graph=q_graph) service = SessionService(session) service.question_graph_service.refresh_from_db() self.assertEqual(len(service.question_graph_service._questions_by_id), 7) for q in service.question_graph_service._questions: AnswerFactory.create(session=session, question=q, payload='answer') answers = service._get_all_answers(session) self.assertEqual(len(answers), 7)
def test_get_reachable_questions_answers_graph_with_cycles(self): q_graph = create_cycle() session = SessionFactory.create(questionnaire__graph=q_graph) service = SessionService(session) service.question_graph_service.refresh_from_db() answers = service._get_all_answers(session) answers_by_question_id = {a.question.id: a for a in answers} with self.assertRaises(CycleDetected): service._get_reachable_questions_and_answers( service.question_graph_service._nx_graph, service.question_graph_service._q_graph.first_question, service.question_graph_service._questions_by_id, answers_by_question_id)
def test_get_reachable_questions_answers_no_answers(self): q_graph = create_diamond_plus() session = SessionFactory.create(questionnaire__graph=q_graph) service = SessionService(session) service.question_graph_service.refresh_from_db() answers = service._get_all_answers(session) answers_by_question_id = {a.question.id: a for a in answers} questions_by_id, unanswered_by_id, answers_by_id, can_freeze = service._get_reachable_questions_and_answers( service.question_graph_service._nx_graph, service.question_graph_service._q_graph.first_question, service.question_graph_service._questions_by_id, answers_by_question_id) self.assertEqual(len(questions_by_id), 4) # should only return questions on one branch self.assertEqual(len(unanswered_by_id), 4) # should only return questions on one branch self.assertEqual(len(answers_by_id), 0) # no answers yet self.assertFalse(can_freeze)
def test_get_reachable_questions_answers_one_path(self): q_graph = create_diamond_plus() session = SessionFactory.create(questionnaire__graph=q_graph) service = SessionService(session) # get references to questions service.question_graph_service.refresh_from_db() q_by_analysis_key = { q.analysis_key: q for q in service.question_graph_service._questions } # Answer questions Answer.objects.create(session=session, question=q_by_analysis_key['q1'], payload='q1') Answer.objects.create(session=session, question=q_by_analysis_key['q2'], payload='q2') Answer.objects.create(session=session, question=q_by_analysis_key['q4'], payload='q4') Answer.objects.create(session=session, question=q_by_analysis_key['q5'], payload='q5') answers = service._get_all_answers(session) answers_by_question_id = {a.question.id: a for a in answers} questions_by_id, unanswered_by_id, answers_by_id, can_freeze = service._get_reachable_questions_and_answers( service.question_graph_service._nx_graph, service.question_graph_service._q_graph.first_question, service.question_graph_service._questions_by_id, answers_by_question_id) self.assertEqual(len(questions_by_id), 4) # should only return questions on one branch self.assertEqual(len(unanswered_by_id), 0) self.assertEqual(len(answers_by_id), 4) # all questions answered self.assertTrue(can_freeze)