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
Harsha ShriHarsha Shri 

Need help in Test class for external datasource

Hi All,
I am weak in writing test class. I have written a controller class related to external object. I want to write test class for the same.
This is my controller class
global class DataSourcCon extends DataSource.Connection {

    public String LookupUrl {get; set;}

    global DataSourcCon(DataSource.ConnectionParams  connectionParams) {
        
    }
    
   global DataSourcCon(DataSource.ConnectionParams  connectionParams, String baseURL) {
       
        LookupUrl = baseURL;
   }

    override public DataSource.TableResult query(DataSource.QueryContext context)
    {
        
        String SOQLObject = context.tableSelection.columnsSelected.get(0).tableName;
        
        
        DataSource.Filter filter = context.tableSelection.filter;
        
      
      String validslordNumber = '666'; 
      String validgoId = '900'; 
      
      List<Map<String,String>> resultMap=new List<Map<String,String>>();    
      if(SOQLObject == 'sp_ord')
      {
        
        IntClass intdord = new IntClass();
        IntClass.SearchParameters searchParameter = new IntClass.SearchParameters();
            if(filter != null && filter.columnName != null && filter.columnValue != null)
            {
                if(filter.columnName == 'g_o_Id')    
                {
                    searchParameter.oppgRecId = String.valueof(filter.columnValue);
                }
                else if(filter.columnName == 'sl_ord_number')
                {
                    searchParameter.slordNumber = String.valueof(filter.columnValue);
                }
            }
            else
            {
                searchParameter.oppgRecId = validgoId;
            }
        intdord.searchParam = searchParameter; 
        
        IntWrap.SearchslordResponse resp = null;
        IntServ service = new IntServ();
        resp = (IntWrap.SearchslordResponse) service.getordchapByCriteria(intdord);
     
        IntViHel  helper=new IntViHel();
        resultMap = helper.getResponseDataAsListMap(resp);
        
        return DataSource.TableResult.get(context,resultMap);         
      }
      else if(SOQLObject == 'chap')
      {
        
        
        IntClass intdchap = new IntClass();
        IntClass.SearchParameters searchParameter = new IntClass.SearchParameters();
            
            if(filter != null && filter.columnName != null && filter.columnValue != null)
            {
                if(filter.columnName == 'g_o_Id')    
                {
                    searchParameter.oppgRecId = String.valueof(filter.columnValue);
                }
                else if(filter.columnName == 'sp_ord')
                {
                    searchParameter.slordNumber = String.valueof(filter.columnValue);
                }
            }
            else
            {
                searchParameter.oppgRecId = validgoId;
            }
        intdchap.searchParam = searchParameter; 
       
        IntWrap.SearchslordResponse resp = null;
        IntServ service = new IntServ();
        resp = (IntWrap.SearchslordResponse) service.getordchapByCriteria(intdchap);
        
        IntViHel  helper=new IntViHel();
        resultMap = helper.getResponseDataAsListMap(resp);
               
        return DataSource.TableResult.get(context,resultMap);         
      }
      else
      {
          return null;
      }
    
    }
    public DataSource.TableResult queryfromDBC(DataSource.QueryContext context)
    {
        
        System.PageReference lookupURL = Apexpages.currentPage();
        
        if (context.tableSelection.columnsSelected.size() == 1
            && context.tableSelection.columnsSelected.get(0).aggregation == DataSource.QueryAggregation.COUNT)
        {
            
            List<Map<String,Object>> rows = getRows(context);
           
            List<Map<String,Object>> response = DataSource.QueryUtils.filter(context, getRows(context));

            List<Map<String, Object>> countResponse = new List<Map<String, Object>>();
            Map<String, Object> countRow = new Map<String, Object>();

            countRow.put(context.tableSelection.columnsSelected.get(0).columnName,response.size());
            countResponse.add(countRow);
            return DataSource.TableResult.get(context,countResponse);
        }
        else
        {
            
            List<Map<String,Object>> filteredRows = DataSource.QueryUtils.filter(context, getRows(context));
            List<Map<String,Object>> filteredRowsCustom = filterRows(context, getRows(context));
            List<Map<String,Object>> sortedRows = DataSource.QueryUtils.sort(context, filteredRows);
            
            List<Map<String,Object>> limitedRows = DataSource.QueryUtils.applyLimitAndOffset(context,sortedRows);
            return DataSource.TableResult.get(context, limitedRows);
        }
    }

    override global List<DataSource.TableResult> search(DataSource.SearchContext c) { 
              
        List<DataSource.TableResult> results = new List<DataSource.TableResult>();
        for (DataSource.TableSelection tableSelection : c.tableSelections) {
            results.add(DataSource.TableResult.get(tableSelection, findRows(c)));
        }
        return results;
    }

    global override List<DataSource.UpsertResult> upsertRows(DataSource.UpsertContext 
            context) {
       
       if (context.tableSelected == 'Sample') {
           List<DataSource.UpsertResult> results = new List<DataSource.UpsertResult>();
           List<Map<String, Object>> rows = context.rows;
           
           for (Map<String, Object> row : rows){
              
              HttpResponse response;
              
              if (row.get('ExternalId') == null){
                 
                     response = null;
              }
              else {
                 
                   response = null;  
              }
         
              Map<String, Object> m = (Map<String, Object>)JSON.deserializeUntyped(
                      response.getBody());
              if (response.getStatusCode() == 200){
                  results.add(DataSource.UpsertResult.success(
                          String.valueOf(m.get('id'))));
              } 
              else {
                 results.add(DataSource.UpsertResult.failure(
                         String.valueOf(m.get('id')), 
                         'The callout resulted in an error: ' + 
                         response.getStatusCode()));
              }
           } 
           return results;
       } 
       return null;
    }

   
    global override List<DataSource.DeleteResult> deleteRows(DataSource.DeleteContext 
            context) {
       if (context.tableSelected == 'Sample'){
           List<DataSource.DeleteResult> results = new List<DataSource.DeleteResult>();
           for (String externalId : context.externalIds){
             
              HttpResponse response = null;
              if (response.getStatusCode() == 200){
                 results.add(DataSource.DeleteResult.success(externalId));
              } 
              else {
                 results.add(DataSource.DeleteResult.failure(externalId, 
                         'Callout delete error:' 
                         + response.getBody()));
              }
           }
           return results;
       }
       return null;
     }
  
    private DataSource.DataType getFieldDataType(String dataType)
    {
        
        DataSource.DataType fieldType;
        
        if(dataType == 'Checkbox')
            fieldType = DataSource.DataType.BOOLEAN_TYPE;   
        else if(dataType == 'Date/Time')
            fieldType = DataSource.DataType.DATETIME_TYPE;  
        else if(dataType == 'Lookup Relationship')
            fieldType = DataSource.DataType.LOOKUP_TYPE;  
        else if(dataType == 'External lookup relationship')
            fieldType = DataSource.DataType.EXTERNAL_LOOKUP_TYPE;  
        else if(dataType == 'Indirect lookup relationship')
            fieldType = DataSource.DataType.INDIRECT_LOOKUP_TYPE;  
        else if(dataType == 'Number')
            fieldType = DataSource.DataType.NUMBER_TYPE;
        else if(dataType == 'Text (40)')
            fieldType = DataSource.DataType.STRING_SHORT_TYPE;
        else if(dataType == 'Text Area (255)')
            fieldType = DataSource.DataType.STRING_LONG_TYPE;
        else if(dataType == 'Text Area Long (32768)')
            fieldType = DataSource.DataType.STRING_LONG_TYPE;
        else if(dataType == 'URL')
            fieldType = DataSource.DataType.URL_TYPE; 

        return fieldType;
    }

    
    private DataSource.Column setupCustomFieldData(ext_External_Field__c extField)
    {   
        
        DataSource.DataType fieldType = getFieldDataType(extField.Data_Type__c);
        DataSource.Column fieldData;
        Integer fieldLength = 0;
        Integer fieldDecimalsLength = 0;
       
        if(fieldType == DataSource.DataType.NUMBER_TYPE)
        {    
            fieldLength = ((extField.Length__c + extField.Decimal_Places__c) <= 18) ? Integer.valueof(extField.Length__c) : 16;
            fieldDecimalsLength = ((extField.Length__c + extField.Decimal_Places__c) <= 18) ? Integer.valueof(extField.Decimal_Places__c) : 2;
        }
        else if(fieldType == DataSource.DataType.STRING_SHORT_TYPE)
        {    
            fieldLength = (extField.Data_Type__c == 'Text (40)') ? 40 : 255;
        }
        else if(fieldType == DataSource.DataType.STRING_LONG_TYPE)
        {    
            fieldLength = 32768;
        }

        if(fieldType == DataSource.DataType.LOOKUP_TYPE)
        {
            fieldData = DataSource.Column.lookup(extField.Name, extField.ReferenceTo__c);
            
			
        }
        else if(fieldType == DataSource.DataType.EXTERNAL_LOOKUP_TYPE)
        {
            fieldData = DataSource.Column.externalLookup(extField.Name, extField.ReferenceTo__c);
           
        }
        else if(fieldType == DataSource.DataType.INDIRECT_LOOKUP_TYPE)
        {
            fieldData = DataSource.Column.indirectLookup(extField.Name, extField.ReferenceTo__c, extField.ReferenceTargetField__c);
           
        }
        else if(fieldType != DataSource.DataType.LOOKUP_TYPE && fieldType != DataSource.DataType.EXTERNAL_LOOKUP_TYPE && 
            fieldType != DataSource.DataType.INDIRECT_LOOKUP_TYPE)
        {
            fieldData = DataSource.Column.get(extField.Name, extField.Field_Label__c, extField.Description__c, extField.Sortable__c, extField.Filterable__c, fieldType, fieldLength, fieldDecimalsLength, null, null); 
        }

        return fieldData;
    }

   
    private DataSource.Table setupTableData(ext_External_Object__c extObj, List<DataSource.Column> columns_extObj)
    {   
        
        DataSource.Table extObj_Table = new DataSource.Table();
          extObj_Table.labelSingular = extObj.Label_Singular__c;
          extObj_Table.labelPlural = extObj.Label_Plural__c;
          extObj_Table.name = extObj.Name;
          extObj_Table.description = extObj.Description__c;
         
          extObj_Table.nameColumn = extObj.Name_Column__c;
         
          extObj_Table.columns = columns_extObj; 

        return extObj_Table;
    }

    
    private List<Map<String,Object>> filterRows(DataSource.QueryContext context, List<Map<String,Object>> allRows){
       
        List<Map<String,Object>> objRowList = new List<Map<String,Object>>();
        DataSource.TableSelection tableSelection=null;
        String tableName = null;
        if(context != null){
            tableSelection = context.tableSelection;
            tableName=tableSelection.tableSelected;
            
            if(tablename.equalsIgnoreCase('sp_ord'))
            {
                
            }
        }
        return objRowList;
    }   

    private List<Map<String,Object>> getObjRows(DataSource.QueryContext c){
        List<Map<String,Object>> objRowList=new List<Map<String,Object>>();
        DataSource.TableSelection tableSelection=null;
        String tableName=null;
        if(c!=null){
           tableSelection=c.tableSelection;
           tableName=tableSelection.tableSelected;
          
           
        }
        return objRowList;
    }   
    
   

    private List<Map<String,Object>> getRows(DataSource.ReadContext context)
    {
      
        List<Map<String, Object>> rows = new List<Map<String, Object>>();

        DataSource.QueryContext myContext = (DataSource.QueryContext)context;
        
        DataSource.Filter filter = myContext.tableSelection.filter;
        
        return rows;
    }

    private List<Map<String,Object>> findRows(DataSource.ReadContext context)
    {

        List<Map<String, Object>> rows = new List<Map<String, Object>>();

        DataSource.ReadContext myContext = (DataSource.ReadContext)context;
        
        

        return rows;
    }

     private Map<String,Object> foundRow(Map<String,Object> foundRow) {
        Map<String,Object> row = new Map<String,Object>();
        row.put('ExternalId', string.valueOf(foundRow.get('Id')));
        row.put('DisplayUrl', string.valueOf(foundRow.get('DisplayUrl')));
        row.put('Name', string.valueOf(foundRow.get('Name')));        
        return row;
    }
   
    private static HttpResponse makeGetCallout() {
        Http h = new Http();
        HttpRequest req = new HttpRequest();
        req.setEndpoint('https://test.com');
        req.setMethod('GET');
        HttpResponse response=h.send(req);         
        return response;
    }    

   
}
Please help me how to write test class for this

Thanks in Advance

 
Suraj MakandarSuraj Makandar
Hi  Harsha Shri,

Below blog will help you to write test class for Connection and Provider classes.

Link: https://nealhobert.wordpress.com/2017/07/28/salesforce-connect-custom-adapter-part-3-test-classes/

Thanks,
Suraj