Apex Specialist Superbadge

Shiv Shankar
3 min readJul 29, 2019

--

  1. Automate record creation using Apex triggers
  2. Synchronize Salesforce data with an external system using asynchronous REST callouts
  3. Schedule synchronization using Apex code
  4. Test automation logic to confirm Apex trigger side effects
  5. Test integration logic using callout mocks
  6. Test scheduling logic to confirm action gets queued.

Concepts Tested in This Superbadge

  • Apex Triggers
  • Asynchronous Apex
  • Apex Integration
  • Apex Testing

Step 1 — Go through the Apex Specialist Use-Case,Business Requirement And Schema Diagram of the Story

Step 2 -Create a New Trail Head Playground so That there will not be any Problem while Going through the apex code

Step 3 -To Start the apex challenge Install this unmanaged package after that go through the Standard object and the custom object details in your org so that you might get understand the basic of the Requirement

Step 4 — you all have the apex class made while installing unmanaged package

1: Automate Record Creation

a. Update the following below code in the MaintenanceRequest trigger

trigger MaintenanceRequest on Case (before update, after update) {

// call MaintenanceRequestHelper.updateWorkOrders

MaintenanceRequestHelper.updateWorkOrders();

}

b. Now Update the below code in HelperClass MaintenanceRequestHelper

public class MaintenanceRequestHelper {

public static void updateWorkOrders(){
// update workorders
//bulk determine
List<case> maintenanceRequestList=[select id,case.Vehicle__c,Equipment__c,Equipment__r.Maintenance_Cycle__c,Type,Status from case where id in :Trigger.New limit 200];
if(maintenanceRequestList !=null && maintenanceRequestList.size()>0 ){
List<Case> insertMaintenanceRequest=getCaseList(maintenanceRequestList);
insert insertMaintenanceRequest;
}
}

public static List<Case> getCaseList(List<Case> maintenanceRequestList){
List<Case> newMaintenanceRequestList= new List<Case>();
for(Case cas:maintenanceRequestList){
if(cas.Type==’Routine Maintenance’ && cas.Status==’Closed’){
case newMaintenanceRequest=new Case();
newMaintenanceRequest.Subject=’test’;
newMaintenanceRequest.Type=’Routine Maintenance’;
newMaintenanceRequest.Vehicle__c=cas.Vehicle__c;
newMaintenanceRequest.Equipment__c=cas.Equipment__c;
newMaintenanceRequest.Date_Reported__c=date.Today();
newMaintenanceRequest.Date_Due__c=Date.today().addDays(Integer.valueOf(cas.Equipment__r.Maintenance_Cycle__c));
newMaintenanceRequest.Status=’New’;
newMaintenanceRequest.Origin=’Phone’;
newMaintenanceRequestList.add(newMaintenanceRequest);
}
}
return newMaintenanceRequestList;
}
}

2: Synchronize Salesforce data with an external system

public with sharing class WarehouseCalloutService {

private static final String WAREHOUSE_URL = ‘ https://th-superbadge-apex.herokuapp.com/equipment';

// complete this method to make the callout (using @future) to the
// REST endpoint and update equipment on hand.
@future(callout=true)
public static void runWarehouseEquipmentSync(){

HttpResponse response = getrespond();

if(response.getStatusCode()==200){
//System.debug(‘size of equipment — ‘+equipmentlist.size());
List<Product2> updateEquipmentlist=getProductlist(response);
if(updateEquipmentlist.size() > 0){
insert new List<Product2>(updateEquipmentlist);
}
}
}

public static List<Product2> getProductlist(HttpResponse response){

List<Object> externalEquipment = (List<Object>) JSON.deserializeUntyped(response.getBody());
List<Product2> equipmentlist=new List<Product2>();
//System.debug(‘size of result’+externalEquipment.size());
for (Object externalEquipment1: externalEquipment) {
Map<String,Object> data = (Map<String,Object>)externalEquipment1;
//system.debug(externalEquipment1);
//system.debug(data+’===’+data.get(‘cost’));
Product2 equipment=new Product2();
//equipment.Id =(String)data.get(‘_id’);
equipment.Cost__c=(Integer)data.get(‘cost’);
equipment.Lifespan_Months__c =(Integer)data.get(‘lifespan’);
equipment.Maintenance_Cycle__c =(Integer)data.get(‘maintenanceperiod’);
equipment.Name =(String)data.get(‘name’);
equipment.Current_Inventory__c =(Integer)data.get(‘quantity’);
equipment.Replacement_Part__c =(Boolean)data.get(‘replacement’);
equipment.Warehouse_SKU__c=(String)data.get(‘sku’);
equipmentlist.add(equipment);
}
return equipmentlist;
}

public static HttpResponse getrespond(){
Http http=new Http();
HttpRequest request=new HttpRequest();
request.setEndpoint(WAREHOUSE_URL);
request.setMethod(‘GET’);
HttpResponse res=Http.send(request);
return res;
}
}

3: Schedule Synchronization

global class WarehouseSyncSchedule implements Schedulable{
// implement scheduled code here
global void execute (SchedulableContext sc){

WarehouseCalloutService.runWarehouseEquipmentSync();
//optional this can be done by debug mode
String sch = ’00 00 01 * * ?’;//on 1 pm
System.schedule(‘WarehouseSyncScheduleTest’, sch, new WarehouseSyncSchedule());
}
}

4: Test automation logic

@isTest
public class MaintenanceRequestTest {

@isTest static void testMaintenanceRequest(){

List<Case> maintenanceList=new List<Case>();
List<Case> maintenanceListAfterClosed=new List<Case>();
Vehicle__c vehicle=new Vehicle__c(Name=’tata sumo’,Air_Conditioner__c=true,Model__c=’23Test’);
insert vehicle;
Product2 equipment=new Product2(Name=’tire’,Cost__c=100,Current_Inventory__c =10,Replacement_Part__c=true,
Warehouse_SKU__c =’test’,Lifespan_Months__c =10,Maintenance_Cycle__c=10);
insert equipment;
for(Integer i=1;i<=300;i++){
Case maintenance=new Case(Subject=’Test subject’+i,Type=’Routine Maintenance’+i,Status=’New’+i,
Origin=’Phone’+i,Equipment__c=equipment.Id,Vehicle__c=vehicle.Id);
maintenanceList.add(maintenance);
}
insert maintenanceList;
// system.assertEquals(300, maintenanceList.size());
for(Case caseupdate:maintenanceList){
caseupdate.Status=’Closed’;
caseupdate.Type=’Routine Maintenance’;
caseupdate.Date_Due__c=date.Today().addDays(Integer.valueOf(equipment.Maintenance_Cycle__c));
maintenanceListAfterClosed.add(caseupdate);
}
Test.startTest();
//UPDATE maintenanceListAfterClosed;
//Bulk insert update
Database.SaveResult[] updatequipment = Database.update(maintenanceListAfterClosed);
Test.stopTest();
for(Database.SaveResult sa:updatequipment){
System.assert(sa.isSuccess());}
}
}

5: Test callout logic

//Mock Class

@isTest
global class WarehouseCalloutServiceMock implements HttpCalloutMock {
// implement http mock callout
//Mock responce created to test the call out
global HttpResponse respond(HttpRequest request){
System.assertEquals(‘https://th-superbadge-apex.herokuapp.com/equipment', request.getEndpoint());
System.assertEquals(‘GET’, request.getMethod());
HttpResponse response = new HttpResponse();
response.setHeader(‘Content-Type’, ‘application/json’);
response.setBody(‘[{“_id”:”55d66226726b611100aaf741″,”replacement”:false,”quantity”:5,”name”:”Generator 1000 kW”,”maintenanceperiod”:365,”lifespan”:120,”cost”:5000,”sku”:”100003″}]’);
response.setStatusCode(200);
return response;
}
}

//testClass

@isTest
private class WarehouseCalloutServiceTest {
// implement your mock callout test here
@isTest static void TestWarehouseCalloutService() {
Test.startTest();
//mock respoonse
Test.setMock(HttpCalloutMock.class, new WarehouseCalloutServiceMock());
WarehouseCalloutService.runWarehouseEquipmentSync();
Test.stopTest();
}
}

6: Test scheduling logic

@isTest

public class WarehouseSyncScheduleTest {

@isTest static void WarehousescheduleTest(){

String scheduleTime = ’00 00 01 * * ?’;

Test.startTest();

Test.setMock(HttpCalloutMock.class, new WarehouseCalloutServiceMock());

String jobID=System.schedule(‘Warehouse Time To Schedule to Test’, scheduleTime, new WarehouseSyncSchedule());

Test.stopTest();

//Contains schedule information for a scheduled job. CronTrigger is similar to a cron job on UNIX systems.

// This object is available in API version 17.0 and later.

CronTrigger a=[SELECT Id FROM CronTrigger where NextFireTime > today];

System.assertEquals(jobID, a.Id,’Schedule ‘);

}

}

Originally published at https://shivshankarsfdc.com on July 29, 2019.

--

--

Shiv Shankar

Salesforce Consultant || 6X Certified Salesforce || 1X DevOps Certified || TrailheadRanger || Salesforce Lover || Follow me at https://shivshankarsfdc.com/