def test_update_state_multiple_answers_in_schema(self): question = RepeatingAnswerStateQuestion('question_id', MagicMock()) question.schema_item.type = 'RepeatingAnswer' answer1 = Answer('answer_one') answer2 = Answer('answer_two') answer1.widget = TextWidget('answer_one') answer2.widget = TextWidget('answer_two') question.schema_item.answers = [answer1, answer2] question.update_state({ 'answer_one': 'answer_one_value', 'answer_one_1': 'answer_one_value_1', 'answer_two': 'answer_two_value', }) self.assertEqual(len(question.children), 3) question.update_state({ 'answer_one': 'answer_one_value', 'answer_two': 'answer_two_value', 'answer_two_3': 'answer_two_value_3', 'answer_two_2': 'answer_two_value_2', }) self.assertEqual(len(question.children), 5)
def test_basics(self): question = Question() question.id = 'some-id' question.title = 'my question object' question.description = 'fill this in' answer1 = Answer() answer1.id = 'answer-1' answer2 = Answer() answer2.id = 'answer-2' question.add_answer(answer1) question.add_answer(answer2) self.assertEqual(question.id, 'some-id') self.assertEqual(question.title, 'my question object') self.assertEqual(question.description, 'fill this in') self.assertIsNone(question.container) self.assertEqual(len(question.answers), 2) self.assertEqual(question.answers[0], answer1) self.assertEqual(question.answers[1], answer2) self.assertEqual(answer1.container, question) self.assertEqual(answer2.container, question)
def test_convert_answers(self): with self.application.test_request_context(): user_answer = [create_answer('ABC', '2016-01-01', group_id='group-1', block_id='block-1'), create_answer('DEF', '2016-03-30', group_id='group-1', block_id='block-1')] answer_1 = Answer() answer_1.id = "ABC" answer_1.code = "001" answer_2 = Answer() answer_2.id = "DEF" answer_2.code = "002" question = Question() question.id = 'question-1' question.add_answer(answer_1) question.add_answer(answer_2) section = Section() section.add_question(question) block = Block() block.id = 'block-1' block.add_section(section) group = Group() group.id = 'group-1' group.add_block(block) questionnaire = Questionnaire() questionnaire.survey_id = "021" questionnaire.data_version = "0.0.1" questionnaire.add_group(group) questionnaire.register(group) questionnaire.register(block) questionnaire.register(section) questionnaire.register(question) questionnaire.register(answer_1) questionnaire.register(answer_2) routing_path = [Location(group_id='group-1', group_instance=0, block_id='block-1')] answer_object = convert_answers(metadata, questionnaire, AnswerStore(user_answer), routing_path) self.assertEqual(answer_object['type'], 'uk.gov.ons.edc.eq:surveyresponse') self.assertEqual(answer_object['version'], '0.0.1') self.assertEqual(answer_object['origin'], 'uk.gov.ons.edc.eq') self.assertEqual(answer_object['survey_id'], '021') self.assertEqual(answer_object['collection']['exercise_sid'], metadata['collection_exercise_sid']) self.assertEqual(answer_object['collection']['instrument_id'], metadata['form_type']) self.assertEqual(answer_object['collection']['period'], metadata['period_id']) self.assertEqual(answer_object['metadata']['user_id'], metadata['user_id']) self.assertEqual(answer_object['metadata']['ru_ref'], metadata['ru_ref']) self.assertEqual(answer_object['data']['001'], '2016-01-01') self.assertEqual(answer_object['data']['002'], '2016-03-30')
def test_update_state_multiple_repeating_answers(self): question_state = RepeatingAnswerStateQuestion('question_id', MagicMock()) question_state.schema_item.type = 'RepeatingAnswer' answers = [] for x in range(3): answer = Answer('answer' + str(x)) answer.widget = TextWidget('answer' + str(x)) answers.append(answer) question_state.schema_item.answers = answers answer1 = StateAnswer('answer0', MagicMock()) answer2 = StateAnswer('answer1', MagicMock()) answer3 = StateAnswer('answer2', MagicMock()) question_state.answers = [answer1, answer2, answer3] question_state.update_state({ 'answer0': 'answer_one_value', 'answer0_1': 'answer_one_value_1', 'answer1': 'answer_two_value', 'answer1_1': 'answer_two_value_1', 'answer1_2': 'answer_two_value_2', 'answer2': 'answer_three_value', }) self.assertEqual(len(question_state.answers), 6)
def test_answers_grouped_by_instance_id_one_answer_many_instances(self): # Given question_state = RepeatingAnswerStateQuestion('question_id', MagicMock()) schema_answer = Answer('answer') schema_answer.widget = TextWidget('answer') question_state.schema_item.answers = [schema_answer] state_answer = MagicMock() state_answer.id = 'answer' state_answer.answer_instance = 0 state_answer1 = MagicMock() state_answer1.id = 'answer' state_answer1.answer_instance = 1 question_state.answers = [state_answer, state_answer1] # When result = question_state.answers_grouped_by_instance() # Then self.assertEqual(len(result), 2) self.assertEqual(len(result[0]), 1) self.assertEqual(result[0][0], state_answer) self.assertEqual(len(result[1]), 1) self.assertEqual(result[1][0], state_answer1)
def test_get_known_validators_by_type(self): # answer types item = Answer() item.type = 'integer' validators = TypeValidatorFactory.get_validators_by_type(item) self.assertEqual(len(validators), 1) self.assertTrue(isinstance(validators[0], IntegerTypeCheck)) item.type = 'date' validators = TypeValidatorFactory.get_validators_by_type(item) self.assertEqual(len(validators), 1) self.assertTrue(isinstance(validators[0], DateTypeCheck)) item.type = 'positiveinteger' validators = TypeValidatorFactory.get_validators_by_type(item) self.assertEqual(len(validators), 1) self.assertTrue(isinstance(validators[0], PositiveIntegerTypeCheck)) item.type = 'textarea' validators = TypeValidatorFactory.get_validators_by_type(item) self.assertEqual(len(validators), 1) self.assertTrue(isinstance(validators[0], TextAreaTypeCheck)) # question types item = Question() item.type = 'daterange' validators = TypeValidatorFactory.get_validators_by_type(item) self.assertEqual(len(validators), 1) self.assertTrue(isinstance(validators[0], DateRangeCheck))
def test_answers_grouped_by_instance_id_odd_number_of_instances(self): # Given question_state = RepeatingAnswerStateQuestion('question_id', MagicMock()) first_name_schema = Answer('first-name') first_name_schema.widget = TextWidget('first-name') last_name_schema = Answer('last-name') last_name_schema.widget = TextWidget('last-name') question_state.schema_item.answers = [ first_name_schema, last_name_schema ] first_name = MagicMock() first_name.id = 'first-name' first_name.answer_instance = 0 last_name = MagicMock() last_name.id = 'last-name' last_name.answer_instance = 0 first_name1 = MagicMock() first_name1.id = 'first-name' first_name1.answer_instance = 1 question_state.answers = [first_name, last_name, first_name1] # When result = question_state.answers_grouped_by_instance() # Then self.assertEqual(len(result), 2) # Instance 0 self.assertEqual(len(result[0]), 2) self.assertEqual(result[0][0], first_name) self.assertEqual(result[0][1], last_name) # Instance 1 self.assertEqual(len(result[1]), 1) self.assertEqual(result[1][0], first_name1)
def test_widget_should_contain_current_person(self): # Given widget = RelationshipWidget('relationship') widget.current_person = 'John Doe' state_answer = StateAnswer('who-related', Answer()) # When widget_params = widget.build_widget_params(state_answer) # Then self.assertEqual(widget_params['answer']['current_person'], 'John Doe')
def test_answers_grouped_by_instance_id_many_answers_one_instance(self): # Given question_state = RepeatingAnswerStateQuestion('question_id', MagicMock()) first_name_schema = Answer('first-name') first_name_schema.widget = TextWidget('first-name') middle_name_schema = Answer('middle-names') middle_name_schema.widget = TextWidget('middle-names') last_name_schema = Answer('last-name') last_name_schema.widget = TextWidget('last-name') question_state.schema_item.answers = [ first_name_schema, middle_name_schema, last_name_schema ] first_name = MagicMock() first_name.id = 'first-name' first_name.answer_instance = 0 middle_name = MagicMock() middle_name.id = 'middle-names' middle_name.answer_instance = 0 last_name = MagicMock() last_name.id = 'last-name' last_name.answer_instance = 0 question_state.answers = [first_name, middle_name, last_name] # When result = question_state.answers_grouped_by_instance() # Then self.assertEqual(len(result), 1) self.assertEqual(len(result[0]), 3) self.assertEqual(result[0][0], first_name) self.assertEqual(result[0][1], middle_name) self.assertEqual(result[0][2], last_name)
def test_unknown_validators(self): # answer types item = Answer() item.type = 'unknown_type' self.assertRaises(TypeValidatorFactoryException, TypeValidatorFactory.get_validators_by_type, item) # question types item = Question() item.type = 'unknown_type' self.assertRaises(TypeValidatorFactoryException, TypeValidatorFactory.get_validators_by_type, item)
def test_widget_should_be_selected(self): # Given widget = RelationshipWidget('relationship') answer = Answer() answer.options = [{'label': 'Husband or wife', 'value': 'Husband or wife'}, {'label': 'Son or daughter', 'value': 'Son or daughter'}] state_answer = StateAnswer('who-related', answer) state_answer.input = 'Husband or wife' # When widget_params = widget.build_widget_params(state_answer) # Then self.assertEqual(widget_params['widget']['options'][0].selected, True)
def test_answers_grouped_by_instance_id_one_answer_no_instances(self): # Given question_state = RepeatingAnswerStateQuestion('question_id', MagicMock()) schema_answer = Answer('answer') schema_answer.widget = TextWidget('answer') question_state.schema_item.answers = [schema_answer] question_state.answers = [] # When result = question_state.answers_grouped_by_instance() # Then self.assertEqual(len(result), 0)
def test_render_widget_should_contain_other_person(self): with self.app.test_request_context(): # Given widget = RelationshipWidget('relationship') widget.other_person = 'Jane Doe' answer = Answer() answer.label = '%(current_person)s is the … of %(other_person)s' answer.options = [{'label': 'Husband or wife', 'value': 'Husband or wife'}, {'label': 'Son or daughter', 'value': 'Son or daughter'}] state_answer = StateAnswer('who-related', answer) state_answer.input = 'Husband or wife' # When rendered = widget.render(state_answer) # Then self.assertRegex(rendered, 'of Jane Doe')
def setUp(self): self.answer_schema = Answer('multiple-choice-with-other') self.answer_schema.type = 'Radio' self.answer_schema.widget = TextWidget(self.answer_schema.id) self.answer_schema.options = [ { "label": "Yes", "value": "Yes" }, { "label": "No", "value": "No", "other": { "label": "Please enter the country of usual residence" } } ]
def test_widget_should_contain_options(self): # Given widget = RelationshipWidget('relationship') answer = Answer() answer.options = [{'label': 'Husband or wife', 'value': 'Husband or wife'}, {'label': 'Son or daughter', 'value': 'Son or daughter'}] state_answer = StateAnswer('who-related', answer) # When widget_params = widget.build_widget_params(state_answer) # Then self.assertEqual(widget_params['widget']['options'][0].label, 'Husband or wife') self.assertEqual(widget_params['widget']['options'][0].value, 'Husband or wife') self.assertEqual(widget_params['widget']['options'][0].selected, False) self.assertEqual(widget_params['widget']['options'][1].label, 'Son or daughter') self.assertEqual(widget_params['widget']['options'][1].value, 'Son or daughter') self.assertEqual(widget_params['widget']['options'][0].selected, False)
def test_update_state_initialise_repeating(self): question_state = RepeatingAnswerStateQuestion('question_id', MagicMock()) question_state.schema_item.type = 'RepeatingAnswer' question_state.schema_item.answers = [Answer('answer_id')] question_state.schema_item.answers[0].widget = TextWidget('answer_id') answer_state = MagicMock() answer_state.id = 'answer_id' answer_state.answer_instance = 0 question_state.answers.append(answer_state) question_state.update_state({ 'answer_id': 'answer_value', 'answer_id_1': 'answer_value_1' }) self.assertEqual(len(question_state.answers), 2)
def test_answer_with_multiple_instances(self): with self.application.test_request_context(): user_answer = [create_answer('GHI', 0, group_id='group-1', block_id='block-1'), create_answer('GHI', value=1, answer_instance=1, group_id='group-1', block_id='block-1'), create_answer('GHI', value=2, answer_instance=2, group_id='group-1', block_id='block-1')] answer = Answer() answer.id = "GHI" answer.code = "003" question = Question() question.id = 'question-2' question.add_answer(answer) section = Section() section.add_question(question) block = Block() block.id = 'block-1' block.add_section(section) group = Group() group.id = 'group-1' group.add_block(block) questionnaire = Questionnaire() questionnaire.survey_id = "021" questionnaire.data_version = "0.0.1" questionnaire.add_group(group) questionnaire.register(question) questionnaire.register(answer) routing_path = [Location(group_id='group-1', group_instance=0, block_id='block-1')] answer_object = convert_answers(metadata, questionnaire, AnswerStore(user_answer), routing_path) # Check the converter correctly self.assertEqual(answer_object["data"]["003"], ['0', '1', '2'])
def create_answer(group_instance=0): answer = Answer('whos-related') answer.widget = TextWidget('whos-related') answer_state = answer.construct_state() answer_state.group_instance = group_instance return answer_state
def test_answers_grouped_by_instance_id_many_answers_many_instance(self): # pylint: disable=too-many-statements # Given question_state = RepeatingAnswerStateQuestion('question_id', MagicMock()) first_name_schema = Answer('first-name') first_name_schema.widget = TextWidget('first-name') middle_name_schema = Answer('middle-names') middle_name_schema.widget = TextWidget('middle-names') last_name_schema = Answer('last-name') last_name_schema.widget = TextWidget('last-name') question_state.schema_item.answers = [ first_name_schema, middle_name_schema, last_name_schema ] first_name = MagicMock() first_name.id = 'first-name' first_name.answer_instance = 0 middle_name = MagicMock() middle_name.id = 'middle-names' middle_name.answer_instance = 0 last_name = MagicMock() last_name.id = 'last-name' last_name.answer_instance = 0 first_name1 = MagicMock() first_name1.id = 'first-name' first_name1.answer_instance = 1 middle_name1 = MagicMock() middle_name1.id = 'middle-names' middle_name1.answer_instance = 1 last_name1 = MagicMock() last_name1.id = 'last-name' last_name1.answer_instance = 1 first_name2 = MagicMock() first_name2.id = 'first-name' first_name2.answer_instance = 2 middle_name2 = MagicMock() middle_name2.id = 'middle-names' middle_name2.answer_instance = 2 last_name2 = MagicMock() last_name2.id = 'last-name' last_name2.answer_instance = 2 question_state.answers = [ first_name, middle_name, last_name, first_name1, middle_name1, last_name1, first_name2, middle_name2, last_name2, ] # When result = question_state.answers_grouped_by_instance() # Then self.assertEqual(len(result), 3) # Instance 0 self.assertEqual(len(result[0]), 3) self.assertEqual(result[0][0], first_name) self.assertEqual(result[0][1], middle_name) self.assertEqual(result[0][2], last_name) # Instance 1 self.assertEqual(len(result[1]), 3) self.assertEqual(result[1][0], first_name1) self.assertEqual(result[1][1], middle_name1) self.assertEqual(result[1][2], last_name1) # Instance 2 self.assertEqual(len(result[2]), 3) self.assertEqual(result[2][0], first_name2) self.assertEqual(result[2][1], middle_name2) self.assertEqual(result[2][2], last_name2)