package hudson.plugins.emailext;
import hudson.FilePath;
import hudson.model.Run;
import org.apache.commons.lang.StringEscapeUtils;
import org.jenkinsci.plugins.workflow.cps.CpsFlowDefinition;
import org.jenkinsci.plugins.workflow.job.WorkflowJob;
import org.jenkinsci.plugins.workflow.steps.AbstractStepDescriptorImpl;
import org.jenkinsci.plugins.workflow.steps.AbstractStepImpl;
import org.jenkinsci.plugins.workflow.steps.AbstractSynchronousNonBlockingStepExecution;
import org.jenkinsci.plugins.workflow.steps.StepConfigTester;
import org.jenkinsci.plugins.workflow.steps.StepContextParameter;
import org.junit.Rule;
import org.junit.Test;
import org.jvnet.hudson.test.JenkinsRule;
import org.jvnet.hudson.test.TestExtension;
import org.jvnet.hudson.test.recipes.WithPlugin;
import org.jvnet.mock_javamail.Mailbox;
import org.kohsuke.stapler.DataBoundConstructor;
import javax.mail.BodyPart;
import javax.mail.Message;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import java.io.File;
import java.net.URL;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
/**
* Created by acearl on 9/15/2015.
*/
public class EmailExtStepTest {
@Rule
public JenkinsRule j = new JenkinsRule() {
@Override
public void before() throws Throwable {
super.before();
Mailbox.clearAll();
}
@Override
public void after() throws Exception {
super.after();
Mailbox.clearAll();
}
};
@Test
public void configRoundTrip() throws Exception {
EmailExtStep step1 = new EmailExtStep("subject", "body");
step1.setTo("mickeymouse@disney.com");
step1.setReplyTo("mickeymouse@disney.com");
step1.setMimeType("text/html");
EmailExtStep step2 = new StepConfigTester(j).configRoundTrip(step1);
j.assertEqualDataBoundBeans(step1, step2);
}
@Test
public void simpleEmail() throws Exception {
WorkflowJob job = j.getInstance().createProject(WorkflowJob.class, "wf");
job.setDefinition(new CpsFlowDefinition("node { emailext(to: 'mickeymouse@disney.com', subject: 'Boo') }"));
Run<?,?> run = job.scheduleBuild2(0).get();
j.assertBuildStatusSuccess(run);
Mailbox mbox = Mailbox.get("mickeymouse@disney.com");
assertEquals(1, mbox.size());
Message msg = mbox.get(0);
assertEquals("Boo", msg.getSubject());
}
@Test
public void attachLog() throws Exception {
WorkflowJob job = j.getInstance().createProject(WorkflowJob.class, "wf");
job.setDefinition(new CpsFlowDefinition("node { emailext(to: 'mickeymouse@disney.com', subject: 'Boo', attachLog: true) }"));
Run<?,?> run = job.scheduleBuild2(0).get();
j.assertBuildStatusSuccess(run);
Mailbox mbox = Mailbox.get("mickeymouse@disney.com");
assertEquals(1, mbox.size());
Message msg = mbox.get(0);
assertEquals("Boo", msg.getSubject());
assertTrue("Message should be multipart", msg instanceof MimeMessage);
assertTrue("Content should be a MimeMultipart", msg.getContent() instanceof MimeMultipart);
MimeMultipart part = (MimeMultipart) msg.getContent();
assertEquals("Should have two body items (message + attachment)", 2, part.getCount());
BodyPart attach = part.getBodyPart(1);
assertTrue("There should be a log named \"build.log\" attached", "build.log".equalsIgnoreCase(attach.getFileName()));
}
@Test
public void attachment() throws Exception {
URL url = this.getClass().getResource("/test.pdf");
final File attachment = new File(url.getFile());
WorkflowJob job = j.getInstance().createProject(WorkflowJob.class, "wf");
job.setDefinition(new CpsFlowDefinition("node { fileCopy('" + StringEscapeUtils.escapeJava(attachment.getAbsolutePath()) + "'); emailext (to: 'mickeymouse@disney.com', subject: 'Boo', body: 'Here is your file', attachmentsPattern: '*.pdf') }"));
Run<?,?> run = job.scheduleBuild2(0).get();
j.assertBuildStatusSuccess(run);
Mailbox mbox = Mailbox.get("mickeymouse@disney.com");
assertEquals("Should have an email from success", 1, mbox.size());
Message msg = mbox.get(0);
assertTrue("Message should be multipart", msg instanceof MimeMessage);
assertTrue("Content should be a MimeMultipart", msg.getContent() instanceof MimeMultipart);
MimeMultipart part = (MimeMultipart)msg.getContent();
assertEquals("Should have two body items (message + attachment)", 2, part.getCount());
BodyPart attach = part.getBodyPart(1);
assertTrue("There should be a PDF named \"test.pdf\" attached", "test.pdf".equalsIgnoreCase(attach.getFileName()));
}
public static class FileCopyStep extends AbstractStepImpl {
private final String file;
@DataBoundConstructor
public FileCopyStep(String file) {
this.file = file;
}
public String getFile() {
return file;
}
@TestExtension("attachment")
public static class DescriptorImpl extends AbstractStepDescriptorImpl {
public DescriptorImpl() {
super(Execution.class);
}
@Override public String getFunctionName() {
return "fileCopy";
}
@Override public String getDisplayName() {
return "Copy a file into the workspace";
}
}
public static class Execution extends AbstractSynchronousNonBlockingStepExecution<Boolean> {
@javax.inject.Inject
private transient FileCopyStep step;
@StepContextParameter
private transient FilePath workspace;
@Override protected Boolean run() throws Exception {
FilePath file = new FilePath(new File(step.file));
workspace.child(file.getName()).copyFrom(file);
return true;
}
private static final long serialVersionUID = 1L;
}
}
}