javascript - Obteniendo valores del correo electrónico en un caso de prueba de transportador
email testing (2)
Necesito probar un caso de prueba de transportador en el que un usuario se registra, recibe un correo electrónico, va al enlace proporcionado en el correo electrónico y completa sus datos en el formulario de registro de activación.
El problema es cómo puedo obtener el token de canje del correo electrónico. Mi correo electrónico tiene un enlace a la página de activación que tiene el token de autenticación como el siguiente:
http://127.0.0.1:3000/#/signup/redeem/eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJqdGkiOiJlOTRhYzY3MC1kYTNlLTQyYTUtODVkZS02NDU4ZjVmZGMwYjAiLCJzdWIiOiJ0ZXN0QGNvZWYuY28iLCJpYXQiOjE0Mjc0OTM5MDMsImV4cCI6MTQyODA5ODcwM30.
Pero, ¿cómo obtengo ese token para poder construir la URL o cómo puedo hacer clic en ese botón en mi correo electrónico para poder completar el flujo? Estoy usando mailcatcher para simular el correo electrónico.
Esto es algo que he resuelto recientemente. Espero que la solución también se aplique a su caso de uso.
Prerrequisitos:
-
paquete
mail-listener2
-
comprensión del concepto de
promises
Instrucciones paso a paso:
-
Instalar
mail-listener2
:npm install mail-listener2 --save-dev
-
En la configuración de su transportador, inicialice Mail Listener y póngalo disponible globalmente:
onPrepare: function () { var MailListener = require("mail-listener2"); // here goes your email connection configuration var mailListener = new MailListener({ username: "imap-username", password: "imap-password", host: "imap-host", port: 993, // imap port tls: true, tlsOptions: { rejectUnauthorized: false }, mailbox: "INBOX", // mailbox to monitor searchFilter: ["UNSEEN", "FLAGGED"], // the search filter being used after an IDLE notification has been retrieved markSeen: true, // all fetched email willbe marked as seen and not fetched next time fetchUnreadOnStart: true, // use it only if you want to get all unread email on lib start. Default is `false`, mailParserOptions: {streamAttachments: true}, // options to be passed to mailParser lib. attachments: true, // download attachments as they are encountered to the project directory attachmentOptions: { directory: "attachments/" } // specify a download directory for attachments }); mailListener.start(); mailListener.on("server:connected", function(){ console.log("Mail listener initialized"); }); global.mailListener = mailListener; }), onCleanUp: function () { mailListener.stop(); },
-
Cree una función auxiliar
getLastEmail()
que esperaría a que se recupere unemail
:function getLastEmail() { var deferred = protractor.promise.defer(); console.log("Waiting for an email..."); mailListener.on("mail", function(mail){ deferred.fulfill(mail); }); return deferred.promise; };
-
Ejemplo de caso de prueba:
describe("Sample test case", function () { beforeEach(function () { browser.get("/#login"); browser.waitForAngular(); }); it("should login with a registration code sent to an email", function () { element(by.id("username")).sendKeys("MyUserName"); element(by.id("password")).sendKeys("MyPassword"); element(by.id("loginButton")).click(); browser.controlFlow().await(getLastEmail()).then(function (email) { expect(email.subject).toEqual("New Registration Code"); expect(email.headers.to).toEqual("[email protected]"); // extract registration code from the email message var pattern = /Registration code is: (/w+)/g; var regCode = pattern.exec(email.text)[1]; console.log(regCode); }); }); });
La solución que implementé fue usar la API mailcatcher, si te desplazas un poco hacia abajo encontrarás lo siguiente sobre la API:
Un esquema de URL bastante RESTful significa que puede descargar una lista de mensajes en JSON desde / messages, los metadatos de cada mensaje con /messages/:id.json, y luego las partes pertinentes con /messages/:id.html y / messages /: id .plain para la versión predeterminada de HTML y texto sin formato, / messages /: id /: cid para archivos adjuntos individuales por CID, o el mensaje completo con /messages/:id.source.
Entonces, primero obtuvimos toda la respuesta json, la analizamos y buscamos la última identificación de correo electrónico:
// Returns the last email id
function(emails, user) {
var email, recipient;
for(var i = emails.length - 1; i >= 0; i--) {
email = emails[i];
for(var j = 0; j < email.recipients.length ; j++) {
recipient = email.recipients[j];
if(recipient == "<"+user+">") {
return email.id;
}
}
}
};
usando esa identificación de correo electrónico podemos obtener el cuerpo del correo electrónico
/messages/:id.plain
(por supuesto, hay más variantes como recuperar el código fuente del correo electrónico o el correo electrónico procesado html, solo necesitamos el mensaje) y luego simplemente podemos analizar el cuerpo para buscar lo que queremos, el siguiente es el código:
browser.driver.get(mailcatcherUrl+"/messages");
browser.driver.findElement(by.tagName(''body'')).getText().then(function(response) {
var emails, lastEmailId, partialTokens ;
emails = JSON.parse(response);
lastEmailId = getLastEmailId(emails, user);
browser.driver.get(mailcatcherUrl+"/messages/"+lastEmailId+".plain");
browser.driver.findElement(by.tagName(''body'')).getText().then(function(lastEmail) {
// use latestEmail to get what you want.
});
});
Y saludos!