Tuesday, January 7, 2014

Run Your Tests With GreenMail - A simple Mail Server

Let me start this post with some background information why I had to use a simple mail server like GreenMail.

Background story

I came across the need of an email or some mechanism that can be used in email related testcases. For an example if I need to send an email within my test case what is the mail account that I can use .

Simplest way is create some mail account with G-mail, Yahoo, Gmx or what ever your preferred free email provider and use credentials of that account and provider's smtp severs.

See the example below which is written in Jaggery. You can find a detailed sample code here.

 
var sender = new email.Sender("smtp.gmail.com", "25", "mytestmail@gmail.com", "pw", "tls");


In the above example we have used the smtp mail server of google (smtp.gmail.com) and a some dummy account that we have created with G-mail. Similarly you can do the same with your preferred free email provider.

But the problem with this approach is when you run your test repeatedly for sometime (may be a year or so) test case starts failing. 

Recently I had to go through the same issue and I was amazed when I found out that it is a problem with the credentials that I used in the code which used to be pass the test without any issue earlier. (In the above example "mytestmail@gmail.com" and password "pw") So I tried login to that gmail account and Google complained with the following message.

"Please change your password
We've detected suspicious activity on your Google Account. Please choose a new password to finish signing in. "

Google is suspicious with the account due to reasons listed here and the reason for this particular account may be "Messages that you didn't send appear in Sent Mail ".I could have got this issue fixed by resetting the password of this account as instructed in the above message. But someday I might face the same issue as this is a temporary solution.

So this solution of simple mail servers popped up with this background. Apart from GreenMail, there are many other simple mail servers available such as Apache James, Dumbster and so on. But GreenMail was the one that fitted most in to my requirement and I decided to move on with GreenMail.

How to get GreenMail mail server in your testcase

Add the relevant maven dependency in your pom file. You can find GreenMail dependencies for Maven projects here.

I added following snippet in my pom file.


       <dependency>
            <groupId>com.icegreen</groupId>
            <artifactId>greenmail</artifactId>
            <version>1.3.1b</version>
        </dependency>


And then added the following imports in my test java class file.

   
       import com.icegreen.greenmail.util.GreenMail;
       import com.icegreen.greenmail.util.ServerSetupTest;


Afterwards you have to initialize and start the GreenMail server as stated below in the same test class.


     GreenMail greenMail = new GreenMail ( ServerSetupTest.SMTP );
     greenMail.start ();


Then include what ever your sender code. In my case my sender code is written in Jaggery as below in a separate jaggery (.jag) file. (My test class is pointing to the jaggery file after the Green Mail initialization and start above. )

 
      var from = "from@localhost.com";
      var to = "to@localhost.com";
      var subject = "Test Subject";
      var content = "Test Content";

      var msg = require('email');
      var email = new msg.Sender("localhost", "3025", "from@localhost.com", "frompw", "tls"); 

     email.from = from;
     email.to = to;
     email.subject = subject;
     email.text = content;

     email.send();
     print("email successfully sent");


You may note in the above code that you don't need any free email provider credentials, but simply xxx@localhost.com and some random password. So your test case will not fail due to credential issues.

Also note that without specifying the sender information as in the above code you can also embed that information in your configuration files as described in the answer here.

Your next step is upon message delivery and you need to  check whether the message received is as same as the message sent.

Given below is how you test whether the sent message subject is as same as the received message subject. You can do the same for mail content as well.


     String subject = greenMail.getReceivedMessages()[0].getSubject();
     assertEquals ( subject , "Test Subject");


Donot forget to stop the GreenMail server at the end.


    greenMail.stop();


We are done :) Run your test and see whether your test get passed. 

If you need any reference you can find my pom file here , test class here and my jaggery file here.

Try out more complex test cases with GreenMail !!!


1 comment: