Esempio Trigger after update

Questo trigger crea nuovi Case alla chiusura di altri Case. E’ un esercizio di un superbadge dove i Case sono ordini di manutenzione di veicoli. Come la manuntenzione è chiusa di aprono altri ordini per il futuro (Manutenzione programmata)

trigger MaintenanceRequest on Case (after update) {
    
    // Trigger che scatta dopo l'aggiornamento di un case
    // Il case deve avere lo status closed e il type repair o routine maintenance
    
    if(Trigger.isUpdate){
        
        List<Case> ListOfCaseTriggered = Trigger.new;  // Lista dei case che sono stati aggiornati
        List<Case> ListOfCaseValid = new List<Case>(); // Lista dei case che serviranno poi per la creazione dei nuovi case
        
        for(Case c:ListOfCaseTriggered){
            if(c.Status == 'Closed' && (c.Type == 'Repair' || c.Type == 'Routine Maintenance')){
                ListOfCaseValid.add(c); // Viene popolata la lista dei case che serviranno per la creazione dei nuovi case
            }            
        }
        
        MaintenanceRequestHelper.updateWorkOrders(ListOfCaseValid); // Viene invocata la classe che elabora i dati per la creazione dei nuovi case
       
    }       
}

Classe MaintenanceRequestHelper

Il trigger in alto scatta per ogni aggiornamento di un case. Crea una lista di dati (Case) da elaborare e la invia ad una classe che poi partendo da questa base crea nuovi Case che sono la duplicazione di quelli appena chiusi

public with sharing class MaintenanceRequestHelper {
    
    public static void updateWorkOrders(List<Case> c) {
        
        List<Case> newMaintenanceRequestList = new List<Case>(); // Lista nuovi case
        List<Case> baseCaseData = [select Status,Vehicle__c,Equipment__c,Type,Subject,Date_Reported__c,Product__c,ContactId,AccountId,AssetId from case where id in: c];
        
        for(Case caseItem:baseCaseData){
            
            Case nc = new Case();
                        
            nc.Status           = 'New';	
            nc.Vehicle__c       = caseItem.Vehicle__c;
            nc.Equipment__c     = caseItem.Equipment__c;
            nc.Type             = ' Routine Maintenance';	// Routine Maintenance or Repair
            nc.Subject          = caseItem.Subject;
            nc.Date_Reported__c = Date.today();            
            nc.Product__c       = caseItem.Product__c;
            nc.ContactId        = caseItem.ContactId;
            nc.AccountId        = caseItem.AccountId;
            //nc.AssetId          = caseItem.AssetId;
            nc.Type             = 'Routine Maintenance';                        
            
            newMaintenanceRequestList.add(nc);
        }
        
        insert newMaintenanceRequestList;
	}
}

Classe di test per Trigger after update

@isTest
public class MaintenanceRequestTest {
    
    @isTest
    static void TestTrigger_1(){
        
        List<Case> lc = new List<Case>();
        
        Vehicle__c v = new Vehicle__c(Name = 'dfd');
        insert v;
        
        Product2 p = new Product2(Name = 'dfd');        
        insert p;
        
        Account a = new Account (name = 'Acme',
        BillingCity ='TestCity',
        BillingCountry ='TestCountry',
        BillingStreet ='TestStreet',
        BillingPostalCode ='t3stcd3'
        );
        
        insert a;
        
        Contact c = new Contact (        
        FirstName = 'xyzFirst',
        LastName = 'XyZLast',        
        AccountId = a.Id,
        Email = 'xyzmail@mail.com'
        );
        
        //line added - waveoc
        insert c;
                
        Integer i = 0;
        for(i = 0; i < 300; i++){
        	Case testCase             = new Case();    
            testCase.Status           = 'New';
            testCase.Type             = 'Routine Maintenance';
            testCase.Subject          = 'Manutenzione ' + i;
            testCase.Date_Reported__c = Date.today();            
            testCase.Vehicle__c       = v.id; //
            testCase.Equipment__c     = p.id; //
            testCase.Product__c       = 'GC1040';
            testCase.ContactId        = c.id;
            testCase.AccountId        = a.id;
            
            lc.add(testCase);
        }
        
        insert lc;
        
        Test.startTest();
        List<Case> testCase = [select Status,Type from case limit 50];
        List<Case> testCaseUp = new List<Case>();
        for(Case cas:testCase){
            cas.Status = 'Closed';
            cas.Type = 'Repair';
            testCaseUp.add(cas);
        }
        update testCaseUp;
        Test.stopTest();
        
        System.assertEquals(50, [Select Id from Case where type='Repair' and Status='Closed'].size());
        
    }
    
    @isTest
    static void TestTrigger_2(){
        
        List<Case> lc = new List<Case>();
        
        Vehicle__c v = new Vehicle__c(Name = 'dfd');
        insert v;
        
        Product2 p = new Product2(Name = 'dfd');        
        insert p;
        
        Account a = new Account (name = 'Acme',
        BillingCity ='TestCity',
        BillingCountry ='TestCountry',
        BillingStreet ='TestStreet',
        BillingPostalCode ='t3stcd3'
        );
        
        insert a;
        
        Contact c = new Contact (        
        FirstName = 'xyzFirst',
        LastName = 'XyZLast',        
        AccountId = a.Id,
        Email = 'xyzmail@mail.com'
        );
        
        //line added - waveoc
        insert c;
                
        Integer i = 0;
        for(i = 0; i < 300; i++){
        	Case testCase             = new Case();    
            testCase.Status           = 'Working';
            testCase.Type             = 'Mechanical';
            testCase.Subject          = 'Mechanical ' + i;
            testCase.Date_Reported__c = Date.today();            
            testCase.Vehicle__c       = v.id; //
            testCase.Equipment__c     = p.id; //
            testCase.Product__c       = 'GC1040';
            testCase.ContactId        = c.id;
            testCase.AccountId        = a.id;
            
            lc.add(testCase);
        }
        
        insert lc;
        
        Test.startTest();
        List<Case> testCase = [select Status,Type from case limit 50];
        List<Case> testCaseUp = new List<Case>();
        for(Case cas:testCase){
            cas.Status = 'Escalated';
            cas.Type = 'Working';
            testCaseUp.add(cas);
        }
        update testCaseUp;
        
        System.assertEquals(0, [Select Id from Case where type='Repair' and Status='Closed'].size());
        Test.stopTest();
        
    }
    
    @isTest
    static void TestTrigger_3(){
        
        List<Case> lc = new List<Case>();
        
        Vehicle__c v = new Vehicle__c(Name = 'dfd');
        insert v;
        
        Product2 p = new Product2(Name = 'dfd');        
        insert p;
        
        Account a = new Account (name = 'Acme',
        BillingCity ='TestCity',
        BillingCountry ='TestCountry',
        BillingStreet ='TestStreet',
        BillingPostalCode ='t3stcd3'
        );
        
        insert a;
        
        Contact c = new Contact (        
        FirstName = 'xyzFirst',
        LastName = 'XyZLast',        
        AccountId = a.Id,
        Email = 'xyzmail@mail.com'
        );
        
        //line added - waveoc
        insert c;
                
        Integer i = 0;
        for(i = 0; i < 300; i++){
        	Case testCase             = new Case();    
            testCase.Status           = 'New';
            testCase.Type             = 'Routine Maintenance';
            testCase.Subject          = 'Manutenzione ' + i;
            testCase.Date_Reported__c = Date.today();            
            testCase.Vehicle__c       = v.id; //
            testCase.Equipment__c     = p.id; //
            testCase.Product__c       = 'GC1040';
            testCase.ContactId        = c.id;
            testCase.AccountId        = a.id;
            
            lc.add(testCase);
        }
        
        insert lc;
        
        Test.startTest();
        List<Case> testCase = [select Status,Type from case limit 300];
        List<Case> testCaseUp = new List<Case>();
        for(Case cas:testCase){
            cas.Status = 'Closed';
            cas.Type = 'Repair';
            testCaseUp.add(cas);
        }
        update testCaseUp;
        Test.stopTest();
        
        System.assertEquals(300, [Select Id from Case where type='Repair' and Status='Closed'].size());
        
    }


}