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
Mike Reynolds 6Mike Reynolds 6 

Creating a test class for trigger that updates case with emailMessge data after case insert

Hey, 

I have a simple trigger that puts basic emailMessage data on the related parent case after the parent case is inserted. See the relevant trigger snippet below:
if (Trigger.isAfter)
	{
    List<case> cases=new List<Case>();
	List<EmailMessage> email=[select ToAddress, FromAddress, CcAddress, FromName from EmailMessage where ParentId IN : trigger.newMap.keyset() and Incoming = true and Parent.Number_of_Messages_Received__c = 0];
	map<Id,EmailMessage> mapCaseId_Email = new map<Id,EmailMessage>();
	for(EmailMessage objEmail : email){
		mapCaseId_Email.put(objEmail.ParentId, objEmail); 
		}	
	if(!mapCaseId_Email.isEmpty()){
		for(Case c:Trigger.new){
			if(mapCaseId_Email.containsKey(c.Id)){}
				c.Email_To_Address__c=email[0].ToAddress;
				c.From_Address__c=email[0].FromAddress;
				c.Email_CC_Address__c=email[0].CcAddress;
				c.Email_From_Name__c=email[0].FromName;
				cases.add(c);
			}
		if(cases.size()>0){
			update cases;
			}
		}
	}

The trigger is great, but I can't get good code coverage because I need to insert the case with a related emailMessage record and I have no idea how to make that happen. Here's what I have now:
@isTest
private class caseTriggerAllTestIsAfter {
    static testMethod void isAfterCaseTest(){
        case newCase = new case ();
        	newCase.Email_CC_Address__c = '';
        	newCase.Email_From_Name__c = '';
        	newCase.Email_To_Address__c = '';
        	newCase.From_Address__c = '';
        emailMessage newEmail = new emailMessage();
           	newEmail.FromAddress = 'Email@No.com';
    		newEmail.ToAddress = 'Feedback@no.com';
    		newEmail.CcAddress = 'ccAddress@verify.com';
    		newEmail.FromName = 'Someones Name';
    		newEmail.Incoming = True;
    		newEmail.ParentId = newCase.id;
	insert newCase;
    insert newEmail;
	System.assertEquals ('Email@No.com', newCase.From_Address__c);
   	System.assertEquals ('Feedback@no.com', newCase.Email_To_Address__c);
   	System.assertEquals ('ccAddress@verify.com', newCase.Email_CC_Address__c);
   	System.assertEquals ('Someones Name', newCase.Email_From_Name__c);
    }
}

I know that if I create the case first, i can populate the emailMessage.ParentId as the newCase.id, but at that point, the trigger will have already fired because the case has already been inserted. Does anyone know how to create the child emailMessage first, and then associate it to the case at insert? Any help will be greatly appreciated! 

Thanks, Mike.


 
Amit Chaudhary 8Amit Chaudhary 8
Can you please post your full trigger code with event. Are you sure your trigger is executing on After insert only or After update ?
 
Mike Reynolds 6Mike Reynolds 6
trigger caseTriggerAll on Case (Before Update, After Insert) {
   
if (Trigger.isBefore)
    {   
    List<Case> casesToUpdate = new List<Case>();
    	for (Case c : Trigger.new) {
        	if(c.description != null && c.description.trim() != '') {
            casesToUpdate.add(c);
        	}
    	}
    	HelperCaseDescUpdate.descUpdate(casesToUpdate);
    }

if (Trigger.isAfter)
	{
    List<case> cases=new List<Case>();
	List<EmailMessage> email=[select ToAddress,FromAddress,CcAddress,FromName from EmailMessage 
                              where ParentId IN : trigger.newMap.keyset() and Incoming = true and Parent.Number_of_Messages_Received__c = 0];
	map<Id,EmailMessage> mapCaseId_Email = new map<Id,EmailMessage>();
	for(EmailMessage objEmail : email){
		mapCaseId_Email.put(objEmail.ParentId, objEmail); 
		}	
		for(Case c:Trigger.new){
			if(mapCaseId_Email.containsKey(c.Id)){}
				c.Email_To_Address__c=email[0].ToAddress;
				c.From_Address__c=email[0].FromAddress;
				c.Email_CC_Address__c=email[0].CcAddress;
				c.Email_From_Name__c=email[0].FromName;
				cases.add(c);
			}
		if(cases.size()>0){
			update cases;
			}
	} 
}

Sure thing Amit. Here you go. 
Amit Chaudhary 8Amit Chaudhary 8
Hi Mike Reynolds 6,

There is come issue in your Trigger it self. I dont think so you trigger is excuting After Insert logic as you are updating same record in After Insert event. If that trigger will execute then you will get Read only error
 
Mike Reynolds 6Mike Reynolds 6
I'm not getting an error when i test. What should I change?
Amit Chaudhary 8Amit Chaudhary 8
Try to add debug in your trigger and try to debug it your logic is executing or not
trigger caseTriggerAll on Case (Before Update, After Insert) {
   
if (Trigger.isBefore)
    {   
    List<Case> casesToUpdate = new List<Case>();
    	for (Case c : Trigger.new) {
        	if(c.description != null && c.description.trim() != '') {
            casesToUpdate.add(c);
        	}
    	}
    	HelperCaseDescUpdate.descUpdate(casesToUpdate);
    }

if (Trigger.isAfter)
	{
    List<case> cases=new List<Case>();
	List<EmailMessage> email=[select ToAddress,FromAddress,CcAddress,FromName from EmailMessage 
                              where ParentId IN : trigger.newMap.keyset() and Incoming = true and Parent.Number_of_Messages_Received__c = 0];
	map<Id,EmailMessage> mapCaseId_Email = new map<Id,EmailMessage>();
	for(EmailMessage objEmail : email){
		mapCaseId_Email.put(objEmail.ParentId, objEmail); 
		}	
		for(Case c:Trigger.new){
			if(mapCaseId_Email.containsKey(c.Id)){}
				c.Email_To_Address__c=email[0].ToAddress;
				c.From_Address__c=email[0].FromAddress;
				c.Email_CC_Address__c=email[0].CcAddress;
				c.Email_From_Name__c=email[0].FromName;
				cases.add(c);
				System.debug('------------------------------>Here I am');
			}
		if(cases.size()>0){
			update cases;
				System.debug('------------------------------>Here I am after update');
			}
	} 
}

 
Mike Reynolds 6Mike Reynolds 6
I'm all for debugging, but my desired results are happening. The case fields are being updated. I'd debug to solve a problem, but i don't have one. I'm not sure why i'd do that in this case. I get you're thinking i should have an error but i don't have one. I just need to test this trigger.