function readOnly(count){ }
Starting November 20, the site will be set to read-only. On December 4, 2023,
forum discussions will move to the Trailblazer Community.
+ Start a Discussion
ApexDevApexDev 

Apex Test Class for SingleEmailMessage - need help

Hi Experts! 

I need help to increase my test coverage for SingleEmailMessage. The test coverage is only 33%. Everything after for (Case cs : cases) is not coverage. What I am doing wrong? 

Email Class: 
 
public class EmailClass
{
    @InvocableMethod
    public static void sendEmail() {

        
 //Contact and Case lists
    List<Contact> contacts =[Select Id From Contact where Email!=null];
    
    List<Case> cases = new List<Case>();
    cases = [Select Id,ContactEmail, Letter_Sent__c, Letter_Sent_Date__c, Reminder_Sent__c, Reminder_Sent_Date__c, Follow_up_Date__c, Responsibility_Center__c, 
             Status, ContactId, Follow_Up_Date_in_Days__c, Actual_Follow_up_Date__c From Case 
             Where ContactEmail!=null AND subject='Periodic Service' AND account.company_code__c='US45' AND Actual_Follow_up_Date__c = true AND Status='Ready for Email' AND Letter_Sent__c = false AND Reminder_Sent__c = false AND ContactId IN : contacts];
   
    List<Case> cases2 = new List<Case>();    
    cases2 = [Select Id,ContactEmail, Letter_Sent__c, Letter_Sent_Date__c, Reminder_Sent__c, Reminder_Sent_Date__c, Follow_up_Date__c, Responsibility_Center__c, 
             Status, ContactId, Follow_Up_Date_in_Days__c, Actual_Follow_up_Date__c From Case 
             Where ContactEmail!=null AND Follow_Up_Date_in_Days__c = 0 AND subject='Periodic Service' AND account.company_code__c='US45' AND Actual_Follow_up_Date__c = true AND Status='Waiting for Customer' AND Letter_Sent__c = true AND Reminder_Sent__c = false AND ContactId IN : contacts];
    
        
        
        
 //ORG Wide Email Addresses lists   
        
    OrgWideEmailAddress AST = new OrgWideEmailAddress();
                AST = [SELECT Id, Address, DisplayName FROM OrgWideEmailAddress Where DisplayName='Austin']; 
        
    OrgWideEmailAddress ATL = new OrgWideEmailAddress();
                ATL = [SELECT Id, Address, DisplayName FROM OrgWideEmailAddress Where DisplayName='Atlanta'];
        

        
        
    List<Messaging.SingleEmailMessage> emails = new List<Messaging.SingleEmailMessage>();
    for (Case cs : cases)
    {
    Messaging.SingleEmailMessage email = new Messaging.SingleEmailMessage();
    
    List<String> toAddress = new List<String>();
    toAddress.add(cs.ContactEmail);
    email.setToAddresses(toAddress);
    
    email.setWhatId(cs.Id);
    email.setTargetObjectId(cs.ContactId);
    email.setTemplateId('00X7Z0000027tioUAA');
    
    email.setTreatTargetObjectAsRecipient(false);
    //email.setOrgWideEmailAddressId(owea.id);
    //List<String> ccAddress = new List<String>();
    //email.setCcAddresses(ccAddress);
    //email.setSaveAsActivity(true); 
    
    
    //First email reminder
    //Letter_Sent_Date__c and Follow_up_Date__c updated in Cases Processes for first reminder
    
    if (cs.Responsibility_Center__c =='AST' && cs.status=='Ready for Email' && cs.Letter_Sent__c == false && cs.Reminder_Sent__c == false)
    {
        cs.status = 'Waiting for Customer';
        cs.Letter_Sent__c = true;
        email.setOrgWideEmailAddressId(AST.id);
    }
    
    if (cs.Responsibility_Center__c =='ATL' && cs.status=='Ready for Email' && cs.Letter_Sent__c == false && cs.Reminder_Sent__c == false)
    {
        cs.status = 'Waiting for Customer';
        cs.Letter_Sent__c = true;
        email.setOrgWideEmailAddressId(ATL.id);
    } 
        
        else
    {
        system.debug('no mail was sent');
    }
    
    emails.add(email);}
   
    
   //Second email reminder
   
    for (Case cs2 : cases2)
{
    Messaging.SingleEmailMessage email2 = new Messaging.SingleEmailMessage();
    
    List<String> toAddress2 = new List<String>();
    toAddress2.add(cs2.ContactEmail);
    email2.setToAddresses(toAddress2);
    
    email2.setWhatId(cs2.Id);
    email2.setTargetObjectId(cs2.ContactId);
    email2.setTemplateId('00X7Z0000027tioUAA');
    
    email2.setTreatTargetObjectAsRecipient(false);
    cs2.Reminder_Sent__c = true;
   
    if (cs2.Responsibility_Center__c =='AST' && cs2.status=='Waiting for Customer' && cs2.Letter_Sent__c == true && cs2.Follow_Up_Date_in_Days__c == 0)
    {     
        cs2.Reminder_Sent__c = true;
        email2.setOrgWideEmailAddressId(AST.id);
    }
    
    if (cs2.Responsibility_Center__c =='ATL' && cs2.status=='Waiting for Customer' && cs2.Letter_Sent__c == true && cs2.Follow_Up_Date_in_Days__c == 0)
    {
        cs2.Reminder_Sent__c = true;
        email2.setOrgWideEmailAddressId(ATL.id);
    }
    
    else
    {
        system.debug('no mail was sent');
    }
    
    emails.add(email2);
    }
   else
    {
        system.debug('no mail was sent');
    }
    
 
    emails.add(email2);
} 

    Messaging.sendEmail(emails); 
    update cases;
    update cases2;    
  } 
}

Test Class:
 
@isTest(seeAllData=true)
public class EmailClassTest {
   @isTest
    public static void sendEmail(){
            
        //Insert Profile
      Profile cus = [SELECT Id FROM Profile WHERE Name='DGS - Customer Service'];   
        
        
        //Insert User
      User us = new User(Alias = 'standt', Email='standarduser@testorg.com', 
            EmailEncodingKey='UTF-8', LastName='Testing', LanguageLocaleKey='en_US', 
            LocaleSidKey='en_US', ProfileId = cus.Id, CompanyName = 'E3',
            TimeZoneSidKey='America/Los_Angeles', UserName='standarduser@testorg.com'); 
        
        
        //Insert Account
      Account acct = new Account(Name='TestClassAccount', Customer_Segment__c = 'Hospitals', Calibration_Intervals__c = 'Half year');
      insert acct;
        
        
        //Insert Contact
      Contact con = new Contact(LastName='JasonSendEmail', email='sendemail@toatlanta.com', AccountId=acct.Id);
      insert con;
        
        
        //Insert Responsibility Center
      Responsibility_Center__c rc = new Responsibility_Center__c(Name='e3 AST');
        
        
        //Insert Case
       Case cas = new Case(Status = 'Ready for Email', ContactId=con.id, subject='Periodic Service', AccountId = acct.id,
                          Case_Reason__c = 'Business related', Reason = 'General Enquiry', Responsibility_Center_lookup__c=rc.id, Reminder_Sent__c = false, Letter_Sent__c = false,
                          Follow_up_date__c = datetime.newInstance(2022, 10, 15, 12, 30, 0));
       insert cas; 
        //Insert 2nd Case
       Case cas2 = new Case(Follow_up_Date__c = date.today(), Status = 'Waiting for Customer', ContactId=con.id, subject='Periodic Service', AccountId = acct.id,
                          Case_Reason__c = 'Business related', Reason = 'General Enquiry', Responsibility_Center_lookup__c=rc.id, Reminder_Sent__c = false, Letter_Sent__c = true);
       insert cas2; 
         
        
       //Insert Org-wide
       OrgWideEmailAddress[] addresses = [SELECT Id, Address, DisplayName FROM OrgWideEmailAddress Where DisplayName='Austin'];      
            
    
       Test.startTest();
       System.assertEquals(0, Limits.getEmailInvocations(), 'No emails should be sent');

       EmailClass.sendEmail();

       System.assertEquals(1, Limits.getEmailInvocations(), 'Emails should be sent');
      
       Test.stopTest();
        
     
}
}

 
ApexDevApexDev
User-added image
AnkaiahAnkaiah (Salesforce Developers) 
Hi Andzela,

As per salesforce best practies you will not use seealldata=true for test classes.

try with below code.
@Istest
Public class EmailClassTest {
   @isTest
    public static void sendEmail(){
            
        //Insert Profile
      Profile cus = [SELECT Id FROM Profile WHERE Name='DGS - Customer Service'];   
        
        
        //Insert User
      User us = new User(Alias = 'standt', Email='standarduser@testorg.com', 
            EmailEncodingKey='UTF-8', LastName='Testing', LanguageLocaleKey='en_US', 
            LocaleSidKey='en_US', ProfileId = cus.Id, CompanyName = 'E3',
            TimeZoneSidKey='America/Los_Angeles', UserName='standarduser@testorg.com'); 
        
        
        //Insert Account
      Account acct = new Account(Name='TestClassAccount', Customer_Segment__c = 'Hospitals', Calibration_Intervals__c = 'Half year');
      insert acct;
        
        
        //Insert Contact
      Contact con = new Contact(LastName='JasonSendEmail', email='sendemail@toatlanta.com', AccountId=acct.Id);
      insert con;
        
        
        //Insert Responsibility Center
      Responsibility_Center__c rc = new Responsibility_Center__c(Name='ATL');
      insert rc;
        
        //Insert Case
       Case cas = new Case(Status = 'Ready for Email', ContactId=con.id, subject='Periodic Service', AccountId = acct.id,
                          Case_Reason__c = 'Business related', Reason = 'General Enquiry', Responsibility_Center_lookup__c=rc.id, Reminder_Sent__c = false, Letter_Sent__c = false,
                          Follow_up_date__c = datetime.newInstance(2022, 10, 15, 12, 30, 0));
       insert cas; 
        //Insert 2nd Case
       Case cas2 = new Case(Follow_up_Date__c = date.today(), Status = 'Waiting for Customer', ContactId=con.id, subject='Periodic Service', AccountId = acct.id,
                          Case_Reason__c = 'Business related', Reason = 'General Enquiry', Responsibility_Center_lookup__c=rc.id, Reminder_Sent__c = false, Letter_Sent__c = true);
       insert cas2; 
         
        
       //Insert Org-wide
       OrgWideEmailAddress[] addresses = [SELECT Id, Address, DisplayName FROM OrgWideEmailAddress Where DisplayName='Austin'];      
            
    EmailClass.sendEmail();

       Test.startTest();
       System.assertEquals(0, Limits.getEmailInvocations(), 'No emails should be sent');

       EmailClass.sendEmail();

       System.assertEquals(1, Limits.getEmailInvocations(), 'Emails should be sent');
      
       Test.stopTest();
        
     
}
@isTest
    public static void sendEmail1(){
            
        //Insert Profile
      Profile cus = [SELECT Id FROM Profile WHERE Name='DGS - Customer Service'];   
        
        
        //Insert User
      User us = new User(Alias = 'standt', Email='standarduser@testorg.com', 
            EmailEncodingKey='UTF-8', LastName='Testing', LanguageLocaleKey='en_US', 
            LocaleSidKey='en_US', ProfileId = cus.Id, CompanyName = 'E3',
            TimeZoneSidKey='America/Los_Angeles', UserName='standarduser@testorg.com'); 
        
        
        //Insert Account
      Account acct = new Account(Name='TestClassAccount', Customer_Segment__c = 'Hospitals', Calibration_Intervals__c = 'Half year');
      insert acct;
        
        
        //Insert Contact
      Contact con = new Contact(LastName='JasonSendEmail', email='sendemail@toatlanta.com', AccountId=acct.Id);
      insert con;
        
        
        //Insert Responsibility Center
      Responsibility_Center__c rc = new Responsibility_Center__c(Name='AST');
    insert rc;
        
        
        //Insert Case
       Case cas = new Case(Status = 'Ready for Email', ContactId=con.id, subject='Periodic Service', AccountId = acct.id,
                          Case_Reason__c = 'Business related', Reason = 'General Enquiry', Responsibility_Center_lookup__c=rc.id, Reminder_Sent__c = false, Letter_Sent__c = false,
                          Follow_up_date__c = datetime.newInstance(2022, 10, 15, 12, 30, 0));
       insert cas; 
        //Insert 2nd Case
       Case cas2 = new Case(Follow_up_Date__c = date.today(), Status = 'Waiting for Customer', ContactId=con.id, subject='Periodic Service', AccountId = acct.id,
                          Case_Reason__c = 'Business related', Reason = 'General Enquiry', Responsibility_Center_lookup__c=rc.id, Reminder_Sent__c = false, Letter_Sent__c = true);
       insert cas2; 
         
        
       //Insert Org-wide
       OrgWideEmailAddress[] addresses = [SELECT Id, Address, DisplayName FROM OrgWideEmailAddress Where DisplayName='Austin']; 

      EmailClass.sendEmail();     
            
    
       Test.startTest();
       System.assertEquals(0, Limits.getEmailInvocations(), 'No emails should be sent');

       EmailClass.sendEmail();

       System.assertEquals(1, Limits.getEmailInvocations(), 'Emails should be sent');
      
       Test.stopTest();
        
     
}
}

If this helps, Please mark it as best answer.
ApexDevApexDev
Hi Ankaiah, unfortunatelly the same result, only 33% of code is coverage.. :( 
AnkaiahAnkaiah (Salesforce Developers) 
Hi,

Sorry for the late reply.

I will try from my end and get back to you.

Thanks!!