1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127
|
# coding:utf-8
import random
import string
from flanker.addresslib import address
from mock import patch
from nose.tools import assert_equal, assert_not_equal
from nose.tools import nottest
from ... import skip_if_asked
DOMAIN = '@icloud.com'
SAMPLE_MX = 'sample.mail.icloud.com'
@nottest
def mock_exchanger_lookup(arg, metrics=False):
mtimes = {'mx_lookup': 0, 'dns_lookup': 0, 'mx_conn': 0}
return (SAMPLE_MX, mtimes)
def test_exchanger_lookup():
'''
Test if exchanger lookup is occuring correctly. If this simple test
fails that means custom grammar was hit. Then the rest of the tests
can be mocked. Should always be run during deployment, can be skipped
during development.
'''
skip_if_asked()
# very simple test that should fail iCloud custom grammar
addr_string = '!mailgun' + DOMAIN
addr = address.validate_address(addr_string)
assert_equal(addr, None)
def test_icloud_pass():
with patch.object(address, 'mail_exchanger_lookup') as mock_method:
mock_method.side_effect = mock_exchanger_lookup
# valid length range
for i in range(3, 21):
localpart = ''.join(random.choice(string.ascii_letters) for x in range(i))
addr = address.validate_address(localpart + DOMAIN)
assert_not_equal(addr, None)
# start must be letter
for i in string.ascii_letters:
localpart = str(i) + 'aa'
addr = address.validate_address(localpart + DOMAIN)
assert_not_equal(addr, None)
# end must be letter or number
for i in string.ascii_letters + string.digits:
localpart = 'aa' + str(i)
addr = address.validate_address(localpart + DOMAIN)
assert_not_equal(addr, None)
# must be letter, num, and underscore
for i in string.ascii_letters + string.digits + '._':
localpart = 'aa' + str(i) + '00'
addr = address.validate_address(localpart + DOMAIN)
assert_not_equal(addr, None)
# only zero or one dot (.) or underscore (_) allowed
for i in range(0, 2):
localpart = 'aa' + '.'*i + '00'
addr = address.validate_address(localpart + DOMAIN)
assert_not_equal(addr, None)
localpart = 'aa' + '_'*i + '00'
addr = address.validate_address(localpart + DOMAIN)
assert_not_equal(addr, None)
# everything after plus (+) is ignored
for localpart in ['aaa+tag', 'aaa+tag+tag','aaa++tag']:
addr = address.validate_address(localpart + DOMAIN)
assert_not_equal(addr, None)
def test_icloud_fail():
with patch.object(address, 'mail_exchanger_lookup') as mock_method:
mock_method.side_effect = mock_exchanger_lookup
# invalid length range
for i in list(range(0, 3)) + list(range(21, 30)):
localpart = ''.join(random.choice(string.ascii_letters) for x in range(i))
addr = address.validate_address(localpart + DOMAIN)
assert_equal(addr, None)
# invalid start char (must start with letter)
for i in string.punctuation + string.digits:
localpart = str(i) + 'aa'
addr = address.validate_address(localpart + DOMAIN)
assert_equal(addr, None)
# invalid end char (must end with letter or digit)
for i in string.punctuation:
localpart = 'aa' + str(i)
addr = address.validate_address(localpart + DOMAIN)
assert_equal(addr, None)
# invalid chars (must be letter, num, underscore, or dot)
invalid_chars = string.punctuation
invalid_chars = invalid_chars.replace('.', '')
invalid_chars = invalid_chars.replace('_', '')
for i in invalid_chars:
localpart = 'aa' + str(i) + '00'
addr = address.validate_address(localpart + DOMAIN)
assert_equal(addr, None)
# no more than one dot (.) or underscore (_) allowed
for i in range(2, 4):
localpart = 'aa' + '.'*i + 'a' + '.'*i + '00'
addr = address.validate_address(localpart + DOMAIN)
assert_equal(addr, None)
localpart = 'aa' + '_'*i + 'a' + '_'*i + '00'
addr = address.validate_address(localpart + DOMAIN)
assert_equal(addr, None)
# no ending plus (+)
for i in range(2, 4):
localpart = 'aaa' + '+'*i
addr = address.validate_address(localpart + DOMAIN)
assert_equal(addr, None)
|