def test_should_send_personalised_template_to_correct_sms_provider_and_persist( notify_db, notify_db_session, sample_template_with_placeholders, mocker ): db_notification = sample_notification(notify_db, notify_db_session, template=sample_template_with_placeholders, to_field="+447234123123", personalisation={"name": "Jo"}, status='created') mocker.patch('app.mmg_client.send_sms') mocker.patch('app.mmg_client.get_name', return_value="mmg") send_to_providers.send_sms_to_provider( db_notification ) mmg_client.send_sms.assert_called_once_with( to=format_phone_number(validate_phone_number("+447234123123")), content="Sample service: Hello Jo\nYour thing is due soon", reference=str(db_notification.id), sender=None ) notification = Notification.query.filter_by(id=db_notification.id).one() assert notification.status == 'sending' assert notification.sent_at <= datetime.utcnow() assert notification.sent_by == 'mmg' assert notification.billable_units == 1 assert notification.personalisation == {"name": "Jo"}
def test_should_send_sms_sender_from_service_if_present( notify_db, notify_db_session, sample_service, sample_template, mocker): db_notification = sample_notification(notify_db, notify_db_session, template=sample_template, to_field="+447234123123", status='created') sample_service.sms_sender = 'elevenchars' notify_db.session.add(sample_service) notify_db.session.commit() mocker.patch('app.mmg_client.send_sms') mocker.patch('app.mmg_client.get_name', return_value="mmg") send_to_providers.send_sms_to_provider( db_notification ) mmg_client.send_sms.assert_called_once_with( to=format_phone_number(validate_phone_number("+447234123123")), content="This is a template:\nwith a newline", reference=str(db_notification.id), sender=sample_service.sms_sender )
def from_string(cls, service_id, recipient_type, recipient): instance = cls(service_id=service_id, recipient_type=recipient_type) try: if recipient_type == MOBILE_TYPE: validate_phone_number(recipient) instance.recipient = recipient elif recipient_type == EMAIL_TYPE: validate_email_address(recipient) instance.recipient = recipient else: raise ValueError('Invalid recipient type') except InvalidPhoneError: raise ValueError('Invalid whitelist: "{}"'.format(recipient)) except InvalidEmailError: raise ValueError('Invalid whitelist: "{}"'.format(recipient)) else: return instance
def test_send_sms_should_use_template_version_from_notification_not_latest( notify_db, notify_db_session, sample_template, mocker): db_notification = sample_notification(notify_db, notify_db_session, template=sample_template, to_field='+447234123123', status='created') mocker.patch('app.mmg_client.send_sms') mocker.patch('app.mmg_client.get_name', return_value="mmg") version_on_notification = sample_template.version # Change the template from app.dao.templates_dao import dao_update_template, dao_get_template_by_id sample_template.content = sample_template.content + " another version of the template" dao_update_template(sample_template) t = dao_get_template_by_id(sample_template.id) assert t.version > version_on_notification send_to_providers.send_sms_to_provider( db_notification ) mmg_client.send_sms.assert_called_once_with( to=format_phone_number(validate_phone_number("+447234123123")), content="Sample service: This is a template:\nwith a newline", reference=str(db_notification.id), sender=None ) persisted_notification = notifications_dao.get_notification_by_id(db_notification.id) assert persisted_notification.to == db_notification.to assert persisted_notification.template_id == sample_template.id assert persisted_notification.template_version == version_on_notification assert persisted_notification.template_version != sample_template.version assert persisted_notification.status == 'sending' assert not persisted_notification.personalisation
def valid_phone_number(phone_number): try: validate_phone_number(phone_number) return True except InvalidPhoneError: return False
def pre_validate(self, form): try: if self.data: validate_phone_number(self.data, international=True) except InvalidPhoneError as e: raise ValidationError(str(e))
def validate_to(self, value): try: validate_phone_number(value) except InvalidPhoneError as error: raise ValidationError('Invalid phone number: {}'.format(error))
def pre_validate(self, form): try: validate_phone_number(self.data) except InvalidPhoneError as e: raise ValidationError(e.message)
def test_phone_with_semicolon(phone): with pytest.raises(InvalidPhoneError) as e: validate_phone_number(phone) assert "Not a valid number" == str(e.value)
def test_phone_number_rejects_invalid_values(phone_number, error_message): with pytest.raises(InvalidPhoneError) as e: validate_phone_number(phone_number) assert error_message == str(e.value)
def test_valid_phone_number_can_be_formatted_consistently(phone_number): assert format_phone_number(validate_phone_number(phone_number)) == '+447123456789' assert validate_and_format_phone_number(phone_number) == '+447123456789' assert validate_and_format_phone_number(phone_number, human_readable=True) == '07123 456 789'
def test_phone_number_accepts_valid_values(phone_number): try: validate_phone_number(phone_number) except InvalidPhoneError: pytest.fail('Unexpected InvalidPhoneError')
def valid_phone_number(self, num): try: validate_phone_number(num.data) return True except InvalidPhoneError: raise ValidationError('Must be a valid phone number')
def validate_schema_phone_number(instance): if instance is not None: validate_phone_number(instance) return True
def validate_schema_phone_number(instance): if isinstance(instance, str): validate_phone_number(instance, international=True) return True
def validate_to(self, value): try: validate_phone_number(value, international=True) except InvalidPhoneError as error: raise ValidationError('Invalid phone number: {}'.format(error))
def pre_validate(self, form): try: validate_phone_number(self.data) except InvalidPhoneError as e: raise ValidationError(str(e))