Skip to main content
Hi guys, I'm almost finished with the test to get tge Apex Specialist SuperBadge, I attempt to validate the "Test automation logic" but I can't really see what is my error or why is not passing. This is the message I get:

"Challenge Not yet complete... here's what's wrong: 

The 'MaintenanceRequest' trigger does not appear to be handling bulk operations correctly. For the positive use case of inserting and updating more than 200 records, it did not produce the expected outcome."

and here is my code:

Trigger:

 

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);

}

Here's the class:

 

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;

}

}

And my testmethod:

 

@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());

}

}

Can someone help me to undestand what I'm missing?.  Thanks in advance.

Edgar,

 
9 个回答
  1. 2018年11月4日 12:01
    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;

    }

    }