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
sumit dsumit d 

test class of Batch on email messages

Hi All,
i am trying to create test class for following batch:-
public without sharing class BatchDeleteAndMergeDuplicateCases implements Database.Batchable<sObject> {
    
    public string subjectToFind ;
    public Set<Id> duplicateCaseIds;
    public Case parentCase;
 
    public BatchDeleteAndMergeDuplicateCases(Set<Id> duplicateCaseIds, Case parentCase){
        this.duplicateCaseIds = duplicateCaseIds;
        this.parentCase = parentCase;
    }
     public BatchDeleteAndMergeDuplicateCases(String subjectToFind, Set<Id> duplicateCaseIds, Case parentCase){
        this.subjectToFind = subjectToFind;
        this.duplicateCaseIds = duplicateCaseIds;
        this.parentCase = parentCase;
    }
     public static void run( Set<Id> CaseIds ) {
        Set<String> duplicateSubjectMetaData = new Set<String>();
        Set<String> duplicateEmailMetaData = new Set<String>();
        for(Duplicate_Merge_Rule_Exception__mdt duplicateMetaData : [SELECT Active__c, Subject__c 
                                                                     FROM Duplicate_Merge_Rule_Exception__mdt
                                                                     where Active__c =: True]){
            if(duplicateMetaData.Type__c == 'Email'){
               duplicateEmailMetaData.add(duplicateMetaData.Email__c);
            }else if(duplicateMetaData.Type__c == 'Subject'){                                                        
               duplicateSubjectMetaData.add(duplicateMetaData.Subject__c);
            }                                                                
        }
        List<Case> CaseRecords =  [Select id, Subject, 
                                   Origin, DuplicateOf__c,
                                   SuppliedEmail, Status,
                                   Duplicate_Count__c, CaseNumber,
                                   Description
                                   from case 
                                   where Id IN: CaseIds 
                                   AND origin != Null AND 
                                   origin =: 'Email' AND
                                   SuppliedEmail != Null AND 
                                   Subject != Null
                                   AND SuppliedEmail NOT IN: duplicateEmailMetaData 
                                   AND DuplicateOf__c =: Null
                                   ORDER By LastModifiedDate DESC];
        //executeHelper( CaseRecords , parentCase);                  
    }
     public Database.QueryLocator start(Database.BatchableContext BC){
        Set<String> duplicateSubjectMetaData = new Set<String>();
        Set<String> duplicateEmailMetaData = new Set<String>();
        for(Duplicate_Merge_Rule_Exception__mdt duplicateMetaData : [SELECT Active__c, Subject__c, Type__c, Email__c 
                                                                     FROM Duplicate_Merge_Rule_Exception__mdt
                                                                     where Active__c =: True]){
        
        
            if(duplicateMetaData.Type__c == 'Email'){
               duplicateEmailMetaData.add(duplicateMetaData.Email__c);
            }else if(duplicateMetaData.Type__c == 'Subject'){                                                        
                duplicateSubjectMetaData.add(duplicateMetaData.Subject__c);
            }                                                                
        }
         if(subjectToFind != Null && subjectToFind != ''){
            return Database.getQueryLocator([SELECT id, Subject, Origin,SuppliedEmail,
                                             Status, DuplicateOf__c, Description,
                                             Duplicate_Count__c, CaseNumber
                                             FROM Case
                                             WHERE Subject != null
                                             AND Subject LIKE: '%'+ subjectToFind + '%'
                                             AND Origin != Null
                                             And Origin = 'Email'
                                             AND SuppliedEmail != Null
                                             AND Subject NOT IN: duplicateSubjectMetaData
                                             AND SuppliedEmail NOT IN: duplicateEmailMetaData 
                                             AND DuplicateOf__c =: Null
                                             ORDER By CreatedDate DESC 
                                            ]);
            
            
        }
        else if(duplicateCaseIds != null && parentCase.Id != null ) {
            return Database.getQueryLocator([SELECT id, Subject, Origin,SuppliedEmail,
                                             Status, DuplicateOf__c, Description,
                                             Duplicate_Count__c, CaseNumber
                                             FROM Case
                                             WHERE Subject != null
                                             AND Origin != Null
                                             And Origin = 'Email'
                                             AND SuppliedEmail != Null
                                             AND Subject NOT IN: duplicateSubjectMetaData
                                             AND SuppliedEmail NOT IN: duplicateEmailMetaData 
                                             AND DuplicateOf__c =: Null
                                             AND Id in :duplicateCaseIds 
                                             ORDER By CreatedDate DESC 
                                            ]);
        }
        else {
             return Database.getQueryLocator([SELECT id, Subject, Origin,SuppliedEmail,
                                             Status, DuplicateOf__c, Description,
                                             Duplicate_Count__c, CaseNumber
                                             FROM Case
                                             WHERE Subject != null
                                             AND Origin != Null
                                             And Origin = 'Email'
                                             AND SuppliedEmail != Null
                                             AND Subject NOT IN: duplicateSubjectMetaData
                                             AND SuppliedEmail NOT IN: duplicateEmailMetaData 
                                             AND DuplicateOf__c =: Null
                                             ORDER By CreatedDate DESC 
                                            ]);
        } 
    }
     public void execute(Database.BatchableContext BC, List<Case> cases){
        executeHelper(cases, parentCase);
    }
    
    public void finish(Database.BatchableContext BC){
        
    }
     public static void executeHelper(List<Case> caseRecords, Case parentCase){
        
        EmailMessageTriggerHelper.runTrigger = False;
        CaseTriggerHelper.runTrigger = False;
        
        List<EmailMessage> emList = new List<EmailMessage>();
        
        String objectName = 'EmailMessage';  // modify as needed
        String soql = getCreatableFieldsSOQL('EmailMessage', 'ParentId IN :caseRecords');
        emList = database.query(soql);
        
        List<EmailMessage> emListToInsert = new List<EmailMessage>();
        if(emList.size() > 0){
           for(EmailMessage em : emList){
              EmailMessage emToInsert = em.clone(False); 
              emToInsert.ParentId = parentCase.Id; 
               emToInsert.CreatedDate = em.CreatedDate;
               emToInsert.LastModifiedDate = em.LastModifiedDate;
               emToInsert.CreatedById = em.CreatedById;
               emToInsert.LastModifiedById = em.LastModifiedById;
               emListToInsert.add(emToInsert);
           } 
        }
         if(emListToInsert.size() > 0){
            insert emListToInsert;
            
            // merge log
            List<Merge_Log__c> mlList = new List<Merge_Log__c>();
            Set<Id> deleteCaseIds = new Set<Id>();
            for(Case caseObj : caseRecords){
                Merge_Log__c ml = new Merge_Log__c();
                ml.Case__c = caseObj.Id;
                ml.MergedWith__c = caseObj.DuplicateOf__c;
                ml.Case_Details__c = JSON.serializePretty(caseObj);
                ml.Merge_Details__c = '';
                mlList.add(ml);
            }
            if(mlList.size() > 0){
                insert mlList;
            }
             //delete duplicate cases
            delete caseRecords; 
        }
     }
    
    // Returns a dynamic SOQL statement for the whole object, includes only creatable fields since we will be inserting a cloned result of this query
    public static string getCreatableFieldsSOQL(String objectName, String whereClause){
         
        String selects = '';
         
        if (whereClause == null || whereClause == ''){ return null; }
         
        // Get a map of field name and field token
        Map<String, Schema.SObjectField> fMap = Schema.getGlobalDescribe().get(objectName.toLowerCase()).getDescribe().Fields.getMap();
        list<string> selectFields = new list<string>();
         
        if (fMap != null){
            for (Schema.SObjectField ft : fMap.values()){ // loop through all field tokens (ft)
                Schema.DescribeFieldResult fd = ft.getDescribe(); // describe each field (fd)
                if (fd.isCreateable() && fd.getName() != 'ValidatedFromAddress'){ // field is creatable
                    selectFields.add(fd.getName());
                }
            }
        }
         
        if (!selectFields.isEmpty()){
            for (string s:selectFields){
                selects += s + ',';
            }
            if (selects.endsWith(',')){selects = selects.substring(0,selects.lastIndexOf(','));}
             
        }
         
        return 'SELECT ' + selects + ' FROM ' + objectName + ' WHERE ' + whereClause;
         
    }
     
}
how to create the test class for it?
Any suggestions?