def test_build_answers_puts_answers_in_repeating_group(self):
        # Given
        self.answer_store.add(
            Answer(
                answer_id='first_name',
                value='Bloggs',
                answer_instance=1,
            ))
        self.answer_store.add(
            Answer(
                answer_id='first_name',
                value='Joe',
                answer_instance=
                0,  # answer_instance deliberately in inverse order
            ))
        answer_ids_on_path = ['first_name']

        # When
        self.schema.is_repeating_answer_type = MagicMock(return_value=True)
        context_answers = _build_answers(self.answer_store, self.schema,
                                         answer_ids_on_path)

        # Then
        self.assertEqual(len(context_answers), 1)
        self.assertEqual(context_answers['first_name'], ['Joe', 'Bloggs'])
    def test_build_answers_context_repeating_answers(self):
        # Given
        self.answer_store.add(
            Answer(
                answer_id='full_name_answer',
                value='Person One',
            ))
        self.answer_store.add(
            Answer(
                answer_id='full_name_answer',
                value='Person Two',
                answer_instance=1,
            ))
        self.answer_store.add(
            Answer(answer_id='full_name_answer',
                   value='Person One',
                   answer_instance=2))
        answer_ids_on_path = ['full_name_answer']

        # When
        self.schema.is_repeating_answer_type = MagicMock(return_value=True)
        context_answers = _build_answers(self.answer_store, self.schema,
                                         answer_ids_on_path)

        # Then
        self.assertIsInstance(context_answers['full_name_answer'], list)
        self.assertEqual(len(context_answers['full_name_answer']), 3)
        self.assertEqual(len(context_answers), 1)
    def test_given_backslash_in_answers_when_create_context_then_backslash_are_escaped(
            self):
        # Given
        self.answer_store.add(Answer(answer_id='first_name', value='\\'))
        answer_ids_on_path = ['first_name']

        # When
        context_answers = _build_answers(self.answer_store, self.schema,
                                         answer_ids_on_path)

        # Then
        self.assertEqual(len(context_answers), 1)
        self.assertEqual(context_answers['first_name'], r'\\')
    def test_given_quotes_in_answers_when_create_context_quotes_then_are_html_encoded(
            self):
        # Given
        self.answer_store.add(Answer(answer_id='first_name', value='"'))
        answer_ids_on_path = ['first_name']

        # When
        context_answers = _build_answers(self.answer_store, self.schema,
                                         answer_ids_on_path)

        # Then
        self.assertEqual(len(context_answers), 1)
        self.assertEqual(context_answers['first_name'], r'"')
    def test_build_answers(self):
        # Given
        self.answer_store.add_or_update(Answer(
            answer_id='first_name',
            value='Joe Bloggs',
        ))
        answer_ids_on_path = ['first_name']

        # When
        context_answers = _build_answers(self.answer_store, self.schema, answer_ids_on_path)

        # Then
        self.assertEqual(len(context_answers), 1)
        self.assertEqual(context_answers['first_name'], 'Joe Bloggs')
    def test_alias_for_answer_in_repeating_group_returns_list(self):
        # Given
        self.answer_store.add_or_update(Answer(
            answer_id='answer_id',
            value='Some Value',
        ))
        answer_ids_on_path = ['answer_id']

        # When
        self.schema.is_repeating_answer_type = MagicMock(return_value=True)
        context_answers = _build_answers(self.answer_store, self.schema, answer_ids_on_path)

        # Then
        self.assertIsInstance(context_answers['answer_id'], list)
    def test_alias_for_non_repeating_answer_returns_string(self):
        # Given
        self.answer_store.add_or_update(Answer(
            answer_id='non_repeating_answer_id',
            value='Some Value',
        ))
        answer_ids_on_path = ['non_repeating_answer_id']

        # When
        context_answers = _build_answers(self.answer_store, self.schema, answer_ids_on_path)

        # Then
        self.assertIsInstance(context_answers['non_repeating_answer_id'], str)
        self.assertEqual(context_answers['non_repeating_answer_id'], 'Some Value')
    def test_build_answers_single_answer_should_not_return_list(self):
        # Given
        self.answer_store.add_or_update(Answer(
            answer_id='full_name_answer',
            value='Person One',
        ))
        answer_ids_on_path = ['full_name_answer']

        # When
        context_answers = _build_answers(self.answer_store, self.schema, answer_ids_on_path)

        # Then
        self.assertEqual(len(context_answers), 1)
        self.assertEqual(context_answers['full_name_answer'], 'Person One')
    def test_maximum_answers_must_be_limited_to_system_max(self):
        # Given
        for instance in range(26):
            self.answer_store.add_or_update(Answer(
                answer_id='repeating_answer_id',
                value='Some Value',
                answer_instance=instance,
            ))
        answer_ids_on_path = ['repeating_answer_id']

        # When
        self.schema.is_repeating_answer_type = MagicMock(return_value=True)
        context_answers = _build_answers(self.answer_store, self.schema, answer_ids_on_path)

        # Then
        print(context_answers)
        self.assertEqual(len(context_answers['repeating_answer_id']), 25)
    def test_build_answers_excludes_answers_not_in_routing_path(self):
        # Given
        self.answer_store.add(Answer(
            answer_id='first_name',
            value='Joe',
        ))
        self.answer_store.add(Answer(
            answer_id='lastname',
            value='Bloggs',
        ))
        answer_ids_on_path = ['first_name']

        # When
        context_answers = _build_answers(self.answer_store, self.schema,
                                         answer_ids_on_path)

        # Then
        self.assertEqual(len(context_answers), 1)
        self.assertEqual(context_answers['first_name'], 'Joe')
    def test_build_answers_puts_repeating_answers_in_correct_index(self):
        """Tests that repeating answers get put in a padded list in the
        correct position
        """
        # Given
        self.answer_store.add_or_update(Answer(
            answer_id='first_name',
            value='Joe',
            answer_instance=1,
        ))
        answer_ids_on_path = ['first_name']

        # When
        self.schema.is_repeating_answer_type = MagicMock(return_value=True)
        context_answers = _build_answers(self.answer_store, self.schema, answer_ids_on_path)

        # Then
        self.assertEqual(len(context_answers), 1)
        self.assertEqual(context_answers['first_name'], ['', 'Joe'])