Skip to content

Instantly share code, notes, and snippets.

@gbutt
Last active April 21, 2021 03:57
Show Gist options
  • Save gbutt/a276f5e8f78e832009461a422055e7fa to your computer and use it in GitHub Desktop.
Save gbutt/a276f5e8f78e832009461a422055e7fa to your computer and use it in GitHub Desktop.
An email builder for salesforce apex
public virtual class EmailBuilder {
private static final Logger log = LoggerFactory.getInstance(EmailBuilder.class);
@TestVisible
public Messaging.SingleEmailMessage email {
get;
private set;
}
public EmailBuilder() {
email = new Messaging.SingleEmailMessage();
}
public EmailBuilder withToAddress(String value) {
List<String> toAddresses = email.getToAddresses();
if (toAddresses == null) {
toAddresses = new List<String>();
}
if (toAddresses.indexOf(value) == -1) {
toAddresses.add(value);
email.settoAddresses(new List<String>(toAddresses));
}
return this;
}
public EmailBuilder withCcAddress(String value) {
List<String> ccAddresses = email.getCcAddresses();
if (ccAddresses == null) {
ccAddresses = new List<String>();
}
if (ccAddresses.indexOf(value) == -1) {
ccAddresses.add(value);
email.setCcAddresses(new List<String>(ccAddresses));
}
return this;
}
public EmailBuilder withSubject(String value) {
if (OrgUtils.isSandbox) {
email.setSubject('SANDBOX: ' + value);
} else {
email.setSubject(value);
}
return this;
}
public EmailBuilder withPlainTextBody(String value) {
email.setPlainTextBody(value);
return this;
}
public EmailBuilder withReplyTo(String value, String displayName) {
email.setReplyTo(value);
email.setSenderDisplayName(displayName);
return this;
}
public EmailBuilder withTemplateId(Id templateId) {
email.setTemplateId(templateId);
return this;
}
public EmailBuilder withTargetObjectId(Id targetObjectId) {
email.setTargetObjectId(targetObjectId);
return this;
}
public EmailBuilder withWhatId(Id whatId) {
email.setWhatId(whatId);
return this;
}
public EmailBuilder withOrgWideEmailAddressId(Id orgWideEmailAddressId) {
email.setOrgWideEmailAddressId(orgWideEmailAddressId);
return this;
}
public EmailBuilder withSaveAsActivity(Boolean saveAsActivity) {
email.setSaveAsActivity(saveAsActivity);
return this;
}
public virtual void sendEmail() {
Messaging.sendEmail(new Messaging.SingleEmailMessage[] {email});
}
public virtual void sendEmailNoError() {
try {
sendEmail();
} catch (EmailException ex) {
log.error(ex);
}
}
}
@isTest(IsParallel = true)
private class EmailBuilderTest {
@isTest
static void it_should_add_to_address() {
// Given
EmailBuilder builder = new EmailBuilder();
// When
builder.withToAddress('bwillis@email.org');
// Then
String jsonEmail = JSON.serialize(builder.email);
System.assert(jsonEmail.contains('"toAddresses":["bwillis@email.org"]'), jsonEmail);
// When
builder.withToAddress('bwillis@email.org');
// Then - no duplicates
jsonEmail = JSON.serialize(builder.email);
System.assert(jsonEmail.contains('"toAddresses":["bwillis@email.org"]'), jsonEmail);
// When
builder.withToAddress('cwillis@email.org');
// Then
jsonEmail = JSON.serialize(builder.email);
System.assert(jsonEmail.contains('"toAddresses":["bwillis@email.org","cwillis@email.org"]'), jsonEmail);
}
@isTest
static void it_should_add_cc_address() {
// Given
EmailBuilder builder = new EmailBuilder();
// When
builder.withCcAddress('bwillis@email.org');
// Then
String jsonEmail = JSON.serialize(builder.email);
System.assert(jsonEmail.contains('"ccAddresses":["bwillis@email.org"]'), jsonEmail);
// When
builder.withCcAddress('bwillis@email.org');
// Then - no duplicates
jsonEmail = JSON.serialize(builder.email);
System.assert(jsonEmail.contains('"ccAddresses":["bwillis@email.org"]'), jsonEmail);
// When
builder.withCcAddress('cwillis@email.org');
// Then
jsonEmail = JSON.serialize(builder.email);
System.assert(jsonEmail.contains('"ccAddresses":["bwillis@email.org","cwillis@email.org"]'), jsonEmail);
}
@isTest
static void it_should_add_subject() {
// Given
EmailBuilder builder = new EmailBuilder();
// When
OrgUtils.isSandbox = true;
builder.withSubject('bwillis@email.org');
// Then
String jsonEmail = JSON.serialize(builder.email);
System.assert(jsonEmail.contains('"subject":"SANDBOX: bwillis@email.org"'), jsonEmail);
// When
OrgUtils.isSandbox = false;
builder.withSubject('bwillis@email.org');
// Then
jsonEmail = JSON.serialize(builder.email);
System.assert(jsonEmail.contains('"subject":"bwillis@email.org"'), jsonEmail);
}
@isTest
static void it_should_add_plain_text_body() {
// Given
EmailBuilder builder = new EmailBuilder();
// When
builder.withPlainTextBody('bwillis@email.org');
// Then
String jsonEmail = JSON.serialize(builder.email);
System.assert(jsonEmail.contains('"plainTextBody":"bwillis@email.org"'), jsonEmail);
}
@isTest
static void it_should_add_reply_to() {
// Given
EmailBuilder builder = new EmailBuilder();
// When
builder.withReplyTo('bwillis@email.org', 'Bruce Willis');
// Then
String jsonEmail = JSON.serialize(builder.email);
System.assert(jsonEmail.contains('"replyTo":"bwillis@email.org"'), jsonEmail);
System.assert(jsonEmail.contains('"senderDisplayName":"Bruce Willis"'), jsonEmail);
}
@isTest
static void it_should_set_template_id() {
// Given
EmailBuilder builder = new EmailBuilder();
// When
EmailTemplate template = [SELECT Id FROM EmailTemplate LIMIT 1];
builder.withTemplateId(template.Id);
// Then
String jsonEmail = JSON.serialize(builder.email);
System.assert(jsonEmail.contains('"templateId":"' + template.Id + '"'), jsonEmail);
}
@isTest
static void it_should_set_target_object_id() {
// Given
EmailBuilder builder = new EmailBuilder();
// When
Id objectId = IdUtils.newId(Contact.getSObjectType());
builder.withTargetObjectId(objectId);
// Then
String jsonEmail = JSON.serialize(builder.email);
System.assert(jsonEmail.contains('"targetObjectId":"' + objectId + '"'), jsonEmail);
}
@isTest
static void it_should_set_what_id() {
// Given
EmailBuilder builder = new EmailBuilder();
// When
Id objectId = IdUtils.newId(Account.getSObjectType());
builder.withWhatId(objectId);
// Then
String jsonEmail = JSON.serialize(builder.email);
System.assert(jsonEmail.contains('"whatId":"' + objectId + '"'), jsonEmail);
}
@isTest
static void it_should_set_org_wide_email_address_id() {
// Given
EmailBuilder builder = new EmailBuilder();
// When
Id objectId = IdUtils.newId(OrgWideEmailAddress.getSObjectType());
builder.withOrgWideEmailAddressId(objectId);
// Then
String jsonEmail = JSON.serialize(builder.email);
System.assert(jsonEmail.contains('"orgWideEmailAddressId":"' + objectId + '"'), jsonEmail);
}
@isTest
static void it_should_set_save_as_activity() {
// Given
EmailBuilder builder = new EmailBuilder();
// When
builder.withSaveAsActivity(true);
// Then
String jsonEmail = JSON.serialize(builder.email);
System.assert(jsonEmail.contains('"saveAsActivity":true'), jsonEmail);
}
@isTest
static void it_should_send_email_without_error() {
try {
new EmailBuilder().sendEmailNoError();
} catch (Exception ex) {
System.assert(false, 'Expected no error, received ' + ex);
}
}
@isTest
static void it_should_send_email_with_error() {
Exception ex;
try {
new EmailBuilder().sendEmail();
} catch (Exception emailEx) {
ex = emailEx;
}
// Then
System.assert(ex != null);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment