class TestProcessMessageStatus(TestCase): def setUp(self): super(TestProcessMessageStatus, self).setUp() self.backend = SQLTelerivetBackend( name='TELERIVET', is_global=True, hq_api_id=SQLTelerivetBackend.get_api_id()) self.backend.set_extra_fields( webhook_secret='The chamber of webhook secrets') self.backend.save() self.sms = SMS( text='I am testy', custom_metadata={'case_id': '123'}, ) self.sms.save() def tearDown(self): self.sms.delete() super(TestProcessMessageStatus, self).tearDown() def test_status_delivered(self): process_message_status(self.sms, DELIVERED) sms = SMS.objects.get(couch_id=self.sms.couch_id) self.assertTrue('gateway_delivered' in sms.custom_metadata.keys()) def test_error_status(self): message_id = self.sms.couch_id process_message_status(self.sms, FAILED, error_message='Somthing went wrong') sms = SMS.objects.get(couch_id=message_id) self.assertTrue('gateway_delivered' not in sms.custom_metadata.keys())
def testSMSSync(self): self.deleteAllLogs() self.assertEqual(self.getSMSLogCount(), 0) self.assertEqual(self.getSMSCount(), 0) # Test Create sms = SMS() self.setRandomSMSValues(sms) sms.save() sleep(1) self.assertEqual(self.getSMSLogCount(), 1) self.assertEqual(self.getSMSCount(), 1) smslog = FRISMSLog.get(sms.couch_id) self.checkFieldValues(smslog, sms, SMS._migration_get_fields()) self.assertTrue(FRISMSLog.get_db().get_rev(smslog._id).startswith('2-')) # Test Update self.setRandomSMSValues(sms) sms.save() sleep(1) self.assertEqual(self.getSMSLogCount(), 1) self.assertEqual(self.getSMSCount(), 1) smslog = FRISMSLog.get(sms.couch_id) self.checkFieldValues(smslog, sms, SMS._migration_get_fields()) self.assertTrue(FRISMSLog.get_db().get_rev(smslog._id).startswith('3-'))
def testSMSSync(self): prev_couch_count = self.getSMSLogCount() prev_sql_count = self.getSMSCount() # Test Create sms = SMS() self.setRandomSMSValues(sms) sms.save() sleep(1) self.assertEqual(self.getSMSLogCount(), prev_couch_count + 1) self.assertEqual(self.getSMSCount(), prev_sql_count + 1) smslog = FRISMSLog.get(sms.couch_id) self.checkFieldValues(smslog, sms, SMS._migration_get_fields()) self.assertTrue(FRISMSLog.get_db().get_rev( smslog._id).startswith('2-')) # Test Update self.setRandomSMSValues(sms) sms.save() sleep(1) self.assertEqual(self.getSMSLogCount(), prev_couch_count + 1) self.assertEqual(self.getSMSCount(), prev_sql_count + 1) smslog = FRISMSLog.get(sms.couch_id) self.checkFieldValues(smslog, sms, SMS._migration_get_fields()) self.assertTrue(FRISMSLog.get_db().get_rev( smslog._id).startswith('3-'))
def _get_fake_sms(self, text): msg = SMS(domain=self.domain, phone_number='+16175555454', direction=OUTGOING, date=datetime.utcnow(), backend_id=self.mobile_backend.couch_id, text=text) msg.save() return msg
def _get_fake_sms(self, text): msg = SMS( domain=self.domain, phone_number='+16175555454', direction=OUTGOING, date=datetime.utcnow(), backend_id=self.mobile_backend.couch_id, text=text ) msg.save() return msg
def get_fake_sms(domain, backend_api_id, backend_couch_id, text): msg = SMS(domain=domain, phone_number='+12223334444', direction=OUTGOING, date=datetime.utcnow(), backend_api=backend_api_id, backend_id=backend_couch_id, backend_message_id=uuid.uuid4().hex, text=text) msg.save() return msg
def create_fake_sms(self, backend_api_id, backend_couch_id, text, date): msg = SMS(domain=self.domain, phone_number='+12223334444', direction=OUTGOING, date=date, backend_api=backend_api_id, backend_id=backend_couch_id, backend_message_id=uuid.uuid4().hex, text=text) msg.save() return msg
def remove_from_queue(queued_sms): with transaction.atomic(): sms = SMS() for field in sms._meta.fields: if field.name != 'id': setattr(sms, field.name, getattr(queued_sms, field.name)) queued_sms.delete() sms.save() sms.publish_change() if sms.direction == OUTGOING and sms.processed and not sms.error: create_billable_for_sms(sms) elif sms.direction == INCOMING and sms.domain and domain_has_privilege(sms.domain, privileges.INBOUND_SMS): create_billable_for_sms(sms)
def arbitrary_messages_by_backend_and_direction(backend_ids, phone_number=None, domain=None, directions=DIRECTIONS): phone_number = phone_number or TEST_NUMBER domain = domain or TEST_DOMAIN messages = [] for api_id, instance_id in backend_ids.items(): for direction in directions: sms_log = SMS( direction=direction, phone_number=phone_number, domain=domain, backend_api=api_id, backend_id=instance_id, text=arbitrary_message(), date=datetime.datetime.utcnow() ) sms_log.save() messages.append(sms_log) return messages
def arbitrary_messages_by_backend_and_direction(backend_ids, phone_number=None, domain=None, directions=None): phone_number = phone_number or TEST_NUMBER domain = domain or TEST_DOMAIN directions = directions or DIRECTIONS messages = [] for api_id, instance_id in backend_ids.items(): for direction in directions: sms_log = SMS(direction=direction, phone_number=phone_number, domain=domain, backend_api=api_id, backend_id=instance_id, backend_message_id=uuid.uuid4().hex, text=arbitrary_message(), date=datetime.datetime.utcnow()) sms_log.save() messages.append(sms_log) return messages
def remove_from_queue(queued_sms): with transaction.atomic(): sms = SMS() for field in sms._meta.fields: if field.name != 'id': setattr(sms, field.name, getattr(queued_sms, field.name)) queued_sms.delete() sms.save() sms.publish_change() tags = {'backend': sms.backend_api, 'icds_indicator': ''} if isinstance(sms.custom_metadata, dict) and 'icds_indicator' in sms.custom_metadata: tags.update({'icds_indicator': sms.custom_metadata['icds_indicator']}) if sms.direction == OUTGOING and sms.processed and not sms.error: create_billable_for_sms(sms) metrics_counter('commcare.sms.outbound_succeeded', tags=tags) elif sms.direction == OUTGOING: metrics_counter('commcare.sms.outbound_failed', tags=tags) elif sms.direction == INCOMING and sms.domain and domain_has_privilege( sms.domain, privileges.INBOUND_SMS): create_billable_for_sms(sms)
class TelerivetViewTestCase(TestCase): view_path = 'telerivet_message_status' def setUp(self): self.backend = SQLTelerivetBackend( name='TELERIVET', is_global=True, hq_api_id=SQLTelerivetBackend.get_api_id()) self.backend.set_extra_fields( webhook_secret='The chamber of webhook secrets') self.backend.save() self.sms = SMS(phone_number='27845698785', text="Fame is fickle") self.sms.save() def tearDown(self): self.backend.delete() self.sms.delete() def test_message_status_successful_without_prior_metadata(self): data = { 'status': 'delivered', 'secret': self.backend.config.webhook_secret } response = self.client.post( reverse(self.view_path, kwargs={'message_id': self.sms.couch_id}), data) self.assertTrue(response.status_code, 200) self.sms.refresh_from_db() expected_custom_metadata = {'gateway_delivered': True} self.assertEqual(self.sms.custom_metadata, expected_custom_metadata) def test_message_status_successful_with_metadata(self): self.sms.custom_metadata = {'custom': 'data'} self.sms.save() data = { 'status': 'delivered', 'secret': self.backend.config.webhook_secret } response = self.client.post( reverse(self.view_path, kwargs={'message_id': self.sms.couch_id}), data) self.assertTrue(response.status_code, 200) self.sms.refresh_from_db() expected_custom_metadata = { 'custom': 'data', 'gateway_delivered': True } self.assertEqual(self.sms.custom_metadata, expected_custom_metadata) def test_message_status_with_wrong_message_id(self): self.sms.custom_metadata = {} self.sms.save() data = { 'status': 'delivered', 'secret': self.backend.config.webhook_secret } response = self.client.post( reverse(self.view_path, kwargs={'message_id': f'{self.sms.couch_id}123'}), data) self.assertTrue(response.status_code == 404) def test_message_status_with_invalid_secret(self): self.sms.custom_metadata = {} self.sms.save() data = {'status': 'delivered', 'secret': 'not a secret'} response = self.client.post( reverse(self.view_path, kwargs={'message_id': self.sms.couch_id}), data) self.assertTrue(response.status_code == 403)