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
K RoyK 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');
        
        
    }
}
Sai PraveenSai Praveen (Salesforce Developers) 
Hi,

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,
 
K RoyK Roy
My Test Class Coverage is 73%. Can you Help me make it 90%?

---------------------
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');
        
        
    }
}
Sai PraveenSai Praveen (Salesforce Developers) 
Hi,

Thanks for confirming. As i mentioned earlier can you confirm which part of code is not getting covered so can work on it.

Thanks,
 
K RoyK Roy
For the actual code:

--------------------------------
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.
K RoyK Roy
Hi Sai,

Did you find any solution on the same?