You need to sign in to do that
Don't have an account?
sumit d
Test class error:- System.CalloutException: You have uncommitted work pending. Please commit or rollback before calling out
Hi All,
I have created a test class for a class but its failing and giving me error:- System.CalloutException: You have uncommitted work pending. Please commit or rollback before calling out.
my class is given below:-
global without sharing class ZoomService {
@Future(callout=true)
public static void createWebinar(String requestBody, String userId, Id sessionId){
SessionTriggerHelper.runTrigger = false;
String requestEndpoint =ZoomJWTAuthentication.getZoomCredentials().rie__Zoom_URL__c + 'users/'+userId+'/webinars';
String requestMethod = 'POST';
httpResponse res = ZoomCalloutService.postCallout(requestMethod, requestEndpoint, requestBody);
CreateWebinarJSONParser cwp = CreateWebinarJSONParser.parse(res.getBody());
Session__c ss = [Select id, rie__Zoom_URL__c, rie__Meeting_ID__c,
rie__Meeting_Password__c, rie__Session_Type__c
from Session__c
where Id =: sessionId];
ss.rie__Zoom_URL__c = cwp.join_url;
ss.rie__Meeting_ID__c = String.valueOf(cwp.Id);
ss.rie__Meeting_Password__c = cwp.password;
ss.rie__Session_Type__c = 'Webinar';
update ss;
//System.debug(res.getStatusCode());
}
@Future(callout=true)
public static void createUser(String requestBody){
String requestEndpoint = ZoomJWTAuthentication.getZoomCredentials().rie__Zoom_URL__c + 'users';
String requestMethod = 'POST';
Map<String, Object> reqMap = new Map<String, Object>();
reqMap.put('action', 'create');
Map<String, Object> userInfo = new Map<String, Object>();
userInfo.put('email', 'absinghrathore127@gmail.com');
userInfo.put('type', '1');
userInfo.put('first_name', 'abhimanyu');
userInfo.put('last_name', 'singh');
reqMap.put('user_info', userInfo);
String reqBody = JSON.serialize(reqMap);
httpResponse res = ZoomCalloutService.postCallout(requestMethod, requestEndpoint, reqBody);
System.debug(res.getStatus());
System.debug(res.getBody());
}
@Future(callout=true)
public static void listUsers( String emailId, Id zoomUserRecordId){
String requestEndpoint = ZoomJWTAuthentication.getZoomCredentials().rie__Zoom_URL__c + 'users';
String requestMethod = 'GET';
httpResponse res = ZoomCalloutService.getCallout(requestMethod, requestEndpoint);
if(res.getStatusCode() == 200){
GetUsersJSONParser gu = GetUsersJSONParser.parse(res.getBody());
List<GetUsersJSONParser.users> userList= gu.users;
String userId = '';
if(!userList.isEmpty()){
for(GetUsersJSONParser.users u : userList){
if(u.email != Null && u.email == emailId){
userId = u.id;
break;
}
}
rie__Zoom_User__c zoomUser = [Select id from rie__Zoom_User__c where Id =: zoomUserRecordId];
if(userId != Null){
zoomUser.rie__User_Id__c = userId;
}
update zoomUser;
}
}
}
//@Future(callout=true)
webservice static String getMeetingRecording(String meetingId, Id recId){
String requestEndpoint = ZoomJWTAuthentication.getZoomCredentials().rie__Zoom_URL__c + 'meetings/'+meetingId+'/recordings';
String requestMethod = 'GET';
httpResponse res = ZoomCalloutService.getCallout(requestMethod, requestEndpoint);
if(res.getStatusCode() == 200){
GetRecordingJSONParser getRecordingJSONParser = GetRecordingJSONParser.parse(res.getBody());
Session__c ss = [Select id, rie__Zoom_URL__c, rie__Meeting_ID__c,
rie__Zoom_Recording_URL__c
from Session__c
where Id =: recId];
ss.rie__Zoom_Recording_URL__c = getRecordingJSONParser.share_url;
update ss;
return 'Success';
}else{
return 'There is no recording for this meeting ';
}
}
}
my test class is given below:-
@isTest
private class ZoomServiceTest {
public static Integer RESPONSE_CODE = 200;
private class Mock implements HttpCalloutMock {
public HTTPResponse respond(HTTPRequest req) {
HTTPResponse res = new HTTPResponse();
res.setStatusCode(200);
res.setBody('{"topic": "Test Webinar","type": 5,"start_time": "2020-04-20T06:59:00Z","duration": 60,"timezone": "America/Los_Angeles","password": "avfhfgh","agenda": "Test Webinar","recurrence": {"type": 1,"repeat_interval": 1,"end_date_time": "2020-04-20T06:59:00Z"},"settings": {"host_video": true,"panelists_video": true,"practice_session": true,"hd_video": true,"approval_type": 0,"registration_type": "integer",'+
+'"audio": "both","auto_recording": "none","enforce_login": false,"enforce_login_domains": "","alternative_hosts": "","close_registration": true,"show_share_button": true,"allow_multiple_devices": false,"registrants_email_notification": true}}');
return res;
}
}
static testmethod void createWebinarTest() {
Test.setMock(HttpCalloutMock.class, new Mock());
Test.startTest();
rie__Event__c evt = new rie__Event__c();
insert evt;
Session__c ss = new Session__c();
ss.name = 'Test webinar';
ss.rie__Event__c = evt.Id;
insert ss;
ZoomService.createWebinar('','',ss.Id);
//ZoomService.createUser(res);
ZoomService.listUsers('',ss.id);
ZoomService.getMeetingRecording('',ss.id);
Test.stopTest();
}
}
Can anyone help me with this error?
I have created a test class for a class but its failing and giving me error:- System.CalloutException: You have uncommitted work pending. Please commit or rollback before calling out.
my class is given below:-
global without sharing class ZoomService {
@Future(callout=true)
public static void createWebinar(String requestBody, String userId, Id sessionId){
SessionTriggerHelper.runTrigger = false;
String requestEndpoint =ZoomJWTAuthentication.getZoomCredentials().rie__Zoom_URL__c + 'users/'+userId+'/webinars';
String requestMethod = 'POST';
httpResponse res = ZoomCalloutService.postCallout(requestMethod, requestEndpoint, requestBody);
CreateWebinarJSONParser cwp = CreateWebinarJSONParser.parse(res.getBody());
Session__c ss = [Select id, rie__Zoom_URL__c, rie__Meeting_ID__c,
rie__Meeting_Password__c, rie__Session_Type__c
from Session__c
where Id =: sessionId];
ss.rie__Zoom_URL__c = cwp.join_url;
ss.rie__Meeting_ID__c = String.valueOf(cwp.Id);
ss.rie__Meeting_Password__c = cwp.password;
ss.rie__Session_Type__c = 'Webinar';
update ss;
//System.debug(res.getStatusCode());
}
@Future(callout=true)
public static void createUser(String requestBody){
String requestEndpoint = ZoomJWTAuthentication.getZoomCredentials().rie__Zoom_URL__c + 'users';
String requestMethod = 'POST';
Map<String, Object> reqMap = new Map<String, Object>();
reqMap.put('action', 'create');
Map<String, Object> userInfo = new Map<String, Object>();
userInfo.put('email', 'absinghrathore127@gmail.com');
userInfo.put('type', '1');
userInfo.put('first_name', 'abhimanyu');
userInfo.put('last_name', 'singh');
reqMap.put('user_info', userInfo);
String reqBody = JSON.serialize(reqMap);
httpResponse res = ZoomCalloutService.postCallout(requestMethod, requestEndpoint, reqBody);
System.debug(res.getStatus());
System.debug(res.getBody());
}
@Future(callout=true)
public static void listUsers( String emailId, Id zoomUserRecordId){
String requestEndpoint = ZoomJWTAuthentication.getZoomCredentials().rie__Zoom_URL__c + 'users';
String requestMethod = 'GET';
httpResponse res = ZoomCalloutService.getCallout(requestMethod, requestEndpoint);
if(res.getStatusCode() == 200){
GetUsersJSONParser gu = GetUsersJSONParser.parse(res.getBody());
List<GetUsersJSONParser.users> userList= gu.users;
String userId = '';
if(!userList.isEmpty()){
for(GetUsersJSONParser.users u : userList){
if(u.email != Null && u.email == emailId){
userId = u.id;
break;
}
}
rie__Zoom_User__c zoomUser = [Select id from rie__Zoom_User__c where Id =: zoomUserRecordId];
if(userId != Null){
zoomUser.rie__User_Id__c = userId;
}
update zoomUser;
}
}
}
//@Future(callout=true)
webservice static String getMeetingRecording(String meetingId, Id recId){
String requestEndpoint = ZoomJWTAuthentication.getZoomCredentials().rie__Zoom_URL__c + 'meetings/'+meetingId+'/recordings';
String requestMethod = 'GET';
httpResponse res = ZoomCalloutService.getCallout(requestMethod, requestEndpoint);
if(res.getStatusCode() == 200){
GetRecordingJSONParser getRecordingJSONParser = GetRecordingJSONParser.parse(res.getBody());
Session__c ss = [Select id, rie__Zoom_URL__c, rie__Meeting_ID__c,
rie__Zoom_Recording_URL__c
from Session__c
where Id =: recId];
ss.rie__Zoom_Recording_URL__c = getRecordingJSONParser.share_url;
update ss;
return 'Success';
}else{
return 'There is no recording for this meeting ';
}
}
}
my test class is given below:-
@isTest
private class ZoomServiceTest {
public static Integer RESPONSE_CODE = 200;
private class Mock implements HttpCalloutMock {
public HTTPResponse respond(HTTPRequest req) {
HTTPResponse res = new HTTPResponse();
res.setStatusCode(200);
res.setBody('{"topic": "Test Webinar","type": 5,"start_time": "2020-04-20T06:59:00Z","duration": 60,"timezone": "America/Los_Angeles","password": "avfhfgh","agenda": "Test Webinar","recurrence": {"type": 1,"repeat_interval": 1,"end_date_time": "2020-04-20T06:59:00Z"},"settings": {"host_video": true,"panelists_video": true,"practice_session": true,"hd_video": true,"approval_type": 0,"registration_type": "integer",'+
+'"audio": "both","auto_recording": "none","enforce_login": false,"enforce_login_domains": "","alternative_hosts": "","close_registration": true,"show_share_button": true,"allow_multiple_devices": false,"registrants_email_notification": true}}');
return res;
}
}
static testmethod void createWebinarTest() {
Test.setMock(HttpCalloutMock.class, new Mock());
Test.startTest();
rie__Event__c evt = new rie__Event__c();
insert evt;
Session__c ss = new Session__c();
ss.name = 'Test webinar';
ss.rie__Event__c = evt.Id;
insert ss;
ZoomService.createWebinar('','',ss.Id);
//ZoomService.createUser(res);
ZoomService.listUsers('',ss.id);
ZoomService.getMeetingRecording('',ss.id);
Test.stopTest();
}
}
Can anyone help me with this error?
You can't do a web service callout after a DML operation in the same transaction.
For more information follow bellow link
https://salesforce.stackexchange.com/questions/46438/unit-test-you-have-uncommitted-work-pending-please-commit-or-rollback-before-c
I hope you find the above solution helpful. If it does, please mark as Best Answer to help others too.
Thanks and Regards,
Sachin Arora
www.sachinsf.com
Thanks for replying,Can you tell me how can i remove this error and get the coverage?
I would suggest using Test.isRunningTest() as condition over your Update DMLs. For e.g.
It will DML execution in your code when you run the test. So I believe error won't come again.
Please try this and let me know if any issue arises.
Regards
Ayush Sharma
static testmethod void createWebinarTest() {
Test.setMock(HttpCalloutMock.class, new Mock());
rie__Event__c evt = new rie__Event__c();
insert evt;
Session__c ss = new Session__c();
ss.name = 'Test webinar';
ss.rie__Event__c = evt.Id;
insert ss;
Test.startTest();
ZoomService.createWebinar('','',ss.Id);
//ZoomService.createUser(res);
ZoomService.listUsers('',ss.id);
ZoomService.getMeetingRecording('',ss.id);
Test.stopTest();
}
the Test.startTest after the inserts should solve your callout after DML problem.
If this help you mark this answer a correct, it may help others.