an amateur apex user here and I have a question which I've tried to distill below as much as I can. I have a class OrderTriggerHandlerV2 which fires when Order.OriginalContractedOrder__c
gets filled in.
I build three maps to get all the data I need to use to build out the rest of the logic:
public class OrderTriggerHandlerV2 {
public static void updatedAmendmentOrderProducts(Map<Id, Order> updatedOrderMap) {
List<Order> gatherAmendmentOrderInfo = [SELECT Id, OriginalContractedOrder__c, EffectiveDate, (SELECT Id, Order.EffectiveDate, ServiceDate, EndDate, Original_Segment_Start_Date__c FROM OrderItems WHERE SBQQ__ChargeType__c = 'Recurring Fixed')
FROM Order
WHERE Id IN:updatedOrderMap.keySet()];
Map<Id, Date> amendmentOrderWithEffectiveDate = new Map<Id, Date>();
Map<Id, List<OrderItem>> amendmentOrderWithRecurringOrderProducts = new Map<Id, List<OrderItem>>();
Map<Id, Id> amendmentOrderWIthOriginalOrder = new Map<Id, Id>();
for(Order a: gatherAmendmentOrderInfo){
amendmentOrderWithEffectiveDate.put(a.Id, a.EffectiveDate);
amendmentOrderWithRecurringOrderProducts.put(a.Id, a.OrderItems);
amendmentOrderWIthOriginalOrder.put(a.Id, a.OriginalContractedOrder__c);
}
System.debug('amendmentOrderWithEffectiveDate: '+amendmentOrderWithEffectiveDate);
System.debug('amendmentOrderWithRecurringOrderProducts: '+amendmentOrderWithRecurringOrderProducts);
System.debug('amendmentOrderWIthOriginalOrder: '+amendmentOrderWIthOriginalOrder);
}
When I physically fill in the field which fires the trigger in the sandbox, all the maps get filled:
But when I run my test class, I think I'm missing something as the child OrderItems
don't seem to be being picked up. I'm very confused about this and would appreciate any insight into this or approaches I could take to troubleshoot. Thank you @cropredy for answering my post yesterday where I broached almost a similar question. The suggested hypothesis was that I was running into the SFDC test context limitation as it was a queueable class previously. I have changed it to be synchronous and still am hitting the same issue. I have since deleted my previous question to try see if I can get any other insight and so that there isn't a duplication with this - let me know if this goes against any guidelines.
Here is some additional information:
Trigger:
trigger OrderTrigger on Order (before update, after update) {
if(Trigger.isAfter){
if(Trigger.isUpdate){
// OriginalContractedOrder__c gets filled in
Map<Id, Order> mapOfOrderswhereOriginalContractedOrderChanges = new Map<Id, Order>();
for(Order newOrder: Trigger.New){
Order oldOrder = Trigger.OldMap.get(newOrder.Id);
if((newOrder.OriginalContractedOrder__c!= oldOrder.OriginalContractedOrder__c)&&(newOrder.OriginalContractedOrder__c!=NULL)){
mapOfOrderswhereOriginalContractedOrderChanges.put(newOrder.Id, newOrder);
}
}
}
}
Test Class
@isTest
public class OrderTriggerHandlerV2Test {
@isTest public static void updatedAmendmentOrderProductsTest(){
// create data
Account testAcc = testDataFactory.accountCreator('testAcc');
product2 testProd = testDataFactory.productCreator();
Order order1 = testDataFactory.orderCreator4FFAmendment(testAcc, 'Draft', Date.newInstance(2020,01,01), 'New');
insert order1;
Order order2 = testDataFactory.orderCreator4FFAmendment(testAcc, 'Draft', Date.newInstance(2021,01,01), 'Amendment');
insert order2;
OrderItem orderItem4OrderOne = testDataFactory.orderItemCreator4FFAmendment(order1, testProd, Date.newInstance(2020,01,01), Date.newInstance(2022,12,31), 'Annual');
insert orderItem4OrderOne;
OrderItem orderItem4OrderTwo = testDataFactory.orderItemCreator4FFAmendment(order2, testProd, Date.newInstance(2021,01,01), Date.newInstance(2022,12,31), 'Annual');
insert orderItem4OrderTwo;
Order order2Update = [SELECT Id, OriginalContractedOrder__r.Id, EffectiveDate,
(SELECT Id, Order.EffectiveDate, ServiceDate, EndDate, Original_Segment_Start_Date__c FROM OrderItems)
FROM Order
WHERE Id =:order2.Id];
order2Update.OriginalContractedOrder__c = order1.Id;
system.debug('order2Update:' + order2Update);
// run test
test.StartTest();
update order2Update;
test.StopTest();
}
}
TestDataFactory Class
public static Account accountCreator(string name){
Account myAccount = new Account();
myAccount.Name = name;
insert myAccount;
return myAccount;
}
public static product2 productCreator(){
// 12 Month Subscription Product
product2 testProd = new product2();
testProd.Name = 'Test Product';
testProd.isActive = True;
testProd.SBQQ__SubscriptionPricing__c = 'Fixed Price';
testProd.SBQQ__SubscriptionTerm__c = 12;
testProd.SBQQ__SubscriptionType__c = 'Renewable';
testProd.ProductCode = 'TST1';
testProd.SBQQ__PricingMethod__c = 'List';
testProd.QLE_Product_Group__c = 'CMBS';
insert testProd;
// Create Price book entry
PricebookEntry testPBE = new PricebookEntry();
testPBE.isActive = TRUE;
testPBE.Product2Id = testProd.Id;
testPBE.Pricebook2Id = test.getStandardPricebookId();
testPBE.UnitPrice = 1000.00;
insert testPBE;
return testProd;
public static Order orderCreator4FFAmendment(Account a, String status, Date startDate, String orderType){
Order newOrder = new Order();
newOrder.AccountId = a.Id;
newOrder.Status = status;
newOrder.EffectiveDate = startDate;
newOrder.Type = orderType;
newOrder.Pricebook2Id = test.getStandardPricebookId();
newOrder.SBQQ__ContractingMethod__c = 'Single Contract';
newOrder.OriginalContractedOrder__c = NULL;
return newOrder;
}
public static OrderItem orderItemCreator4FFAmendment(Order ord, Product2 p, Date startDate, Date endDate, String billingFrequency){
OrderItem b = new OrderItem();
b.OrderId = ord.Id;
b.Product2Id = p.Id;
b.Quantity = 1;
b.SBQQ__BillingFrequency__c = billingFrequency;
b.ListPrice = 1000;
b.UnitPrice = 1000;
PricebookEntry a = [SELECT Id
FROM PricebookEntry
WHERE Product2Id =: p.Id];
b.PricebookEntryId = a.Id;
b.ServiceDate = startDate;
b.EndDate = endDate;
b.SBQQ__ChargeType__c = 'Recurring Fixed';
b.SBQQ__SubscriptionPricing__c = 'Fixed Price';
b.SBQQ__ProductSubscriptionType__c = 'Renewable';
b.Original_Segment_Start_Date__c = NULL;
return b;
}