2015-03-27 2 views
12

Мне нужно проверить тестовый пример транспортира, в котором пользователь подписывается, получает электронное письмо, идет по ссылке, указанной в письме, и заполняет свои данные в форме регистрации активации.Получение значений из электронной почты в тестовом примере транспортиратора

Проблема в том, как я могу получить токен выкупа из письма. Мой адрес электронной почты имеет ссылку на страницу активации, которая имеет маркер аутентификации, как следующее:

http://127.0.0.1:3000/#/signup/redeem/eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJqdGkiOiJlOTRhYzY3MC1kYTNlLTQyYTUtODVkZS02NDU4ZjVmZGMwYjAiLCJzdWIiOiJ0ZXN0QGNvZWYuY28iLCJpYXQiOjE0Mjc0OTM5MDMsImV4cCI6MTQyODA5ODcwM30. 

Но как Принести этот маркер, так что я могу построить URL или как я могу нажать эту кнопку в моей электронной почте, так что Я могу завершить поток? Я использую mailcatcher для имитации электронной почты.

ответ

22

Это то, что я решил недавно. Надеюсь, что решение будет также применяться для вашего прецедента.

Предпосылки:

Шаг за шагом инструкции:

  1. Установка mail-listener2:

    npm install mail-listener2 --save-dev 
    
  2. В транспортиром конфигурации инициализации почты Слушатель и сделать его доступным по всему миру:

    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(); 
    }, 
    
  3. Создайте вспомогательную getLastEmail() функцию, которая будет ждать email быть извлеченной:

    function getLastEmail() { 
        var deferred = protractor.promise.defer(); 
        console.log("Waiting for an email..."); 
    
        mailListener.on("mail", function(mail){ 
         deferred.fulfill(mail); 
        }); 
        return deferred.promise; 
    }; 
    
  4. Примерный пример:

    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); 
    
         }); 
        }); 
    }); 
    
+0

Спасибо за ответ, я посмотрю на него и приму ваш ответ. –

+0

@ashish спасибо, я использовал предоставленный подход на некоторое время, и он отлично работает для меня. Надеюсь, вы можете сказать то же самое. – alecxe

+0

Эй, @alecxe, мое требование - получать почту напрямую, пока ваше решение можно использовать для чтения с почтового сервера. Мы используем почтовый улавливатель для извлечения почты, но mail-listener2 не может его прочитать, потому что это SMTP-сервер. В качестве решения я использую mailcatcher api непосредственно для анализа сообщений и получения маркера. –

6

Решение я реализовывал использовал mailcatcher API, если вы прокрутите немного вниз вы найдете следующее о API:

A fairly RESTful URL schema means you can download a list of messages in JSON from /messages, each message's metadata with /messages/:id.json, and then the pertinent parts with /messages/:id.html and /messages/:id.plain for the default HTML and plain text version, /messages/:id/:cid for individual attachments by CID, or the whole message with /messages/:id.source.

Таким образом, мы первые извлекаться весь ответ JSON, разбор это и принести последний электронный идентификатор:

// 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; 
      } 
     } 
    } 
}; 

используя этот электронный идентификатор можно получить тело сообщения электронной почты, нажав /messages/:id.plain (конечно Есть несколько вариантов, как извлечение электронной почты исходного кода или по электронной почте вынесенного HTML, мы только необходимым сообщениям), то можно просто разобрать тело, чтобы принести то, что мы хотим, следующий код:

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. 
    }); 
}); 

И Ура!

Смежные вопросы