From a989545505f9b481dd864d53dfb82bf21963670d Mon Sep 17 00:00:00 2001 From: Son NK <> Date: Tue, 3 Nov 2020 11:13:43 +0100 Subject: [PATCH] make sure alias contact address is valid --- app/dashboard/views/alias_contact_manager.py | 9 +++ app/models.py | 4 ++ tests/dashboard/test_alias_contact_manager.py | 58 +++++++++++++++++++ 3 files changed, 71 insertions(+) create mode 100644 tests/dashboard/test_alias_contact_manager.py diff --git a/app/dashboard/views/alias_contact_manager.py b/app/dashboard/views/alias_contact_manager.py index de7b8b9a..0da95df6 100644 --- a/app/dashboard/views/alias_contact_manager.py +++ b/app/dashboard/views/alias_contact_manager.py @@ -185,6 +185,15 @@ def alias_contact_manager(alias_id): ) ) + if not is_valid_email(contact_email): + flash(f"{contact_email} is invalid", "error") + return redirect( + url_for( + "dashboard.alias_contact_manager", + alias_id=alias_id, + ) + ) + contact = Contact.get_by(alias_id=alias.id, website_email=contact_email) # already been added if contact: diff --git a/app/models.py b/app/models.py index 1d0655eb..fe2a397b 100644 --- a/app/models.py +++ b/app/models.py @@ -83,6 +83,10 @@ class ModelMixin(object): def delete(cls, obj_id): cls.query.filter(cls.id == obj_id).delete() + @classmethod + def first(cls): + return cls.query.first() + def __repr__(self): values = ", ".join( "%s=%r" % (n, getattr(self, n)) diff --git a/tests/dashboard/test_alias_contact_manager.py b/tests/dashboard/test_alias_contact_manager.py new file mode 100644 index 00000000..925d804c --- /dev/null +++ b/tests/dashboard/test_alias_contact_manager.py @@ -0,0 +1,58 @@ +from flask import url_for + +from app.config import EMAIL_DOMAIN +from app.models import ( + Alias, + Contact, +) +from tests.utils import login + + +def test_add_contact_success(flask_client): + login(flask_client) + alias = Alias.first() + + assert Contact.query.count() == 0 + + # <<< Create a new contact >>> + flask_client.post( + url_for("dashboard.alias_contact_manager", alias_id=alias.id), + data={ + "form-name": "create", + "email": "abcd@gmail.com", + }, + follow_redirects=True, + ) + # a new contact is added + assert Contact.query.count() == 1 + contact = Contact.first() + assert contact.website_email == "abcd@gmail.com" + + # <<< Create a new contact using a full email format >>> + flask_client.post( + url_for("dashboard.alias_contact_manager", alias_id=alias.id), + data={ + "form-name": "create", + "email": "First Last ", + }, + follow_redirects=True, + ) + # a new contact is added + assert Contact.query.count() == 2 + contact = Contact.get(2) + assert contact.website_email == "another@gmail.com" + assert contact.name == "First Last" + + # <<< Create a new contact with invalid email address >>> + r = flask_client.post( + url_for("dashboard.alias_contact_manager", alias_id=alias.id), + data={ + "form-name": "create", + "email": "with space@gmail.com", + }, + follow_redirects=True, + ) + + # no new contact is added + assert Contact.query.count() == 2 + assert "Invalid email format. Email must be either email@example.com" in str(r.data)