Salesforce test class references for commerce cloud
TaxCartCalculatorSampleTest:
https://github.com/forcedotcom/commerce-extensibility/blob/main/commerce/domain/tax/cart/calculator/classes/TaxCartCalculatorSampleTest.cls#L124
Salesforce ,sfdc and cloud related documents
Salesforce test class references for commerce cloud
TaxCartCalculatorSampleTest:
https://github.com/forcedotcom/commerce-extensibility/blob/main/commerce/domain/tax/cart/calculator/classes/TaxCartCalculatorSampleTest.cls#L124
Create a Community User in the Test Class
The process for creating portal test users is more complex than creating standard test users. It may involve additional fields, and security settings.
Step 1: Create Portal Owner User
Step 2: Create a Community User
Step 3: call below code from the test method:
Salesforce Import and export Files/Attachments
Step 1: Export files using the below path: Setup ==> Data ==> Data Export
Select options:
Export File Encoding: UTF-8
Include images, documents, and attachments: Checked
Include Salesforce Files and Salesforce CRM Content document versions: Checked
Replace carriage returns with spaces: Checked
Select Specific objects to get their attachments: Here, I opted Account
reference from :
https://developer.salesforce.com/docs/platform/salesforce-code-analyzer/guide/dfa.html
https://developer.salesforce.com/docs/platform/salesforce-code-analyzer/guide/cpd-engine.html
In the above code, there is a white space 'Oppy_Scheduled0916 ', when removed this extra space from the system.schedule ("Oppy_Scheduled0916") my class was scheduled as expected.
Salesforce Order Creation using Rest API : Place Order REST API
@RestResource(urlMapping='/CreateOrder/*')
global with sharing class RestAPiOrderCreation {
@HttpPost
global static WrapperClass createOrderOrderItemRestApi() {
List<OrderItem> orderItemsTempList = new List<OrderItem>();
WrapperClass responseWrapper = new WrapperClass();
MAP<String,integer> lineNumberQtyMap = new MAP<String,integer>();
Set<String> lineItemNumberSet = new Set<String>();
List<Order> orderList = new List<Order>();
String orderType;
List<PricebookEntry> pricebookEntryList = new List<PricebookEntry>();
Date effectiveDate;
String errorMessage;
try{
Map<String, Object> params = (Map<String, Object>)JSON.deserializeUntyped(RestContext.request.requestBody.toString());
List<object> orderMainlist = (List<Object>)params.get('order');
for(object obj :orderMainlist){
Map<String, Object> params2 = (Map<String, Object>)obj;
order ordInst = new order();
String effDateStr = (String) params2.get('EffectiveDate'); // **
ordInst.EffectiveDate = Date.valueOf(effDateStr);
effectiveDate = Date.valueOf(effDateStr);
String deliveryDateStr = (String) params2.get('DeliveryDate');
ordInst.PoNumber = (String) params2.get('PONumber');
ordInst.Status = 'Draft';
orderList.add(ordInst);
List<Object> orderItemsvar = (List<Object>) params2.get('OrderItems');
for(object objOI : orderItemsvar){
Map<String, Object> params3 = (Map<String, Object>)objOI;
OrderItem ordItemInst = new OrderItem();
ordItemInst.Quantity =Integer.valueOf( params3.get('Qty'));
lineNumberQtyMap.put(String.valueOf(params3.get('LineNumber')),Integer.valueOf( params3.get('Qty')));
orderItemsTempList.add(ordItemInst);
lineItemNumberSet.add(String.valueOf( params3.get('LineNumber')));
}
}
pricebookEntryList = [SELECT id,name,Product2Id,Product2.name,Product2.StockKeepingUnit,UnitPrice, Pricebook2Id, Pricebook2.name
FROM PricebookEntry
WHERE
Product2.StockKeepingUnit IN : lineItemNumberSet];
orderList[0].Pricebook2ID = pricebookEntryList[0].Pricebook2Id;
orderList[0].status = 'Draft';
orderList[0].accountid ='0018d00000fkDsnAAE';
orderList[0].ContractId ='8008d000000ExAFAA0';
orderList[0].EffectiveDate =system.today()+10;
system.debug('===Before orderList=='+orderList);
if(!orderList.isEmpty()) {
if(Schema.sObjectType.Order.isCreateable()) {
insert orderList;
}
}
system.debug('===orderList=='+orderList);
pricebookEntryList = [SELECT id,name,Product2Id,Product2.name,Product2.StockKeepingUnit,UnitPrice, Pricebook2Id, Pricebook2.name
FROM PricebookEntry
WHERE
Product2.StockKeepingUnit IN : lineItemNumberSet AND Pricebook2Id =: orderList[0].Pricebook2Id ];
Map<String,PricebookEntry> pbeMap = new Map<String,PricebookEntry>();
List<OrderItem> orderItemsList = new List<OrderItem>();
for(PricebookEntry pbeInst: pricebookEntryList){
pbeMap.put(pbeInst.Product2.StockKeepingUnit,pbeInst);
OrderItem instobj = new OrderItem();
if(lineNumberQtyMap.containsKey((pbeInst.Product2.StockKeepingUnit)) ){
lineNumberQtyMap.get(pbeInst.Product2.StockKeepingUnit);
instobj.OrderId = orderList[0].id;
instobj.Quantity = lineNumberQtyMap.get(pbeInst.Product2.StockKeepingUnit);
instobj.Product2Id = pbeInst.Product2id;
instobj.pricebookentryId = pbeInst.id;
instobj.UnitPrice = pbeInst.UnitPrice;
orderItemsList.add(instobj);
}
}
system.debug('===orderItemsList=='+orderItemsList);
if(Schema.sObjectType.OrderItem.isCreateable()) {
insert orderItemsList;
}
}
catch (Exception e){
errorMessage= e.getMessage() +'--getCause'+e.getCause()+'==getInaccessibleFields=='+e.getInaccessibleFields()+'-getLineNumber-'+e.getLineNumber()+'-getStackTraceString-'+e.getStackTraceString();
responseWrapper.status ='409';
responseWrapper.message =e.getMessage();
responseWrapper.sfOrderID ='';
}
if(!orderList.isEmpty() && String.isEmpty(errorMessage)){
responseWrapper.status ='200';
responseWrapper.message ='success';
responseWrapper.sfOrderID =String.valueof(orderList[0].id);
}
else{
responseWrapper.status ='409';
responseWrapper.message =errorMessage;
}
return responseWrapper;
}
// Wrapper WrapperClass for return structure
global class WrapperClass{
Public String status {get;set;}
Public String message {get;set;}
Public String sfOrderID {get;set;}
}
}
==========================
Success Scenario :
Failure Scenario:
Salesforce: Iterate Map for old and new Value
Trigger
trigger Opportunitytrigger on Opportunity (Before Insert,Before Update,After Update) { //Before Update if(trigger.isBefore && trigger.isUpdate){ system.debug('--Before Update'); Opportunitytriggerhandler oOpportunitytriggerhandler = new Opportunitytriggerhandler(); oOpportunitytriggerhandler.onBeforeUpdate(Trigger.oldMap,Trigger.newMap); } } |
=============================================================
Handler Class
public class Opportunitytriggerhandler{
public void onAfterUpdate(map<id,Opportunity> oldMap,map<id,Opportunity> newMap){
public void onBeforeUpdate(map<id,Opportunity> oldMap,map<id,Opportunity> newMap){
OpportunityHelper objHelper = new OpportunityHelper();
objHelper.checkOpportunityAmount(oldMap,newMap);
}
}
=============================================================
Helper Class public class OpportunityHelper { public void checkOpportunityAmount(map<id,Opportunity> oldMap,map<id,Opportunity> newMap){ for(Opportunity opp:newMap.values()){ // Needs Analysis Qualification system.debug('Old AMount '+oldMap.get(opp.id).StageName); system.debug('New Map'+newMap.get(opp.id).StageName); System.debug('Before Update finish'); if(oldMap.get(opp.id).StageName != newMap.get(opp.id).StageName){ opp.isAmountChanged__c = true; } } } } |
Salesforce MAP with Dynamic Values
Considerations:
e.g. Account trigger is passing old and new maps.
Create a custom metadata: ObjectNames_Setting__mdt ,DeveloperName must have object Name
public void dynamicmethod(Map<Id,sobject> newAccountMap, Map<Id,sobject> oldAccountMap) {
Set<Id> resultIds = new Set<Id>();
system.debug('----------'+newAccountMap+'-----'+oldAccountMap+'----------'+newAccountMap.size()+'-----'+oldAccountMap.size());
try{
Set<Id> ids = newAccountMap.keySet();
Id firstId = new List<id> ( ids )[0];
String sObjName = firstId.getSObjectType().getDescribe().getName(); //
system.debug('---DynamicsObjName---'+sObjName); //
List<ObjectNames_Setting__mdt> MOSobj = [SELECT id,Label,Update_Fields_Name__c, FROM ObjectNames_Setting__mdt where DeveloperName =: sObjName LIMIT 1];
System.debug('+++'+MOSobj[0].Update_Fields_Name__c);
List<String> objectFields = MOSobj[0].Update_Fields_Name__c.split(',');
for (sObject l : newAccountMap.values()) {
//system.debug('=====sObject===='+ l);
for(String fieldVar : objectFields){
if (l.get(fieldVar) != oldAccountMap.get(l.Id).get(fieldVar)) {
resultIds.add(l.Id);
break;
}
}
}
}
catch(exception e)
{
System.debug('--------Exception ---'+e);
}
}