From 8184eff15abf553b06403cd6de11fccdc6a8126f Mon Sep 17 00:00:00 2001 From: Imdad Ahad Date: Tue, 27 Sep 2016 13:44:29 +0100 Subject: [PATCH] Update ServiceWhitelist to conform to new data model --- app/models.py | 43 +++++++++++++++++++++++++++-------------- tests/app/test_model.py | 27 +++++++++++++------------- 2 files changed, 42 insertions(+), 28 deletions(-) diff --git a/app/models.py b/app/models.py index 105b4e93b..fb530ea3b 100644 --- a/app/models.py +++ b/app/models.py @@ -138,6 +138,11 @@ class Service(db.Model, Versioned): default=BRANDING_GOVUK ) +MOBILE_TYPE = 'mobile' +EMAIL_TYPE = 'email' + +WHITELIST_RECIPIENT_TYPE = [MOBILE_TYPE, EMAIL_TYPE] +whitelist_recipient_types = db.Enum(*WHITELIST_RECIPIENT_TYPE, name='recipient_type') class ServiceWhitelist(db.Model): __tablename__ = 'service_whitelist' @@ -145,24 +150,33 @@ class ServiceWhitelist(db.Model): id = db.Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4) service_id = db.Column(UUID(as_uuid=True), db.ForeignKey('services.id'), index=True, nullable=False) service = db.relationship('Service', backref='whitelist') - email_address = db.Column(db.String(255), nullable=True) - mobile_number = db.Column(db.String, nullable=True) + recipient_type = db.Column(whitelist_recipient_types, nullable=False) + recipient = db.Column(db.String(255), nullable=False) created_at = db.Column(db.DateTime, default=datetime.datetime.utcnow) @classmethod - def from_string(cls, service_id, contact): - instance = cls(service_id=service_id) - try: - validate_email_address(contact) - instance.email_address = contact - except InvalidEmailError: - try: - validate_phone_number(contact) - instance.mobile_number = contact - except InvalidPhoneError: - raise ValueError('Invalid whitelist: "{}"'.format(contact)) + def from_string(cls, service_id, recipient_type, recipient): + instance = cls(service_id=service_id, recipient_type=recipient_type) - return instance + 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 __repr__(self): + return 'Recipient {} of type: {}'.format(self.recipient, + self.recipient_type) class ApiKey(db.Model, Versioned): @@ -329,7 +343,6 @@ class ProviderDetails(db.Model): priority = db.Column(db.Integer, nullable=False) notification_type = db.Column(notification_types, nullable=False) active = db.Column(db.Boolean, default=False) - blah = db.Column JOB_STATUS_PENDING = 'pending' diff --git a/tests/app/test_model.py b/tests/app/test_model.py index 13bc06b43..78827235a 100644 --- a/tests/app/test_model.py +++ b/tests/app/test_model.py @@ -3,7 +3,10 @@ from datetime import datetime import pytest from app import DATETIME_FORMAT -from app.models import Notification, ServiceWhitelist +from app.models import ( + Notification, + ServiceWhitelist, + MOBILE_TYPE, EMAIL_TYPE) def test_should_build_notification_from_minimal_set_of_api_derived_params(notify_api): @@ -79,27 +82,25 @@ def test_should_build_notification_from_full_set_of_api_derived_params(notify_ap '+44 7700 900678' ]) def test_should_build_service_whitelist_from_mobile_number(mobile_number): - service_whitelist = ServiceWhitelist.from_string('service_id', mobile_number) + service_whitelist = ServiceWhitelist.from_string('service_id', MOBILE_TYPE, mobile_number) - assert service_whitelist.mobile_number == mobile_number - assert service_whitelist.email_address is None + assert service_whitelist.recipient == mobile_number @pytest.mark.parametrize('email_address', [ 'test@example.com' ]) def test_should_build_service_whitelist_from_email_address(email_address): - service_whitelist = ServiceWhitelist.from_string('service_id', email_address) + service_whitelist = ServiceWhitelist.from_string('service_id', EMAIL_TYPE, email_address) - assert service_whitelist.email_address == email_address - assert service_whitelist.mobile_number is None + assert service_whitelist.recipient == email_address -@pytest.mark.parametrize('contact', [ - '', - '07700dsadsad', - 'gmail.com' +@pytest.mark.parametrize('contact, recipient_type', [ + ('', None), + ('07700dsadsad', MOBILE_TYPE), + ('gmail.com', EMAIL_TYPE) ]) -def test_should_not_build_service_whitelist_from_invalid_contact(contact): +def test_should_not_build_service_whitelist_from_invalid_contact(recipient_type, contact): with pytest.raises(ValueError): - ServiceWhitelist.from_string('service_id', contact) + ServiceWhitelist.from_string('service_id', recipient_type, contact)