def test_difference_between_two_survey_response_with_with_deleted_question_in_new_questionnaire(self): old_survey_response = SurveyResponse(Mock(), values={'q1': 'ans5', 'q2': 'ans6', 'q3': 'ans3'}, transport_info=TransportInfo('web', 'web', 'web')) old_survey_response._doc.submitted_on = datetime.date(2012, 02, 27) new_survey_response = SurveyResponse(Mock(), values={'q1': 'ans1', 'q2': 'ans2'}, transport_info=TransportInfo('web', 'web', 'web')) new_survey_response._doc.status = True result_diff = new_survey_response.differs_from(old_survey_response) expected_result_diff = SurveyResponseDifference(old_survey_response.submitted_on, True) expected_result_diff.changed_answers = {'q1': {'old': 'ans5', 'new': 'ans1'}, 'q2': {'old': 'ans6', 'new': 'ans2'}} self.assertEqual(expected_result_diff, result_diff)
def test_set_answers_uses_case_insensitive_key_value(self): values = {'eid': 'cli001'} survey_response = SurveyResponse(Mock(), transport_info=TransportInfo('web', '*****@*****.**', 'destination'), values=values) survey_response.entity_question_code = 'EID' survey_response.set_answers(values) self.assertEquals(1, len(values))
def send_sms_v2(self, text): transport_info = TransportInfo(transport="sms", source="1234", destination="5678") response = self.sms_player_v2.add_survey_response( Request(message=text, transportInfo=transport_info)) return response
def test_edit_survey_response_when_fields_constraints_are_not_satisfied( self): survey_response = Mock(spec=SurveyResponse) with patch( 'mangrove.transport.services.survey_response_service.by_short_code' ) as get_reporter: with patch( 'mangrove.datastore.entity.by_short_code') as get_entity: with patch( 'mangrove.transport.services.survey_response_service.get_form_model_by_code' ) as get_form_model: get_reporter.return_value = Mock(spec=Entity) get_entity.return_value = Mock(spec=Entity) get_form_model.return_value = self.form_model() transport_info = TransportInfo('web', 'src', 'dest') values = {'form_code': 'aids', 'q1': 'a1', 'q2': '200'} request = Request(values, transport_info) response = self.survey_response_service.edit_survey( 'aids', values, [], survey_response) self.assertFalse(response.success) self.assertEquals('aids', response.form_code) self.assertEquals( OrderedDict([( 'q2', u'Answer 200 for question q2 is greater than allowed.' )]), response.errors) self.assertEquals(['clinic'], response.entity_type) self.assertEquals(OrderedDict([('q1', 'a1')]), response.processed_data) self.assertIsNotNone(response.survey_response_id) assert not survey_response.update.called
def add_survey_response(self, text, reporter_id='rep12'): transport_info = TransportInfo(transport="web", source="*****@*****.**", destination="") response = self.web_player.add_survey_response( Request(message=text, transportInfo=transport_info), reporter_id) return response
def test_survey_response_is_saved_with_reporter_id_in_upper_case(self): test_data = TestData(self.manager) survey_response_service = SurveyResponseService(self.manager) values = {'ID': test_data.entity1.short_code, 'Q1': 'name', 'Q2': '80', 'Q3': 'a'} transport_info = TransportInfo('web', 'src', 'dest') request = Request(values, transport_info) response = survey_response_service.save_survey('CL1', values, [], transport_info, 'REP2') self.assertTrue(response.success) self.assertEqual(0, response.errors.__len__()) self.assertIsNotNone(response.datarecord_id) self.assertIsNotNone(response.survey_response_id) self.assertEqual(test_data.entity_type, response.entity_type) self.assertEqual('CL1', response.form_code) self.assertEqual('1', response.short_code) self.assertDictEqual(OrderedDict([('Q1', 'name'), ('Q3', ['RED']), ('Q2', 80), ('ID', u'1')]), response.processed_data) survey_response = SurveyResponse.get(self.manager, response.survey_response_id) self.assertDictEqual({'Q1': 'name', 'Q3': 'a', 'Q2': '80', 'ID': '1'}, survey_response.values) self.assertDictEqual({'Q1': 'name', 'Q3': 'a', 'Q2': '80', 'ID': '1'}, survey_response.values) self.assertEqual(test_data.form_model.revision, survey_response.form_model_revision) self.assertEqual(True, survey_response.status) self.assertIsNotNone(survey_response.data_record)
def send_sms(self, text, player=None): player = player or self.sms_player transport_info = TransportInfo(transport="sms", source=self.phone_number, destination="5678") response = player.accept( Request(message=text, transportInfo=transport_info)) return response
def test_survey_response_is_edited_and_new_submission_and_datarecord_is_created( self): test_data = TestData(self.manager) survey_response_service = SurveyResponseService(self.manager) values = { 'ID': test_data.entity1.short_code, 'Q1': 'name', 'Q2': '80', 'Q3': 'a' } transport_info = TransportInfo('web', 'src', 'dest') request = Request(values, transport_info) saved_response = survey_response_service.save_survey( 'CL1', values, [], transport_info, "rep2") self.assertDictEqual( OrderedDict([('Q1', 'name'), ('Q3', ['RED']), ('Q2', 80), ('ID', u'1')]), saved_response.processed_data) new_values = { 'ID': test_data.entity1.short_code, 'Q1': 'new_name', 'Q2': '430', 'Q3': 'b' } survey_response_to_edit = SurveyResponse.get( self.manager, saved_response.survey_response_id) edited_response = survey_response_service.edit_survey( 'CL1', new_values, [], survey_response_to_edit) self.assertTrue(edited_response.success) self.assertEqual(0, edited_response.errors.__len__()) self.assertIsNotNone(edited_response.datarecord_id) self.assertIsNotNone(edited_response.survey_response_id) self.assertEqual(test_data.entity_type, edited_response.entity_type) self.assertEqual('CL1', edited_response.form_code) self.assertDictEqual( OrderedDict([('Q1', 'new_name'), ('Q3', ['YELLOW']), ('Q2', 430), ('ID', u'1')]), edited_response.processed_data) self.assertNotEquals(saved_response.datarecord_id, edited_response.datarecord_id) old_data_record = DataRecord.get(self.manager, saved_response.datarecord_id) self.assertTrue(old_data_record.voided) new_data_record = DataRecord.get(self.manager, edited_response.datarecord_id) self.assertFalse(new_data_record.voided) edited_survey_response = SurveyResponse.get( self.manager, edited_response.survey_response_id) self.assertEquals(1, len(edited_survey_response._doc.data_record_history)) self.assertEquals(old_data_record.id, edited_survey_response._doc.data_record_history[0])
def test_response_has_no_error_when_feed_creation_fails(self): manager = Mock(spec=DatabaseManager) feed_manager = Mock(spec=DatabaseManager) values = {'ID': 'short_code', 'Q1': 'name', 'Q2': '80', 'Q3': 'a'} transport_info = TransportInfo('web', 'src', 'dest') request = Request(values, transport_info) additional_dictionary = { 'project': { 'name': 'someproject', 'status': 'active', 'id': 'someid' } } survey_response_service = SurveyResponseService(manager, feeds_dbm=feed_manager) with patch( 'mangrove.transport.services.survey_response_service.by_short_code' ) as get_reporter: with patch( 'mangrove.transport.services.survey_response_service.get_form_model_by_code' ) as get_form_model_by_code: with patch('mangrove.datastore.entity.by_short_code' ) as by_short_code: with patch( 'mangrove.transport.services.survey_response_service.DataFormSubmission' ) as data_form_submission: with patch( 'mangrove.transport.services.survey_response_service.EnrichedSurveyResponseBuilder' ) as builder: get_reporter.return_value = Mock(spec=Entity) builder.feed_document.side_effect = Exception( 'Some error') builder.return_value = builder instance_mock = data_form_submission.return_value type(instance_mock).is_valid = PropertyMock( return_value=True) type(instance_mock).data_record_id = PropertyMock( return_value='sdsddsd') type(instance_mock).errors = PropertyMock( return_value='') by_short_code.return_value = Mock(spec=Entity) mock_form_model = MagicMock(spec=FormModel) mock_form_model._dbm = manager mock_form_model._doc = MagicMock() mock_form_model._data = {} mock_form_model.validate_submission.return_value = values, "" get_form_model_by_code.return_value = mock_form_model response = survey_response_service.save_survey( 'CL1', values, [], transport_info, '', additional_dictionary) self.assertFalse(response.errors) self.assertTrue(response.feed_error_message)
def test_exception_is_raised_for_invalid_short_code_submissions(self): survey_response_service = SurveyResponseService(self.manager) with patch( 'mangrove.transport.services.survey_response_service.get_active_form_model') as mock_get_active_form_model: mock_get_active_form_model.side_effect = FormModelDoesNotExistsException("form_code") values = {'ID': "invalid", 'Q1': 'name', 'Q2': '80', 'Q3': 'a'} transport_info = TransportInfo('web', 'src', 'dest') request = Request(values, transport_info) self.assertRaises(MangroveException, survey_response_service.save_survey, 'CL1', values, [], transport_info, '')
def test_deep_copy(self): original = SurveyResponse(Mock(), values={'q1': 'ans5', 'q2': 'ans6', 'q3': 'ans3'}, transport_info=TransportInfo('web', 'web', 'web')) duplicate = original.copy() original.values['q1'] = 2 original.values['q2'] = 2 original.values['q3'] = 2 self.assertNotEqual(original.values['q1'], duplicate.values['q1']) self.assertNotEqual(original.values['q2'], duplicate.values['q2']) self.assertNotEqual(original.values['q3'], duplicate.values['q3'])
def setUp(self): super(TestXformPlayerIT, self).setUp() self.org_id = 'SLX364903' self.player = XFormPlayerV2(self.manager) message = self.xform_message self.transport = TransportInfo(transport="xform", source="*****@*****.**", destination="5678") self.request = Request(message=message, transportInfo=self.transport) TestData(self.manager) register_datasender(self.manager)
def test_survey_response_event_created_when_survey_response_created(self): manager = Mock(spec=DatabaseManager) feed_manager = Mock(spec=DatabaseManager) survey_response_service = SurveyResponseService(manager, feeds_dbm=feed_manager) values = {'ID': 'short_code', 'Q1': 'name', 'Q2': '80', 'Q3': 'a'} transport_info = TransportInfo('web', 'src', 'dest') request = Request(values, transport_info) additional_dictionary = { 'project': { 'name': 'someproject', 'status': 'active', 'id': 'someid' } } with patch( 'mangrove.transport.services.survey_response_service.by_short_code' ) as get_reporter: with patch( 'mangrove.transport.services.survey_response_service.get_form_model_by_code' ) as get_form_model_by_code: with patch('mangrove.datastore.entity.by_short_code' ) as by_short_code: with patch( 'mangrove.transport.services.survey_response_service.EnrichedSurveyResponseBuilder' ) as builder: with patch( "mangrove.form_model.form_submission.DataRecordDocument" ) as DataRecordDocumentMock: get_reporter.return_value = Mock(spec=Entity) builder.return_value = Mock( spec=EnrichedSurveyResponseBuilder) entity_mock = MagicMock(spec=Entity) entity_mock._doc = EntityDocument() by_short_code.return_value = entity_mock mock_form_model = MagicMock(spec=FormModel) mock_form_model._dbm = manager mock_form_model._doc = MagicMock() mock_form_model._data = {} mock_form_model.validate_submission.return_value = OrderedDict( values), OrderedDict('') mock_form_model.is_entity_registration_form.return_value = False mock_form_model.entity_questions = [] mock_form_model.entity_type = 'sometype' get_form_model_by_code.return_value = mock_form_model survey_response_service.save_survey( 'CL1', values, [], transport_info, '', additional_dictionary) self.assertEquals( 1, feed_manager._save_document.call_count)
def setUp(self): self.dbm = Mock(spec=DatabaseManager) self.web_player = WebPlayer(self.dbm, location_tree=DummyLocationTree()) self.transport = TransportInfo(transport="web", source="1234", destination="5678") self.message = { 'form_code': 'reg', 'n': 'subject_name', 't': 'clinic', 'l': 'Pune' } self._mock_form_model()
def submission(request): if request.method != 'POST': response = HttpResponse(status=204) response['Location'] = request.build_absolute_uri() return response send_to_carbon(create_path('submissions.smartphone'), 1) request_user = request.user submission_file = request.FILES.get("xml_submission_file").read() manager = get_database_manager(request_user) if not __authorized_to_make_submission_on_requested_form(request_user, submission_file, manager) \ or is_quota_reached(request): response = HttpResponse(status=403) return response player = XFormPlayerV2(manager, get_feeds_database(request_user)) try: user_profile = NGOUserProfile.objects.get(user=request_user) mangrove_request = Request( message=submission_file, transportInfo=TransportInfo(transport=SMART_PHONE, source=request_user.email, destination=''), media=request.FILES if len(request.FILES) > 1 else []) response = player.add_survey_response(mangrove_request, user_profile.reporter_id, logger=sp_submission_logger) mail_feed_errors(response, manager.database_name) if response.errors: logger.error("Error in submission : \n%s" % get_errors(response.errors)) return HttpResponseBadRequest() except MediaAttachmentNotFoundException as me: _send_media_error_mail(request, request_user, user_profile, me.message) return HttpResponseBadRequest() except Exception as e: logger.exception("Exception in submission : \n%s" % e) return HttpResponseBadRequest() organization = Organization.objects.get(org_id=user_profile.org_id) organization.increment_message_count_for(incoming_sp_count=1) check_quotas_and_update_users(organization) response = HttpResponse(status=201) response['Location'] = request.build_absolute_uri(request.path) return response
def test_should_not_parse_if_two_question_codes(self): transport = TransportInfo(transport="sms", source="1234", destination="5678") with patch('mangrove.form_model.project.get_project_by_code' ) as get_project_by_code: with patch('mangrove.form_model.project.check_if_form_code_is_poll' ) as mock_check_if_form_code_is_poll: with self.assertRaises( MultipleSubmissionsForSameCodeException): self.sms_player.add_survey_response( Request(message="cli001 .na tester1 .na tester2", transportInfo=transport)) self.assertEqual( 0, self.form_model_mock.validate_submission.call_count)
def test_feeds_created_if_subject_not_found_for_a_submission(self): manager = Mock(spec=DatabaseManager) feed_manager = Mock(spec=DatabaseManager) project = Mock(spec=Project) values = {'ID': 'short_code', 'Q1': 'name', 'Q2': '80', 'Q3': 'a'} transport_info = TransportInfo('web', 'src', 'dest') request = Request(values, transport_info) additional_dictionary = {'project': {'name': 'someproject', 'status': 'active', 'id': 'someid'}} survey_response_service = SurveyResponseService(manager, feeds_dbm=feed_manager) with patch('mangrove.transport.services.survey_response_service.by_short_code') as get_reporter: with patch( 'mangrove.transport.services.survey_response_service.get_form_model_by_code') as get_form_model_by_code: with patch('mangrove.datastore.entity.by_short_code') as by_short_code: with patch( 'mangrove.transport.services.survey_response_service.DataFormSubmission') as data_form_submission: with patch( 'mangrove.transport.services.survey_response_service.EnrichedSurveyResponseBuilder')as builder: with patch('mangrove.transport.services.survey_response_service.Project.from_form_model') as from_form_model: get_reporter.return_value = Mock(spec=Entity) builder.return_value = Mock(spec=EnrichedSurveyResponseBuilder) instance_mock = data_form_submission.return_value type(instance_mock).is_valid = PropertyMock(return_value=True) type(instance_mock).data_record_id = PropertyMock(return_value='sdsddsd') instance_mock.save.side_effect = MangroveException("subject not found") from_form_model.return_value = project project.data_senders = [] by_short_code.return_value = Mock(spec=Entity) mock_form_model = MagicMock(spec=FormModel) mock_form_model._dbm = manager mock_form_model._doc = MagicMock() mock_form_model._data = {} mock_form_model.validate_submission.return_value = values, "" get_form_model_by_code.return_value = mock_form_model try: survey_response_service.save_survey('CL1', values, [], transport_info, '', additional_dictionary) self.fail('the subject not found exception should be propagated') except MangroveException: feed_manager._save_document.assert_called_once()
def setUp(self): self.loc_tree = Mock() self.loc_tree.get_hierarchy_path.return_value = None self.dbm = Mock(spec=DatabaseManager) self._mock_form_model() self.reporter_patcher = patch( 'mangrove.transport.player.new_players.reporters') self.reporter_module = self.reporter_patcher.start() self._mock_reporter() self.transport = TransportInfo(transport="sms", source="1234", destination="5678") self.message = "FORM_CODE .ID 1 .M hello world" self.generate_code_patcher = patch( "mangrove.transport.work_flow._set_short_code") self.generate_code_patcher.start() self.post_sms_processor_mock = Mock() self.post_sms_processor_mock.process = lambda x, y, z=None: None self.post_sms_processors = [self.post_sms_processor_mock] self.sms_player = SMSPlayerV2(self.dbm, self.post_sms_processors)
def submission(request): if request.method != 'POST': response = HttpResponse(status=204) response['Location'] = request.build_absolute_uri() return response send_to_carbon(create_path('submissions.smartphone'), 1) request_user = request.user submission_file = request.FILES.get("xml_submission_file").read() manager = get_database_manager(request_user) if not __authorized_to_make_submission_on_requested_form(request_user, submission_file, manager) \ or is_quota_reached(request): response = HttpResponse(status=403) return response player = XFormPlayerV2(manager, get_feeds_database(request_user)) try: user_profile = NGOUserProfile.objects.get(user=request_user) mangrove_request = Request( message=submission_file, transportInfo=TransportInfo(transport=SMART_PHONE, source=request_user.email, destination=''), media=request.FILES if len(request.FILES) > 1 else []) form_code, values = XFormParser(manager).parse( mangrove_request.message) form_model = get_form_model_by_code(manager, form_code) if isinstance( form_model, EntityFormModel) and form_model.is_entity_registration_form: location_tree = LocationBridge( get_location_tree(), get_loc_hierarchy=get_location_hierarchy) response = player.add_subject(form_model, values, location_tree) else: response = player.add_survey_response(mangrove_request, user_profile.reporter_id, logger=sp_submission_logger) mail_feed_errors(response, manager.database_name) if response.errors: logger.error("Error in submission : \n%s" % get_errors(response.errors)) return HttpResponseBadRequest() except MediaAttachmentNotFoundException as me: _send_media_error_mail(request, request_user, user_profile, me.message) return HttpResponseBadRequest() except DataObjectAlreadyExists as doe: send_email_for_duplicate_unique_id_registration( request, doe.data[2], doe.data[1]) return HttpResponseBadRequest() except Exception as e: logger.exception("Exception in submission : \n%s" % e) return HttpResponseBadRequest() organization = Organization.objects.get(org_id=user_profile.org_id) organization.increment_message_count_for(incoming_sp_count=1) check_quotas_and_update_users(organization) response = HttpResponse(status=201) response['Location'] = request.build_absolute_uri(request.path) return response
def errored_survey_response(self): survey_response = SurveyResponse(self.dbm, TransportInfo('web', 'web', 'web'), form_model_id="clinic") survey_response.set_status('previous error') return survey_response
def test_should_throw_error_if_message_is_none(self): with self.assertRaises(AssertionError): transport = TransportInfo(transport="", source="", destination="") Request(transportInfo=transport, message=None)
def test_should_throw_error_if_transport_is_none(self): with self.assertRaises(AssertionError): TransportInfo(transport=None, source="", destination="")
def get_web_transport_info(username): return TransportInfo(transport="web", source=username, destination="")