Esempio n. 1
0
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())
Esempio n. 2
0
    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-'))
Esempio n. 3
0
    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-'))
Esempio n. 4
0
 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
Esempio n. 5
0
 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
Esempio n. 6
0
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
Esempio n. 7
0
 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
Esempio n. 8
0
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)
Esempio n. 9
0
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
Esempio n. 10
0
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
Esempio n. 11
0
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)
Esempio n. 12
0
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)