135 lines
3.9 KiB
Python
135 lines
3.9 KiB
Python
import pytest
|
|
|
|
from mongoengine import Document, EmailField, ValidationError
|
|
from tests.utils import MongoDBTestCase
|
|
|
|
|
|
class TestEmailField(MongoDBTestCase):
|
|
def test_generic_behavior(self):
|
|
class User(Document):
|
|
email = EmailField()
|
|
|
|
user = User(email="ross@example.com")
|
|
user.validate()
|
|
|
|
user = User(email="ross@example.co.uk")
|
|
user.validate()
|
|
|
|
user = User(
|
|
email=("Kofq@rhom0e4klgauOhpbpNdogawnyIKvQS0wk2mjqrgGQ5SaJIazqqWkm7.net")
|
|
)
|
|
user.validate()
|
|
|
|
user = User(email="new-tld@example.technology")
|
|
user.validate()
|
|
|
|
user = User(email="ross@example.com.")
|
|
with pytest.raises(ValidationError):
|
|
user.validate()
|
|
|
|
# unicode domain
|
|
user = User(email="user@пример.рф")
|
|
user.validate()
|
|
|
|
# invalid unicode domain
|
|
user = User(email="user@пример")
|
|
with pytest.raises(ValidationError):
|
|
user.validate()
|
|
|
|
# invalid data type
|
|
user = User(email=123)
|
|
with pytest.raises(ValidationError):
|
|
user.validate()
|
|
|
|
def test_email_field_unicode_user(self):
|
|
class User(Document):
|
|
email = EmailField()
|
|
|
|
# unicode user shouldn't validate by default...
|
|
user = User(email="Dörte@Sörensen.example.com")
|
|
with pytest.raises(ValidationError):
|
|
user.validate()
|
|
|
|
# ...but it should be fine with allow_utf8_user set to True
|
|
class User(Document):
|
|
email = EmailField(allow_utf8_user=True)
|
|
|
|
user = User(email="Dörte@Sörensen.example.com")
|
|
user.validate()
|
|
|
|
def test_email_field_domain_whitelist(self):
|
|
class User(Document):
|
|
email = EmailField()
|
|
|
|
# localhost domain shouldn't validate by default...
|
|
user = User(email="me@localhost")
|
|
with pytest.raises(ValidationError):
|
|
user.validate()
|
|
|
|
# ...but it should be fine if it's whitelisted
|
|
class User(Document):
|
|
email = EmailField(domain_whitelist=["localhost"])
|
|
|
|
user = User(email="me@localhost")
|
|
user.validate()
|
|
|
|
def test_email_domain_validation_fails_if_invalid_idn(self):
|
|
class User(Document):
|
|
email = EmailField()
|
|
|
|
invalid_idn = ".google.com"
|
|
user = User(email="me@%s" % invalid_idn)
|
|
|
|
with pytest.raises(ValidationError) as exc_info:
|
|
user.validate()
|
|
assert "domain failed IDN encoding" in str(exc_info.value)
|
|
|
|
def test_email_field_ip_domain(self):
|
|
class User(Document):
|
|
email = EmailField()
|
|
|
|
valid_ipv4 = "email@[127.0.0.1]"
|
|
valid_ipv6 = "email@[2001:dB8::1]"
|
|
invalid_ip = "email@[324.0.0.1]"
|
|
|
|
# IP address as a domain shouldn't validate by default...
|
|
user = User(email=valid_ipv4)
|
|
with pytest.raises(ValidationError):
|
|
user.validate()
|
|
|
|
user = User(email=valid_ipv6)
|
|
with pytest.raises(ValidationError):
|
|
user.validate()
|
|
|
|
user = User(email=invalid_ip)
|
|
with pytest.raises(ValidationError):
|
|
user.validate()
|
|
|
|
# ...but it should be fine with allow_ip_domain set to True
|
|
class User(Document):
|
|
email = EmailField(allow_ip_domain=True)
|
|
|
|
user = User(email=valid_ipv4)
|
|
user.validate()
|
|
|
|
user = User(email=valid_ipv6)
|
|
user.validate()
|
|
|
|
# invalid IP should still fail validation
|
|
user = User(email=invalid_ip)
|
|
with pytest.raises(ValidationError):
|
|
user.validate()
|
|
|
|
def test_email_field_honors_regex(self):
|
|
class User(Document):
|
|
email = EmailField(regex=r"\w+@example.com")
|
|
|
|
# Fails regex validation
|
|
user = User(email="me@foo.com")
|
|
with pytest.raises(ValidationError):
|
|
user.validate()
|
|
|
|
# Passes regex validation
|
|
user = User(email="me@example.com")
|
|
assert user.validate() is None
|