dataset/seed/dovecot/tests/test_imap.py

127 lines
3.7 KiB
Python
Raw Normal View History

2022-07-04 22:28:44 +02:00
from yaml import load, SafeLoader
from os import environ
import pytest
from imaplib2 import IMAP4_SSL
from smtplib import SMTP, SMTPNotSupportedError, SMTPAuthenticationError
conf_file = f'{environ["MACHINE_TEST_DIR"]}/imap.yml'
with open(conf_file) as yaml:
data = load(yaml, Loader=SafeLoader)
parameters = (('user', data['username'], data['password']),
2022-07-08 10:27:35 +02:00
('family', data['username_family'], data['password_family'] + "2"),
2022-07-04 22:28:44 +02:00
)
def get_msg(username, msg='MESSAGE'):
return f'From: {username}\r\nTo: {username}\r\n\r\nSubject: TEST\r\n{msg}\r\n'
@pytest.mark.parametrize('typ, username, password', parameters)
def test_imap_wrong_password(typ, username, password):
imap = IMAP4_SSL(data['address'])
try:
imap.LOGIN(username, 'b')
except:
pass
else:
raise Exception('wrong login !')
@pytest.mark.parametrize('typ, username, password', parameters)
def test_imap_migration(typ, username, password):
msg = get_msg(username, 'MIGRATION')
2022-07-05 22:09:16 +02:00
if 'FIRST_RUN' in environ:
2022-07-04 22:28:44 +02:00
smtp = SMTP(data['address'], '587')
smtp.starttls()
smtp.login(username, password)
smtp.sendmail(username, username, msg)
smtp.quit()
imap = IMAP4_SSL(data['address'])
imap.LOGIN(username, password)
imap.SELECT(readonly=True)
typ, req = imap.SEARCH(None, 'ALL')
assert typ == 'OK'
assert len(req) == 1
assert req[0] == b'1'
field = imap.FETCH('1', '(RFC822)')
assert field[0] == 'OK'
assert field[1][-2][-1].decode().endswith(msg)
imap.CLOSE()
imap.LOGOUT()
@pytest.mark.parametrize('typ, username, password', parameters)
def test_smtp_no_tls(typ, username, password):
smtp = SMTP(data['address'], '587')
try:
smtp.login(username, password)
raise Exception('no tls!')
except SMTPNotSupportedError:
pass
@pytest.mark.parametrize('typ, username, password', parameters)
def test_smtp_wrong_passwd(typ, username, password):
smtp = SMTP(data['address'], '587')
smtp.starttls()
try:
smtp.login(username, 'a')
raise Exception('wrong password!')
except SMTPAuthenticationError:
pass
smtp.quit()
@pytest.mark.parametrize('typ, username, password', parameters)
def test_smtp_login(typ, username, password):
smtp = SMTP(data['address'], '587')
smtp.starttls()
smtp.login(username, password)
smtp.quit()
@pytest.mark.parametrize('typ, username, password', parameters)
def test_smtp_sendmail(typ, username, password):
smtp = SMTP(data['address'], '587')
smtp.starttls()
smtp.login(username, password)
smtp.sendmail(username, username, get_msg(username))
smtp.quit()
@pytest.mark.parametrize('typ, username, password', parameters)
def test_imap_read_mail(typ, username, password):
imap = IMAP4_SSL(data['address'])
imap.LOGIN(username, password)
imap.SELECT(readonly=True)
typ, req = imap.SEARCH(None, 'ALL')
assert typ == 'OK'
assert len(req) == 1
msg = get_msg(username)
msg_no = req[0].split()
assert len(msg_no) == 2
for num in msg_no[1:]:
field = imap.FETCH(num, '(RFC822)')
assert field[0] == 'OK'
assert field[1][-2][-1].decode().endswith(msg)
imap.CLOSE()
imap.LOGOUT()
@pytest.mark.parametrize('typ, username, password', parameters)
def test_imap_delete_mail(typ, username, password):
imap = IMAP4_SSL(data['address'])
imap.LOGIN(username, password)
imap.SELECT()
typ, req = imap.SEARCH(None, 'ALL')
msg_no = req[0].split()
for num in msg_no[1:]:
ret = imap.store(num, '+FLAGS', '\\Deleted')
assert ret[0] == 'OK', f'error when deleting mail: {ret}'
imap.expunge()
imap.CLOSE()
imap.LOGOUT()