You need to sign in to do that
Don't have an account?
K Roy
Need Help with Lead Convert Test Class
-----------------------
Class
-----------------------
@RestResource(urlMapping='/leadconvert/*')
global with sharing class RestLeadConvert {
public static final Integer StatusCodeOK = 200;
public static final Integer StatusCodeBadRequest = 400;
public static final Integer StatusCodeInternalServerError = 500;
public static String DEFAULT_CONVERTED_STATUS = [SELECT Id, MasterLabel FROM LeadStatus WHERE IsConverted=true limit 1].MasterLabel;
public class BadRequestException extends Exception {}
// Represents a REST response
class ResponseObject {
String message;
String code;
Database.LeadConvertResult lead_convert_result;
public Blob blob() {
return Blob.valueOf(JSON.serialize(this));
}
public ResponseObject(String message, String code, Database.LeadConvertResult lcr) {
this(message, code);
this.lead_convert_result = lcr;
}
public ResponseObject(String message, String code) {
this.message = message;
this.code = code;
}
}
@HttpPost
global static void doPost() {
RestContext.response.addHeader('Content-Type', 'application/json');
Database.LeadConvertResult lcr ;
try {
Database.LeadConvert lc = parseRequest(RestContext.request);
lc.setLeadId(parseTrailingLeadId(RestContext.request.requestURI));
lcr = Database.convertLead(lc);
}
catch (Exception e) {
RestContext.response.responseBody = new ResponseObject(e.getMessage(), exceptionTypeNameToCode(e)).blob();
if (e.getTypeName() == 'RestLeadConvert.BadRequestException') {
RestContext.response.statusCode = StatusCodeBadRequest;
}
else {
// any other exception is unexpected; dump the exception and a stack trace to help debug it in production
system.debug(e);
system.debug(e.getStackTraceString());
RestContext.response.statusCode = StatusCodeInternalServerError;
}
return;
}
if (lcr.isSuccess()) {
RestContext.response.responseBody = new ResponseObject('Success', 'success', lcr).blob();
RestContext.response.statusCode = StatusCodeOK;
}
else {
RestContext.response.responseBody = new ResponseObject('Fail', 'see lead_convert_result', lcr).blob();
RestContext.response.statusCode = StatusCodeInternalServerError;
}
}
// Given an Exception typename like 'RestLeadConvert.BadRequestException', return 'BadRequestException'
static String exceptionTypeNameToCode(Exception e) {
String[] qualifiedName = e.getTypeName().split('\\.');
return qualifiedName[qualifiedName.size()-1];
}
// completely parse the request body into an instance of LeadConvertBody
// throw exception if it fails to parse in any way
@TestVisible static Database.LeadConvert parseRequest(RestRequest request) {
if (request.requestBody == null) {
return createDefaultLeadConvert();
}
try {
return (Database.LeadConvert)JSON.deserialize(request.requestBody.toString(), Database.LeadConvert.class);
}
catch(Exception e) {
throw new BadRequestException('Failed to deserialize json body (%)'.replace('%', e.getMessage()));
}
}
// this determines the behavior for a POST with no request body
static Database.LeadConvert createDefaultLeadConvert() {
Database.LeadConvert lc = new Database.LeadConvert();
lc.setConvertedStatus(DEFAULT_CONVERTED_STATUS);
return lc;
}
// get the LeadId from the requestURI and throw an exception if impossible
static Id parseTrailingLeadId(String requestURI) {
String leadId = getTrailingLeadId(requestURI);
if (leadId == null) {
throw new BadRequestException('requestURI does not have a valid trailing Lead Id');
}
return leadId;
}
// get the LeadId from the requestURI and return null if impossible
@TestVisible
static Id getTrailingLeadId(String requestURI) {
Integer lastSlashIndex = requestURI.lastIndexOf('/');
if (lastSlashIndex != -1) {
String leadId = requestURI.substring(lastSlashIndex+1);
if (leadId instanceOf Id && ((ID)leadId).getsobjecttype() == Schema.Lead.getSObjectType()) {
return (Id)leadId;
}
}
return null;
}
}
-----------------------------------
Test Class
-----------------------------------
@isTest
public class RestLeadConvertTest{
@isTest static void testDoPost()
{
Lead lead = new Lead (FirstName = 'John', LastName = 'Test', Company = 'Test Company' , Email = 'johntest@xyz.com');
insert lead;
RestRequest req = new RestRequest();
req.addHeader('Content-Type', 'application/json');
req.requestURI = '/services/apexrest/leadconvert/' + lead.Id;
req.httpMethod = 'POST';
RestContext.request = req;
RestLeadConvert.doPost();
System.assertEquals(RestLeadConvert.StatusCodeOK, RestContext.response.statusCode,'The Response is 200');
RestRequest req2 = new RestRequest();
req2.addHeader('Content-Type', 'application/json');
req2.requestURI = '/services/apexrest/leadconvert/invalidLeadId';
req2.httpMethod = 'POST';
RestContext.request = req2;
RestLeadConvert.doPost();
System.assertEquals(RestLeadConvert.StatusCodeBadRequest, RestContext.response.statusCode,'The Response is 400');
}
}
Class
-----------------------
@RestResource(urlMapping='/leadconvert/*')
global with sharing class RestLeadConvert {
public static final Integer StatusCodeOK = 200;
public static final Integer StatusCodeBadRequest = 400;
public static final Integer StatusCodeInternalServerError = 500;
public static String DEFAULT_CONVERTED_STATUS = [SELECT Id, MasterLabel FROM LeadStatus WHERE IsConverted=true limit 1].MasterLabel;
public class BadRequestException extends Exception {}
// Represents a REST response
class ResponseObject {
String message;
String code;
Database.LeadConvertResult lead_convert_result;
public Blob blob() {
return Blob.valueOf(JSON.serialize(this));
}
public ResponseObject(String message, String code, Database.LeadConvertResult lcr) {
this(message, code);
this.lead_convert_result = lcr;
}
public ResponseObject(String message, String code) {
this.message = message;
this.code = code;
}
}
@HttpPost
global static void doPost() {
RestContext.response.addHeader('Content-Type', 'application/json');
Database.LeadConvertResult lcr ;
try {
Database.LeadConvert lc = parseRequest(RestContext.request);
lc.setLeadId(parseTrailingLeadId(RestContext.request.requestURI));
lcr = Database.convertLead(lc);
}
catch (Exception e) {
RestContext.response.responseBody = new ResponseObject(e.getMessage(), exceptionTypeNameToCode(e)).blob();
if (e.getTypeName() == 'RestLeadConvert.BadRequestException') {
RestContext.response.statusCode = StatusCodeBadRequest;
}
else {
// any other exception is unexpected; dump the exception and a stack trace to help debug it in production
system.debug(e);
system.debug(e.getStackTraceString());
RestContext.response.statusCode = StatusCodeInternalServerError;
}
return;
}
if (lcr.isSuccess()) {
RestContext.response.responseBody = new ResponseObject('Success', 'success', lcr).blob();
RestContext.response.statusCode = StatusCodeOK;
}
else {
RestContext.response.responseBody = new ResponseObject('Fail', 'see lead_convert_result', lcr).blob();
RestContext.response.statusCode = StatusCodeInternalServerError;
}
}
// Given an Exception typename like 'RestLeadConvert.BadRequestException', return 'BadRequestException'
static String exceptionTypeNameToCode(Exception e) {
String[] qualifiedName = e.getTypeName().split('\\.');
return qualifiedName[qualifiedName.size()-1];
}
// completely parse the request body into an instance of LeadConvertBody
// throw exception if it fails to parse in any way
@TestVisible static Database.LeadConvert parseRequest(RestRequest request) {
if (request.requestBody == null) {
return createDefaultLeadConvert();
}
try {
return (Database.LeadConvert)JSON.deserialize(request.requestBody.toString(), Database.LeadConvert.class);
}
catch(Exception e) {
throw new BadRequestException('Failed to deserialize json body (%)'.replace('%', e.getMessage()));
}
}
// this determines the behavior for a POST with no request body
static Database.LeadConvert createDefaultLeadConvert() {
Database.LeadConvert lc = new Database.LeadConvert();
lc.setConvertedStatus(DEFAULT_CONVERTED_STATUS);
return lc;
}
// get the LeadId from the requestURI and throw an exception if impossible
static Id parseTrailingLeadId(String requestURI) {
String leadId = getTrailingLeadId(requestURI);
if (leadId == null) {
throw new BadRequestException('requestURI does not have a valid trailing Lead Id');
}
return leadId;
}
// get the LeadId from the requestURI and return null if impossible
@TestVisible
static Id getTrailingLeadId(String requestURI) {
Integer lastSlashIndex = requestURI.lastIndexOf('/');
if (lastSlashIndex != -1) {
String leadId = requestURI.substring(lastSlashIndex+1);
if (leadId instanceOf Id && ((ID)leadId).getsobjecttype() == Schema.Lead.getSObjectType()) {
return (Id)leadId;
}
}
return null;
}
}
-----------------------------------
Test Class
-----------------------------------
@isTest
public class RestLeadConvertTest{
@isTest static void testDoPost()
{
Lead lead = new Lead (FirstName = 'John', LastName = 'Test', Company = 'Test Company' , Email = 'johntest@xyz.com');
insert lead;
RestRequest req = new RestRequest();
req.addHeader('Content-Type', 'application/json');
req.requestURI = '/services/apexrest/leadconvert/' + lead.Id;
req.httpMethod = 'POST';
RestContext.request = req;
RestLeadConvert.doPost();
System.assertEquals(RestLeadConvert.StatusCodeOK, RestContext.response.statusCode,'The Response is 200');
RestRequest req2 = new RestRequest();
req2.addHeader('Content-Type', 'application/json');
req2.requestURI = '/services/apexrest/leadconvert/invalidLeadId';
req2.httpMethod = 'POST';
RestContext.request = req2;
RestLeadConvert.doPost();
System.assertEquals(RestLeadConvert.StatusCodeBadRequest, RestContext.response.statusCode,'The Response is 400');
}
}
Can you confirm what is the issue with your test class. Are you not getting required percentage. If so can you share which part of code is not covered?
Thanks,
---------------------
Test Class
---------------------
@isTest
public class RestLeadConvertTest{
@isTest static void testDoPost()
{
Lead lead = new Lead (FirstName = 'John', LastName = 'Test', Company = 'Test Company' , Email = 'johntest@xyz.com');
insert lead;
RestRequest req = new RestRequest();
RestResponse res = new RestResponse();
req.addHeader('Content-Type', 'application/json');
req.requestURI = '/services/apexrest/leadconvert/' + lead.Id;
req.httpMethod = 'POST';
RestContext.request = req;
RestContext.response = res;
RestLeadConvert.doPost();
System.assertEquals(RestLeadConvert.StatusCodeOK, RestContext.response.statusCode,'The Response is 200');
RestRequest req2 = new RestRequest();
RestResponse res2 = new RestResponse();
req2.addHeader('Content-Type', 'application/json');
req2.requestURI = '/services/apexrest/leadconvert/invalidLeadId';
req2.httpMethod = 'POST';
RestContext.request = req2;
RestContext.response = res2;
RestLeadConvert.doPost();
System.assertEquals(RestLeadConvert.StatusCodeBadRequest, RestContext.response.statusCode,'The Response is 400');
}
}
Thanks for confirming. As i mentioned earlier can you confirm which part of code is not getting covered so can work on it.
Thanks,
--------------------------------
public ResponseObject(String message, String code, Database.LeadConvertResult lcr) {
this(message, code);
this.lead_convert_result = lcr;
--------------------------------
--------------------------------
RestContext.response.statusCode = StatusCodeBadRequest;
--------------------------------
-------------------------------
if (lcr.isSuccess()) {
RestContext.response.responseBody = new ResponseObject('Success', 'success', lcr).blob();
RestContext.response.statusCode = StatusCodeOK;
}
else {
RestContext.response.responseBody = new ResponseObject('Fail', 'see lead_convert_result', lcr).blob();
RestContext.response.statusCode = StatusCodeInternalServerError;
---------------------------------
try {
return (Database.LeadConvert)JSON.deserialize(request.requestBody.toString(), Database.LeadConvert.class);
}
catch(Exception e) {
throw new BadRequestException('Failed to deserialize json body (%)'.replace('%', e.getMessage()));
-----------------------------------
-----------------------------------
throw new BadRequestException('requestURI does not have a valid trailing Lead Id');
-------------------------------------
THESE ARE NOT GETTING COVERED.
Did you find any solution on the same?