Here's the class:trigger MaintenanceRequest on Case (after update) {
//List<Case> casesToEvaluate = new List<Case>();
Map<Id, Case> casesToEvaluate = new Map<Id, Case>();
if(Trigger.isAfter && Trigger.isUpdate){
for(Case maintenance:Trigger.new){
if((maintenance.Type.contains('Repair') || maintenance.Type.contains('Routine Maintenance')) && maintenance.Status == 'Closed'){
casesToEvaluate.put(maintenance.Id,maintenance);
}
}
}
MaintenanceRequestHelper.updateWorkOrders(casesToEvaluate);
}
And my testmethod:public class MaintenanceRequestHelper {
public static void updateWorkOrders(Map<Id, Case> cases){
List<Case> maintenance_routineList = new List<Case>();
List<Product2> listProduct = [select Id, Maintenance_Cycle__c from Product2];
Map<Id,decimal> mapProduct = new Map<Id, decimal>();
for (Product2 p : listProduct) {
if (p != null) {
if(p.Maintenance_Cycle__c != null){
mapProduct.put(p.Id, p.Maintenance_Cycle__c);
}
}
}
System.debug('⌗⌗⌗ product: '+mapProduct);
for(Case maintenance:cases.values()){
Case maintenanceNew = new Case();
maintenanceNew.Subject = 'Routine Maintenance';
System.debug('⌗⌗⌗ Second: '+mapProduct.get(maintenance.Equipment__c));
if (mapProduct.get(maintenance.Equipment__c) != null) {
maintenanceNew.Date_Due__c = Date.today().addDays(Integer.valueOf(mapProduct.get(maintenance.Equipment__c)));
}
maintenanceNew.Vehicle__c = maintenance.Vehicle__c;
maintenanceNew.Product__c = maintenance.Product__c;
maintenanceNew.ContactId = maintenance.ContactId;
maintenanceNew.AccountId = maintenance.AccountId;
maintenanceNew.AssetId = maintenance.AssetId;
maintenanceNew.Type = 'Routine Maintenance';
maintenanceNew.Status = 'New';
maintenanceNew.Equipment__c = maintenance.Equipment__c;
maintenanceNew.Date_Reported__c = Date.today();
maintenance_routineList.add(maintenanceNew);
}
insert maintenance_routineList;
}
}
Can someone help me to undestand what I'm missing?. Thanks in advance.Edgar,@isTest
private class MaintenanceRequestHelperTest {
@isTest static void test_method_one() {
List<Case> caseList = new List<Case>();
List<Case> secondList = new List<Case>();
Account acc = new Account();
acc.Name = 'test';
insert acc;
Contact contact = new Contact();
contact.FirstName = 'test';
contact.LastName = 'last';
contact.Email = 'test@test.com';
contact.AccountId = acc.Id;
insert contact;
Vehicle__c vehicle = new Vehicle__c();
vehicle.Name = 'car';
insert vehicle;
Product2 product = new Product2();
product.Name = 'test';
product.isActive = true;
product.Maintenance_Cycle__c = 2;
product.Replacement_Part__c = true;
insert product;
for(Integer i=1;i<=1000;i++){
Case maintenanceNew = new Case();
maintenanceNew.Subject = 'Other';
maintenanceNew.Vehicle__c = vehicle.Id;
maintenanceNew.Product__c = product.Id;
maintenanceNew.ContactId = contact.Id;
maintenanceNew.AccountId = acc.Id;
maintenanceNew.Type = 'Other';
maintenanceNew.Status = 'New';
maintenanceNew.Equipment__c = product.Id;
maintenanceNew.Date_Reported__c = Date.today();
maintenanceNew.Date_Due__c = Date.today();
caseList.add(maintenanceNew);
}
insert caseList;
System.assertEquals(1000,caseList.size());
for(Case cas:caseList){
//update information
cas.Type = 'Repair';
cas.Status = 'Closed';
secondList.add(cas);
}
update secondList;
List<Case> createdCases = [Select Id from Case where Type = 'Routine Maintenance'];
System.assertEquals(1000,createdCases.size());
}
}

You have to insert as many work parts records for each inserted new case record. Here's my code for helper class:
public class MaintenanceRequestHelper {
public static void updateWorkOrders(Map<Id,Case> cOldMap, Map<Id,Case> cNewMap){
List<Id> caseToProcessIdList = new List<Id>();
Map<Id,List<Work_Part__c>> caseIdToWpMap = new Map<Id,List<Work_Part__c>>();
Map<Integer,Case> insertCaseMap = new Map<Integer,Case>();
Map<Integer,List<Work_Part__c>> insertWpMap = new Map<Integer,List<Work_Part__c>>();
List<Work_Part__c> insertAllWpList = new List<Work_Part__c>();
Integer commonKey = 0;
for(Id csId : cNewMap.keySet()){
if(cOldMap.get(csId).status != 'Closed' && cNewMap.get(csId).status == 'Closed' && (cNewMap.get(csId).type == 'Repair' || cNewMap.get(csId).type == 'Routine Maintenance'))
caseToProcessIdList.add(csId);
}
if(caseToProcessIdList.size() == 0)
return;
for (Work_Part__c wp: [Select Id, Name, Equipment__c, Equipment__r.Maintenance_Cycle__c, Maintenance_Request__c, Quantity__c From Work_Part__c Where Maintenance_Request__c IN :caseToProcessIdList]) {
if(!caseIdToWpMap.containsKey(wp.Maintenance_Request__c))
caseIdToWpMap.put(wp.Maintenance_Request__c, new List<Work_Part__c>{wp});
else{
List<Work_Part__c> tempList = caseIdToWpMap.get(wp.Maintenance_Request__c);
tempList.add(wp);
caseIdToWpMap.put(wp.Maintenance_Request__c, tempList);
}
}
for(Id csId : caseToProcessIdList){
List<Work_Part__c> relatedWpList = caseIdToWpMap.get(csId);
List<Work_Part__c> insertWpList = new List<Work_Part__c>();
Integer minDays;
if(relatedWpList==null || relatedWpList.size()==0){
relatedWpList = new List<Work_Part__c>();
minDays = 0;
}
for(Work_Part__c wp : relatedWpList){
if(minDays == null || minDays >= wp.Equipment__r.Maintenance_Cycle__c.intValue())
minDays = wp.Equipment__r.Maintenance_Cycle__c.intValue();
insertWpList.add(new Work_Part__c(Equipment__c=wp.Equipment__c, Quantity__c=wp.Quantity__c));
}
Case oldCase = cNewMap.get(csId);
Case cse = new Case();
cse.Type ='Routine Maintenance';
cse.Status ='New';
cse.Origin =oldCase.Origin;
cse.Vehicle__c = oldCase.Vehicle__c;
cse.Equipment__c = oldCase.Equipment__c;
cse.Subject = String.isBlank(oldCase.Subject) ? 'subject' : oldCase.Subject;
cse.Date_Reported__c = System.today();
cse.Date_Due__c = System.Today().addDays(minDays);
insertCaseMap.put(commonKey, cse);
insertWpMap.put(commonKey, insertWpList);
commonKey++;
}
insert insertCaseMap.values();
for(Integer i : insertCaseMap.keySet()){
for(Work_Part__c wp : insertWpMap.get(i)){
wp.Maintenance_Request__c = insertCaseMap.get(i).Id;
insertAllWpList.add(wp);
}
}
insert insertAllWpList;
}
}