CloudSlang/cs-actions

View on GitHub
cs-mail/src/test/java/io/cloudslang/content/mail/services/SendMailServiceTest.java

Summary

Maintainability
D
1 day
Test Coverage
/*
 * Copyright 2021-2024 Open Text
 * This program and the accompanying materials
 * are made available under the terms of the Apache License v2.0 which accompany this distribution.
 *
 * The Apache License is available at
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */




package io.cloudslang.content.mail.services;

import com.sun.mail.smtp.SMTPMessage;
import io.cloudslang.content.mail.constants.SecurityConstants;
import io.cloudslang.content.mail.entities.SendMailInput;
import org.junit.After;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
import org.junit.runner.RunWith;
import org.mockito.ArgumentMatcher;
import org.mockito.Matchers;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.Spy;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;

import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.Address;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMultipart;
import java.io.File;
import java.nio.file.Files;
import java.nio.file.Path;
import java.security.InvalidParameterException;
import java.util.ArrayList;
import java.util.Map;
import java.util.Properties;

import static com.sun.mail.smtp.SMTPMessage.NOTIFY_DELAY;
import static com.sun.mail.smtp.SMTPMessage.NOTIFY_FAILURE;
import static com.sun.mail.smtp.SMTPMessage.NOTIFY_SUCCESS;
import static junit.framework.Assert.assertTrue;
import static org.junit.Assert.assertEquals;
import static org.mockito.Matchers.anyObject;
import static org.mockito.Matchers.anyString;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.anyList;
import static org.mockito.Mockito.argThat;
import static org.mockito.Mockito.atLeastOnce;
import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.doThrow;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;

/**
 * Created by giloan on 11/5/2014.
 */

@RunWith(PowerMockRunner.class)
@PrepareForTest({Files.class, Transport.class, Session.class, SMTPMessage.class, SendMailService.class})
public class SendMailServiceTest {

    // operation inputs
    private static final String SMTP_HOSTANME = "127.0.0.1";
    private static final String PORT = "25";
    private static final String FROM = "from@test.com";
    private static final String TO = "to@test.com";
    private static final String TO2 = "to2@test.com";
    private static final String CC = "cc@test.com";
    private static final String BCC = "bcc@test.com";
    private static final String SUBJECT = "test subject";
    private static final String BODY = "test body";
    private static final String HTML_BODY_BASE64_IMAGES = "<!DOCTYPE html>\n" +
            "<html>\n" +
            "<body>\n" +
            "\n" +
            "<h2>Spectacular Mountains</h2>\n" +
            "<img src=\"data:image/png;base64,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\">\n" +
            "\n" +
            "</body>\n" +
            "</html>";
    private static final String HTML_BODY_BASE64_IMAGES_AFTER_PROCESSING = "<!DOCTYPE html>\n" +
            "<html>\n" +
            "<body>\n" +
            "\n" +
            "<h2>Spectacular Mountains</h2>\n" +
            "<img src=\"cid:35104.1429183112809\">\n" +
            "\n" +
            "</body>\n" +
            "</html>";
    private static final String HTML_EMAIL_TRUE = "true";
    private static final String READ_RECEIPT_TRUE = "true";
    private static final String ATTACHMENTS = "HDD:\\FULL_PATH1;HDD:\\FULL_PATH2";
    private static final String USER = "user";
    private static final String PASSWORD = "pass";
    private static final String DELIMITER = ";";

    private static final int
            INT_PORT = 25;

    // operation return codes
    private static final String RETURN_CODE = "returnCode";
    private static final String SUCCESS_RETURN_CODE = "0";

    //operation results
    private static final String RETURN_RESULT = "returnResult";
    private static final String MAIL_WAS_SENT = "SentMailSuccessfully";

    private static final String SMTP_PROTOCOL = "smtp";
    private static final String SMTP_HOST_CONFIG = "mail.smtp.host";
    private static final String SMTP_PORT_CONFIG = "mail.smtp.port";
    private static final String SMTP_USER_CONFIG = "mail.smtp.user";
    private static final String SMTP_PASSWORD_CONFIG = "mail.smtp.password";
    private static final String SMTP_AUTH_CONFIG = "mail.smtp.auth";
    private static final String CONTENT_TRANSFER_ENCODING = "Content-Transfer-Encoding";
    private static final String DEFAULT_CONTENT_TRANSFER_ENCODING = "quoted-printable";
    private static final String TEXT_HTML = "text/html";
    private static final String TEXT_PLAIN = "text/plain";
    private static final String CHARSET_CST = ";charset=";
    private static final String DEFAULT_CHARACTERSET = "UTF-8";
    private static final String DEFAULT_DELIMITER = ",";
    private static final String CANNOT_ATTACH = "Cannot attach";
    private static final String NO_READ_PERMISSION = "HDD:\\FULL_PATH1 don't have read permision";
    private static final String HEADERS_WITH_DEFAULT_DELIMIETRS = "Sensitivity:Company-Confidential\n" +
            "message-type:Multiple Part\n" +
            "Sensitivity:Personal";


    @Rule
    public ExpectedException exception = ExpectedException.none();
    private SendMailService sendMailService;
    private SendMailInput.Builder inputBuilder;
    private Address[] addresses = new Address[1];
    @Mock
    private Session sessionMock;
    @Mock
    private Transport transportMock;
    @Mock
    private Properties propertiesMock;
    @Mock
    private SMTPMessage smtpMessageMock;
    @Mock
    private SMTPMessage msgMock;
    @Mock
    private MimeMultipart mimeMultipartMock;
    @Mock
    private InternetAddress recipientMock;
    @Mock
    private MimeBodyPart mimeBodyPartMock;
    @Mock
    private FileDataSource fileDataSourceMock;
    @Mock
    private DataHandler dataHandlerMock;
    @Mock
    private File fileMock;

    @Mock
    private Path mockPath;
    @Spy
    private SendMailService sendMailServiceSpy = new SendMailService();

    /**
     * Initialize tested object and set up the mocks.
     *
     * @throws Exception
     */
    @Before
    public void setUp() throws Exception {
        sendMailService = new SendMailService();
        inputBuilder = new SendMailInput.Builder();

        PowerMockito.whenNew(Properties.class).withNoArguments().thenReturn(propertiesMock);
        Mockito.doReturn(SMTP_HOSTANME).when(propertiesMock).put(SMTP_HOST_CONFIG, SMTP_HOSTANME);
        PowerMockito.mockStatic(Session.class);
        PowerMockito.doReturn(sessionMock).when(Session.class, "getInstance", anyObject(),
                anyObject());
        PowerMockito.whenNew(SMTPMessage.class).withArguments(sessionMock).thenReturn(smtpMessageMock);
        PowerMockito.whenNew(MimeMultipart.class).withNoArguments().thenReturn(mimeMultipartMock);
        PowerMockito.whenNew(MimeBodyPart.class).withNoArguments().thenReturn(mimeBodyPartMock);
        Mockito.doNothing().when(mimeBodyPartMock).setHeader(anyString(), anyString());
        Mockito.doNothing().when(mimeMultipartMock).addBodyPart(mimeBodyPartMock);
        Mockito.doNothing().when(smtpMessageMock).setContent(mimeMultipartMock);
        Mockito.doNothing().when(smtpMessageMock).setFrom(Matchers.<InternetAddress>any());
        Mockito.doNothing().when(smtpMessageMock).setSubject(anyString());
        PowerMockito.whenNew(InternetAddress.class).withArguments(anyString()).thenReturn(recipientMock);
        Mockito.doNothing()
                .when(smtpMessageMock)
                .setRecipients(Matchers.<Message.RecipientType>any(), Matchers.<InternetAddress[]>any());
    }

    /**
     * Tear down objects after each test.
     *
     * @throws Exception
     */
    @After
    public void tearDown() throws Exception {
        sendMailService = null;
        inputBuilder = null;
    }

    /**
     * Test if the method addHeadersToSMTPMessage is called if headers are supplied to be added to the mail.
     *
     * @throws Exception
     */
    @Test
    public void testExecuteWithHeaders() throws Exception {
        Mockito.doReturn(transportMock).when(sessionMock).getTransport(SMTP_PROTOCOL);

        inputBuilder.hostname(SMTP_HOSTANME)
                .port(PORT)
                .from(FROM)
                .to(TO)
                .cc(CC)
                .bcc(BCC)
                .subject(SUBJECT)
                .body(BODY)
                .user(USER)
                .password(PASSWORD)
                .headers(HEADERS_WITH_DEFAULT_DELIMIETRS);
        doReturn(msgMock).when(sendMailServiceSpy).addHeadersToSMTPMessage(Matchers.<SMTPMessage>any(), anyList(), anyList());

        sendMailServiceSpy.execute(inputBuilder.build());
        verify(sendMailServiceSpy).addHeadersToSMTPMessage(Matchers.<SMTPMessage>any(), anyList(), anyList());
    }

    /**
     * Test addHeadersToSMTPMessage method when adding 3 headers and two of them have the same name but different values,
     * so the method should add the second value to the same header.
     *
     * @throws MessagingException
     */
    @Test
    public void testAddHeadersToSMTPMessage() throws MessagingException {
        ArrayList<String> headerNames = new ArrayList<>();
        headerNames.add(0, "Sensitivity");
        headerNames.add(1, "message-type");
        headerNames.add(2, "Sensitivity");
        ArrayList<String> headerValues = new ArrayList<>();
        headerValues.add(0, "Company-Confidential");
        headerValues.add(1, "Multiple Part");
        headerValues.add(2, "Personal");

        doReturn(null).doReturn(new String[]{"Company-Confidential"}).when(msgMock).getHeader("Sensitivity");
        Mockito.when(new SMTPMessage(smtpMessageMock)).thenReturn(msgMock);
        sendMailService.addHeadersToSMTPMessage(smtpMessageMock, headerNames, headerValues);
        verify(msgMock, times(1)).addHeader(Matchers.anyString(), Matchers.anyString());
        verify(msgMock, times(2)).setHeader(Matchers.anyString(), Matchers.anyString());
        verify(msgMock, times(3)).getHeader(Matchers.anyString());
    }

    /**
     * Test addHeadersToSMTPMessage method when it throws a MessagingException.
     *
     * @throws MessagingException
     */
    @Test
    public void testAddHeadersToSMTPMessageThrowsException() throws MessagingException {
        ArrayList<String> headerNames = new ArrayList<>();
        headerNames.add(0, "Sensitivity");
        ArrayList<String> headerValues = new ArrayList<>();
        headerValues.add(0, "Company-Confidential");
        Mockito.when(new SMTPMessage(smtpMessageMock)).thenReturn(msgMock);
        doThrow(new MessagingException()).when(msgMock).getHeader(Matchers.anyString());
        exception.expect(MessagingException.class);

        sendMailService.addHeadersToSMTPMessage(smtpMessageMock, headerNames, headerValues);
    }

    /**
     * Test Execute method with successful scenario,
     * (user not null, html input takes the default value(false)).
     *
     * @throws Exception
     */
    @Test
    public void testExecuteGoesToSuccessScenario1() throws Exception {
        Mockito.doReturn(transportMock).when(sessionMock).getTransport(SMTP_PROTOCOL);
        Mockito.doNothing().when(transportMock).connect(SMTP_HOSTANME, INT_PORT, USER, PASSWORD);
        Mockito.doNothing().when(transportMock).sendMessage(Matchers.<SMTPMessage>any(), Matchers.<Address[]>any());
        Mockito.doReturn(addresses).when(smtpMessageMock).getAllRecipients();
        Mockito.doNothing().when(mimeBodyPartMock).setContent(BODY, TEXT_PLAIN + CHARSET_CST + DEFAULT_CHARACTERSET);

        inputBuilder.hostname(SMTP_HOSTANME)
                .port(PORT)
                .from(FROM)
                .to(TO)
                .cc(CC)
                .bcc(BCC)
                .subject(SUBJECT)
                .body(BODY)
                .user(USER)
                .password(PASSWORD);

        Map<String, String> result = sendMailService.execute(inputBuilder.build());
        assertEquals(MAIL_WAS_SENT, result.get(RETURN_RESULT));
        assertEquals(SUCCESS_RETURN_CODE, result.get(RETURN_CODE));
        verifyCommonMethodInvocations();
        verify(propertiesMock).put(eq(SMTP_USER_CONFIG), eq(USER));
        verify(propertiesMock).put(eq(SMTP_PASSWORD_CONFIG), eq(PASSWORD));
        verify(propertiesMock).put(eq(SMTP_AUTH_CONFIG), eq("true"));
        verify(sessionMock).getTransport(SMTP_PROTOCOL);
        verify(transportMock).connect(SMTP_HOSTANME, INT_PORT, USER, PASSWORD);
        verify(transportMock).sendMessage(Matchers.<SMTPMessage>any(), Matchers.<Address[]>any());
        verify(mimeBodyPartMock).setContent(BODY, TEXT_PLAIN + CHARSET_CST + DEFAULT_CHARACTERSET);
        verify(transportMock).close();
    }

    /**
     * Test Execute method with successful scenario,
     * (user is null, html inputs is true).
     *
     * @throws Exception
     */
    @Test
    public void testExecuteGoesToSuccessScenario2() throws Exception {
        prepareTransportClassForStaticMock();
        Mockito.doNothing().when(mimeBodyPartMock).setContent(BODY, TEXT_HTML + CHARSET_CST + DEFAULT_CHARACTERSET);

        inputBuilder.hostname(SMTP_HOSTANME)
                .port(PORT)
                .from(FROM)
                .to(TO)
                .cc(CC)
                .bcc(BCC)
                .subject(SUBJECT)
                .body(BODY)
                .htmlEmail(HTML_EMAIL_TRUE);

        Map<String, String> result = sendMailService.execute(inputBuilder.build());
        assertEquals(MAIL_WAS_SENT, result.get(RETURN_RESULT));
        assertEquals(SUCCESS_RETURN_CODE, result.get(RETURN_CODE));
        verifyCommonMethodInvocations();
        verify(propertiesMock, never()).put(eq(SMTP_USER_CONFIG), eq(USER));
        verify(propertiesMock, never()).put(eq(SMTP_PASSWORD_CONFIG), eq(PASSWORD));
        verify(propertiesMock, never()).put(eq(SMTP_AUTH_CONFIG), eq("true"));
        verify(sessionMock, never()).getTransport(SMTP_PROTOCOL);
        verify(transportMock, never()).connect(SMTP_HOSTANME, INT_PORT, USER, PASSWORD);
        verify(transportMock, never()).sendMessage(Matchers.<SMTPMessage>any(), Matchers.<Address[]>any());
        PowerMockito.verifyStatic(Mockito.times(1));
        Transport.send(smtpMessageMock);
        verify(mimeBodyPartMock).setContent(BODY, TEXT_HTML + CHARSET_CST + DEFAULT_CHARACTERSET);
    }

    private void prepareTransportClassForStaticMock() throws Exception {
        PowerMockito.mockStatic(Transport.class);
        PowerMockito.doNothing().when(Transport.class, "send", smtpMessageMock);
    }

    /**
     * Test Execute method with successful scenario,
     * (attachments not empty and readReceipt is true).
     *
     * @throws Exception
     */
    @Test
    public void testExecuteGoesToSuccessScenario3() throws Exception {
        prepareTransportClassForStaticMock();
        Mockito.doNothing().when(mimeBodyPartMock).setContent(BODY, TEXT_PLAIN + CHARSET_CST + DEFAULT_CHARACTERSET);
        PowerMockito.whenNew(FileDataSource.class).withArguments(anyString()).thenReturn(fileDataSourceMock);
        Mockito.doReturn(fileMock).when(fileDataSourceMock).getFile();
        Mockito.doReturn(true).when(fileMock).exists();
        Mockito.doReturn(mockPath).when(fileMock).toPath();
        PowerMockito.mockStatic(Files.class);
        when(Files.isReadable(mockPath)).thenReturn(true);
        PowerMockito.whenNew(DataHandler.class).withArguments(fileDataSourceMock).thenReturn(dataHandlerMock);
        doNothing().when(mimeBodyPartMock).setDataHandler(dataHandlerMock);
        doNothing().when(mimeBodyPartMock).setFileName(anyString());
        doNothing().when(mimeMultipartMock).addBodyPart(mimeBodyPartMock);

        inputBuilder.hostname(SMTP_HOSTANME)
                .port(PORT)
                .from(FROM)
                .to(TO)
                .cc(CC)
                .bcc(BCC)
                .subject(SUBJECT)
                .body(BODY)
                .attachments(ATTACHMENTS)
                .delimiter(DELIMITER)
                .readReceipt(READ_RECEIPT_TRUE);

        Map<String, String> result = sendMailService.execute(inputBuilder.build());
        assertEquals(MAIL_WAS_SENT, result.get(RETURN_RESULT));
        assertEquals(SUCCESS_RETURN_CODE, result.get(RETURN_CODE));
        // 3 invocations, one for html setting and one for each of the attachments
        PowerMockito.verifyNew(MimeBodyPart.class, times(3)).withNoArguments();
        verify(mimeBodyPartMock, times(3)).setHeader(CONTENT_TRANSFER_ENCODING, DEFAULT_CONTENT_TRANSFER_ENCODING);
        PowerMockito.verifyNew(FileDataSource.class, times(2)).withArguments(anyString());
        verify(mimeBodyPartMock, times(2)).setDataHandler(dataHandlerMock);
        verify(mimeBodyPartMock, times(2)).setFileName(anyString());
        verify(mimeMultipartMock, times(3)).addBodyPart(mimeBodyPartMock);
        verify(smtpMessageMock).setNotifyOptions(NOTIFY_DELAY + NOTIFY_FAILURE + NOTIFY_SUCCESS);
    }

    /**
     * Test Execute method when attachment doesn't have read permission.
     *
     * @throws Exception
     */
    @Test
    public void testExecuteWithNoReadPermisionOnAttachedFile() throws Exception {
        prepareTransportClassForStaticMock();
        Mockito.doNothing().when(mimeBodyPartMock).setContent(BODY, TEXT_PLAIN + CHARSET_CST + DEFAULT_CHARACTERSET);
        PowerMockito.whenNew(FileDataSource.class).withArguments(anyString()).thenReturn(fileDataSourceMock);
        Mockito.doReturn(fileMock).when(fileDataSourceMock).getFile();
        Mockito.doReturn(true).when(fileMock).exists();
        Mockito.doReturn(mockPath).when(fileMock).toPath();
        PowerMockito.mockStatic(Files.class);
        when(Files.isReadable(mockPath)).thenReturn(false);

        inputBuilder.hostname(SMTP_HOSTANME)
                .port(PORT)
                .from(FROM)
                .to(TO)
                .cc(CC)
                .bcc(BCC)
                .subject(SUBJECT)
                .body(BODY)
                .attachments(ATTACHMENTS)
                .delimiter(DELIMITER)
                .readReceipt(READ_RECEIPT_TRUE);

        exception.expect(InvalidParameterException.class);
        exception.expectMessage(NO_READ_PERMISSION);
        sendMailService.execute(inputBuilder.build());
    }

    /**
     * Test Execute method with successful scenario,
     * (multiple destination recipients)
     *
     * @throws Exception
     */
    @Test
    public void testExecuteGoesToSuccessScenario4() throws Exception {
        prepareTransportClassForStaticMock();

        inputBuilder.hostname(SMTP_HOSTANME)
                .port(PORT)
                .from(FROM)
                .to(TO + DEFAULT_DELIMITER + TO2)
                .cc(CC)
                .bcc(BCC)
                .subject(SUBJECT)
                .body(BODY);

        Map<String, String> result = sendMailService.execute(inputBuilder.build());
        assertEquals(MAIL_WAS_SENT, result.get(RETURN_RESULT));
        assertEquals(SUCCESS_RETURN_CODE, result.get(RETURN_CODE));
        PowerMockito.verifyNew(InternetAddress.class).withArguments(TO);
        PowerMockito.verifyNew(InternetAddress.class).withArguments(TO2);
        verify(smtpMessageMock, times(3)).setRecipients(Matchers.<Message.RecipientType>any(), Matchers.<InternetAddress[]>any());
    }

    /**
     * Test Execute method with successful scenario,
     * (cc and bcc not null)
     *
     * @throws Exception
     */
    @Test
    public void testExecuteGoesToSuccessScenario5() throws Exception {
        prepareTransportClassForStaticMock();

        inputBuilder.hostname(SMTP_HOSTANME)
                .port(PORT)
                .from(FROM)
                .to(TO)
                .cc(CC)
                .bcc(BCC)
                .subject(SUBJECT)
                .body(BODY);

        Map<String, String> result = sendMailService.execute(inputBuilder.build());
        assertEquals(MAIL_WAS_SENT, result.get(RETURN_RESULT));
        assertEquals(SUCCESS_RETURN_CODE, result.get(RETURN_CODE));
        PowerMockito.verifyNew(InternetAddress.class).withArguments(CC);
        PowerMockito.verifyNew(InternetAddress.class).withArguments(BCC);
    }

    @Test
    public void testExecuteGoesToSuccessScenarioWithHTMLAndBase64Images() throws Exception {
        prepareTransportClassForStaticMock();
        Mockito.doNothing().when(mimeBodyPartMock).setContent(HTML_BODY_BASE64_IMAGES_AFTER_PROCESSING,
                TEXT_HTML + CHARSET_CST + DEFAULT_CHARACTERSET);

        inputBuilder.hostname(SMTP_HOSTANME)
                .port(PORT)
                .from(FROM)
                .to(TO)
                .cc(CC)
                .bcc(BCC)
                .subject(SUBJECT)
                .body(HTML_BODY_BASE64_IMAGES)
                .htmlEmail(HTML_EMAIL_TRUE);

        Map<String, String> result = sendMailService.execute(inputBuilder.build());
        assertEquals(MAIL_WAS_SENT, result.get(RETURN_RESULT));
        assertEquals(SUCCESS_RETURN_CODE, result.get(RETURN_CODE));
        PowerMockito.verifyNew(MimeBodyPart.class, Mockito.times(2)).withNoArguments();
        verify(mimeMultipartMock, Mockito.times(2)).addBodyPart(mimeBodyPartMock);
        verifyCommons();
        verify(propertiesMock, never()).put(eq(SMTP_USER_CONFIG), eq(USER));
        verify(propertiesMock, never()).put(eq(SMTP_PASSWORD_CONFIG), eq(PASSWORD));
        verify(propertiesMock, never()).put(eq(SMTP_AUTH_CONFIG), eq("true"));
        verify(sessionMock, never()).getTransport(SMTP_PROTOCOL);
        verify(transportMock, never()).connect(SMTP_HOSTANME, INT_PORT, USER, PASSWORD);
        verify(transportMock, never()).sendMessage(Matchers.<SMTPMessage>any(), Matchers.<Address[]>any());
        PowerMockito.verifyStatic(Mockito.times(1));
        Transport.send(smtpMessageMock);
        verify(mimeBodyPartMock).setContent(argThat(new ArgumentMatcher<String>() {
            @Override
            public boolean matches(Object o) {
                if (o instanceof String) {
                    String body = (String) o;
                    int indexOfCID = body.indexOf("cid:") + 4;
                    String contentId = body.substring(indexOfCID, (body.indexOf("\">", indexOfCID)));
                    String partBeforeContentId = HTML_BODY_BASE64_IMAGES_AFTER_PROCESSING.substring(0,
                            HTML_BODY_BASE64_IMAGES_AFTER_PROCESSING.indexOf("cid:") + 3);
                    String partAfterContentID = HTML_BODY_BASE64_IMAGES_AFTER_PROCESSING.substring(
                            HTML_BODY_BASE64_IMAGES_AFTER_PROCESSING.indexOf("cid:") + 23,
                            HTML_BODY_BASE64_IMAGES_AFTER_PROCESSING.length());
                    if (body.contains(partBeforeContentId) && body.contains(partAfterContentID) &&
                            contentId.matches("\\d{1,5}\\.\\d{12,13}")) {
                        return true;
                    }
                }
                return false;
            }
        }), eq(TEXT_HTML + CHARSET_CST + DEFAULT_CHARACTERSET));
    }

    /**
     * Test Execute method with exception thrown when attachment files are not found
     *
     * @throws Exception
     */
    @Test
    public void testExecuteThrowsException() throws Exception {
        prepareTransportClassForStaticMock();

        Mockito.doNothing().when(mimeBodyPartMock).setContent(BODY, TEXT_PLAIN + CHARSET_CST + DEFAULT_CHARACTERSET);
        PowerMockito.whenNew(FileDataSource.class).withArguments(anyString()).thenReturn(fileDataSourceMock);
        Mockito.doReturn(fileMock).when(fileDataSourceMock).getFile();
        Mockito.doReturn(false).when(fileMock).exists();
        PowerMockito.whenNew(DataHandler.class).withArguments(fileDataSourceMock).thenReturn(dataHandlerMock);
        doNothing().when(mimeBodyPartMock).setDataHandler(dataHandlerMock);

        doThrow(new MessagingException("IOException")).when(mimeBodyPartMock).setDataHandler(dataHandlerMock);

        inputBuilder.hostname(SMTP_HOSTANME)
                .port(PORT)
                .from(FROM)
                .to(TO + DEFAULT_DELIMITER + TO2)
                .cc(CC)
                .bcc(BCC)
                .subject(SUBJECT)
                .body(BODY)
                .attachments(ATTACHMENTS);

        exception.expect(Exception.class);
        exception.expectMessage(CANNOT_ATTACH);
        sendMailService.execute(inputBuilder.build());
    }

    /**
     * Verify the stubbed method invocations.
     */
    private void verifyCommonMethodInvocations() throws Exception {
        PowerMockito.verifyNew(MimeBodyPart.class).withNoArguments();
        verify(mimeMultipartMock).addBodyPart(mimeBodyPartMock);

        verifyCommons();
    }

    private void verifyCommons() throws Exception {
        verify(propertiesMock).put(eq(SMTP_HOST_CONFIG), eq(SMTP_HOSTANME));
        verify(propertiesMock).put(eq(SMTP_PORT_CONFIG), eq(PORT));
        PowerMockito.verifyStatic(Mockito.times(1));
        Session.getInstance(propertiesMock, null);
        verify(mimeBodyPartMock).setHeader(CONTENT_TRANSFER_ENCODING, DEFAULT_CONTENT_TRANSFER_ENCODING);
        verify(smtpMessageMock).setContent(mimeMultipartMock);
        verify(smtpMessageMock).setFrom(Matchers.<InternetAddress>any());
        verify(smtpMessageMock).setSubject(anyString());
        PowerMockito.verifyNew(Properties.class).withNoArguments();
        PowerMockito.verifyNew(SMTPMessage.class).withArguments(sessionMock);
        PowerMockito.verifyNew(MimeMultipart.class).withNoArguments();
        PowerMockito.verifyNew(InternetAddress.class, atLeastOnce()).withArguments(anyString());
    }
}