class TestSubmissions(TestCase): def setUp(self): self.FORM_CODE = "QR1" self.VALUES = {"EID": "100", "Q1": "20"} self.dbm = Mock(spec=DatabaseManager) self.form_model_patcher = patch( 'mangrove.transport.submissions.get_form_model_by_code') self.form_submission_entity_patcher = patch( 'mangrove.form_model.form_model.entity') self.SubmissionLogger_class_patcher = patch( 'mangrove.transport.submissions.SubmissionLogger', ) self.get_form_model_mock = self.form_model_patcher.start() self.form_submission_entity_module = self.form_submission_entity_patcher.start( ) self.SubmissionLogger_mock_class = self.SubmissionLogger_class_patcher.start( ) self.submissionLogger = Mock(spec=SubmissionLogger) self.SubmissionLogger_mock_class.return_value = self.submissionLogger self.SUBMISSION_ID = "SUBMISSION_ID" self.submissionLogger.create_submission_log.return_value = self.SUBMISSION_ID self.form_model_mock = Mock(spec=FormModel) self.form_model_mock.is_registration_form.return_value = False self.form_model_mock.entity_defaults_to_reporter.return_value = False self.form_model_mock.is_inactive.return_value = False self.form_model_mock.is_in_test_mode.return_value = False self.ENTITY_TYPE = ["entity_type"] self.form_model_mock.entity_type = self.ENTITY_TYPE entity_question = Mock() entity_question.code = "eid" self.form_model_mock.entity_question = entity_question self.get_form_model_mock.return_value = self.form_model_mock self.sms = Channel.SMS reporter = Mock(spec=Entity) reporter.short_code.return_value = "REP1" self.submission_request = SubmissionRequest(form_code=self.FORM_CODE, submission=self.VALUES, transport=self.sms, source="1234", destination="5678", reporter=reporter) self.submission_handler = SubmissionHandler(self.dbm) def tearDown(self): self.form_model_patcher.stop() self.form_submission_entity_patcher.stop() def _valid_form_submission(self): return FormSubmission(self.form_model_mock, { 'eid': 'CID001', "location": "Pune" }) def _valid_form_submission_unicode(self): return FormSubmission(self.form_model_mock, { 'eid': u'Āgra', "location": "Agra" }) def _invalid_form_submission_unicode(self): return FormSubmission(self.form_model_mock, {}, {"field": u"Āgra"}) def _valid_form_submission_with_choices(self): return FormSubmission(self.form_model_mock, { 'eid': 'CID001', "location": "Pune", "favourite_colour": ['red'] }) def _empty_form_submission(self): return FormSubmission(self.form_model_mock, {'eid': 'CID001'}) def _invalid_form_submission(self): return FormSubmission(self.form_model_mock, {}, {"field": "Invalid"}) def test_should_return_true_if_valid_form_submission(self): self.form_model_mock.validate_submission.return_value = self._valid_form_submission( ) response = self.submission_handler.accept(self.submission_request) self.assertTrue(response.success) self.assertEqual({}, response.errors) self.assertFalse(response.is_registration) def test_should_save_data_record_if_valid_form_submission(self): self.form_model_mock.validate_submission.return_value = self._valid_form_submission( ) self.submission_handler.accept(self.submission_request) self.assertTrue( self.form_submission_entity_module.get_by_short_code.called) def test_should_not_save_data_record_if_in_valid_form_submission(self): self.form_model_mock.validate_submission.return_value = self._invalid_form_submission( ) response = self.submission_handler.accept(self.submission_request) self.assertEqual({"field": "Invalid"}, response.errors) self.assertFalse(response.success) self.assertFalse(response.is_registration) def test_should_not_save_data_record_if_no_valid_questions_present(self): self.form_model_mock.validate_submission.side_effect = NoQuestionsSubmittedException( ) with self.assertRaises(NoQuestionsSubmittedException): self.submission_handler.accept(self.submission_request) def test_should_create_new_submission_log(self): form_submission = self._valid_form_submission() self.form_model_mock.validate_submission.return_value = form_submission self.submission_handler.accept(self.submission_request) self.assertTrue(self.submissionLogger.create_submission_log.called) def test_should_update_submission_log_on_success(self): form_submission = self._valid_form_submission() self.form_model_mock.validate_submission.return_value = form_submission response = self.submission_handler.accept(self.submission_request) self.submissionLogger.update_submission_log.assert_called_once_with( submission_id=self.SUBMISSION_ID, status=True, errors=None, data_record_id=response.datarecord_id, in_test_mode=False) def test_should_update_submission_log_on_failure(self): form_submission = self._invalid_form_submission() self.form_model_mock.validate_submission.return_value = form_submission self.submission_handler.accept(self.submission_request) self.submissionLogger.update_submission_log.assert_called_once_with( submission_id=self.SUBMISSION_ID, status=False, data_record_id=None, errors=form_submission.errors, in_test_mode=False) def test_should_fail_submission_if_invalid_form_code(self): self.get_form_model_mock.side_effect = FormModelDoesNotExistsException( "INVALID_CODE") with self.assertRaises(FormModelDoesNotExistsException): self.submission_handler.accept(self.submission_request) def test_should_fail_submission_if_invalid_short_code(self): form_submission = self._valid_form_submission() self.form_model_mock.validate_submission.return_value = form_submission self.form_submission_entity_module.get_by_short_code.side_effect = DataObjectNotFound( "Entity", 'id', 'short_code') with self.assertRaises(DataObjectNotFound): self.submission_handler.accept(self.submission_request) self.submissionLogger.update_submission_log.assert_called_once_with( submission_id=self.SUBMISSION_ID, status=False, errors=u'Entity with id = short_code not found.', in_test_mode=False) def test_should_register_entity_if_form_submission_valid(self): self.form_model_mock.validate_submission.return_value = self._valid_form_submission( ) self.form_model_mock.is_registration_form.return_value = True response = self.submission_handler.accept(self.submission_request) self.assertTrue(response.success) self.assertEqual({}, response.errors) self.assertEqual("cid001", response.short_code) self.assertTrue(response.is_registration) self.form_submission_entity_module.create_entity.assert_called_once_with( dbm=self.dbm, entity_type=self.ENTITY_TYPE, location=None, short_code="cid001", geometry=None) self.submissionLogger.update_submission_log.assert_called_once_with( submission_id=self.SUBMISSION_ID, status=True, errors=None, data_record_id=response.datarecord_id, in_test_mode=False) def test_should_not_register_entity_if_form_submission_invalid(self): form_submission = self._invalid_form_submission() self.form_model_mock.validate_submission.return_value = form_submission self.form_model_mock.is_registration_form.return_value = True response = self.submission_handler.accept(self.submission_request) self.assertFalse(response.success) self.assertEqual({"field": "Invalid"}, response.errors) self.assertTrue(response.is_registration) self.assertFalse( self.form_submission_entity_module.create_entity.called) self.submissionLogger.update_submission_log.assert_called_once_with( submission_id=self.SUBMISSION_ID, status=False, data_record_id=None, errors=form_submission.errors, in_test_mode=False) def test_should_return_expanded_response(self): form_submission = self._valid_form_submission_with_choices() self.form_model_mock.validate_submission.return_value = form_submission response = self.submission_handler.accept(self.submission_request) expected_message = form_submission.cleaned_data self.assertEquals(expected_message, response.processed_data) def test_should_accept_unicodes_for_valid_submission(self): form_submission = self._valid_form_submission_unicode() self.form_model_mock.validate_submission.return_value = form_submission response = self.submission_handler.accept(self.submission_request) self.assertTrue(response.success) self.assertEqual({}, response.errors) def test_should_accept_unicodes_for_invalid_submission(self): form_submission = self._invalid_form_submission_unicode() self.form_model_mock.validate_submission.return_value = form_submission response = self.submission_handler.accept(self.submission_request) self.assertFalse(response.success) self.assertEqual({'field': u'Āgra'}, response.errors) def test_should_raise_inactive_form_model_exception(self): self.form_model_mock.is_inactive.return_value = True with self.assertRaises(InactiveFormModelException): self.submission_handler.accept(self.submission_request) def test_should_log_submissions_in_test_mode(self): self.form_model_mock.is_in_test_mode.return_value = True self.form_model_mock.is_inactive.return_value = False form_submission = self._valid_form_submission() self.form_model_mock.validate_submission.return_value = form_submission response = self.submission_handler.accept(self.submission_request) self.assertTrue(response.success) self.assertIsNotNone(response.datarecord_id) self.assertIsNotNone(response.submission_id) def test_should_convert_mobile_number_to_string(self): actual_value = self.submission_handler._get_telephone_number( u'2.66123321435e+11') expected_value = unicode(266123321435) self.assertEqual(expected_value, actual_value) actual_value = self.submission_handler._get_telephone_number( u'266123321') expected_value = u'266123321' self.assertEqual(expected_value, actual_value) def test_should_strip_non_numbers_from_mobile_number(self): actual_value = self.submission_handler._get_telephone_number( u'26554-2123') expected_value = u'265542123' self.assertEqual(expected_value, actual_value)
class TestSubmissions(TestCase): def setUp(self): self.FORM_CODE = "QR1" self.VALUES = {"EID": "100", "Q1": "20"} self.dbm = Mock(spec=DatabaseManager) self.form_model_patcher = patch('mangrove.transport.submissions.get_form_model_by_code') self.form_submission_entity_patcher = patch('mangrove.form_model.form_model.entity') self.SubmissionLogger_class_patcher = patch('mangrove.transport.submissions.SubmissionLogger', ) self.get_form_model_mock = self.form_model_patcher.start() self.form_submission_entity_module = self.form_submission_entity_patcher.start() self.SubmissionLogger_mock_class = self.SubmissionLogger_class_patcher.start() self.submissionLogger = Mock(spec=SubmissionLogger) self.SubmissionLogger_mock_class.return_value = self.submissionLogger self.SUBMISSION_ID = "SUBMISSION_ID" self.submissionLogger.create_submission_log.return_value = self.SUBMISSION_ID self.form_model_mock = Mock(spec=FormModel) self.form_model_mock.is_registration_form.return_value = False self.form_model_mock.entity_defaults_to_reporter.return_value = False self.form_model_mock.is_inactive.return_value = False self.form_model_mock.is_in_test_mode.return_value = False self.ENTITY_TYPE = ["entity_type"] self.form_model_mock.entity_type = self.ENTITY_TYPE entity_question = Mock() entity_question.code = "eid" self.form_model_mock.entity_question = entity_question self.get_form_model_mock.return_value = self.form_model_mock self.sms = Channel.SMS reporter = Mock(spec=Entity) reporter.short_code.return_value = "REP1" self.submission_request = SubmissionRequest(form_code=self.FORM_CODE, submission=self.VALUES, transport=self.sms , source="1234", destination="5678", reporter=reporter) self.submission_handler = SubmissionHandler(self.dbm) def tearDown(self): self.form_model_patcher.stop() self.form_submission_entity_patcher.stop() def _valid_form_submission(self): return FormSubmission(self.form_model_mock, {'eid': 'CID001', "location": "Pune"}) def _valid_form_submission_unicode(self): return FormSubmission(self.form_model_mock, {'eid': u'Āgra', "location": "Agra"}) def _invalid_form_submission_unicode(self): return FormSubmission(self.form_model_mock, {}, {"field": u"Āgra"}) def _valid_form_submission_with_choices(self): return FormSubmission(self.form_model_mock, {'eid': 'CID001', "location": "Pune", "favourite_colour": ['red']}) def _empty_form_submission(self): return FormSubmission(self.form_model_mock, {'eid': 'CID001'}) def _invalid_form_submission(self): return FormSubmission(self.form_model_mock, {}, {"field": "Invalid"}) def test_should_return_true_if_valid_form_submission(self): self.form_model_mock.validate_submission.return_value = self._valid_form_submission() response = self.submission_handler.accept(self.submission_request) self.assertTrue(response.success) self.assertEqual({}, response.errors) self.assertFalse(response.is_registration) def test_should_save_data_record_if_valid_form_submission(self): self.form_model_mock.validate_submission.return_value = self._valid_form_submission() self.submission_handler.accept(self.submission_request) self.assertTrue(self.form_submission_entity_module.get_by_short_code.called) def test_should_not_save_data_record_if_in_valid_form_submission(self): self.form_model_mock.validate_submission.return_value = self._invalid_form_submission() response = self.submission_handler.accept(self.submission_request) self.assertEqual({"field": "Invalid"}, response.errors) self.assertFalse(response.success) self.assertFalse(response.is_registration) def test_should_not_save_data_record_if_no_valid_questions_present(self): self.form_model_mock.validate_submission.side_effect = NoQuestionsSubmittedException() with self.assertRaises(NoQuestionsSubmittedException): self.submission_handler.accept(self.submission_request) def test_should_create_new_submission_log(self): form_submission = self._valid_form_submission() self.form_model_mock.validate_submission.return_value = form_submission self.submission_handler.accept(self.submission_request) self.assertTrue(self.submissionLogger.create_submission_log.called) def test_should_update_submission_log_on_success(self): form_submission = self._valid_form_submission() self.form_model_mock.validate_submission.return_value = form_submission response = self.submission_handler.accept(self.submission_request) self.submissionLogger.update_submission_log.assert_called_once_with(submission_id=self.SUBMISSION_ID, status=True, errors=None, data_record_id=response.datarecord_id, in_test_mode=False) def test_should_update_submission_log_on_failure(self): form_submission = self._invalid_form_submission() self.form_model_mock.validate_submission.return_value = form_submission self.submission_handler.accept(self.submission_request) self.submissionLogger.update_submission_log.assert_called_once_with(submission_id=self.SUBMISSION_ID, status=False, data_record_id=None, errors=form_submission.errors, in_test_mode=False) def test_should_fail_submission_if_invalid_form_code(self): self.get_form_model_mock.side_effect = FormModelDoesNotExistsException("INVALID_CODE") with self.assertRaises(FormModelDoesNotExistsException): self.submission_handler.accept(self.submission_request) def test_should_fail_submission_if_invalid_short_code(self): form_submission = self._valid_form_submission() self.form_model_mock.validate_submission.return_value = form_submission self.form_submission_entity_module.get_by_short_code.side_effect = DataObjectNotFound("Entity", 'id', 'short_code') with self.assertRaises(DataObjectNotFound): self.submission_handler.accept(self.submission_request) self.submissionLogger.update_submission_log.assert_called_once_with(submission_id=self.SUBMISSION_ID, status=False, errors=u'Entity with id = short_code not found.' , in_test_mode=False) def test_should_register_entity_if_form_submission_valid(self): self.form_model_mock.validate_submission.return_value = self._valid_form_submission() self.form_model_mock.is_registration_form.return_value = True response = self.submission_handler.accept(self.submission_request) self.assertTrue(response.success) self.assertEqual({}, response.errors) self.assertEqual("cid001", response.short_code) self.assertTrue(response.is_registration) self.form_submission_entity_module.create_entity.assert_called_once_with(dbm=self.dbm, entity_type=self .ENTITY_TYPE, location=None, short_code="cid001", geometry=None) self.submissionLogger.update_submission_log.assert_called_once_with(submission_id=self.SUBMISSION_ID, status=True, errors=None, data_record_id=response.datarecord_id, in_test_mode=False) def test_should_not_register_entity_if_form_submission_invalid(self): form_submission = self._invalid_form_submission() self.form_model_mock.validate_submission.return_value = form_submission self.form_model_mock.is_registration_form.return_value = True response = self.submission_handler.accept(self.submission_request) self.assertFalse(response.success) self.assertEqual({"field": "Invalid"}, response.errors) self.assertTrue(response.is_registration) self.assertFalse(self.form_submission_entity_module.create_entity.called) self.submissionLogger.update_submission_log.assert_called_once_with(submission_id=self.SUBMISSION_ID, status=False, data_record_id=None, errors=form_submission.errors, in_test_mode=False) def test_should_return_expanded_response(self): form_submission = self._valid_form_submission_with_choices() self.form_model_mock.validate_submission.return_value = form_submission response = self.submission_handler.accept(self.submission_request) expected_message = form_submission.cleaned_data self.assertEquals(expected_message, response.processed_data) def test_should_accept_unicodes_for_valid_submission(self): form_submission = self._valid_form_submission_unicode() self.form_model_mock.validate_submission.return_value = form_submission response = self.submission_handler.accept(self.submission_request) self.assertTrue(response.success) self.assertEqual({}, response.errors) def test_should_accept_unicodes_for_invalid_submission(self): form_submission = self._invalid_form_submission_unicode() self.form_model_mock.validate_submission.return_value = form_submission response = self.submission_handler.accept(self.submission_request) self.assertFalse(response.success) self.assertEqual({'field': u'Āgra'}, response.errors) def test_should_raise_inactive_form_model_exception(self): self.form_model_mock.is_inactive.return_value = True with self.assertRaises(InactiveFormModelException): self.submission_handler.accept(self.submission_request) def test_should_log_submissions_in_test_mode(self): self.form_model_mock.is_in_test_mode.return_value = True self.form_model_mock.is_inactive.return_value = False form_submission = self._valid_form_submission() self.form_model_mock.validate_submission.return_value = form_submission response = self.submission_handler.accept(self.submission_request) self.assertTrue(response.success) self.assertIsNotNone(response.datarecord_id) self.assertIsNotNone(response.submission_id) def test_should_convert_mobile_number_to_string(self): actual_value = self.submission_handler._get_telephone_number(u'2.66123321435e+11') expected_value = unicode(266123321435) self.assertEqual(expected_value, actual_value) actual_value = self.submission_handler._get_telephone_number(u'266123321') expected_value = u'266123321' self.assertEqual(expected_value, actual_value) def test_should_strip_non_numbers_from_mobile_number(self): actual_value = self.submission_handler._get_telephone_number(u'26554-2123') expected_value = u'265542123' self.assertEqual(expected_value, actual_value)