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
Raja.PRaja.P 

Test Class Issue for a Class contains REST API Call and dml operation based on the Response

Hi folks,
Error: CalloutException: You have uncommitted work pending. Please commit or rollback before calling out
I am getting this error ,for test class :my logic is I am using restapi calls to make a callout and then based on the Response I am doing theDML operations in the salesforce
I have created the mock response also and used test.setmock  method but still my test class is failing  i wondering how to cover my code 
Class :
global class EZRE_MCEmailToAssignmentOwner
{
    public static Mailchimp_Details__c MCDtls{get;set;} 
    public static Map<String, String> mapCmpgnIdNme{get;set;} 
    public static Map<String,String> mapCmpgnIdFrmEml{get;set;}
    public static Map<String, Set<String>> mapCmpgnCndt{get;set;} 
    public static Set<String> setCmpgnId{get;set;}
    public static Set<String> setEmlAddrss{get;set;}
    public static MCCandidateList__c objInsrtMCCndt{get;set;}
      public static Set<String> setBouncedEmlAddrss{get;set;}
      public static HTTPResponse httpres{get;set;}
    ///OBJECTIVE
    ///getting the lsit of emails and the list of bounced and unsubscribed and opened emails  from mailchimp and update theresponse 
    ///OBJECTIVE
   @future (callout=true) 
    public static void sendMailToAssgnmntOwnr()
    {       
        getMCCmpngLst();
        getMCCampaignOpenList();  
        updateUnsubCand();
        updateBouncedCand();            
    }
    public static void getMCCmpngLst()
    {
        DateTime d = DateTime.Now().addDays(-5);       
        System.debug('d========================='+d);
        MCDtls = new Mailchimp_Details__c();
        MCDtls = EZRE_Data_Utility.getMCDtls('MCAccount');       
        Http h = new Http();        
        HttpRequest reqst = new HttpRequest();  
        reqst.setMethod('POST');       
        reqst.setBody('{"apikey": "'+MCDtls.API_Key__c+'","filters": {"status": "sent","sendtime_start": "'+d+'" },"sort_field": "create_time","sort_dir": "DESC"}');
        reqst.setEndpoint('https://'+MCDtls.Domain_Name__c+'.api.mailchimp.com/2.0/campaigns/list.JSON');
        HttpResponse res = new HttpResponse();
        res = h.send(reqst);              
            system.debug(':: Response for getting  campaign list:: ********'+res.getbody()); 
            mapCmpgnIdNme = new Map<String, String>();
            mapCmpgnIdFrmEml = new Map<String,String>();
            setCmpgnId = new Set<String>();
            Map<String, Object> m = (Map<String, Object>) JSON.deserializeUntyped(res.getBody());
            List<Object> data = (List<Object>) m.get('data');        
            Map<String, Object> mapPgeDtls = new Map<String, Object>();           
            for (Object o : data) 
            { 
                mapPgeDtls = (Map<String, Object>) o;
                System.debug('>>> ' + mapPgeDtls);
                if((string.valueOf(mapPgeDtls.get('status'))) == 'sent')
                 {
                    mapCmpgnIdNme.put(string.valueOf(mapPgeDtls.get('id')),string.valueOf(mapPgeDtls.get('title')));
                    setCmpgnId.add(string.valueOf(mapPgeDtls.get('id')));  
                    mapCmpgnIdFrmEml.put(string.valueOf(mapPgeDtls.get('id')),string.valueOf(mapPgeDtls.get('from_email')));
                 } } 
         setEmlAddrss = new Set<String>(); 
        setBouncedEmlAddrss = new Set<String>(); 
        for(String str: setCmpgnId )
        {
            getMCCandUnsubscribesList(str);
            getMCCandBounceMessageList(str);
        } }
    
   public static void getMCCampaignOpenList()    
    {  
        MCDtls = new Mailchimp_Details__c();
        mapCmpgnCndt = new Map<String, Set<String>>();
        MCDtls = EZRE_Data_Utility.getMCDtls('MCAccount');       
        Http h = new Http();        
        HttpRequest reqst = new HttpRequest();  
        reqst.setMethod('POST');              
        reqst.setEndpoint('https://'+MCDtls.Domain_Name__c+'.api.mailchimp.com/2.0/reports/opened.JSON');
            for(String strCmpgn :setCmpgnId)  {         
                reqst.setBody('{"apikey": "'+MCDtls.API_Key__c+'","cid":"'+strCmpgn+'"}');        
                HttpResponse res = h.send(reqst);        
                system.debug(':: Response for getting  campaign open list:: ********'+res.getbody());
                setEmlAddrss = new Set<String>(); 
                JSONParser parser = JSON.createParser(res.getBody());
                while (parser.nextToken() != null) {
                    if ((parser.getCurrentToken() == JSONToken.FIELD_NAME)&& (parser.getText() == 'Email')) {
                        parser.nextToken();                     
                        setEmlAddrss.add(parser.getText());
                    } }
                mapCmpgnCndt.put(strCmpgn,setEmlAddrss); }      
        upsrtMCCndtLst(mapCmpgnCndt);       
        sendEmail(mapCmpgnCndt); }             
    public static void upsrtMCCndtLst(Map<String, Set<String>> mapCndtCmpgn)
    {
        Set<String> setAllEmlAddrss;
        Set<String> setExstngEmlAddrss;
        List<MCCandidateList__c> lstToUpdate = new List<MCCandidateList__c>();
        List<MCCandidateList__c> lstToUpsert = new List<MCCandidateList__c>();
        System.debug('Map Size******************'+mapCndtCmpgn.KeySet());
        for(String str : mapCndtCmpgn.KeySet())
        {
            setAllEmlAddrss = new Set<String>();
            setExstngEmlAddrss = new Set<String>();
            lstToUpdate = [Select Id, Campaign_Id__c, Candidate_Email__c, IsNew__c from MCCandidateList__c 
                                    where (Campaign_Id__c = : str) AND (Candidate_Email__c IN : mapCndtCmpgn.get(str))];
            setAllEmlAddrss = mapCndtCmpgn.get(str);
            for(MCCandidateList__c objCndt : lstToUpdate ) {
                setExstngEmlAddrss.add(objCndt.Candidate_Email__c); 
            }
            if(setExstngEmlAddrss.size() != 0 || !setExstngEmlAddrss.isEmpty()) {
                setAllEmlAddrss.removeAll(setExstngEmlAddrss);
            }
            for(String strNwEmlAddrss : setAllEmlAddrss)
            {           
                MCCandidateList__c objToInsrt= new MCCandidateList__c();
                objToInsrt.Campaign_Id__c = str;
                objToInsrt.Campaign_Name__c = mapCmpgnIdNme.get(str);
                lstToUpsert.add(objToInsrt); }
            for(MCCandidateList__c obj: lstToUpdate)
            {
                MCCandidateList__c updtCndt = new MCCandidateList__c(Id = obj.Id);
                updtCndt.IsNew__c = False;
                lstToUpsert.add(updtCndt);
            }
          }
        upsert lstToUpsert; }
    private static string createEmailBody(List<MCCandidateList__c> lstCmpgnMails)
    {
        //logic building an email
        return strHtmlBody;
    }
    private static void sendEmail(Map<String, Set<String>> mapCmpgnIdSet)
    {
        //list of email ids 
    }
 public static void getMCCandUnsubscribesList( string campId)    
    {  
        MCDtls = new Mailchimp_Details__c();
        //mapCmpgnCndt = new Map<String, Set<String>>();
        MCDtls = EZRE_Data_Utility.getMCDtls('MCAccount');       
        Http h = new Http();        
        HttpRequest reqst = new HttpRequest();  
        reqst.setMethod('POST');
        reqst.setBody('{"apikey": "'+MCDtls.API_Key__c+'","cid":"'+campId+'"}');        
        reqst.setEndpoint('https://'+MCDtls.Domain_Name__c+'.api.mailchimp.com/2.0/reports/unsubscribes.JSON');
            if(!Test.isRunningTest()) {       
                HttpResponse res = h.send(reqst);       
                JSONParser parser = JSON.createParser(res.getBody());
                while (parser.nextToken() != null) {
                    if ((parser.getCurrentToken() == JSONToken.FIELD_NAME)&& (parser.getText() == 'Email')) {
                        parser.nextToken();                     
                        setEmlAddrss.add(parser.getText()); }}}}
    public static void getMCCandBounceMessageList( string campId)    { 
        MCDtls = new Mailchimp_Details__c();
        //mapCmpgnCndt = new Map<String, Set<String>>();
        MCDtls = EZRE_Data_Utility.getMCDtls('MCAccount');       
        Http h = new Http();        
        HttpRequest reqst = new HttpRequest();  
        reqst.setMethod('POST');
        reqst.setBody('{"apikey": "'+MCDtls.API_Key__c+'","cid":"'+campId+'"}');        
        reqst.setEndpoint('https://'+MCDtls.Domain_Name__c+'.api.mailchimp.com/2.0/reports/bounce-messages.JSON');       
                HttpResponse res = h.send(reqst);        
                JSONParser parser = JSON.createParser(res.getBody());
                while (parser.nextToken() != null) {
                    if ((parser.getCurrentToken() == JSONToken.FIELD_NAME)&& (parser.getText() == 'Email')) {
                        parser.nextToken();                     
                        setBouncedEmlAddrss.add(parser.getText()); } } } 
    public static void updateUnsubCand() {
        list<candidate__c> upcandUnsub = new list<candidate__c>();
        list<candidate__c> lstcand = [select id,Name,Email__c,email_status__c from candidate__c where Email__c IN: setEmlAddrss];
               system.debug('canidateemailmatching list:: ********'+lstcand);
               if(lstcand.size()>0){
                   for(candidate__c Finalcandlist :lstcand) {
                       Finalcandlist.email_status__c = 'Unsubscribed';
                       upcandUnsub.add(Finalcandlist);}
                   update upcandUnsub;} }
    public static void updateBouncedCand()
    {
        list<candidate__c> upcandBounced = new list<candidate__c>();
        list<candidate__c> lstcand = [select id,Name,Email__c,email_status__c from candidate__c where Email__c IN: setBouncedEmlAddrss];
               system.debug('canidateemailmatching list:: ********'+lstcand);
               if(lstcand.size()>0){
                   for(candidate__c Finalcandlist :lstcand){
                       Finalcandlist.email_status__c = 'Bounced';
                       upcandBounced.add(Finalcandlist);}
                   update upcandBounced; } } }


any help will be high appreciable 
thank you so much guys in advance
KevinPKevinP
This might help you http://codefriar.com/2013/09/25/so-you-want-to-mix-dml-inserts-and-make-callouts-in/ (http://codefriar.com/2013/09/25/so-you-want-to-mix-dml-inserts-and-make-callouts-in/" target="_blank)