class TestImportData(unittest.TestCase): def setUp(self): self.dbm = get_db_manager(database='mangrove-test') self._create_entities() self.player = SMSPlayer(self.dbm, SubmissionHandler(self.dbm)) self.transport = TransportInfo(transport="sms", source="1234", destination="5678") initializer.run(self.dbm) def tearDown(self): _delete_db_and_remove_db_manager(self.dbm) def test_should_load_all_subjects(self): self._register_entities() subjects = load_subject_registration_data(self.dbm) self.assertEqual(4, len(subjects)) self.assertEqual(subjects[0]['name'], '--') self.assertEqual(subjects[0]['geocode'], '1.0, 1.0') self.assertEqual(subjects[1]['name'], 'clinic1') self.assertEqual(subjects[1]['mobile_number'], '--') self.assertEqual(subjects[2]['name'], '--') self.assertEqual(subjects[2]['mobile_number'], '12332114') self.assertEqual(subjects[3]['name'], '--') self.assertEqual(subjects[3]['geocode'], '--') self.assertEqual(subjects[3]['location'], 'pune') self.assertEqual(subjects[3]['description'], 'this is a clinic') def _create_entities(self): self.entity_type = ['clinic'] define_type(self.dbm, self.entity_type) define_type(self.dbm, ['reporter']) self.name_type = DataDictType(self.dbm, name='Name', slug='name', primitive_type='string') self.telephone_number_type = DataDictType(self.dbm, name='telephone_number', slug='telephone_number', primitive_type='string') rep1 = create_entity(self.dbm, ['reporter'], 'rep1') rep1.add_data(data=[(MOBILE_NUMBER_FIELD, '1234', self.telephone_number_type), (NAME_FIELD, "Test_reporter", self.name_type)], submission=dict(submission_id="2")) def _register_entity(self, text): self.player.accept(Request(transportInfo=self.transport, message=text)) def _register_entities(self): self._register_entity('reg +t clinic +s 1 +g 1 1') self._register_entity('reg +t clinic +s 2 +g 21 21 +n clinic1') self._register_entity('reg +t clinic +s 3 +g 11 11 +m 12332114') self._register_entity('reg +t clinic +s 4 +d this is a clinic +l pune')
def sms(request): _message = request.POST["message"] _from, _to = _get_from_and_to_numbers(request) try: dbm = get_db_manager_for(_to) sms_player = SMSPlayer(dbm, SubmissionHandler(dbm)) transportInfo = TransportInfo(transport=SMS, source=_from, destination=_to) response = sms_player.accept(Request(transportInfo=transportInfo, message=_message)) message = SMSResponse(response).text() except (SubmissionParseException, FormModelDoesNotExistsException,) as exception: message = get_exception_message_for(exception=exception, channel=SMS) log = DatawinnerLog(message=_message, from_number=_from, to_number=_to, form_code=exception.data[0], error=message) log.save() except NumberNotRegisteredException as exception: message = get_exception_message_for(exception=exception, channel=SMS) log = DatawinnerLog(message=_message, from_number=_from, to_number=_to, form_code=None, error=message) log.save() except MangroveException as exception: message = get_exception_message_for(exception=exception, channel=SMS) except Exception as exception: logger.exception('SMS Processing failure: message') message = get_exception_message_for(exception=exception, channel=SMS) return HttpResponse(message)
class TestSMSPlayer(TestCase): def _mock_reporter(self): self.reporter_mock = Mock(spec=Entity) reporter_name = "1234" self.reporter_module.find_reporter_entity.return_value = self.reporter_mock, reporter_name def setUp(self): loc_tree = Mock() loc_tree.get_hierarchy_path.return_value = None self.dbm = Mock(spec=DatabaseManager) self.submission_handler_mock = Mock(spec=SubmissionHandler) self.reporter_patcher = patch('mangrove.transport.player.player.reporter') self.reporter_module = self.reporter_patcher.start() self._mock_reporter() self.transport = TransportInfo(transport="sms", source="1234", destination="5678") self.request = Request( transportInfo=self.transport, message="FORM_CODE +ID 1 +M hello world") self.sms_player = SMSPlayer(self.dbm, self.submission_handler_mock, loc_tree) self.generate_code_patcher = patch("mangrove.transport.player.player.Player._handle_registration_form") self.generate_code_patcher.start() def tearDown(self): self.reporter_patcher.stop() self.generate_code_patcher.stop() def test_should_submit_if_parsing_is_successful(self): self.sms_player.accept(self.request) self.assertEqual(1, self.submission_handler_mock.accept.call_count) def test_should_submit_if_submission_by_registered_reporter(self): self.sms_player.accept(self.request) self.assertEqual(1, self.submission_handler_mock.accept.call_count) submission_request = self.submission_handler_mock.accept.call_args[0][0] self.assertEqual(self.reporter_mock, submission_request.reporter) def test_should_check_if_submission_by_unregistered_reporter(self): self.reporter_module.find_reporter_entity.side_effect = NumberNotRegisteredException("1234") with self.assertRaises(NumberNotRegisteredException): self.sms_player.accept(self.request) def test_should_not_submit_if_parsing_is_not_successful(self): self.request = Request(transportInfo=self.transport, message="invalid format") with self.assertRaises(SubmissionParseException): self.sms_player.accept(self.request) self.assertEqual(0, self.submission_handler_mock.accept.call_count) def test_should_not_parse_if_two_question_codes(self): transport = TransportInfo(transport="sms", source="1234", destination="5678") self.request = Request(transportInfo=transport, message="cli001 +na tester1 +na tester2") with self.assertRaises(SubmissionParseException): self.sms_player.accept(self.request) self.assertEqual(0, self.submission_handler_mock.accept.call_count)
def setUp(self): self.dbm = get_db_manager(database='mangrove-test') self._create_entities() self.player = SMSPlayer(self.dbm, SubmissionHandler(self.dbm)) self.transport = TransportInfo(transport="sms", source="1234", destination="5678") initializer.run(self.dbm)
class TestImportData(unittest.TestCase): def setUp(self): self.dbm = get_db_manager(database='mangrove-test') self._create_entities() self.player = SMSPlayer(self.dbm, SubmissionHandler(self.dbm)) self.transport = TransportInfo(transport="sms", source="1234", destination="5678") initializer.run(self.dbm) def tearDown(self): _delete_db_and_remove_db_manager(self.dbm) def test_should_load_all_subjects(self): self._register_entities() subjects = load_subject_registration_data(self.dbm) self.assertEqual(4,len(subjects)) self.assertEqual(subjects[0]['name'],'--') self.assertEqual(subjects[0]['geocode'],'1.0, 1.0') self.assertEqual(subjects[1]['name'],'clinic1') self.assertEqual(subjects[1]['mobile_number'],'--') self.assertEqual(subjects[2]['name'],'--') self.assertEqual(subjects[2]['mobile_number'],'12332114') self.assertEqual(subjects[3]['name'],'--') self.assertEqual(subjects[3]['geocode'],'--') self.assertEqual(subjects[3]['location'],'pune') self.assertEqual(subjects[3]['description'],'this is a clinic') def _create_entities(self): self.entity_type = ['clinic'] define_type(self.dbm, self.entity_type) define_type(self.dbm, ['reporter']) self.name_type = DataDictType(self.dbm, name='Name', slug='name', primitive_type='string') self.telephone_number_type = DataDictType(self.dbm, name='telephone_number', slug='telephone_number', primitive_type='string') rep1 = create_entity(self.dbm, ['reporter'], 'rep1') rep1.add_data(data=[(MOBILE_NUMBER_FIELD, '1234', self.telephone_number_type), (NAME_FIELD, "Test_reporter", self.name_type)], submission=dict(submission_id="2")) def _register_entity(self,text): self.player.accept(Request(transportInfo=self.transport, message=text)) def _register_entities(self): self._register_entity('reg +t clinic +s 1 +g 1 1') self._register_entity('reg +t clinic +s 2 +g 21 21 +n clinic1') self._register_entity('reg +t clinic +s 3 +g 11 11 +m 12332114') self._register_entity('reg +t clinic +s 4 +d this is a clinic +l pune')
def submit_to_player(incoming_request): try: dbm = incoming_request['dbm'] post_sms_parser_processors = [PostSMSProcessorLanguageActivator(dbm, incoming_request), PostSMSProcessorNumberOfAnswersValidators(dbm, incoming_request)] sms_player = SMSPlayer(dbm, LocationBridge(get_location_tree(),get_loc_hierarchy=get_location_hierarchy), post_sms_parser_processors=post_sms_parser_processors) mangrove_request = Request(message=incoming_request['incoming_message'], transportInfo=incoming_request['transport_info']) response = sms_player.accept(mangrove_request, logger=incoming_request.get("logger")) message = SMSResponse(response).text(dbm) send_message(incoming_request, response) except DataObjectAlreadyExists as e: message = ugettext("%s with %s = %s already exists.") % (ugettext(e.data[2]), ugettext(e.data[0]), e.data[1]) except Exception as exception: message = handle(exception, incoming_request) incoming_request['outgoing_message'] = message return incoming_request
def setUp(self): loc_tree = Mock() loc_tree.get_hierarchy_path.return_value = None self.dbm = Mock(spec=DatabaseManager) self.submission_handler_mock = Mock(spec=SubmissionHandler) self.reporter_patcher = patch( 'mangrove.transport.player.player.reporter') self.reporter_module = self.reporter_patcher.start() self._mock_reporter() self.transport = TransportInfo(transport="sms", source="1234", destination="5678") self.request = Request(transportInfo=self.transport, message="FORM_CODE +ID 1 +M hello world") self.sms_player = SMSPlayer(self.dbm, self.submission_handler_mock, loc_tree) self.generate_code_patcher = patch( "mangrove.transport.player.player.Player._handle_registration_form" ) self.generate_code_patcher.start()
def sms(request): _message = request.POST["message"] _from, _to = _get_from_and_to_numbers(request) try: dbm = get_db_manager_for(_to) sms_player = SMSPlayer(dbm, SubmissionHandler(dbm)) transportInfo = TransportInfo(transport=SMS, source=_from, destination=_to) response = sms_player.accept( Request(transportInfo=transportInfo, message=_message)) message = SMSResponse(response).text() except ( SubmissionParseException, FormModelDoesNotExistsException, ) as exception: message = get_exception_message_for(exception=exception, channel=SMS) log = DatawinnerLog(message=_message, from_number=_from, to_number=_to, form_code=exception.data[0], error=message) log.save() except NumberNotRegisteredException as exception: message = get_exception_message_for(exception=exception, channel=SMS) log = DatawinnerLog(message=_message, from_number=_from, to_number=_to, form_code=None, error=message) log.save() except MangroveException as exception: message = get_exception_message_for(exception=exception, channel=SMS) except Exception as exception: logger.exception('SMS Processing failure: message') message = get_exception_message_for(exception=exception, channel=SMS) return HttpResponse(message)
def setUp(self): loc_tree = Mock() loc_tree.get_hierarchy_path.return_value = None self.dbm = Mock(spec=DatabaseManager) self.submission_handler_mock = Mock(spec=SubmissionHandler) self.reporter_patcher = patch('mangrove.transport.player.player.reporter') self.reporter_module = self.reporter_patcher.start() self._mock_reporter() self.transport = TransportInfo(transport="sms", source="1234", destination="5678") self.request = Request( transportInfo=self.transport, message="FORM_CODE +ID 1 +M hello world") self.sms_player = SMSPlayer(self.dbm, self.submission_handler_mock, loc_tree) self.generate_code_patcher = patch("mangrove.transport.player.player.Player._handle_registration_form") self.generate_code_patcher.start()
def setUp(self): self.dbm = get_db_manager(database='mangrove-test') initializer.run(self.dbm) define_type(self.dbm, ["dog"]) self.entity_type = ["healthfacility", "clinic"] define_type(self.dbm, self.entity_type) self.name_type = DataDictType(self.dbm, name='Name', slug='name', primitive_type='string') self.telephone_number_type = DataDictType(self.dbm, name='telephone_number', slug='telephone_number', primitive_type='string') self.entity_id_type = DataDictType(self.dbm, name='Entity Id Type', slug='entity_id', primitive_type='string') self.stock_type = DataDictType(self.dbm, name='Stock Type', slug='stock', primitive_type='integer') self.color_type = DataDictType(self.dbm, name='Color Type', slug='color', primitive_type='string') self.name_type.save() self.telephone_number_type.save() self.stock_type.save() self.color_type.save() self.entity = create_entity(self.dbm, entity_type=self.entity_type, location=["India", "Pune"], aggregation_paths=None, short_code="cli1", ) self.data_record_id = self.entity.add_data(data=[("Name", "Ruby", self.name_type)], submission=dict(submission_id="1")) self.reporter = create_entity(self.dbm, entity_type=["reporter"], location=["India", "Pune"], aggregation_paths=None, short_code="rep1", ) self.reporter.add_data(data=[(MOBILE_NUMBER_FIELD, '1234', self.telephone_number_type), (NAME_FIELD, "Test_reporter", self.name_type)], submission=dict(submission_id="2")) question1 = TextField(name="entity_question", code="EID", label="What is associated entity", language="eng", entity_question_flag=True, ddtype=self.entity_id_type) question2 = TextField(name="Name", code="NAME", label="Clinic Name", defaultValue="some default value", language="eng", length=TextConstraint(4, 15), ddtype=self.name_type) question3 = IntegerField(name="Arv stock", code="ARV", label="ARV Stock", range=NumericConstraint(min=15, max=120), ddtype=self.stock_type) question4 = SelectField(name="Color", code="COL", label="Color", options=[("RED", 1), ("YELLOW", 2)], ddtype=self.color_type) self.form_model = FormModel(self.dbm, entity_type=self.entity_type, name="aids", label="Aids form_model", form_code="clinic", type='survey', fields=[question1, question2, question3]) self.form_model.add_field(question4) self.form_model__id = self.form_model.save() self.submission_handler = SubmissionHandler(self.dbm) self.sms_player = SMSPlayer(self.dbm, self.submission_handler, LocationTree())
def submit_to_player(incoming_request): sent_via_sms_test_questionnaire = incoming_request.get( 'test_sms_questionnaire', False) organization = incoming_request.get('organization') organization = organization try: dbm = incoming_request['dbm'] post_sms_parser_processors = [ PostSMSProcessorLanguageActivator(dbm, incoming_request), PostSMSProcessorNumberOfAnswersValidators(dbm, incoming_request) ] sms_player = SMSPlayer( dbm, LocationBridge(get_location_tree(), get_loc_hierarchy=get_location_hierarchy), post_sms_parser_processors=post_sms_parser_processors, feeds_dbm=incoming_request['feeds_dbm']) mangrove_request = Request( message=incoming_request['incoming_message'], transportInfo=incoming_request['transport_info']) response = sms_player.accept(mangrove_request, logger=incoming_request.get("logger")) if response.is_registration and not sent_via_sms_test_questionnaire: organization.increment_message_count_for(sms_registration_count=1) if not response.is_registration and sent_via_sms_test_questionnaire: organization.increment_message_count_for(incoming_web_count=1) mail_feed_errors(response, dbm.database_name) message = SMSResponse(response).text(dbm) send_message(incoming_request, response) except DataObjectAlreadyExists as e: message = ugettext("The Unique ID Number %s is already used for the %s %s. Register your %s with a different ID.") % \ (e.data[1], e.data[2], e.data[3], e.data[2]) if not sent_via_sms_test_questionnaire: organization.increment_message_count_for(sms_registration_count=1) except DataObjectNotFound as exception: if sent_via_sms_test_questionnaire: organization.increment_message_count_for(incoming_web_count=1) message = handle(exception, incoming_request) except FormModelDoesNotExistsException as exception: if sent_via_sms_test_questionnaire: organization.increment_message_count_for(incoming_web_count=1) message = handle(exception, incoming_request) except Exception as exception: message = handle(exception, incoming_request) incoming_request['outgoing_message'] = message if not sent_via_sms_test_questionnaire: SMS(message=message, message_id=incoming_request['message_id'], organization=incoming_request['organization'], msg_from=mangrove_request.transport.source, msg_to=mangrove_request.transport.destination, msg_type=MSG_TYPE_SUBMISSION_REPLY, status="Submitted").save() return incoming_request
from mangrove.transport.player.player import SMSPlayer from mangrove.transport.contract.submission import Submission #submission date, source, destination, messages, #2012-11-24 13:48:22 24535435348 26134535750 009 MCHTDV07 22.11.2012 ABE0000369 72.15 0 0 0 0 data_folder = "/Users/twer/Downloads/lost_data_folder/*.xlsx" db_server = "localhost" db_name = "hni_crs-stock_jhw14178" db_credentials = settings.COUCHDBMAIN_CREDENTIALS dbm = get_db_manager(server="http://%s:5984" % db_server, database=db_name, credentials=db_credentials) sms_player = SMSPlayer(dbm) def update_submission_date(response, submission_date): submission = Submission.get(dbm, response.submission_id) submission._doc.submitted_on = submission_date submission._doc.created = submission_date submission._doc.event_time = submission_date submission.save() pprint(submission.values) def send_sms(source, destination, text): print text transport_info = TransportInfo(transport="sms", source=source,
def setUp(self): self.dbm = get_db_manager(database='mangrove-test') initializer.run(self.dbm) define_type(self.dbm, ["dog"]) self.entity_type = ["healthfacility", "clinic"] define_type(self.dbm, self.entity_type) self.name_type = DataDictType(self.dbm, name='Name', slug='name', primitive_type='string') self.telephone_number_type = DataDictType(self.dbm, name='telephone_number', slug='telephone_number', primitive_type='string') self.entity_id_type = DataDictType(self.dbm, name='Entity Id Type', slug='entity_id', primitive_type='string') self.stock_type = DataDictType(self.dbm, name='Stock Type', slug='stock', primitive_type='integer') self.color_type = DataDictType(self.dbm, name='Color Type', slug='color', primitive_type='string') self.name_type.save() self.telephone_number_type.save() self.stock_type.save() self.color_type.save() self.entity = create_entity( self.dbm, entity_type=self.entity_type, location=["India", "Pune"], aggregation_paths=None, short_code="cli1", ) self.data_record_id = self.entity.add_data( data=[("Name", "Ruby", self.name_type)], submission=dict(submission_id="1")) self.reporter = create_entity( self.dbm, entity_type=["reporter"], location=["India", "Pune"], aggregation_paths=None, short_code="rep1", ) self.reporter.add_data(data=[ (MOBILE_NUMBER_FIELD, '1234', self.telephone_number_type), (NAME_FIELD, "Test_reporter", self.name_type) ], submission=dict(submission_id="2")) question1 = TextField(name="entity_question", code="EID", label="What is associated entity", language="eng", entity_question_flag=True, ddtype=self.entity_id_type) question2 = TextField(name="Name", code="NAME", label="Clinic Name", defaultValue="some default value", language="eng", length=TextConstraint(4, 15), ddtype=self.name_type) question3 = IntegerField(name="Arv stock", code="ARV", label="ARV Stock", range=NumericConstraint(min=15, max=120), ddtype=self.stock_type) question4 = SelectField(name="Color", code="COL", label="Color", options=[("RED", 1), ("YELLOW", 2)], ddtype=self.color_type) self.form_model = FormModel(self.dbm, entity_type=self.entity_type, name="aids", label="Aids form_model", form_code="clinic", type='survey', fields=[question1, question2, question3]) self.form_model.add_field(question4) self.form_model__id = self.form_model.save() self.submission_handler = SubmissionHandler(self.dbm) self.sms_player = SMSPlayer(self.dbm, self.submission_handler, LocationTree())
class TestSMSPlayer(TestCase): def _mock_reporter(self): self.reporter_mock = Mock(spec=Entity) reporter_name = "1234" self.reporter_module.find_reporter_entity.return_value = self.reporter_mock, reporter_name def setUp(self): loc_tree = Mock() loc_tree.get_hierarchy_path.return_value = None self.dbm = Mock(spec=DatabaseManager) self.submission_handler_mock = Mock(spec=SubmissionHandler) self.reporter_patcher = patch( 'mangrove.transport.player.player.reporter') self.reporter_module = self.reporter_patcher.start() self._mock_reporter() self.transport = TransportInfo(transport="sms", source="1234", destination="5678") self.request = Request(transportInfo=self.transport, message="FORM_CODE +ID 1 +M hello world") self.sms_player = SMSPlayer(self.dbm, self.submission_handler_mock, loc_tree) self.generate_code_patcher = patch( "mangrove.transport.player.player.Player._handle_registration_form" ) self.generate_code_patcher.start() def tearDown(self): self.reporter_patcher.stop() self.generate_code_patcher.stop() def test_should_submit_if_parsing_is_successful(self): self.sms_player.accept(self.request) self.assertEqual(1, self.submission_handler_mock.accept.call_count) def test_should_submit_if_submission_by_registered_reporter(self): self.sms_player.accept(self.request) self.assertEqual(1, self.submission_handler_mock.accept.call_count) submission_request = self.submission_handler_mock.accept.call_args[0][ 0] self.assertEqual(self.reporter_mock, submission_request.reporter) def test_should_check_if_submission_by_unregistered_reporter(self): self.reporter_module.find_reporter_entity.side_effect = NumberNotRegisteredException( "1234") with self.assertRaises(NumberNotRegisteredException): self.sms_player.accept(self.request) def test_should_not_submit_if_parsing_is_not_successful(self): self.request = Request(transportInfo=self.transport, message="invalid format") with self.assertRaises(SubmissionParseException): self.sms_player.accept(self.request) self.assertEqual(0, self.submission_handler_mock.accept.call_count) def test_should_not_parse_if_two_question_codes(self): transport = TransportInfo(transport="sms", source="1234", destination="5678") self.request = Request(transportInfo=transport, message="cli001 +na tester1 +na tester2") with self.assertRaises(SubmissionParseException): self.sms_player.accept(self.request) self.assertEqual(0, self.submission_handler_mock.accept.call_count)
class TestShouldSaveSMSSurveyResponse(MangroveTestCase): def setUp(self): MangroveTestCase.setUp(self) initializer.run(self.manager) define_type(self.manager, ["dog"]) self.entity_type = ["clinic"] define_type(self.manager, self.entity_type) self.entity = create_entity( self.manager, entity_type=self.entity_type, location=["India", "Pune"], aggregation_paths=None, short_code="cli1", ) self.data_record_id = self.entity.add_data( data=[("Name", "Ruby")], submission=dict(submission_id="1")) self.reporter = create_entity( self.manager, entity_type=["reporter"], location=["India", "Pune"], aggregation_paths=None, short_code="rep1", ) self.reporter.add_data(data=[(MOBILE_NUMBER_FIELD, '1234'), (NAME_FIELD, "Test_reporter")], submission=dict(submission_id="2")) question1 = UniqueIdField('clinic', name="entity_question", code="EID", label="What is associated entity") question2 = TextField(name="Name", code="NAME", label="Clinic Name", defaultValue="some default value", constraints=[TextLengthConstraint(4, 15)], required=False) question3 = IntegerField( name="Arv stock", code="ARV", label="ARV Stock", constraints=[NumericRangeConstraint(min=15, max=120)], required=False) question4 = SelectField(name="Color", code="COL", label="Color", options=[("RED", 1), ("YELLOW", 2)], required=False) self.form_model = FormModel(self.manager, name="aids", label="Aids form_model", form_code="clinic", fields=[question1, question2, question3]) self.form_model.add_field(question4) self.form_model_id = self.form_model.save() self.submission_handler = None self.sms_player = SMSPlayer(self.manager, LocationTree()) self.sms_player_v2 = SMSPlayerV2(self.manager, []) def tearDown(self): MangroveTestCase.tearDown(self) def _prepare_survey_responses(self): doc_id1 = self.manager._save_document( SurveyResponseDocument(channel="transport", destination=12345, form_model_id=FORM_MODEL_ID, values={ 'Q1': 'ans1', 'Q2': 'ans2' }, status=True, error_message="")) doc_id2 = self.manager._save_document( SurveyResponseDocument(channel="transport", destination=12345, form_model_id=FORM_MODEL_ID, values={ 'Q1': 'ans12', 'Q2': 'ans22' }, status=True, error_message="")) doc_id3 = self.manager._save_document( SurveyResponseDocument(channel="transport", destination=12345, form_model_id=FORM_MODEL_ID, values={ 'Q3': 'ans12', 'Q4': 'ans22' }, status=False, error_message="")) doc_id4 = self.manager._save_document( SurveyResponseDocument(channel="transport", destination=12345, form_model_id="def", values={ 'defQ1': 'defans12', 'defQ2': 'defans22' }, status=False, error_message="")) return [doc_id1, doc_id2, doc_id3, doc_id4] def test_count_of_survey_responses_should_be_zero_when_form_code_not_existed( self): self._prepare_survey_responses() count = survey_response_count(self.manager, "not_existed_form_code", 0, self._tomorrow()) self.assertEqual(0, count) def test_get_survey_responses_for_form(self): self._prepare_survey_responses() survey_responses = get_survey_responses(self.manager, FORM_MODEL_ID, 0, self._tomorrow()) self.assertEquals(3, len(survey_responses)) self.assertEquals({ 'Q3': 'ans12', 'Q4': 'ans22' }, survey_responses[0].values) self.assertEquals({ 'Q1': 'ans12', 'Q2': 'ans22' }, survey_responses[1].values) self.assertEquals({ 'Q1': 'ans1', 'Q2': 'ans2' }, survey_responses[2].values) def test_error_messages_are_being_logged_in_survey_responses(self): text = "clinic .EID %s .ARV 150 " % self.entity.short_code self.send_sms_v2(text) survey_responses = get_survey_responses(self.manager, self.form_model_id, 0, self._tomorrow()) self.assertEquals(1, len(survey_responses)) self.assertEquals( u"Answer 150 for question ARV is greater than allowed.", survey_responses[0].errors) def test_get_survey_responses_for_form_for_an_activity_period(self): self.manager._save_document( SurveyResponseDocument(channel="transport", destination=12345, form_model_id="abc", values={ 'Q1': 'ans1', 'Q2': 'ans2' }, status=False, error_message="", data_record_id='2345678', event_time=datetime.datetime(2011, 9, 1))) self.manager._save_document( SurveyResponseDocument(channel="transport", destination=12345, form_model_id="abc", values={ 'Q1': 'ans12', 'Q2': 'ans22' }, status=False, error_message="", data_record_id='1234567', event_time=datetime.datetime(2011, 3, 3))) self.manager._save_document( SurveyResponseDocument(channel="transport", destination=12345, form_model_id="abc", values={ 'Q1': 'ans12', 'Q2': 'defans22' }, status=False, error_message="", data_record_id='345678', event_time=datetime.datetime(2011, 3, 10))) from_time = datetime.datetime(2011, 3, 1) end_time = datetime.datetime(2011, 3, 30) submissions = get_survey_responses_for_activity_period( self.manager, "abc", from_time, end_time) self.assertEquals(2, len(submissions)) def send_sms(self, text): transport_info = TransportInfo(transport="sms", source="1234", destination="5678") response = self.sms_player.accept( Request(message=text, transportInfo=transport_info)) return response 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 _tomorrow(self): oneDay = datetime.timedelta(days=1) tomorrow = datetime.datetime.now() + oneDay return int(mktime(tomorrow.timetuple())) * 1000
def setUp(self): MangroveTestCase.setUp(self) self._create_entities() self.player = SMSPlayer(self.manager, location_tree=LocationBridge(get_location_tree(), get_loc_hierarchy=get_location_hierarchy)) self.transport = TransportInfo(transport="sms", source="1234", destination="5678") initializer.run(self.manager)
class TestShouldSaveSMSSubmission(unittest.TestCase): def setUp(self): self.dbm = get_db_manager(database='mangrove-test') initializer.run(self.dbm) define_type(self.dbm, ["dog"]) self.entity_type = ["healthfacility", "clinic"] define_type(self.dbm, self.entity_type) self.name_type = DataDictType(self.dbm, name='Name', slug='name', primitive_type='string') self.telephone_number_type = DataDictType(self.dbm, name='telephone_number', slug='telephone_number', primitive_type='string') self.entity_id_type = DataDictType(self.dbm, name='Entity Id Type', slug='entity_id', primitive_type='string') self.stock_type = DataDictType(self.dbm, name='Stock Type', slug='stock', primitive_type='integer') self.color_type = DataDictType(self.dbm, name='Color Type', slug='color', primitive_type='string') self.name_type.save() self.telephone_number_type.save() self.stock_type.save() self.color_type.save() self.entity = create_entity( self.dbm, entity_type=self.entity_type, location=["India", "Pune"], aggregation_paths=None, short_code="cli1", ) self.data_record_id = self.entity.add_data( data=[("Name", "Ruby", self.name_type)], submission=dict(submission_id="1")) self.reporter = create_entity( self.dbm, entity_type=["reporter"], location=["India", "Pune"], aggregation_paths=None, short_code="rep1", ) self.reporter.add_data(data=[ (MOBILE_NUMBER_FIELD, '1234', self.telephone_number_type), (NAME_FIELD, "Test_reporter", self.name_type) ], submission=dict(submission_id="2")) question1 = TextField(name="entity_question", code="EID", label="What is associated entity", language="eng", entity_question_flag=True, ddtype=self.entity_id_type) question2 = TextField(name="Name", code="NAME", label="Clinic Name", defaultValue="some default value", language="eng", length=TextConstraint(4, 15), ddtype=self.name_type) question3 = IntegerField(name="Arv stock", code="ARV", label="ARV Stock", range=NumericConstraint(min=15, max=120), ddtype=self.stock_type) question4 = SelectField(name="Color", code="COL", label="Color", options=[("RED", 1), ("YELLOW", 2)], ddtype=self.color_type) self.form_model = FormModel(self.dbm, entity_type=self.entity_type, name="aids", label="Aids form_model", form_code="clinic", type='survey', fields=[question1, question2, question3]) self.form_model.add_field(question4) self.form_model__id = self.form_model.save() self.submission_handler = SubmissionHandler(self.dbm) self.sms_player = SMSPlayer(self.dbm, self.submission_handler, LocationTree()) def tearDown(self): _delete_db_and_remove_db_manager(self.dbm) def send_sms(self, text): transport_info = TransportInfo(transport="sms", source="1234", destination="5678") response = self.sms_player.accept( Request(transportInfo=transport_info, message=text)) return response def test_should_save_submitted_sms(self): text = "clinic +EID %s +name CLINIC-MADA +ARV 50 +COL a" % self.entity.short_code response = self.send_sms(text) self.assertTrue(response.success) data_record_id = response.datarecord_id data_record = self.dbm._load_document( id=data_record_id, document_class=DataRecordDocument) self.assertEqual(self.name_type.slug, data_record.data["Name"]["type"]["slug"]) self.assertEqual(self.stock_type.slug, data_record.data["Arv stock"]["type"]["slug"]) self.assertEqual(self.color_type.slug, data_record.data["Color"]["type"]["slug"]) self.assertEqual("clinic", data_record.submission['form_code']) self.assertEqual(u"Test_reporter", response.reporters[0].get(NAME_FIELD)) data = self.entity.values({ "Name": "latest", "Arv stock": "latest", "Color": "latest" }) self.assertEquals(data["Arv stock"], 50) self.assertEquals(data["Name"], "CLINIC-MADA") submission_log = self.dbm._load_document(response.submission_id, SubmissionLogDocument) self.assertEquals(data_record_id, submission_log.data_record_id) def test_should_save_submitted_sms_for_activity_report(self): question1 = TextField(name="entity_question", code="EID", label="What is associated entity", language="eng", entity_question_flag=True, ddtype=self.entity_id_type) question2 = TextField(name="Name", code="NAME", label="Clinic Name", defaultValue="some default value", language="eng", length=TextConstraint(4, 15), ddtype=self.name_type) question3 = IntegerField(name="Arv stock", code="ARV", label="ARV Stock", range=NumericConstraint(min=15, max=120), ddtype=self.stock_type) activity_report = FormModel(self.dbm, entity_type=["reporter"], name="report", label="reporting form_model", form_code="acp", type='survey', fields=[question1, question2, question3]) activity_report.save() text = "acp +name tester +ARV 50 " response = self.send_sms(text) self.assertTrue(response.success) self.assertEqual(u"Test_reporter", response.reporters[0].get(NAME_FIELD)) data_record_id = response.datarecord_id data_record = self.dbm._load_document( id=data_record_id, document_class=DataRecordDocument) self.assertEqual(self.name_type.slug, data_record.data["Name"]["type"]["slug"]) self.assertEqual(self.stock_type.slug, data_record.data["Arv stock"]["type"]["slug"]) self.assertEqual("acp", data_record.submission['form_code']) data = self.reporter.values({"Name": "latest", "Arv stock": "latest"}) self.assertEquals(data["Arv stock"], 50) self.assertEquals(data["Name"], "tester") submission_log = self.dbm._load_document(response.submission_id, SubmissionLogDocument) self.assertEquals(data_record_id, submission_log.data_record_id) def test_should_give_error_for_wrong_integer_value(self): text = "clinic +EID %s +ARV 150 " % self.entity.id response = self.send_sms(text) self.assertFalse(response.success) self.assertEqual(len(response.errors), 1) def test_should_give_error_for_wrong_text_value(self): text = "clinic +EID CID001 +NAME ABC" response = self.send_sms(text) self.assertFalse(response.success) self.assertEqual(len(response.errors), 1) def test_get_submissions_for_form(self): self.dbm._save_document( SubmissionLogDocument(channel="transport", source=1234, destination=12345, form_code="abc", values={ 'Q1': 'ans1', 'Q2': 'ans2' }, status=False, error_message="", data_record_id='2345678')) self.dbm._save_document( SubmissionLogDocument(channel="transport", source=1234, destination=12345, form_code="abc", values={ 'Q1': 'ans12', 'Q2': 'ans22' }, status=False, error_message="", data_record_id='1234567')) self.dbm._save_document( SubmissionLogDocument(channel="transport", source=1234, destination=12345, form_code="def", values={ 'defQ1': 'defans12', 'defQ2': 'defans22' }, status=False, error_message="", data_record_id='345678')) oneDay = datetime.timedelta(days=1) tomorrow = datetime.datetime.now() + oneDay submission_list, ids = get_submissions_made_for_form( self.dbm, "abc", 0, int(mktime(tomorrow.timetuple())) * 1000) self.assertEquals(2, len(submission_list)) self.assertEquals({ 'Q1': 'ans12', 'Q2': 'ans22' }, submission_list[0]['values']) self.assertEquals({ 'Q1': 'ans1', 'Q2': 'ans2' }, submission_list[1]['values']) self.assertEquals(2, len(ids)) self.assertListEqual(['1234567', '2345678'], ids) def test_error_messages_are_being_logged_in_submissions(self): text = "clinic +EID %s +ARV 150 " % self.entity.id self.send_sms(text) oneDay = datetime.timedelta(days=1) tomorrow = datetime.datetime.now() + oneDay submission_list, ids = get_submissions_made_for_form( self.dbm, "clinic", 0, int(mktime(tomorrow.timetuple())) * 1000) self.assertEquals(1, len(submission_list)) self.assertEquals( u"Answer 150 for question ARV is greater than allowed.", submission_list[0]['error_message']) def test_should_register_new_entity(self): message1 = """reg +t dog +n Clinic in Diégo–Suarez +l Diégo–Suarez +g -12.35 49.3 +d This is a Clinic in Diégo–Suarez + m 87654325 """ response = self.send_sms(message1) self.assertTrue(response.success) self.assertIsNotNone(response.datarecord_id) expected_short_code = "dog1" self.assertEqual(response.short_code, expected_short_code) a = get_by_short_code(self.dbm, expected_short_code, ["dog"]) self.assertEqual(a.short_code, expected_short_code) text = "reg +N buddy +S bud +T dog +G 80 80 +D its a dog! +M 45557" response = self.send_sms(text) self.assertTrue(response.success) self.assertIsNotNone(response.datarecord_id) self.assertEqual(response.short_code, "bud", ["dog"]) a = get_by_short_code(self.dbm, "bud", ["dog"]) self.assertEqual(a.short_code, "bud") text = "reg +N buddy2 +T dog +L 80 80 +D its another dog! +M 78541" response = self.send_sms(text) self.assertTrue(response.success) self.assertIsNotNone(response.datarecord_id) expected_short_code = "dog3" self.assertEqual(response.short_code, expected_short_code) b = get_by_short_code(self.dbm, expected_short_code, ["dog"]) self.assertEqual(b.short_code, expected_short_code) def test_should_return_error_for_registration_having_invalid_geo_data( self): INVALID_LATITUDE = 380 text = "reg +N buddy2 +T dog +G %s 80 +D its another dog! +M 78541" % ( INVALID_LATITUDE, ) response = self.send_sms(text) self.assertFalse(response.success) self.assertEqual({'g': 'The answer 380 must be between -90 and 90'}, response.errors) INVALID_LONGITUDE = -184 text = "reg +N buddy2 +T dog +G 80 %s +D its another dog! +M 78541" % ( INVALID_LONGITUDE, ) response = self.send_sms(text) self.assertFalse(response.success) self.assertEqual({'g': 'The answer -184 must be between -180 and 180'}, response.errors) def test_should_log_submission(self): transport_info = TransportInfo(transport="sms", source="1234", destination="5678") request = Request(transportInfo=transport_info, message="reg +N buddy +S DOG3 +T dog") response = self.sms_player.accept(request) submission_log = self.dbm._load_document(response.submission_id, SubmissionLogDocument) self.assertIsInstance(submission_log, SubmissionLogDocument) self.assertEquals(transport_info.transport, submission_log.channel) self.assertEquals(transport_info.source, submission_log.source) self.assertEquals(transport_info.destination, submission_log.destination) self.assertEquals(True, submission_log.status) self.assertEquals("reg", submission_log.form_code) self.assertEquals({ 'n': 'buddy', 's': 'DOG3', 't': 'dog', 'l': None }, submission_log.values) self.assertEquals(transport_info.destination, submission_log.destination) self.assertEquals(response.datarecord_id, submission_log.data_record_id) def test_should_throw_error_if_entity_with_same_short_code_exists(self): text = "reg +N buddy +S DOG3 +T dog +G 80 80 +D its a dog! +M 123456" self.send_sms(text) text = "reg +N buddy2 +S dog3 +T dog +L 80 80 +D its a dog! +M 123456" with self.assertRaises(DataObjectAlreadyExists): self.send_sms(text) def test_should_throw_error_if_reporter_with_same_phone_number_exists( self): text = "reg +N buddy +T reporter +G 80 80 +M 1@23456" self.send_sms(text) with self.assertRaises(MultipleReportersForANumberException): text = "reg +N buddy2 +T reporter +L 80 80 +M 123456" self.send_sms(text) def test_should_throw_error_if_reporter_registration_submission_has_no_mobile_number( self): with self.assertRaises(MobileNumberMissing): text = "reg +N buddy2 +T reporter +L 80 80" self.send_sms(text) def test_should_throw_error_if_entityType_doesnt_exist(self): with self.assertRaises(EntityTypeDoesNotExistsException): text = "reg +N buddy1 +S DOG3 +T cat +L 80 80 +D its another dog! +M 1234567" self.send_sms(text) def test_entity_instance_is_case_insensitive(self): text = "clinic +EID %s +name CLINIC-MADA +ARV 50 +COL a" % "CLI1" response = self.send_sms(text) self.assertTrue(response.success) def test_questionnaire_code_is_case_insensitive(self): text = "CLINIC +EID %s +name CLINIC-MADA +ARV 50 +COL a" % "cli1" response = self.send_sms(text) self.assertTrue(response.success) def test_entity_type_is_case_insensitive_in_registration(self): text = "reg +n buddy +T DOG +G 80 80 +M 123456" response = self.send_sms(text) self.assertTrue(response.success) data_record = self.dbm._load_document(response.datarecord_id, DataRecordDocument) actual_type = data_record["entity"]["aggregation_paths"]["_type"] self.assertEquals(["dog"], actual_type) def test_should_accept_unicode_submissions(self): text = "reg +s Āgra +n Agra +m 080 +t clinic +g 45 56" with self.assertRaises(EntityTypeDoesNotExistsException): self.send_sms(text) def test_should_accept_unicode_submissions_and_invalidate_wrong_GPS(self): text = "reg +s Āgra +n Agra +m 080 +t clinic +g 45Ö 56" with self.assertRaises(GeoCodeFormatException): self.send_sms(text) def test_should_raise_exception_for_inactive_form_model(self): self.form_model.deactivate() self.form_model.save() text = "clinic +EID %s +name CLINIC-MADA +ARV 50 +COL a" % self.entity.short_code with self.assertRaises(InactiveFormModelException): self.send_sms(text) def test_should_set_submission_log_as_Test_for_form_model_in_test_mode( self): self.form_model.set_test_mode() self.form_model.save() text = "clinic +EID %s +name CLINIC-MADA +ARV 50 +COL a" % self.entity.short_code response = self.send_sms(text) self.assertTrue(response.success) self.assertIsNotNone(response.datarecord_id) self.assertIsNotNone(response.submission_id) submission_log = self.dbm._load_document(response.submission_id, SubmissionLogDocument) self.assertTrue(submission_log.test) def test_should_register_entity_with_geo_code(self): message1 = """reg +t dog +n Dog in Diégo–Suarez +g -12.35 49.3 +d This is a Dog in Diégo–Suarez + m 87654325 """ response = self.send_sms(message1) self.assertTrue(response.success) self.assertIsNotNone(response.datarecord_id) expected_short_code = 'dog1' self.assertEqual(response.short_code, expected_short_code) dog = get_by_short_code(self.dbm, expected_short_code, ["dog"]) self.assertEqual([-12.35, 49.3], dog.geometry.get("coordinates")) def test_should_register_entity_with_geocode_if_only_location_provided( self): message1 = """reg +t dog +n Dog in AMPIZARANTANY +l AMPIZARANTANY +d This is a Dog in AMPIZARANTANY + m 87654325 """ response = self.send_sms(message1) self.assertTrue(response.success) self.assertIsNotNone(response.datarecord_id) expected_short_code = 'dog1' self.assertEqual(response.short_code, expected_short_code) dog = get_by_short_code(self.dbm, expected_short_code, ["dog"]) self.assertEqual([-12, 60], dog.geometry.get("coordinates")) def test_should_register_entity_with_geocode_and_location_provided(self): message1 = """reg +t dog +n Dog in AMPIZARANTANY +l AMPIZARANTANY +g 10 10 +d This is a Dog in AMPIZARANTANY + m 87654325 """ response = self.send_sms(message1) self.assertTrue(response.success) self.assertIsNotNone(response.datarecord_id) expected_short_code = 'dog1' self.assertEqual(response.short_code, expected_short_code) dog = get_by_short_code(self.dbm, expected_short_code, ["dog"]) self.assertEqual([10, 10], dog.geometry.get("coordinates")) self.assertEqual(["ampizarantany"], dog.location_path)
def setUpClass(cls): cls.dbm = create_db(uniq('mangrove-test')) initializer.initial_data_setup(cls.dbm) cls.entity_type = ["healthfacility", "clinic"] safe_define_type(cls.dbm, cls.entity_type) cls.entity_short_code = "cli" + str(int(random.random() * 10000)) cls.entity = create_entity( cls.dbm, entity_type=cls.entity_type, location=["India", "Pune"], aggregation_paths=None, short_code=cls.entity_short_code, ) cls.entity.save() cls.reporter_id = "rep" + str(int(random.random() * 10000)) cls.reporter = create_contact(cls.dbm, location=["India", "Pune"], aggregation_paths=None, short_code=cls.reporter_id) cls.reporter.save() cls.phone_number = str(int(random.random() * 10000000)) cls.reporter.add_data(data=[(MOBILE_NUMBER_FIELD, cls.phone_number), (NAME_FIELD, "Test_reporter")], submission=dict(submission_id="2")) question1 = ShortCodeField( name="entity_question", code="EID", label="What is associated entity", constraints=[TextLengthConstraint(min=1, max=20)]) question2 = TextField(name="Name", code="NAME", label="Clinic Name", defaultValue="some default value", constraints=[TextLengthConstraint(4, 15)], required=False) question3 = IntegerField( name="Arv stock", code="ARV", label="ARV Stock", constraints=[NumericRangeConstraint(min=15, max=120)], required=False) question4 = SelectField(name="Color", code="COL", label="Color", options=[("RED", 'a'), ("YELLOW", 'a')], required=False) try: cls.form_model = get_form_model_by_code(cls.dbm, "clinic") except FormModelDoesNotExistsException: cls.form_model = EntityFormModel( cls.dbm, entity_type=cls.entity_type, name="aids", label="Aids form_model", form_code="clinic", fields=[question1, question2, question3], is_registration_model=True) cls.form_model.add_field(question4) cls.form_model.save() cls.sms_player = SMSPlayer(cls.dbm, LocationTree()) cls.sms_ordered_message_player = SMSPlayer(cls.dbm, LocationTree())
def submit_to_player(incoming_request): sent_via_sms_test_questionnaire = incoming_request.get( 'test_sms_questionnaire', False) organization = incoming_request.get('organization') organization = organization try: dbm = incoming_request['dbm'] mangrove_request = Request( message=incoming_request['incoming_message'], transportInfo=incoming_request['transport_info']) response = _is_datasender_registered(dbm, incoming_request) if not response: post_sms_parser_processors = [ PostSMSProcessorLanguageActivator(dbm, incoming_request) ] if organization.in_trial_mode: post_sms_parser_processors.append( PostSMSProcessorCheckLimits(dbm, incoming_request)) post_sms_parser_processors.extend([ PostSMSProcessorNumberOfAnswersValidators( dbm, incoming_request), PostSMSProcessorCheckDSIsLinkedToProject( dbm, incoming_request) ]) sms_player = SMSPlayer( dbm, LocationBridge(get_location_tree(), get_loc_hierarchy=get_location_hierarchy), post_sms_parser_processors=post_sms_parser_processors, feeds_dbm=incoming_request['feeds_dbm']) response = sms_player.accept( mangrove_request, logger=incoming_request.get("logger"), translation_processor=TranslationProcessor) if response.is_registration: incoming_request['is_registration'] = True if not sent_via_sms_test_questionnaire: organization.increment_message_count_for( sms_registration_count=1) if not response.is_registration: if sent_via_sms_test_questionnaire: organization.increment_message_count_for( incoming_web_count=1) check_quotas_and_update_users(organization, sms_channel=True) mail_feed_errors(response, dbm.database_name) message = SMSResponse(response, incoming_request).text(dbm) send_message(incoming_request, response) except DataObjectAlreadyExists as e: message = identification_number_already_exists_handler( dbm, e.data[1], e.data[2]) if not sent_via_sms_test_questionnaire: organization.increment_message_count_for(sms_registration_count=1) except DataObjectNotFound as exception: if sent_via_sms_test_questionnaire: organization.increment_message_count_for(incoming_web_count=1) message = handle(exception, incoming_request) except FormModelDoesNotExistsException as exception: if sent_via_sms_test_questionnaire: organization.increment_message_count_for(incoming_web_count=1) message = incorrect_questionnaire_code_handler(dbm, exception.data[0]) except SMSParserWrongNumberOfAnswersException as exception: form_model = sms_player.get_form_model(mangrove_request) if not form_model.is_entity_registration_form(): organization.increment_message_count_for( incoming_web_count=1 ) if sent_via_sms_test_questionnaire else organization.increment_message_count_for( incoming_sms_count=1) message = incorrect_number_of_answers_for_submission_handler( dbm, form_model.form_code, incoming_request) elif form_model.is_entity_registration_form(): message = incorrect_number_of_answers_for_uid_registration_handler( dbm, form_model.form_code, incoming_request) elif not sent_via_sms_test_questionnaire: organization.increment_message_count_for(sms_registration_count=1) except Exception as exception: if sent_via_sms_test_questionnaire: organization.increment_message_count_for(incoming_web_count=1) message = handle(exception, incoming_request) message = incoming_request.get('error_message', message) incoming_request['outgoing_message'] = message if incoming_request.get( 'is_outgoing_reply_sms_enabled', True) else "" if not sent_via_sms_test_questionnaire: if incoming_request.get('is_outgoing_reply_sms_enabled', True): organization.increment_message_count_for(outgoing_sms_count=1) SMS(message=message, message_id=incoming_request['message_id'], organization=incoming_request['organization'], msg_from=mangrove_request.transport.source, msg_to=mangrove_request.transport.destination, msg_type=MSG_TYPE_SUBMISSION_REPLY, status="Submitted").save() return incoming_request
def setUp(self): MangroveTestCase.setUp(self) initializer.run(self.manager) define_type(self.manager, ["dog"]) self.entity_type = ["clinic"] define_type(self.manager, self.entity_type) self.entity = create_entity( self.manager, entity_type=self.entity_type, location=["India", "Pune"], aggregation_paths=None, short_code="cli1", ) self.data_record_id = self.entity.add_data( data=[("Name", "Ruby")], submission=dict(submission_id="1")) self.reporter = create_entity( self.manager, entity_type=["reporter"], location=["India", "Pune"], aggregation_paths=None, short_code="rep1", ) self.reporter.add_data(data=[(MOBILE_NUMBER_FIELD, '1234'), (NAME_FIELD, "Test_reporter")], submission=dict(submission_id="2")) question1 = UniqueIdField('clinic', name="entity_question", code="EID", label="What is associated entity") question2 = TextField(name="Name", code="NAME", label="Clinic Name", defaultValue="some default value", constraints=[TextLengthConstraint(4, 15)], required=False) question3 = IntegerField( name="Arv stock", code="ARV", label="ARV Stock", constraints=[NumericRangeConstraint(min=15, max=120)], required=False) question4 = SelectField(name="Color", code="COL", label="Color", options=[("RED", 1), ("YELLOW", 2)], required=False) self.form_model = FormModel(self.manager, name="aids", label="Aids form_model", form_code="clinic", fields=[question1, question2, question3]) self.form_model.add_field(question4) self.form_model_id = self.form_model.save() self.submission_handler = None self.sms_player = SMSPlayer(self.manager, LocationTree()) self.sms_player_v2 = SMSPlayerV2(self.manager, [])
def load_sms_data_for_cli001(manager): FEB = datetime(2011, 02, 28, hour=12, minute=00, second=00, tzinfo=UTC) MARCH = datetime(2011, 03, 01, tzinfo=UTC) DEC_2010 = datetime(2010, 12, 28, hour=00, minute=00, second=59, tzinfo=UTC) NOV_2010 = datetime(2010, 11, 26, hour=23, minute=59, second=59, tzinfo=UTC) today = datetime.today() THIS_MONTH = datetime(today.year, today.month, 5, 12, 45, 58) PREV_MONTH = THIS_MONTH - timedelta(days=8) tree = get_location_tree() sms_player = SMSPlayer(manager, SubmissionHandler(manager), location_tree=tree) FROM_NUMBER = '1234567890' TO_NUMBER = '261333782943' transport = TransportInfo(SMS, FROM_NUMBER, TO_NUMBER) message1 = "reg +t clinic +n Clinic in Analalava +l Analalava +g -14.6333 47.7667 +d This is a Clinic in Analalava +m 987654321" response = sms_player.accept( Request(transportInfo=transport, message=message1)) message1 = "reg +t clinic +n Clinic in Andapa +l Andapa +g -14.65 49.6167 +d This is a Clinic in Andapa +m 87654322" response = sms_player.accept( Request(transportInfo=transport, message=message1)) message1 = "reg +t clinic +n Clinic in Antalaha +l Antalaha +g -14.8833 50.25 +d This is a Clinic in Antalaha +m 87654323" response = sms_player.accept( Request(transportInfo=transport, message=message1)) message1 = "reg +t clinic +n Clinic in ANALAMANGA +l ANALAMANGA +g -18.8 47.4833 +d This is a Clinic in Antananarivo +m 87654324" response = sms_player.accept( Request(transportInfo=transport, message=message1)) message1 = "reg +t clinic +n Clinic in TSIMANARIRAZANA +l TSIMANARIRAZANA +g -12.35 49.3 +d This is a Clinic in Diégo–Suarez +m 87654325" response = sms_player.accept( Request(transportInfo=transport, message=message1)) message1 = "reg +t clinic +n Clinic in Antsirabe +l Antsirabe +g -19.8167 47.0667 +d This is a Clinic in Antsirabe +m 87654326" response = sms_player.accept( Request(transportInfo=transport, message=message1)) message1 = "reg +t clinic +n Clinic in Besalampy +l Besalampy +g -16.75 44.5 +d This is a Clinic in Besalampy +m 87654327" response = sms_player.accept( Request(transportInfo=transport, message=message1)) message1 = "reg +t clinic +n clinique à Farafangana +l Farafangana +g -22.8 47.8333 +d This is a Clinic in Farafangana +m 87654328" response = sms_player.accept( Request(transportInfo=transport, message=message1)) message1 = "reg +t clinic +n Clinic in Fianarantsoa I +l Fianarantsoa I +g -21.45 47.1 +d C'est une clinique à Fianarantsoa +m 87654329" response = sms_player.accept( Request(transportInfo=transport, message=message1)) message1 = "reg +t clinic +n Clinic in Sainte Marie +l Sainte Marie +g -17.0833 49.8167 +d This is a Clinic in Île Sainte–Marie +m 87654330" response = sms_player.accept( Request(transportInfo=transport, message=message1)) message1 = "reg +t clinic +n Clinic in Mahajanga +l Mahajanga +g -15.6667 46.35 +d This is a Clinic in Mahajanga +m 87654331" response = sms_player.accept( Request(transportInfo=transport, message=message1)) datetime_mocker = DateTimeMocker() datetime_mocker.set_date_time_now(FEB) # Total number of identical records = 3 message1 = "cli001 +EID cid001 +NA Mr. Tessy +FA 58 +RD 28.02.2011 +BG c +SY ade +GPS 79.2 20.34567" response = sms_player.accept( Request(transportInfo=transport, message=message1)) message1 = "cli001 +EID cid002 +NA Mr. Adam +FA 62 +RD 15.02.2011 +BG a +SY ab +GPS 74.2678 23.3567" response = sms_player.accept( Request(transportInfo=transport, message=message1)) message1 = "cli001 +EID cid003 +NA Ms. Beth +FA 75 +RD 09.02.2011 +BG b +SY bc +GPS 18.245 29.3123" response = sms_player.accept( Request(transportInfo=transport, message=message1)) datetime_mocker.set_date_time_now(MARCH) # Total number of identical records = 4 message1 = "cli001 +EID cid004 +NA Jannita +FA 90 +RD 07.03.2011 +BG b +SY bbe +GPS 45.233 28.3324" response = sms_player.accept( Request(transportInfo=transport, message=message1)) message1 = "cli001 +EID cid005 +NA Aanda +RD 12.03.2011 +BG c +SY bd +GPS 40.2 69.3123" response = sms_player.accept( Request(transportInfo=transport, message=message1)) message1 = 'cli001 +EID cid001 +NA Ianda (",) +FA 34 +RD 27.03.2011 +BG d +SY be +GPS 38.3452 15.3345' response = sms_player.accept( Request(transportInfo=transport, message=message1)) message1 = "cli001 +EID cid001 +NA ànita +FA 45 +RD 07.03.2011 +BG b +SY bbe +GPS 45.233 28.3324" response = sms_player.accept( Request(transportInfo=transport, message=message1)) message1 = "cli001 +EID cid004 +NA Amanda +RD 12.03.2011 +BG c +SY bd +GPS 40.2 69.3123" response = sms_player.accept( Request(transportInfo=transport, message=message1)) message1 = 'cli001 +EID cid005 +NA Vanda (",) +FA 34 +RD 27.03.2011 +BG d +SY be +GPS 38.3452 15.3345' response = sms_player.accept( Request(transportInfo=transport, message=message1)) message1 = "cli001 +EID cid003 +NA ànnita +FA 80 +RD 07.03.2011 +BG b +SY bbe +GPS 45.233 28.3324" response = sms_player.accept( Request(transportInfo=transport, message=message1)) message1 = "cli001 +EID cid002 +NA Amanda +RD 12.03.2011 +BG c +SY bd +GPS 40.2 69.3123" response = sms_player.accept( Request(transportInfo=transport, message=message1)) message1 = 'cli001 +EID cid004 +NA Panda (",) +FA 34 +RD 27.03.2011 +BG d +SY be +GPS 38.3452 15.3345' response = sms_player.accept( Request(transportInfo=transport, message=message1)) message1 = "cli001 +EID cid005 +NA ànnita +FA 50 +RD 07.03.2011 +BG b +SY bbe +GPS 45.233 28.3324" response = sms_player.accept( Request(transportInfo=transport, message=message1)) message1 = "cli001 +EID cid003 +NA Jimanda +RD 12.03.2011 +BG c +SY bd +GPS 40.2 69.3123" response = sms_player.accept( Request(transportInfo=transport, message=message1)) message1 = 'cli001 +EID cli10 +NA Kanda (",) +FA 64 +RD 27.03.2011 +BG d +SY be +GPS 38.3452 15.3345' response = sms_player.accept( Request(transportInfo=transport, message=message1)) message1 = "cli001 +EID cid004 +NA ànnita +FA 30 +RD 07.03.2011 +BG b +SY bbe +GPS 45.233 28.3324" response = sms_player.accept( Request(transportInfo=transport, message=message1)) message1 = "cli001 +EID cid005 +NA Qamanda +RD 12.03.2011 +BG c +SY bd +GPS 40.2 69.3123" response = sms_player.accept( Request(transportInfo=transport, message=message1)) message1 = 'cli001 +EID cid001 +NA Huanda (*_*) +FA 74 +RD 27.03.2011 +BG d +SY be +GPS 38.3452 15.3345' response = sms_player.accept( Request(transportInfo=transport, message=message1)) datetime_mocker.set_date_time_now(DEC_2010) # Total number of identical records = 4 message1 = "cli001 +EID cli12 +FA 47 +RD 15.12.2010 +BG d +SY ace +GPS -58.3452 19.3345" response = sms_player.accept( Request(transportInfo=transport, message=message1)) message1 = "cli001 +EID cli11 +NA De'melo +FA 38 +RD 27.12.2010 +BG c +SY ba +GPS 81.672 92.33456" response = sms_player.accept( Request(transportInfo=transport, message=message1)) message1 = "cli001 +EID cli13 +NA Dono`mova +FA 24 +RD 06.12.2010 +BG b +SY cd +GPS 65.23452 -28.3456" response = sms_player.accept( Request(transportInfo=transport, message=message1)) message1 = "cli001 +EID cli15 +NA Aàntra +FA 89 +RD 11.12.2010 +BG a +SY bd +GPS 45.234 89.32345" response = sms_player.accept( Request(transportInfo=transport, message=message1)) datetime_mocker.set_date_time_now(NOV_2010) # Total number of identical records = 3 message1 = "cli001 +EID cli12 +NA ànnita +FA 90 +RD 07.11.2010 +BG b +SY bbe +GPS 45.233 28.3324" response = sms_player.accept( Request(transportInfo=transport, message=message1)) message1 = "cli001 +EID cli14 +NA Amanda +RD 12.11.2010 +BG c +SY bd +GPS 40.2 69.3123" response = sms_player.accept( Request(transportInfo=transport, message=message1)) message1 = 'cli001 +EID cli8 +NA Kanda (",) +FA 34 +RD 27.11.2010 +BG d +SY be +GPS 38.3452 15.3345' response = sms_player.accept( Request(transportInfo=transport, message=message1)) message1 = "cli001 +EID cli9 +NA ànnita +FA 90 +RD 17.11.2010 +BG b +SY bbe +GPS 45.233 28.3324" response = sms_player.accept( Request(transportInfo=transport, message=message1)) message1 = "cli001 +EID cid007 +NA Amanda +RD 12.11.2010 +BG c +SY bd +GPS 40.2 69.3123" response = sms_player.accept( Request(transportInfo=transport, message=message1)) message1 = 'cli001 +EID cli8 +NA Kanda (",) +FA 34 +RD 27.11.2010 +BG d +SY be +GPS 38.3452 15.3345' response = sms_player.accept( Request(transportInfo=transport, message=message1)) datetime_mocker.set_date_time_now(PREV_MONTH) # Total number of identical records = 4 message1 = "cli001 +EID cli9 +NA Demelo +FA 38 +RD 17.05.2011 +BG c +SY ba +GPS 19.672 92.33456" response = sms_player.accept( Request(transportInfo=transport, message=message1)) message1 = "cli001 +EID cli10 +NA Zorro +FA 48 +RD 05.05.2011 +BG b +SY cd +GPS 23.23452 -28.3456" response = sms_player.accept( Request(transportInfo=transport, message=message1)) message1 = "cli001 +EID cli11 +NA Aàntra +FA 98 +RD 12.05.2011 +BG a +GPS -45.234 89.32345" response = sms_player.accept( Request(transportInfo=transport, message=message1)) message1 = "cli001 +EID cli12 +NA ànnita +FA 37 +RD 05.05.2011 +BG d +SY cbe +GPS -78.233 -28.3324" response = sms_player.accept( Request(transportInfo=transport, message=message1)) message1 = "cli001 +EID cli9 +NA Demelo +FA 38 +RD 17.05.2011 +BG c +SY ba +GPS 19.672 92.33456" response = sms_player.accept( Request(transportInfo=transport, message=message1)) message1 = "cli001 +EID cli10 +NA Zorro +FA 48 +RD 02.05.2011 +BG b +SY cd +GPS 23.23452 -28.3456" response = sms_player.accept( Request(transportInfo=transport, message=message1)) message1 = "cli001 +EID cli11 +NA Aàntra +FA 95 +RD 12.05.2011 +BG a +GPS -45.234 89.32345" response = sms_player.accept( Request(transportInfo=transport, message=message1)) message1 = "cli001 +EID cli12 +NA ànnita +FA 35 +RD 09.05.2010 +BG d +SY cbe +GPS -78.233 -28.3324" response = sms_player.accept( Request(transportInfo=transport, message=message1)) message1 = "cli001 +EID cli9 +NA Demelo +FA 32 +RD 27.05.2011 +BG c +SY ba +GPS 19.672 92.33456" response = sms_player.accept( Request(transportInfo=transport, message=message1)) message1 = "cli001 +EID cli10 +NA Zorro +FA 43 +RD 05.05.2011 +BG b +SY cd +GPS 23.23452 -28.3456" response = sms_player.accept( Request(transportInfo=transport, message=message1)) message1 = "cli001 +EID cli11 +NA Aàntra +FA 91 +RD 12.05.2011 +BG a +GPS -45.234 89.32345" response = sms_player.accept( Request(transportInfo=transport, message=message1)) message1 = "cli001 +EID cli12 +NA ànnita +FA 45 +RD 15.05.2010 +BG d +SY cbe +GPS -78.233 -28.3324" response = sms_player.accept( Request(transportInfo=transport, message=message1)) datetime_mocker.set_date_time_now(THIS_MONTH) # Total number of identical records = 4 message1 = "cli001 +EID cli13 +NA Dmanda +FA 69 +RD 05.06.2011 +BG c +SY ce +GPS 40.2 69.3123" response = sms_player.accept( Request(transportInfo=transport, message=message1)) message1 = "cli001 +EID cli14 +NA Vamand +FA 36 +RD 03.06.2011 +BG a +SY ace +GPS 58.3452 115.3345" response = sms_player.accept( Request(transportInfo=transport, message=message1)) message1 = "cli001 +EID cli15 +NA M!lo +FA 88 +RD 02.06.2011 +SY ba +GPS 19.672 92.33456" response = sms_player.accept( Request(transportInfo=transport, message=message1)) message1 = "cli001 +EID cli16 +NA K!llo +FA 88 +GPS 19.672 92.33456" response = sms_player.accept( Request(transportInfo=transport, message=message1)) message1 = "cli001 +EID cli13 +NA Dmanda +FA 89 +RD 04.06.2011 +BG c +SY ce +GPS 40.2 69.3123" response = sms_player.accept( Request(transportInfo=transport, message=message1)) message1 = "cli001 +EID cli14 +NA Vamand +FA 56 +RD 01.06.2011 +BG a +SY ace +GPS 58.3452 115.3345" response = sms_player.accept( Request(transportInfo=transport, message=message1)) message1 = "cli001 +EID cli15 +NA M!lo +FA 45 +RD 07.06.2011 +SY ba +GPS 19.672 92.33456" response = sms_player.accept( Request(transportInfo=transport, message=message1)) message1 = "cli001 +EID cli16 +NA K!llo +FA 28 +GPS 19.672 92.33456" response = sms_player.accept( Request(transportInfo=transport, message=message1)) datetime_mocker.end_mock() # Total number of identical records = 3 message1 = "cli001 +EID cli17 +NA Catty +FA 78 +RD 15.06.2011 +BG b +SY dce +GPS 33.23452 -68.3456" response = sms_player.accept( Request(transportInfo=transport, message=message1)) message1 = "cli001 +EID cli18 +NA àntra +FA 28 +RD 12.06.2011 +BG a +SY adb +GPS -45.234 169.32345" response = sms_player.accept( Request(transportInfo=transport, message=message1)) message1 = "cli001 +EID cli9 +NA Tinnita +FA 37 +BG d +SY ace +GPS -78.233 -28.3324" response = sms_player.accept( Request(transportInfo=transport, message=message1)) message1 = "cli001 +EID cli17 +NA Catty +FA 98 +RD 25.06.2011 +BG b +SY dce +GPS 33.23452 -68.3456" response = sms_player.accept( Request(transportInfo=transport, message=message1)) message1 = "cli001 +EID cli18 +NA àntra +FA 58 +RD 22.06.2011 +BG a +SY adb +GPS -45.234 169.32345" response = sms_player.accept( Request(transportInfo=transport, message=message1)) message1 = "cli001 +EID cli9 +NA Tinnita +FA 27 +BG d +SY ace +GPS -78.233 -28.3324" response = sms_player.accept( Request(transportInfo=transport, message=message1))
def SendSubmission(self, message): sms_player = SMSPlayer(self.manager, location_tree=["China", "Beijing"], parser=(OrderSMSParser(self.manager))) transport_info = TransportInfo(transport="sms", source="1234567890", destination="5678") request = Request(message=message, transportInfo=transport_info) return sms_player.accept(request)
def submit_to_player(incoming_request): sent_via_sms_test_questionnaire = incoming_request.get('test_sms_questionnaire', False) organization = incoming_request.get('organization') organization = organization should_increment_incoming_sms_count = True if not sent_via_sms_test_questionnaire else False response =None try: dbm = incoming_request['dbm'] mangrove_request = Request(message=incoming_request['incoming_message'], transportInfo=incoming_request['transport_info']) post_sms_parser_processors = [PostSMSProcessorLanguageActivator(dbm, incoming_request), PostSMSProcessorCheckDSIsRegistered(dbm, incoming_request)] if organization.in_trial_mode: post_sms_parser_processors.append(PostSMSProcessorCheckLimits(dbm, incoming_request)) post_sms_parser_processors.extend([PostSMSProcessorNumberOfAnswersValidators(dbm, incoming_request), PostSMSProcessorCheckDSIsLinkedToProject(dbm, incoming_request)]) sms_player = SMSPlayer(dbm, LocationBridge(get_location_tree(), get_loc_hierarchy=get_location_hierarchy), post_sms_parser_processors=post_sms_parser_processors, feeds_dbm=incoming_request['feeds_dbm']) response = sms_player.accept(mangrove_request, logger=incoming_request.get("logger"), translation_processor=TranslationProcessor) if response.is_registration: incoming_request['is_registration'] = True if not sent_via_sms_test_questionnaire: organization.increment_message_count_for(sms_registration_count=1) else: if sent_via_sms_test_questionnaire: organization.increment_message_count_for(incoming_web_count=1) check_quotas_and_update_users(organization, sms_channel=True) mail_feed_errors(response, dbm.database_name) message = SMSResponse(response, incoming_request).text(dbm) send_message(incoming_request, response) except DataObjectAlreadyExists as e: message = identification_number_already_exists_handler(dbm, e.data[1], e.data[2]) if not sent_via_sms_test_questionnaire: organization.increment_message_count_for(sms_registration_count=1) except DataObjectNotFound as exception: if sent_via_sms_test_questionnaire: organization.increment_message_count_for(incoming_web_count=1) message = handle(exception, incoming_request) except FormModelDoesNotExistsException as exception: if sent_via_sms_test_questionnaire: organization.increment_message_count_for(incoming_web_count=1) message = incorrect_questionnaire_code_handler(dbm, exception.data[0], incoming_request) except SMSParserWrongNumberOfAnswersException: form_model = sms_player.get_form_model(mangrove_request) if not form_model.is_entity_registration_form(): if sent_via_sms_test_questionnaire: organization.increment_message_count_for(incoming_web_count=1) message = incorrect_number_of_answers_for_submission_handler(dbm, form_model.form_code, incoming_request) elif form_model.is_entity_registration_form(): message = incorrect_number_of_answers_for_uid_registration_handler(dbm, form_model.form_code, incoming_request) except (ExceedSubmissionLimitException, ExceedSMSLimitException) as exception: should_increment_incoming_sms_count = False message = handle(exception, incoming_request) except Exception as exception: if sent_via_sms_test_questionnaire: organization.increment_message_count_for(incoming_web_count=1) message = handle(exception, incoming_request) if should_increment_incoming_sms_count: organization.increment_incoming_message_count() if response and not response.is_registration: check_quotas_and_update_users(organization, ) return post_player_handler(incoming_request, message)
class TestShouldSaveSMSSubmission(unittest.TestCase): def setUp(self): self.dbm = get_db_manager(database='mangrove-test') initializer.run(self.dbm) define_type(self.dbm, ["dog"]) self.entity_type = ["healthfacility", "clinic"] define_type(self.dbm, self.entity_type) self.name_type = DataDictType(self.dbm, name='Name', slug='name', primitive_type='string') self.telephone_number_type = DataDictType(self.dbm, name='telephone_number', slug='telephone_number', primitive_type='string') self.entity_id_type = DataDictType(self.dbm, name='Entity Id Type', slug='entity_id', primitive_type='string') self.stock_type = DataDictType(self.dbm, name='Stock Type', slug='stock', primitive_type='integer') self.color_type = DataDictType(self.dbm, name='Color Type', slug='color', primitive_type='string') self.name_type.save() self.telephone_number_type.save() self.stock_type.save() self.color_type.save() self.entity = create_entity(self.dbm, entity_type=self.entity_type, location=["India", "Pune"], aggregation_paths=None, short_code="cli1", ) self.data_record_id = self.entity.add_data(data=[("Name", "Ruby", self.name_type)], submission=dict(submission_id="1")) self.reporter = create_entity(self.dbm, entity_type=["reporter"], location=["India", "Pune"], aggregation_paths=None, short_code="rep1", ) self.reporter.add_data(data=[(MOBILE_NUMBER_FIELD, '1234', self.telephone_number_type), (NAME_FIELD, "Test_reporter", self.name_type)], submission=dict(submission_id="2")) question1 = TextField(name="entity_question", code="EID", label="What is associated entity", language="eng", entity_question_flag=True, ddtype=self.entity_id_type) question2 = TextField(name="Name", code="NAME", label="Clinic Name", defaultValue="some default value", language="eng", length=TextConstraint(4, 15), ddtype=self.name_type) question3 = IntegerField(name="Arv stock", code="ARV", label="ARV Stock", range=NumericConstraint(min=15, max=120), ddtype=self.stock_type) question4 = SelectField(name="Color", code="COL", label="Color", options=[("RED", 1), ("YELLOW", 2)], ddtype=self.color_type) self.form_model = FormModel(self.dbm, entity_type=self.entity_type, name="aids", label="Aids form_model", form_code="clinic", type='survey', fields=[question1, question2, question3]) self.form_model.add_field(question4) self.form_model__id = self.form_model.save() self.submission_handler = SubmissionHandler(self.dbm) self.sms_player = SMSPlayer(self.dbm, self.submission_handler, LocationTree()) def tearDown(self): _delete_db_and_remove_db_manager(self.dbm) def send_sms(self, text): transport_info = TransportInfo(transport="sms", source="1234", destination="5678") response = self.sms_player.accept(Request(transportInfo=transport_info, message=text)) return response def test_should_save_submitted_sms(self): text = "clinic +EID %s +name CLINIC-MADA +ARV 50 +COL a" % self.entity.short_code response = self.send_sms(text) self.assertTrue(response.success) data_record_id = response.datarecord_id data_record = self.dbm._load_document(id=data_record_id, document_class=DataRecordDocument) self.assertEqual(self.name_type.slug, data_record.data["Name"]["type"]["slug"]) self.assertEqual(self.stock_type.slug, data_record.data["Arv stock"]["type"]["slug"]) self.assertEqual(self.color_type.slug, data_record.data["Color"]["type"]["slug"]) self.assertEqual("clinic", data_record.submission['form_code']) self.assertEqual(u"Test_reporter",response.reporters[0].get(NAME_FIELD)) data = self.entity.values({"Name": "latest", "Arv stock": "latest", "Color": "latest"}) self.assertEquals(data["Arv stock"], 50) self.assertEquals(data["Name"], "CLINIC-MADA") submission_log = self.dbm._load_document(response.submission_id, SubmissionLogDocument) self.assertEquals(data_record_id, submission_log.data_record_id) def test_should_save_submitted_sms_for_activity_report(self): question1 = TextField(name="entity_question", code="EID", label="What is associated entity", language="eng", entity_question_flag=True, ddtype=self.entity_id_type) question2 = TextField(name="Name", code="NAME", label="Clinic Name", defaultValue="some default value", language="eng", length=TextConstraint(4, 15), ddtype=self.name_type) question3 = IntegerField(name="Arv stock", code="ARV", label="ARV Stock", range=NumericConstraint(min=15, max=120), ddtype=self.stock_type) activity_report = FormModel(self.dbm, entity_type=["reporter"], name="report", label="reporting form_model", form_code="acp", type='survey', fields=[question1, question2, question3]) activity_report.save() text = "acp +name tester +ARV 50 " response = self.send_sms(text) self.assertTrue(response.success) self.assertEqual(u"Test_reporter",response.reporters[0].get(NAME_FIELD)) data_record_id = response.datarecord_id data_record = self.dbm._load_document(id=data_record_id, document_class=DataRecordDocument) self.assertEqual(self.name_type.slug, data_record.data["Name"]["type"]["slug"]) self.assertEqual(self.stock_type.slug, data_record.data["Arv stock"]["type"]["slug"]) self.assertEqual("acp", data_record.submission['form_code']) data = self.reporter.values({"Name": "latest", "Arv stock": "latest"}) self.assertEquals(data["Arv stock"], 50) self.assertEquals(data["Name"], "tester") submission_log = self.dbm._load_document(response.submission_id, SubmissionLogDocument) self.assertEquals(data_record_id, submission_log.data_record_id) def test_should_give_error_for_wrong_integer_value(self): text = "clinic +EID %s +ARV 150 " % self.entity.id response = self.send_sms(text) self.assertFalse(response.success) self.assertEqual(len(response.errors), 1) def test_should_give_error_for_wrong_text_value(self): text = "clinic +EID CID001 +NAME ABC" response = self.send_sms(text) self.assertFalse(response.success) self.assertEqual(len(response.errors), 1) def test_get_submissions_for_form(self): self.dbm._save_document(SubmissionLogDocument(channel="transport", source=1234, destination=12345, form_code="abc", values={'Q1': 'ans1', 'Q2': 'ans2'}, status=False, error_message="", data_record_id='2345678')) self.dbm._save_document(SubmissionLogDocument(channel="transport", source=1234, destination=12345, form_code="abc", values={'Q1': 'ans12', 'Q2': 'ans22'}, status=False, error_message="", data_record_id='1234567')) self.dbm._save_document(SubmissionLogDocument(channel="transport", source=1234, destination=12345, form_code="def", values={'defQ1': 'defans12', 'defQ2': 'defans22'}, status=False, error_message="", data_record_id='345678')) oneDay = datetime.timedelta(days=1) tomorrow = datetime.datetime.now() + oneDay submission_list, ids = get_submissions_made_for_form(self.dbm, "abc", 0, int(mktime(tomorrow.timetuple())) * 1000) self.assertEquals(2, len(submission_list)) self.assertEquals({'Q1': 'ans12', 'Q2': 'ans22'}, submission_list[0]['values']) self.assertEquals({'Q1': 'ans1', 'Q2': 'ans2'}, submission_list[1]['values']) self.assertEquals(2, len(ids)) self.assertListEqual(['1234567', '2345678'], ids) def test_error_messages_are_being_logged_in_submissions(self): text = "clinic +EID %s +ARV 150 " % self.entity.id self.send_sms(text) oneDay = datetime.timedelta(days=1) tomorrow = datetime.datetime.now() + oneDay submission_list, ids = get_submissions_made_for_form(self.dbm, "clinic", 0, int(mktime(tomorrow.timetuple())) * 1000) self.assertEquals(1, len(submission_list)) self.assertEquals(u"Answer 150 for question ARV is greater than allowed.", submission_list[0]['error_message']) def test_should_register_new_entity(self): message1 = """reg +t dog +n Clinic in Diégo–Suarez +l Diégo–Suarez +g -12.35 49.3 +d This is a Clinic in Diégo–Suarez + m 87654325 """ response = self.send_sms(message1) self.assertTrue(response.success) self.assertIsNotNone(response.datarecord_id) expected_short_code = "dog1" self.assertEqual(response.short_code, expected_short_code) a = get_by_short_code(self.dbm, expected_short_code, ["dog"]) self.assertEqual(a.short_code, expected_short_code) text = "reg +N buddy +S bud +T dog +G 80 80 +D its a dog! +M 45557" response = self.send_sms(text) self.assertTrue(response.success) self.assertIsNotNone(response.datarecord_id) self.assertEqual(response.short_code, "bud", ["dog"]) a = get_by_short_code(self.dbm, "bud", ["dog"]) self.assertEqual(a.short_code, "bud") text = "reg +N buddy2 +T dog +L 80 80 +D its another dog! +M 78541" response = self.send_sms(text) self.assertTrue(response.success) self.assertIsNotNone(response.datarecord_id) expected_short_code = "dog3" self.assertEqual(response.short_code, expected_short_code) b = get_by_short_code(self.dbm, expected_short_code, ["dog"]) self.assertEqual(b.short_code, expected_short_code) def test_should_return_error_for_registration_having_invalid_geo_data(self): INVALID_LATITUDE = 380 text = "reg +N buddy2 +T dog +G %s 80 +D its another dog! +M 78541" % (INVALID_LATITUDE,) response = self.send_sms(text) self.assertFalse(response.success) self.assertEqual({'g': 'The answer 380 must be between -90 and 90'}, response.errors) INVALID_LONGITUDE = -184 text = "reg +N buddy2 +T dog +G 80 %s +D its another dog! +M 78541" % (INVALID_LONGITUDE,) response = self.send_sms(text) self.assertFalse(response.success) self.assertEqual({'g': 'The answer -184 must be between -180 and 180'}, response.errors) def test_should_log_submission(self): transport_info = TransportInfo(transport="sms", source="1234", destination="5678") request = Request(transportInfo=transport_info, message="reg +N buddy +S DOG3 +T dog") response = self.sms_player.accept(request) submission_log = self.dbm._load_document(response.submission_id, SubmissionLogDocument) self.assertIsInstance(submission_log, SubmissionLogDocument) self.assertEquals(transport_info.transport, submission_log.channel) self.assertEquals(transport_info.source, submission_log.source) self.assertEquals(transport_info.destination, submission_log.destination) self.assertEquals(True, submission_log. status) self.assertEquals("reg", submission_log.form_code) self.assertEquals({'n': 'buddy', 's': 'DOG3', 't': 'dog', 'l':None}, submission_log.values) self.assertEquals(transport_info.destination, submission_log.destination) self.assertEquals(response.datarecord_id, submission_log.data_record_id) def test_should_throw_error_if_entity_with_same_short_code_exists(self): text = "reg +N buddy +S DOG3 +T dog +G 80 80 +D its a dog! +M 123456" self.send_sms(text) text = "reg +N buddy2 +S dog3 +T dog +L 80 80 +D its a dog! +M 123456" with self.assertRaises(DataObjectAlreadyExists): self.send_sms(text) def test_should_throw_error_if_reporter_with_same_phone_number_exists(self): text = "reg +N buddy +T reporter +G 80 80 +M 1@23456" self.send_sms(text) with self.assertRaises(MultipleReportersForANumberException): text = "reg +N buddy2 +T reporter +L 80 80 +M 123456" self.send_sms(text) def test_should_throw_error_if_reporter_registration_submission_has_no_mobile_number(self): with self.assertRaises(MobileNumberMissing): text = "reg +N buddy2 +T reporter +L 80 80" self.send_sms(text) def test_should_throw_error_if_entityType_doesnt_exist(self): with self.assertRaises(EntityTypeDoesNotExistsException): text = "reg +N buddy1 +S DOG3 +T cat +L 80 80 +D its another dog! +M 1234567" self.send_sms(text) def test_entity_instance_is_case_insensitive(self): text = "clinic +EID %s +name CLINIC-MADA +ARV 50 +COL a" % "CLI1" response = self.send_sms(text) self.assertTrue(response.success) def test_questionnaire_code_is_case_insensitive(self): text = "CLINIC +EID %s +name CLINIC-MADA +ARV 50 +COL a" % "cli1" response = self.send_sms(text) self.assertTrue(response.success) def test_entity_type_is_case_insensitive_in_registration(self): text = "reg +n buddy +T DOG +G 80 80 +M 123456" response = self.send_sms(text) self.assertTrue(response.success) data_record = self.dbm._load_document(response.datarecord_id, DataRecordDocument) actual_type = data_record["entity"]["aggregation_paths"]["_type"] self.assertEquals(["dog"], actual_type) def test_should_accept_unicode_submissions(self): text = "reg +s Āgra +n Agra +m 080 +t clinic +g 45 56" with self.assertRaises(EntityTypeDoesNotExistsException): self.send_sms(text) def test_should_accept_unicode_submissions_and_invalidate_wrong_GPS(self): text = "reg +s Āgra +n Agra +m 080 +t clinic +g 45Ö 56" with self.assertRaises(GeoCodeFormatException): self.send_sms(text) def test_should_raise_exception_for_inactive_form_model(self): self.form_model.deactivate() self.form_model.save() text = "clinic +EID %s +name CLINIC-MADA +ARV 50 +COL a" % self.entity.short_code with self.assertRaises(InactiveFormModelException): self.send_sms(text) def test_should_set_submission_log_as_Test_for_form_model_in_test_mode(self): self.form_model.set_test_mode() self.form_model.save() text = "clinic +EID %s +name CLINIC-MADA +ARV 50 +COL a" % self.entity.short_code response = self.send_sms(text) self.assertTrue(response.success) self.assertIsNotNone(response.datarecord_id) self.assertIsNotNone(response.submission_id) submission_log = self.dbm._load_document(response.submission_id, SubmissionLogDocument) self.assertTrue(submission_log.test) def test_should_register_entity_with_geo_code(self): message1 = """reg +t dog +n Dog in Diégo–Suarez +g -12.35 49.3 +d This is a Dog in Diégo–Suarez + m 87654325 """ response = self.send_sms(message1) self.assertTrue(response.success) self.assertIsNotNone(response.datarecord_id) expected_short_code = 'dog1' self.assertEqual(response.short_code, expected_short_code) dog = get_by_short_code(self.dbm, expected_short_code, ["dog"]) self.assertEqual([-12.35 , 49.3] ,dog.geometry.get("coordinates")) def test_should_register_entity_with_geocode_if_only_location_provided(self): message1 = """reg +t dog +n Dog in AMPIZARANTANY +l AMPIZARANTANY +d This is a Dog in AMPIZARANTANY + m 87654325 """ response = self.send_sms(message1) self.assertTrue(response.success) self.assertIsNotNone(response.datarecord_id) expected_short_code = 'dog1' self.assertEqual(response.short_code, expected_short_code) dog = get_by_short_code(self.dbm, expected_short_code, ["dog"]) self.assertEqual([-12, 60] ,dog.geometry.get("coordinates")) def test_should_register_entity_with_geocode_and_location_provided(self): message1 = """reg +t dog +n Dog in AMPIZARANTANY +l AMPIZARANTANY +g 10 10 +d This is a Dog in AMPIZARANTANY + m 87654325 """ response = self.send_sms(message1) self.assertTrue(response.success) self.assertIsNotNone(response.datarecord_id) expected_short_code = 'dog1' self.assertEqual(response.short_code, expected_short_code) dog = get_by_short_code(self.dbm, expected_short_code, ["dog"]) self.assertEqual([10, 10] ,dog.geometry.get("coordinates")) self.assertEqual(["ampizarantany"] ,dog.location_path)
class TestImportData(MangroveTestCase): def setUp(self): MangroveTestCase.setUp(self) self._create_entities() self.player = SMSPlayer(self.manager, location_tree=LocationBridge(get_location_tree(), get_loc_hierarchy=get_location_hierarchy)) self.transport = TransportInfo(transport="sms", source="1234", destination="5678") initializer.run(self.manager) def tearDown(self): MangroveTestCase.tearDown(self) def test_should_load_all_subjects(self): self._register_entities() subjects = load_all_subjects(self.manager) self.assertEqual(2, len(subjects)) self.assertEqual(subjects[0]["entity"], "clinic") self.assertEqual(subjects[1]["entity"], "waterpoint") self.assertEqual(subjects[0]["code"], "cli") self.assertEqual(subjects[1]["code"], "wat") self.assertEqual(6, len(subjects[0]["names"])) self.assertEqual(6, len(subjects[0]["labels"])) self.assertEqual(subjects[0]['data'][0]['cols'][0], 'Bhopal') self.assertEqual(subjects[0]['data'][0]['cols'][2], 'India') self.assertEqual(subjects[0]['data'][0]['cols'][5], 'clb') self.assertEqual(subjects[0]['data'][1]['cols'][0], 'Satna') self.assertEqual(subjects[0]['data'][1]['cols'][3], '-10.66, 13.1') self.assertEqual(subjects[0]['data'][1]['cols'][5], 'cli2') self.assertEqual(subjects[1]['data'][0]['cols'][0], 'Ambovombe') self.assertEqual(subjects[1]['data'][0]['cols'][3], '-18.16, 14.1') self.assertEqual(subjects[1]['data'][0]['cols'][4], '123444') self.assertEqual(subjects[1]['data'][0]['cols'][5], 'wat1') def _create_entities(self): self.entity_type = ['clinic'] define_type(self.manager, self.entity_type) create_registration_form(self.manager, self.entity_type) self.entity_type = ['waterpoint'] define_type(self.manager, self.entity_type) create_registration_form(self.manager, self.entity_type) define_type(self.manager, ['reporter']) self.name_type = DataDictType(self.manager, name='Name', slug='name', primitive_type='string') self.telephone_number_type = DataDictType(self.manager, name='telephone_number', slug='telephone_number', primitive_type='string') rep1 = create_entity(self.manager, ['reporter'], 'rep1') rep1.add_data(data=[(MOBILE_NUMBER_FIELD, '1234', self.telephone_number_type), (NAME_FIELD, "Test_reporter", self.name_type)], submission=dict(submission_id="2")) def _register_entity(self, text): self.player.accept(Request(text, self.transport)) def _register_entities(self): self._register_entity('cli Bhopal Clinic India -12.35,49.3 123444 clb') self._register_entity('cli Satna Clinic India -10.66,13.1 567223') self._register_entity('cli Pune Clinic Yerawada -18.16,14.1 643321') self._register_entity('wat Ambovombe Test Androy -18.16,14.1 123444') self._register_entity('wat Morondava Test Menabe -15.91,12.67 138866')
def load_sms_data_for_cli001(manager): FEB = datetime(2011, 02, 28, hour=12, minute=00, second=00, tzinfo=UTC) MARCH = datetime(2011, 03, 01, tzinfo=UTC) DEC_2010 = datetime(2010, 12, 28, hour=00, minute=00, second=59, tzinfo=UTC) NOV_2010 = datetime(2010, 11, 26, hour=23, minute=59, second=59, tzinfo=UTC) today = datetime.today() THIS_MONTH = datetime(today.year,today.month,5,12,45,58) PREV_MONTH = THIS_MONTH - timedelta(days=8) tree = get_location_tree() sms_player = SMSPlayer(manager, SubmissionHandler(manager), location_tree=tree) FROM_NUMBER = '1234567890' TO_NUMBER = '261333782943' transport = TransportInfo(SMS, FROM_NUMBER, TO_NUMBER) message1 = "reg +t clinic +n Clinic in Analalava +l Analalava +g -14.6333 47.7667 +d This is a Clinic in Analalava +m 987654321" response = sms_player.accept(Request(transportInfo=transport, message=message1)) message1 = "reg +t clinic +n Clinic in Andapa +l Andapa +g -14.65 49.6167 +d This is a Clinic in Andapa +m 87654322" response = sms_player.accept(Request(transportInfo=transport, message=message1)) message1 = "reg +t clinic +n Clinic in Antalaha +l Antalaha +g -14.8833 50.25 +d This is a Clinic in Antalaha +m 87654323" response = sms_player.accept(Request(transportInfo=transport, message=message1)) message1 = "reg +t clinic +n Clinic in ANALAMANGA +l ANALAMANGA +g -18.8 47.4833 +d This is a Clinic in Antananarivo +m 87654324" response = sms_player.accept(Request(transportInfo=transport, message=message1)) message1 = "reg +t clinic +n Clinic in TSIMANARIRAZANA +l TSIMANARIRAZANA +g -12.35 49.3 +d This is a Clinic in Diégo–Suarez +m 87654325" response = sms_player.accept(Request(transportInfo=transport, message=message1)) message1 = "reg +t clinic +n Clinic in Antsirabe +l Antsirabe +g -19.8167 47.0667 +d This is a Clinic in Antsirabe +m 87654326" response = sms_player.accept(Request(transportInfo=transport, message=message1)) message1 = "reg +t clinic +n Clinic in Besalampy +l Besalampy +g -16.75 44.5 +d This is a Clinic in Besalampy +m 87654327" response = sms_player.accept(Request(transportInfo=transport, message=message1)) message1 = "reg +t clinic +n clinique à Farafangana +l Farafangana +g -22.8 47.8333 +d This is a Clinic in Farafangana +m 87654328" response = sms_player.accept(Request(transportInfo=transport, message=message1)) message1 = "reg +t clinic +n Clinic in Fianarantsoa I +l Fianarantsoa I +g -21.45 47.1 +d C'est une clinique à Fianarantsoa +m 87654329" response = sms_player.accept(Request(transportInfo=transport, message=message1)) message1 = "reg +t clinic +n Clinic in Sainte Marie +l Sainte Marie +g -17.0833 49.8167 +d This is a Clinic in Île Sainte–Marie +m 87654330" response = sms_player.accept(Request(transportInfo=transport, message=message1)) message1 = "reg +t clinic +n Clinic in Mahajanga +l Mahajanga +g -15.6667 46.35 +d This is a Clinic in Mahajanga +m 87654331" response = sms_player.accept(Request(transportInfo=transport, message=message1)) datetime_mocker = DateTimeMocker() datetime_mocker.set_date_time_now(FEB) # Total number of identical records = 3 message1 = "cli001 +EID cid001 +NA Mr. Tessy +FA 58 +RD 28.02.2011 +BG c +SY ade +GPS 79.2 20.34567" response = sms_player.accept(Request(transportInfo=transport, message=message1)) message1 = "cli001 +EID cid002 +NA Mr. Adam +FA 62 +RD 15.02.2011 +BG a +SY ab +GPS 74.2678 23.3567" response = sms_player.accept(Request(transportInfo=transport, message=message1)) message1 = "cli001 +EID cid003 +NA Ms. Beth +FA 75 +RD 09.02.2011 +BG b +SY bc +GPS 18.245 29.3123" response = sms_player.accept(Request(transportInfo=transport, message=message1)) datetime_mocker.set_date_time_now(MARCH) # Total number of identical records = 4 message1 = "cli001 +EID cid004 +NA Jannita +FA 90 +RD 07.03.2011 +BG b +SY bbe +GPS 45.233 28.3324" response = sms_player.accept(Request(transportInfo=transport, message=message1)) message1 = "cli001 +EID cid005 +NA Aanda +RD 12.03.2011 +BG c +SY bd +GPS 40.2 69.3123" response = sms_player.accept(Request(transportInfo=transport, message=message1)) message1 = 'cli001 +EID cid001 +NA Ianda (",) +FA 34 +RD 27.03.2011 +BG d +SY be +GPS 38.3452 15.3345' response = sms_player.accept(Request(transportInfo=transport, message=message1)) message1 = "cli001 +EID cid001 +NA ànita +FA 45 +RD 07.03.2011 +BG b +SY bbe +GPS 45.233 28.3324" response = sms_player.accept(Request(transportInfo=transport, message=message1)) message1 = "cli001 +EID cid004 +NA Amanda +RD 12.03.2011 +BG c +SY bd +GPS 40.2 69.3123" response = sms_player.accept(Request(transportInfo=transport, message=message1)) message1 = 'cli001 +EID cid005 +NA Vanda (",) +FA 34 +RD 27.03.2011 +BG d +SY be +GPS 38.3452 15.3345' response = sms_player.accept(Request(transportInfo=transport, message=message1)) message1 = "cli001 +EID cid003 +NA ànnita +FA 80 +RD 07.03.2011 +BG b +SY bbe +GPS 45.233 28.3324" response = sms_player.accept(Request(transportInfo=transport, message=message1)) message1 = "cli001 +EID cid002 +NA Amanda +RD 12.03.2011 +BG c +SY bd +GPS 40.2 69.3123" response = sms_player.accept(Request(transportInfo=transport, message=message1)) message1 = 'cli001 +EID cid004 +NA Panda (",) +FA 34 +RD 27.03.2011 +BG d +SY be +GPS 38.3452 15.3345' response = sms_player.accept(Request(transportInfo=transport, message=message1)) message1 = "cli001 +EID cid005 +NA ànnita +FA 50 +RD 07.03.2011 +BG b +SY bbe +GPS 45.233 28.3324" response = sms_player.accept(Request(transportInfo=transport, message=message1)) message1 = "cli001 +EID cid003 +NA Jimanda +RD 12.03.2011 +BG c +SY bd +GPS 40.2 69.3123" response = sms_player.accept(Request(transportInfo=transport, message=message1)) message1 = 'cli001 +EID cli10 +NA Kanda (",) +FA 64 +RD 27.03.2011 +BG d +SY be +GPS 38.3452 15.3345' response = sms_player.accept(Request(transportInfo=transport, message=message1)) message1 = "cli001 +EID cid004 +NA ànnita +FA 30 +RD 07.03.2011 +BG b +SY bbe +GPS 45.233 28.3324" response = sms_player.accept(Request(transportInfo=transport, message=message1)) message1 = "cli001 +EID cid005 +NA Qamanda +RD 12.03.2011 +BG c +SY bd +GPS 40.2 69.3123" response = sms_player.accept(Request(transportInfo=transport, message=message1)) message1 = 'cli001 +EID cid001 +NA Huanda (*_*) +FA 74 +RD 27.03.2011 +BG d +SY be +GPS 38.3452 15.3345' response = sms_player.accept(Request(transportInfo=transport, message=message1)) datetime_mocker.set_date_time_now(DEC_2010) # Total number of identical records = 4 message1 = "cli001 +EID cli12 +FA 47 +RD 15.12.2010 +BG d +SY ace +GPS -58.3452 19.3345" response = sms_player.accept(Request(transportInfo=transport, message=message1)) message1 = "cli001 +EID cli11 +NA De'melo +FA 38 +RD 27.12.2010 +BG c +SY ba +GPS 81.672 92.33456" response = sms_player.accept(Request(transportInfo=transport, message=message1)) message1 = "cli001 +EID cli13 +NA Dono`mova +FA 24 +RD 06.12.2010 +BG b +SY cd +GPS 65.23452 -28.3456" response = sms_player.accept(Request(transportInfo=transport, message=message1)) message1 = "cli001 +EID cli15 +NA Aàntra +FA 89 +RD 11.12.2010 +BG a +SY bd +GPS 45.234 89.32345" response = sms_player.accept(Request(transportInfo=transport, message=message1)) datetime_mocker.set_date_time_now(NOV_2010) # Total number of identical records = 3 message1 = "cli001 +EID cli12 +NA ànnita +FA 90 +RD 07.11.2010 +BG b +SY bbe +GPS 45.233 28.3324" response = sms_player.accept(Request(transportInfo=transport, message=message1)) message1 = "cli001 +EID cli14 +NA Amanda +RD 12.11.2010 +BG c +SY bd +GPS 40.2 69.3123" response = sms_player.accept(Request(transportInfo=transport, message=message1)) message1 = 'cli001 +EID cli8 +NA Kanda (",) +FA 34 +RD 27.11.2010 +BG d +SY be +GPS 38.3452 15.3345' response = sms_player.accept(Request(transportInfo=transport, message=message1)) message1 = "cli001 +EID cli9 +NA ànnita +FA 90 +RD 17.11.2010 +BG b +SY bbe +GPS 45.233 28.3324" response = sms_player.accept(Request(transportInfo=transport, message=message1)) message1 = "cli001 +EID cid007 +NA Amanda +RD 12.11.2010 +BG c +SY bd +GPS 40.2 69.3123" response = sms_player.accept(Request(transportInfo=transport, message=message1)) message1 = 'cli001 +EID cli8 +NA Kanda (",) +FA 34 +RD 27.11.2010 +BG d +SY be +GPS 38.3452 15.3345' response = sms_player.accept(Request(transportInfo=transport, message=message1)) datetime_mocker.set_date_time_now(PREV_MONTH) # Total number of identical records = 4 message1 = "cli001 +EID cli9 +NA Demelo +FA 38 +RD 17.05.2011 +BG c +SY ba +GPS 19.672 92.33456" response = sms_player.accept(Request(transportInfo=transport, message=message1)) message1 = "cli001 +EID cli10 +NA Zorro +FA 48 +RD 05.05.2011 +BG b +SY cd +GPS 23.23452 -28.3456" response = sms_player.accept(Request(transportInfo=transport, message=message1)) message1 = "cli001 +EID cli11 +NA Aàntra +FA 98 +RD 12.05.2011 +BG a +GPS -45.234 89.32345" response = sms_player.accept(Request(transportInfo=transport, message=message1)) message1 = "cli001 +EID cli12 +NA ànnita +FA 37 +RD 05.05.2011 +BG d +SY cbe +GPS -78.233 -28.3324" response = sms_player.accept(Request(transportInfo=transport, message=message1)) message1 = "cli001 +EID cli9 +NA Demelo +FA 38 +RD 17.05.2011 +BG c +SY ba +GPS 19.672 92.33456" response = sms_player.accept(Request(transportInfo=transport, message=message1)) message1 = "cli001 +EID cli10 +NA Zorro +FA 48 +RD 02.05.2011 +BG b +SY cd +GPS 23.23452 -28.3456" response = sms_player.accept(Request(transportInfo=transport, message=message1)) message1 = "cli001 +EID cli11 +NA Aàntra +FA 95 +RD 12.05.2011 +BG a +GPS -45.234 89.32345" response = sms_player.accept(Request(transportInfo=transport, message=message1)) message1 = "cli001 +EID cli12 +NA ànnita +FA 35 +RD 09.05.2010 +BG d +SY cbe +GPS -78.233 -28.3324" response = sms_player.accept(Request(transportInfo=transport, message=message1)) message1 = "cli001 +EID cli9 +NA Demelo +FA 32 +RD 27.05.2011 +BG c +SY ba +GPS 19.672 92.33456" response = sms_player.accept(Request(transportInfo=transport, message=message1)) message1 = "cli001 +EID cli10 +NA Zorro +FA 43 +RD 05.05.2011 +BG b +SY cd +GPS 23.23452 -28.3456" response = sms_player.accept(Request(transportInfo=transport, message=message1)) message1 = "cli001 +EID cli11 +NA Aàntra +FA 91 +RD 12.05.2011 +BG a +GPS -45.234 89.32345" response = sms_player.accept(Request(transportInfo=transport, message=message1)) message1 = "cli001 +EID cli12 +NA ànnita +FA 45 +RD 15.05.2010 +BG d +SY cbe +GPS -78.233 -28.3324" response = sms_player.accept(Request(transportInfo=transport, message=message1)) datetime_mocker.set_date_time_now(THIS_MONTH) # Total number of identical records = 4 message1 = "cli001 +EID cli13 +NA Dmanda +FA 69 +RD 05.06.2011 +BG c +SY ce +GPS 40.2 69.3123" response = sms_player.accept(Request(transportInfo=transport, message=message1)) message1 = "cli001 +EID cli14 +NA Vamand +FA 36 +RD 03.06.2011 +BG a +SY ace +GPS 58.3452 115.3345" response = sms_player.accept(Request(transportInfo=transport, message=message1)) message1 = "cli001 +EID cli15 +NA M!lo +FA 88 +RD 02.06.2011 +SY ba +GPS 19.672 92.33456" response = sms_player.accept(Request(transportInfo=transport, message=message1)) message1 = "cli001 +EID cli16 +NA K!llo +FA 88 +GPS 19.672 92.33456" response = sms_player.accept(Request(transportInfo=transport, message=message1)) message1 = "cli001 +EID cli13 +NA Dmanda +FA 89 +RD 04.06.2011 +BG c +SY ce +GPS 40.2 69.3123" response = sms_player.accept(Request(transportInfo=transport, message=message1)) message1 = "cli001 +EID cli14 +NA Vamand +FA 56 +RD 01.06.2011 +BG a +SY ace +GPS 58.3452 115.3345" response = sms_player.accept(Request(transportInfo=transport, message=message1)) message1 = "cli001 +EID cli15 +NA M!lo +FA 45 +RD 07.06.2011 +SY ba +GPS 19.672 92.33456" response = sms_player.accept(Request(transportInfo=transport, message=message1)) message1 = "cli001 +EID cli16 +NA K!llo +FA 28 +GPS 19.672 92.33456" response = sms_player.accept(Request(transportInfo=transport, message=message1)) datetime_mocker.end_mock() # Total number of identical records = 3 message1 = "cli001 +EID cli17 +NA Catty +FA 78 +RD 15.06.2011 +BG b +SY dce +GPS 33.23452 -68.3456" response = sms_player.accept(Request(transportInfo=transport, message=message1)) message1 = "cli001 +EID cli18 +NA àntra +FA 28 +RD 12.06.2011 +BG a +SY adb +GPS -45.234 169.32345" response = sms_player.accept(Request(transportInfo=transport, message=message1)) message1 = "cli001 +EID cli9 +NA Tinnita +FA 37 +BG d +SY ace +GPS -78.233 -28.3324" response = sms_player.accept(Request(transportInfo=transport, message=message1)) message1 = "cli001 +EID cli17 +NA Catty +FA 98 +RD 25.06.2011 +BG b +SY dce +GPS 33.23452 -68.3456" response = sms_player.accept(Request(transportInfo=transport, message=message1)) message1 = "cli001 +EID cli18 +NA àntra +FA 58 +RD 22.06.2011 +BG a +SY adb +GPS -45.234 169.32345" response = sms_player.accept(Request(transportInfo= transport, message=message1)) message1 = "cli001 +EID cli9 +NA Tinnita +FA 27 +BG d +SY ace +GPS -78.233 -28.3324" response = sms_player.accept(Request(transportInfo=transport, message=message1))