JUnit testing for Siebel CRM Email Inbound functionality and processes
13. 5. 2022
Email Inbound functionality is crucial for every CRM. Customer , partners can send emails, respond to campaigns and communicate with the company. The process of processing incomming email message is very often automated and there are important processes. CRM can generate automatic replies, process the emails by parsing the content and create entities.
In Siebel CRM the Email is represented by so called interaction or activity which is created with preconfigured information from the email. The process of processing email starts with fetching the email from Email server using pop3 protocol. The involved component is Communication Inbound Receiver which is calling processing workflow configured in the response group. For every email box can be configured different workflow. By standard there are eMail Response* workflows.
Our customer has a process where in defined email box expects emails from partners in the foreign countries which take over insurance services for customers. These services are captured in the email and needs to be parsed and mapped into insurance entities. This is done by webservice call to parsing systems which returns the data in the structured response. This complex process needs to be on daily bases tested after every build. It is puzzle where each component can be changed and we need to make sure it is working.
Beside automated system testing we are also using JUnit testing provided by Teamcity. On daily basis we call different JUnit tests to make sure the daily development didn`t malfunction important functionalities of Siebel CRM.
Let us have a look to the Oracle Siebel CRM Email Inbound functionality :
The principe of the JUnit Siebel CRM Email inbound is to send an email for defined email box. For this email account the defined Siebel CRM Response group applies and calls workflow. In the JUnit test we send an email to this email box and test whether siebel crm creates expected response. Most often it should create an email inbound activity with respective subject, email body and attachments. The JUnit test scenario may looks like this :
- Generate UUID for the subject to easily identify the email after processing in the Siebel CRM.
- Send Email to the defined email box. You may fake sender to trigger specific preconfigured functionality for certain partners, customers etc. U
- Wait for defined time and call callback function to check whether the inbound email activity is created.
- After activity is recognized end your testcase successfully otherwise it failed.
For creating email we have used javax.mail.* library. You need to make sure that this jar is added to the project structure and not javax.mail-api which is available within the maven. The UUID was generated wit java.util.UUID. For waiting and callback functionality of the asynchronous processing we use com.jayway.awaitility.Awaitility library. We have created public class which can be used in the respective scenarios. This class is only to compose and send email through defined smtp server to Siebel.
To compose and send the email :
package ch.mobi.siebel.unittest;
import com.siebel.data.SiebelException;
import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.activation.FileDataSource;
import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import java.util.Properties;
public class CTIEmailInbound {
public void MailTest(String sender, String recipient, String subject, String bodyText, String filename, String debug) throws SiebelException {
String SMTP = "mailrelay.mobicorp.test";
//String port = "587";
Properties props = new Properties();
props.put("mail.smtp.host", SMTP);
props.put("mail.smtp.auth", "false");
props.put("mail.debug", debug);
props.put("mail.debug.auth", debug);
//properties.put("mail.smtp.starttls.enable", "true");
//properties.put("mail.smtp.port", port);
// String myAccount = "login"; // GMail-Sender
//String myPassword = "Password";
//we do not need this for mobi mailrelay
/* Session session = Session.getInstance(properties, new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(myAccount, myPassword);
}
});*/
Session session = Session.getDefaultInstance(props);
// Message-Objekt create and send!
Message message = new MimeMessage(session);
try {
message.setFrom(new InternetAddress(sender));
message.setRecipient(Message.RecipientType.TO, new InternetAddress(recipient));
message.setSubject(subject);
// Multipart-Message ("Wrapper")
Multipart multipart = new MimeMultipart();
// Body-Part
BodyPart messageBodyPart = new MimeBodyPart();
// Text of the body
messageBodyPart.setText(bodyText);
// Body-Part with the Multipart-Wrapper
multipart.addBodyPart(messageBodyPart);
message.setContent(multipart);
// Part two is attachment
//if the attachment name is given add attachment
if (filename != null && !filename.isEmpty()) {
messageBodyPart = new MimeBodyPart();
DataSource source = new FileDataSource(filename);
messageBodyPart.setDataHandler(new DataHandler(source));
messageBodyPart.setFileName(filename);
multipart.addBodyPart(messageBodyPart);
//message.setContent(multipart);
}
} catch (Exception e) {
e.printStackTrace();
}
try {
Transport.send(message); // E-Mail senden!
System.out.println("E-Mail sent!");
} catch (Exception e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
}
The testcase using this class and checking the Email Inbound activity by response workflow after receiving the email can look like :
package ch.mobi.siebel.unittest.testcases.wf.cti;
//CCW s.r.o.
//Martin Piekov
//13.05.2022 SIEB-8325
import ch.mobi.siebel.unittest.CTIEmailInbound;
import ch.mobi.siebel.unittest.annotations.CTITest;
import ch.mobi.siebel.unittest.annotations.Rollback;
import ch.mobi.siebel.unittest.base.AbstractJDBTest;
import com.jayway.awaitility.Awaitility;
import org.junit.jupiter.api.Test;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import java.util.concurrent.TimeUnit;
import static org.junit.jupiter.api.Assertions.assertEquals;
@CTITest("Email")
@Rollback
public class MobiEmailInboundTest extends AbstractJDBTest {
private int isActivityEmailIn (String subject) throws Exception {
List<Map<String, String>> record = sdb.queryRecords("Action", "Action",
"[Description] = '" + subject + "' AND [MOBI Activity Type] = '60'", new String[]{"Id"});
return record.size();
}
@Test
public void test() throws Exception {
String filename = "C:/Users/U803665/Downloads/Kundendossier.PDF";
//generate UUID so we can identify the email activity
UUID uuid = UUID.randomUUID();
//initialize class for email
CTIEmailInbound mail = new CTIEmailInbound();
//create subject
String subject = "Test_"+uuid;
//send the emaul
mail.MailTest("ceo@world.com","mobi24.entw_w@mobiliar-test.ch",subject,"Test Body","","true");
//Wait and try to find the activity
Awaitility.await()
.atMost(300, TimeUnit.SECONDS)
.pollDelay(45, TimeUnit.SECONDS)
.pollInterval(60, TimeUnit.SECONDS)
.until(() -> {
try {
isActivityEmailIn(subject);
} catch (Exception e) {
e.printStackTrace();
}
});
List<Map<String, String>> records = sdb.queryRecords("Action", "Action",
"[Description] = '" + subject + "' AND [MOBI Activity Type] = '60'",new String[]{"Id"});
assertEquals(1, records.size());
//sdb.deleteRecord("MOBI EAI Action", "MOBI EAI Action", records.get(0).get("Id"));
}
}
The testcases can include also checking of respective other entities such as INS Claim which are created after receiving email.
Conclusion
JUnit is very usefulll for checking daily procuct increment of the software after daily build. The problems can be detected and fixed immediately. It is saving costs by running automated JUnit tests and the need to test by humans is minimized and quality of software improved.
In this blog we have demonstrated how can be JUnit automatic tested a Siebel Inbound Email functionality which is so important for customer care withing CRM system.
For more information contact us !
Back to Blog