Hi, I am trying to write a test for new method for IMAPLib, but I cannot even create basic message in the mocked IMAP server.
def test_move_messages(self):
from email.message import EmailMessage
class MoveServer(SimpleIMAPHandler):
capabilities = 'ENABLE UTF8=ACCEPT'
def cmd_ENABLE(self, tag, args):
self._send_tagged(tag, 'OK', 'ENABLE successful')
def cmd_AUTHENTICATE(self, tag, args):
self._send_textline('+')
self.server.response = yield
self._send_tagged(tag, 'OK', 'FAKEAUTH successful')
def cmd_APPEND(self, tag, args):
self._send_textline('+')
self.server.response = yield
self._send_tagged(tag, 'OK', 'okay')
def cmd_CREATE(self, tag, args):
self._send_textline('* CREATE ' + args[0])
self._send_tagged(tag, 'OK', 'okay')
def cmd_MOVE(self, tag, args):
self._send_textline('* MOVE ' + args[0])
self._send_tagged(tag, 'OK', 'okay')
def cmd_SELECT(self, tag, args):
self.server.is_selected = True
self._send_textline('* 2 EXISTS')
self._send_tagged(tag, 'OK', '[READ-WRITE] SELECT completed.')
client, _ = self._setup(MoveServer)
typ, data = client.login('user', 'pass')
typ, data = client.create('source')
typ, data = client.create('target')
typ, data = client.select('source')
msg = EmailMessage()
msg['Subject'] = 'Test message'
msg['From'] = 'test@example.com'
msg['To'] = 'testee@example.com'
msg.set_content('This is a testing message')
print(f'=========================\nmsg:\n{msg}=============')
typ, data = client.append('source', None, None, msg.as_bytes())
typ, data = client.search(None, 'ALL') # HERE IT FAILS
typ, data = client.move_messages('target', data[0])
self.assertEqual(typ, 'OK')
typ, data = client.search(None, 'target', 'ALL')
self.assertEqual(typ, 'OK')
self.assertEqual(int(data[0]), 1)
leads to this:
cpython@stitny (33327_move_messages *+)$ ./python -m unittest test.test_imaplib.NewIMAPTests.test_move_messages
SENT: b'* OK IMAP4rev1'
GOT: b'DGCB0 CAPABILITY'
SENT: b'* CAPABILITY IMAP4rev1 ENABLE UTF8=ACCEPT'
SENT: b'DGCB0 OK CAPABILITY completed'
GOT: b'DGCB1 LOGIN user "pass"'
SENT: b'DGCB1 OK LOGIN completed'
GOT: b'DGCB2 CAPABILITY'
SENT: b'* CAPABILITY IMAP4rev1 ENABLE UTF8=ACCEPT'
SENT: b'DGCB2 OK CAPABILITY completed'
GOT: b'DGCB3 CREATE source'
SENT: b'* CREATE source'
SENT: b'DGCB3 OK okay'
GOT: b'DGCB4 CREATE target'
SENT: b'* CREATE target'
SENT: b'DGCB4 OK okay'
GOT: b'DGCB5 SELECT source'
SENT: b'* 2 EXISTS'
SENT: b'DGCB5 OK [READ-WRITE] SELECT completed.'
=========================
msg:
Subject: Test message
From: test@example.com
To: testee@example.com
Content-Type: text/plain; charset="utf-8"
Content-Transfer-Encoding: 7bit
MIME-Version: 1.0
This is a testing message
=============
GOT: b'DGCB6 APPEND source {195}'
SENT: b'+'
GOT: b'Subject: Test message'
SENT: b'DGCB6 OK okay'
GOT: b'From: test@example.com'
SENT: b'From: BAD test@example.com unknown'
GOT: b'To: testee@example.com'
SENT: b'To: BAD testee@example.com unknown'
GOT: b'Content-Type: text/plain; charset="utf-8"'
SENT: b'Content-Type: BAD text/plain; unknown'
----------------------------------------
Exception occurred during processing of request from ('127.0.0.1', 36260)
Traceback (most recent call last):
File "/home/matej/archiv/knihovna/repos/cpython/Lib/socketserver.py", line 316, in _handle_request_noblock
self.process_request(request, client_address)
File "/home/matej/archiv/knihovna/repos/cpython/Lib/socketserver.py", line 347, in process_request
self.finish_request(request, client_address)
File "/home/matej/archiv/knihovna/repos/cpython/Lib/socketserver.py", line 360, in finish_request
self.RequestHandlerClass(request, client_address, self)
File "/home/matej/archiv/knihovna/repos/cpython/Lib/socketserver.py", line 720, in __init__
self.handle()
File "/home/matej/archiv/knihovna/repos/cpython/Lib/test/test_imaplib.py", line 178, in handle
self._send_tagged(tag, 'BAD', cmd + ' unknown')
File "/home/matej/archiv/knihovna/repos/cpython/Lib/test/test_imaplib.py", line 136, in _send_tagged
self._send_textline(' '.join((tag, code, message)))
File "/home/matej/archiv/knihovna/repos/cpython/Lib/test/test_imaplib.py", line 133, in _send_textline
self._send_line(message.encode('ASCII'))
File "/home/matej/archiv/knihovna/repos/cpython/Lib/test/test_imaplib.py", line 130, in _send_line
self._send(message + b'\r\n')
File "/home/matej/archiv/knihovna/repos/cpython/Lib/test/test_imaplib.py", line 127, in _send
self.wfile.write(message)
File "/home/matej/archiv/knihovna/repos/cpython/Lib/socketserver.py", line 799, in write
self._sock.sendall(b)
BrokenPipeError: [Errno 32] Broken pipe
----------------------------------------
E
======================================================================
ERROR: test_move_messages (test.test_imaplib.NewIMAPTests)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/home/matej/archiv/knihovna/repos/cpython/Lib/imaplib.py", line 1095, in _command_complete
typ, data = self._get_tagged_response(tag, expect_bye=logout)
File "/home/matej/archiv/knihovna/repos/cpython/Lib/imaplib.py", line 1225, in _get_tagged_response
self._get_response()
File "/home/matej/archiv/knihovna/repos/cpython/Lib/imaplib.py", line 1156, in _get_response
raise self.abort("unexpected response: %r" % resp)
imaplib.IMAP4.abort: unexpected response: b'From: BAD test@example.com unknown'
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/home/matej/archiv/knihovna/repos/cpython/Lib/test/test_imaplib.py", line 587, in test_move_messages
typ, data = client.search(None, 'ALL')
File "/home/matej/archiv/knihovna/repos/cpython/Lib/imaplib.py", line 782, in search
typ, dat = self._simple_command(name, *criteria)
File "/home/matej/archiv/knihovna/repos/cpython/Lib/imaplib.py", line 1282, in _simple_command
return self._command_complete(name, self._command(name, *args))
File "/home/matej/archiv/knihovna/repos/cpython/Lib/imaplib.py", line 1097, in _command_complete
raise self.abort('command: %s => %s' % (name, val))
imaplib.IMAP4.abort: command: SEARCH => unexpected response: b'From: BAD test@example.com unknown'
----------------------------------------------------------------------
Ran 1 test in 0.025s
FAILED (errors=1)
cpython@stitny (33327_move_messages *+)$
typ, data = client.move_messages('target', data[0])
self.assertEqual(typ, 'OK')
typ, data = client.search(None, 'target', 'ALL')
self.assertEqual(typ, 'OK')
self.assertEqual(int(data[0]), 1)
even when commenting out everything after the first client.search()
call.
Any idea, what’s wrong? Does anybody here understand the intricacies of the test module?