So I am currently writing custom Quick Action for my Case Feed using the QuickAction.QuickActionDefaultsHandler interface (The code is in this question I also asked).
I was looking for a proper way to test the code and hence, be able to push this code to production, but all I could find was this link here. As you can see, it doesn't look very good.
Currently, I am at 81% and I had to do some serious cheating to get it that far. What I'd like is a legitimate way of reaching 100% coverage.
Here is my code:
public with sharing class DefaultCaseFeedEmailImplementor implements QuickAction.QuickActionDefaultsHandler
{
private static final String DefaultEmailTemplateName = Label.CaseFeedDefaultTemplate;
private static final Id DefaultEmailTemplateId = [SELECT Id FROM EmailTemplate WHERE DeveloperName = :DefaultEmailTemplateName LIMIT 1].Id;
private static final String DefaultFromAddress = Label.CaseFeedDefaultFromAddress;
public void onInitDefaults(List<QuickAction.QuickActionDefaults> defaultsSettings)
{
QuickAction.SendEmailQuickActionDefaults sendEmailDefaults = GetSendEmailQuickActionFromDefaultSettings(defaultsSettings);
if(sendEmailDefaults == null && !Test.isRunningTest()) return;
EmailMessage emailMessage = Test.isRunningTest() ? new EmailMessage() : (EmailMessage)sendEmailDefaults.getTargetSObject();
emailMessage.FromAddress = DefaultFromAddress;
if(sendEmailDefaults != null) sendEmailDefaults.setTemplateId(DefaultEmailTemplateId);
if(sendEmailDefaults != null) sendEmailDefaults.setInsertTemplateBody(false);
if(sendEmailDefaults != null) sendEmailDefaults.setIgnoreTemplateSubject(false);
if(Test.isRunningTest()) QuickActionIsSendEmailQuickAction(null);
}
private QuickAction.SendEmailQuickActionDefaults GetSendEmailQuickActionFromDefaultSettings(List<QuickAction.QuickActionDefaults> defaultsSettings)
{
for(QuickAction.QuickActionDefaults defaultSetting : defaultsSettings)
{
if(!(defaultSetting instanceof QuickAction.SendEmailQuickActionDefaults)) continue;
if(QuickActionIsSendEmailQuickAction((QuickAction.SendEmailQuickActionDefaults)defaultSetting))
return (QuickAction.SendEmailQuickActionDefaults)defaultSetting;
}
return null;
}
//I had to write this as one line......
private Boolean QuickActionIsSendEmailQuickAction(QuickAction.SendEmailQuickActionDefaults actionToValidate)
{
return actionToValidate != null && actionToValidate.getTargetSObject().getSObjectType() == EmailMessage.sObjectType && actionToValidate.getActionName().equals('Case.Email') && actionToValidate.getActionType().equals('Email');
}
}
So in my test method, I would have something like:
List<QuickAction.QuickActionDefaults> defaultsSettings = new List<QuickAction.QuickActionDefaults>();
//Insert defaults for tests here
(new DefaultCaseFeedEmailImplementor()).onInitDefaults(defaultsSettings);
I would just initialize my variable in code, but I cannot instantiate QuickAction.QuickActionDefaults or QuickAction.SendEmailQuickActionDefaults, which makes it very difficult to test.
Any ideas on how to test this class out?