You need to sign in to do that
Don't have an account?
Raja.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
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
KevinP
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)