# -*- coding: utf-8 -*- import sys from unittest import SkipTest from mongoengine import * 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.") self.assertRaises(ValidationError, user.validate) # unicode domain user = User(email=u"user@пример.рф") user.validate() # invalid unicode domain user = User(email=u"user@пример") self.assertRaises(ValidationError, user.validate) # invalid data type user = User(email=123) self.assertRaises(ValidationError, user.validate) def test_email_field_unicode_user(self): # Don't run this test on pypy3, which doesn't support unicode regex: # https://bitbucket.org/pypy/pypy/issues/1821/regular-expression-doesnt-find-unicode if sys.version_info[:2] == (3, 2): raise SkipTest("unicode email addresses are not supported on PyPy 3") class User(Document): email = EmailField() # unicode user shouldn't validate by default... user = User(email=u"Dörte@Sörensen.example.com") self.assertRaises(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=u"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") self.assertRaises(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 self.assertRaises(ValidationError) as ctx_err: user.validate() self.assertIn("domain failed IDN encoding", str(ctx_err.exception)) 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) self.assertRaises(ValidationError, user.validate) user = User(email=valid_ipv6) self.assertRaises(ValidationError, user.validate) user = User(email=invalid_ip) self.assertRaises(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) self.assertRaises(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") self.assertRaises(ValidationError, user.validate) # Passes regex validation user = User(email="me@example.com") self.assertIsNone(user.validate())