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
Thanigai Kumaran BalajiThanigai Kumaran Balaji 

Please help me with test class for updating custom metadata and batch apex

My Apex helper class:
public class ExportObjectHelperclass implements Metadata.DeployCallback {
     public void handleResult(Metadata.DeployResult result, Metadata.DeployCallbackContext context) {
        if (result.status == Metadata.DeployStatus.Succeeded) {
            //Success
            System.debug('Success Result-' + result);
        } else {
            //Failed
            System.debug('Failed Result-' + result);
        }
    }
  //Update Custom Metadata record
    public static void updateCustomMetadata(String metdataName, String recordDevName, String label, Map<String, Object> metadataFieldValueMap){
        Metadata.CustomMetadata cMetadata = new Metadata.CustomMetadata();
        cMetadata.fullName = metdataName + '.' + recordDevName;
        cMetadata.label = label;       
        for(String key : metadataFieldValueMap.keySet()){
            Metadata.CustomMetadataValue cMetadataValue = new Metadata.CustomMetadataValue();
            cMetadataValue.Field = key;
            cMetadataValue.Value = metadataFieldValueMap.get(key); 
            cMetadata.values.add(cMetadataValue);
        }
       Metadata.DeployContainer mdContainer = new Metadata.DeployContainer();
        mdContainer.addMetadata(cMetadata);
        ExportObjectHelperclass callback = new ExportObjectHelperclass();
        Id jobId = Metadata.Operations.enqueueDeployment(mdContainer, callback);
    }
  public static String Feildnamefromuser;
        public static Boolean fullbackup;
        public static Boolean partialbackup;
           public Static String Objectname;    
        public Static String Email;
        public Static Boolean Backupbetweenintervals;
        public Static Datetime Backupstartingfrom;
        public Static Datetime BackupEnddatetime;
 @InvocableMethod (Label ='call batch apex with metadata')
    public static void callbatch(List<FlowInputs> request) {
        Map<String, Object> metadataFieldValueMap = new Map<String, Object>();
        fullbackup = request[0].Full_Object_Backup;
           Feildnamefromuser = request[0].Enter_Feild_API_name_with_inbetween;
        partialbackup = request[0].Partial;
          Objectname = request[0].Objectname;
        Email = request[0].Email;
        Backupbetweenintervals = request[0].Backupbetweenintervals;
        Backupstartingfrom = request[0].Backupstartingfrom;
        BackupEnddatetime = request[0].BackupEnddatetime;
        metadataFieldValueMap.put('Backup_between_interval__c', Backupbetweenintervals);
        metadataFieldValueMap.put('Full_backup__c', fullbackup);
        metadataFieldValueMap.put('Backup_from__c', Backupstartingfrom);
        metadataFieldValueMap.put('Backup_till__c', BackupEnddatetime);
        metadataFieldValueMap.put('Object_Name__c', Objectname);
        metadataFieldValueMap.put('Email_ID__c', Email);
        metadataFieldValueMap.put('Field_backup__c', partialbackup);
        metadataFieldValueMap.put('Full_backup__c', Feildnamefromuser);
        metadataFieldValueMap.put('Field_name_Separated_with__c', Feildnamefromuser);  ExportObjectHelperclass.updateCustomMetadata('ExportCSV__mdt','Export_Object_as_CSV', 'Export Object as CSV',metadataFieldValueMap);
        //Id batchInstanceId = Database.executeBatch(new exportobascsv());
        ExportObjasCSV objbatch = new ExportObjasCSV();
         Database.executeBatch(objbatch, 200); 
    }
    public class FlowInputs{
      @InvocableVariable
        public Boolean Full_Object_Backup;
        @InvocableVariable
        public Boolean Partial;
        @InvocableVariable
        public String Enter_Feild_API_name_with_inbetween;
         @InvocableVariable
        public String Objectname;    
         @InvocableVariable
        public String Email;
         @InvocableVariable
        public Boolean Backupbetweenintervals;
        @InvocableVariable
        public Datetime Backupstartingfrom;
        @InvocableVariable
        public Datetime BackupEnddatetime;
    }   
}


Batch class:
global class ExportObjAsCSV implements Database.Batchable <SObject>, Database.Stateful {
        
global Database.QueryLocator start (Database.BatchableContext bc)
{
ExportCSV__mdt eo = [Select Object_Name__c,Backup_between_interval__c,Field_backup__c,Full_backup__c,Field_name_Separated_with__c,Backup_from__c,Backup_till__c from ExportCSV__mdt where label = 'Export Object as CSV'];
Datetime backupfrom = eo.Backup_from__c;
Datetime backuptill = eo.Backup_till__c;   
String Objectname = eo.Object_Name__c;
Map<String, Schema.SObjectType> schemaMap = Schema.getGlobalDescribe();
Map<String, Schema.SObjectField> fieldMap = schemaMap.get(Objectname).getDescribe().fields.getMap();
    
// query to return Object 
String query = 'Select ';       
for(String fieldName : fieldMap.keyset() )
    {
        query += fieldname+',';   
        }
query = query.removeEnd(',');
    if(eo.Backup_between_interval__c == true)
    {
    String newbackupfrom = backupfrom.format('yyyy-MM-dd\'T\'hh:mm:ss\'Z\'');
    String newbackuptill = backuptill.format('yyyy-MM-dd\'T\'hh:mm:ss\'Z\'');   
     if(!test.isRunningTest()){
        query += ' from ' +Objectname+ ' where lastmodifieddate >= ' +newbackupfrom+ ' and lastmodifieddate <= ' +newbackuptill+ '';
     }else{
            query += ' from ' +Objectname+ '';
     }  }
    else {
        if(!test.isRunningTest()){
        query += ' from ' +Objectname+ ' where lastmodifieddate = yesterday';
     }else{
            query += ' from ' +Objectname+ '';
     } 
    }
         return Database.getQueryLocator(query);
}
global static void execute(Database.BatchableContext bc, List<sobject> OppList)
   {  
 // Implementing Try catch for error handling
       try{      
    ExportCSV__mdt eo = [Select Object_Name__c,Field_backup__c,Email_ID__c,Full_backup__c,Field_name_Separated_with__c,Backup_from__c,Backup_till__c from ExportCSV__mdt where label = 'Export Object as CSV'];
    String Objectname = eo.Object_Name__c;
    String ObjectID = eo.ID;
    String EmailID = eo.Email_ID__c;
           
    String generatedCSVFile = '';
        if(eo.Full_backup__c == true)
    {
Map<String, Schema.SObjectType> schemaMap = Schema.getGlobalDescribe();
Map<String, Schema.SObjectField> fieldMap = schemaMap.get(Objectname).getDescribe().fields.getMap();
        for(String fieldName : fieldMap.keyset() )
    {
        generatedCSVFile += Fieldname +',';     
        }
generatedCSVFile = generatedCSVFile.removeEnd(',');
generatedCSVFile = generatedCSVFile + '\n'; 
for(sObject company: OppList){
  for(String fieldName : fieldMap.keyset() )
    {
        generatedCSVFile += company.get(fieldName)+ ',';     
        }
        generatedCSVFile = generatedCSVFile.removeEnd(',');
        generatedCSVFile = generatedCSVFile + '\n'; 

    }else if(eo.Field_backup__c == true )
    {
        
//Split the text in Feild name as separate lines
String Fieldfromuser = (string) eo.Field_name_Separated_with__c;
list<String> eachline = Fieldfromuser.split(' ');
for(Integer i = 0; i < eachline.size(); i++)
{
        generatedCSVFile += eachline[i] +',';            
}
generatedCSVFile = generatedCSVFile.removeEnd(',');
generatedCSVFile = generatedCSVFile + '\n'; 
for(sobject company: OppList){
 for(Integer i = 0; i < eachline.size(); i++)
{
        generatedCSVFile += company.get(eachline[i])+ ',';     
        }
    generatedCSVFile = generatedCSVFile.removeEnd(',');
    generatedCSVFile = generatedCSVFile + '\n'; 

    }

//send email with generated csv file
Messaging.EmailFileAttachment csvAttachment = new Messaging.EmailFileAttachment();
Blob csvBlob = blob.valueOf(generatedCSVFile);
String csvName = '' +Objectname+ ' backup.csv';
csvAttachment.setFileName(csvName);
csvAttachment.setBody(csvBlob);
Messaging.SingleEmailMessage email = new Messaging.SingleEmailMessage();
String[] toAddresses = new String[]{EmailID};
String subject = '' +Objectname+ '  backup';
email.setSubject(subject);
email.setToAddresses(toAddresses);
email.setPlainTextBody('Please find the Object backup file attached to the mail');
email.setFileAttachments(new Messaging.EmailFileAttachment[]{csvAttachment});
Messaging.SendEmailResult[] r = Messaging.sendEmail(new Messaging.SingleEmailMessage[]{email});
           
//Attach the CSV to ExportObject attachments
Attachment attachment = new attachment();
attachment.Body = blob.valueOf(generatedCSVFile);
attachment.Name = '' +Objectname+ ' backup.csv';
attachment.ParentId = ObjectID;
insert attachment;           
       }
       
       catch(exception e)
       {
            system.debug('Exception Caught:'+e.getmessage());
       }
       }
    global void finish(Database.BatchableContext bc)
    {
    }  
}
AnkaiahAnkaiah (Salesforce Developers) 
Hi Thanigai,

Refer the below links will help you to proceed further on your test class.

https://www.infallibletechie.com/2018/12/code-coverage-for-custom-metadata-type.html
https://developer.salesforce.com/forums/?id=906F0000000kD8eIAE

Thanks!!