reemplazar paginas ejemplos con acentos python testing imap mocking

paginas - python y html5



¿Cómo me burlo de un servidor IMAP en Python, a pesar de la pereza extrema? (4)

¿Cuánto de eso realmente necesitas para una prueba? Si comienza a construir algo del orden de la complejidad de un servidor real para que pueda usarlo en todas sus pruebas, ya se ha equivocado. Solo fíjate en los bits que cualquier prueba necesita.

No te molestes en intentar compartir una implementación simulada. No se supone que sean activos, sino piezas y piezas descartables.

Tengo curiosidad por saber si hay una manera fácil de burlarse de un servidor IMAP (a la la imaplib module) en Python, sin hacer mucho trabajo.

¿Hay una solución preexistente? Idealmente, podría conectarme al servidor IMAP existente, hacer un volcado y hacer que el servidor falso se ejecute en la estructura real del buzón / correo electrónico.

Algunos antecedentes sobre la pereza: tengo la desagradable sensación de que este pequeño script que estoy escribiendo crecerá con el tiempo y me gustaría crear un entorno de prueba adecuado, pero dado que puede no crecer con el tiempo, no quiero hacerlo. mucho trabajo para ejecutar el servidor simulado.


Me pareció bastante fácil escribir un servidor IMAP en la última vez que intenté. Viene con soporte para escribir servidores IMAP y tiene una gran cantidad de flexibilidad.


Nunca lo intenté pero, si tuviera que hacerlo, comenzaría con el servidor SMTP existente.


Como no encontré algo conveniente en Python 3 para mis necesidades (la parte del correo de twisted no se ejecuta en python 3), hice una pequeña simulación con asyncio que puede mejorar si lo desea:

Definí un ImapProtocol que extiende asyncio.Protocol. A continuación, inicie un servidor como este:

factory = loop.create_server(lambda: ImapProtocol(mailbox_map), ''localhost'', 1143) server = loop.run_until_complete(factory)

El mailbox_map es un mapa de mapa: correo electrónico -> mapa de buzones -> conjunto de mensajes. Entonces todos los mensajes / buzones están en la memoria.

Cada vez que un cliente se conecta, se crea una nueva instancia de ImapProtocol. Luego, ImapProtocol ejecuta y responde para cada cliente, implementando la capacidad / login / fetch / select / search / store:

class ImapHandler(object): def __init__(self, mailbox_map): self.mailbox_map = mailbox_map self.user_login = None # ... def connection_made(self, transport): self.transport = transport transport.write(''* OK IMAP4rev1 MockIMAP Server ready/r/n''.encode()) def data_received(self, data): command_array = data.decode().rstrip().split() tag = command_array[0] self.by_uid = False self.exec_command(tag, command_array[1:]) def connection_lost(self, error): if error: log.error(error) else: log.debug(''closing'') self.transport.close() super().connection_lost(error) def exec_command(self, tag, command_array): command = command_array[0].lower() if not hasattr(self, command): return self.error(tag, ''Command "%s" not implemented'' % command) getattr(self, command)(tag, *command_array[1:]) def capability(self, tag, *args): # code for it... def login(self, tag, *args): # code for it...

Luego en mis pruebas, inicio el servidor durante la configuración con:

self.loop = asyncio.get_event_loop() self.server = self.loop.run_until_complete(self.loop.create_server(create_imap_protocol, ''localhost'', 12345))

Cuando quiero simular un nuevo mensaje:

imap_receive(Mail(to=''[email protected]'', mail_from=''[email protected]'', subject=''hello''))

Y detenerlo en el desmontaje:

self.server.close() asyncio.wait_for(self.server.wait_closed(), 1)

cf https://github.com/bamthomas/aioimaplib/blob/master/aioimaplib/tests/imapserver.py

EDITAR : Tuve un error de parada del servidor, lo reescribí con asyncio.Protocol y modifiqué la respuesta para reflejar los cambios