function readOnly(count){ }
Starting November 20, the site will be set to read-only. On December 4, 2023,
forum discussions will move to the Trailblazer Community.
+ Start a Discussion
Wes McCarthyWes McCarthy 

Test Class Coverage @ 73% - please help

Hi all.

Im having issues getting my code coverage up to 75% for a Task Trigger.  Please see Trigger and Test Class below.  My APEX skills are very basic.  Any advice on how to boost my coverage is much appreciated.  Thanks in advance!!
trigger TaskTrigger on Task (before insert, before update) 
{
    List<Id> OppIds=new List<Id>();
    for(Task t:trigger.new)
    {
        if(t.Status=='Completed')
        {
            if(t.whatId != null && String.valueOf(t.whatId).startsWith('006')==TRUE) //check if the task is associated with an Opp
            {
                OppIds.add(t.whatId);
                //System.debug('In here:' + t.whatid);
            }//if 2
        }//if 1
    }//for
        
    map<id,Opportunity> OpptaskMap = new map<id,Opportunity>([SELECT Id, Situation__c, Forecast_Delivery_Start_Date__c, Forecast_Delivery_End_Date__c, Bypass_Validation_Rule__c, Problem__c, Implication__c, Need_Payoff__c , Involves_Active_Partners__c, Google_Drive_URL__c, StageName, (Select ID From OpportunityLineItems) FROM Opportunity WHERE Id IN :OppIds]);
    
    
    List<OpportunityContactRole> OCR = [select id from OpportunityContactRole where OpportunityId IN :oppIds];
    List<OpportunityPartner> OPartner = [select id from OpportunityPartner where OpportunityId in :oppIds];
       
    
    
    
    for(Task tsk:trigger.new)
    {   
      if(OpptaskMap.keyset().contains(tsk.whatid))
      {
            OpptaskMap.get(tsk.whatid).Bypass_Validation_Rule__c = TRUE;
      
            if(tsk.Status == 'Completed' && tsk.Subject == 'Communicate with Client')
            {
                OpptaskMap.get(tsk.whatid).StageName = '2-Identified';
                //System.debug('Communicate with Client:' + OpptaskMap.get(tsk.whatid).StageName);
            }
            
            Else if( tsk.Status == 'Completed' && tsk.Subject == 'Validate Opportunity')
            {
                If (OpptaskMap.get(tsk.whatid).Situation__c == Null ||  OpptaskMap.get(tsk.whatid).Problem__c == Null || OpptaskMap.get(tsk.whatid).Implication__c == Null || OpptaskMap.get(tsk.whatid).Need_Payoff__c == Null || OpptaskMap.get(tsk.whatid).Involves_Active_Partners__c == Null)
                {
                    tsk.adderror('Task cannot be completed until the following Opportunity fields have been populated: Situation, Problem, Implication, Need & PayOff, Involves Active Partners.');
                }
                Else
                {
                    OpptaskMap.get(tsk.whatid).StageName = '3-Validated';
                }
                    
            }
            
          //  System.debug('1 condition:' + LeadtaskMap.get(tsk.whatid).Description == NULL);
          //  System.debug('2 condition:' + tsk.Status == 'Completed');
          //  System.debug('3 condition:' + tsk.Subject == 'Make contact with Lead');
          //  System.debug('task:' + tsk);
            
            Else if(tsk.Status == 'Completed' && tsk.Subject == 'Qualify Opportunity and Identify Contact Roles')
            {
                If(OpptaskMap.get(tsk.whatid).Forecast_Delivery_Start_Date__c==Null || OpptaskMap.get(tsk.whatid).Forecast_Delivery_End_Date__c==Null)
                {
                     tsk.adderror('Please add the Forecast Delivery Start and End Dates to the "Delivery Details" section of the Opportunity');
                }
                
                If(OpptaskMap.get(tsk.whatid).Involves_Active_Partners__c == 'Yes') 
                { 
                    If (OpptaskMap.get(tsk.whatid).OpportunityLineItems.isEmpty() || OCR.size()==0 || OPartner.size()==0) 
                    {
                        tsk.adderror('Task cannot be completed until Contact Roles, Products AND Partners have been added to the Opportunity');
                    
                    }
                    Else
                    {
                        OpptaskMap.get(tsk.whatid).StageName = '4-Qualified';
                    }
                }
                Else If(OpptaskMap.get(tsk.whatid).Involves_Active_Partners__c == 'No')
                {
                    If (OpptaskMap.get(tsk.whatid).OpportunityLineItems.isEmpty() || OCR.size()==0) 
                    {
                        tsk.adderror('Task cannot be completed until Contact Roles AND Products have been added to the Opportunity');
                    
                    }
                    Else
                    {
                        OpptaskMap.get(tsk.whatid).StageName = '4-Qualified';
                    }
                
                }
                Else
                {
                    //OpptaskMap.get(tsk.whatid).StageName = '4-Qualified';
                }
            }
            
            Else if(tsk.Status == 'Completed' && tsk.Subject == 'Create quote and submit for approval')
            {
                If(OpptaskMap.get(tsk.whatid).Google_Drive_URL__c==Null)
                {
                        tsk.adderror('Task cannot be completed until associated Google Drive URL has been added to the Opportunity');
                    
                }
                Else
                {
                    OpptaskMap.get(tsk.whatid).StageName = '5-Proposal';
                }
            }
            
            Else if(tsk.Status == 'Completed' && tsk.Subject == 'Proposal Outcome')
            {
                If (tsk.Proposal_Outcome__c == 'Commercial Agreement')
                {
                    OpptaskMap.get(tsk.whatid).StageName = '6-Commercial Agreement';
                }
                Else If (tsk.Proposal_Outcome__c == 'Lost')
                {
                    If (tsk.Loss_Abandonment_Reason__c == Null)
                    {
                        tsk.adderror('Please enter a reason for Loss / Abandonment');
                    }
                    Else
                    {
                        OpptaskMap.get(tsk.whatid).StageName = '9-Lost';
                        OpptaskMap.get(tsk.whatid).Opportunity_Loss_Abandoned_Reason__c = tsk.Loss_Abandonment_Reason__c;
                        OpptaskMap.get(tsk.whatid).Opp_Other_Loss_Abandonment_Comments__c = tsk.Other_Loss_Abandonment_Comments__c;
                    }
                }
                Else
                {
                    If (tsk.Loss_Abandonment_Reason__c == Null)
                    {
                        tsk.adderror('Please enter a reason for Loss / Abandonment');
                    }
                    Else
                    {
                        OpptaskMap.get(tsk.whatid).StageName = '8-Abandoned';
                        OpptaskMap.get(tsk.whatid).Opportunity_Loss_Abandoned_Reason__c = tsk.Loss_Abandonment_Reason__c;
                        OpptaskMap.get(tsk.whatid).Opp_Other_Loss_Abandonment_Comments__c = tsk.Other_Loss_Abandonment_Comments__c;
                    }
                }
            }
            
            Else if(tsk.Status == 'Completed' && tsk.Subject == 'Opportunity Outcome')
            {
                If (tsk.Opportunity_Outcome__c == 'Won')
                {
                    OpptaskMap.get(tsk.whatid).StageName = '7-Won';
                }
                Else If (tsk.Opportunity_Outcome__c == 'Lost')
                {
                    If (tsk.Loss_Abandonment_Reason__c == Null)
                    {
                        tsk.adderror('Please enter a reason for Loss / Abandonment');
                    }
                    Else
                    {
                        OpptaskMap.get(tsk.whatid).StageName = '9-Lost';
                        OpptaskMap.get(tsk.whatid).Opportunity_Loss_Abandoned_Reason__c = tsk.Loss_Abandonment_Reason__c;
                        OpptaskMap.get(tsk.whatid).Opp_Other_Loss_Abandonment_Comments__c = tsk.Other_Loss_Abandonment_Comments__c;
                    }
                }
                Else
                {
                    If (tsk.Loss_Abandonment_Reason__c == Null)
                    {
                        tsk.adderror('Please enter a reason for Loss / Abandonment');
                    }
                    Else
                    {
                        OpptaskMap.get(tsk.whatid).StageName = '8-Abandoned';
                        OpptaskMap.get(tsk.whatid).Opportunity_Loss_Abandoned_Reason__c = tsk.Loss_Abandonment_Reason__c;
                        OpptaskMap.get(tsk.whatid).Opp_Other_Loss_Abandonment_Comments__c = tsk.Other_Loss_Abandonment_Comments__c;
                    }
                }
            }
            
            Else 
            {
                //OpptaskMap.get(tsk.whatid).StageName = '7-Won';
            }
      }
    } 
    
    List<Opportunity> OppList = OpptaskMap.values(); 
      update OppList;
      }
Wes McCarthyWes McCarthy
Test Class as follows:

@IsTest()
public class TaskTriggerTest
{

    @IsTest static void TestTaskNotClosed()
    {   
        // Create an Opportunity record
        Opportunity opp = new Opportunity(Name='TestOpp',CloseDate=System.today(),StageName='Unassigned');
        insert opp;
        
        
        
        // Create an Task record to test your Trigger and relate it with the Opp created
        Task t = new Task(Priority='Normal',whatId=opp.id,Subject='Communicate with Client',Status='Completed');
        insert t;
        
        t.Status ='Not Started';
        update t;
    
        
    }
    
    
    @IsTest static void TestStageUpdateToUnassigned()
    {   
        // Create an Opportunity record
        Opportunity opp = new Opportunity(Name='TestOpp',CloseDate=System.today(),StageName='Unassigned');
        insert opp;
        
        
        
        // Create an Task record to test your Trigger and relate it with the Opp created
        Task t = new Task(Priority='Normal',whatId=opp.id,Subject='Communicate with Client',Status='Not Started');
        insert t;
        
        t.Status ='Completed';
        update t;
    
        
    }

    @IsTest static void TestStageUpdateToIdentified()
    {   
        // Create an Opportunity record
        Opportunity opp = new Opportunity(Name='TestOpp',CloseDate=System.today(),StageName='1-Noticing');
        insert opp;
        
        // Create an Task record to test your Trigger and relate it with the Opp created
        Task t = new Task(Priority='Normal',whatId=opp.id,Subject='Communicate with Client',Status='Not Started');
        insert t;
        
        t.Status ='Completed';
        update t;

        //t.Subject='Opportunity Outcome';
        //update t;
        
    }
    
    @IsTest static void TestStageUpdateToValidated()
    {   
        // Create an Opportunity record
        Opportunity opp = new Opportunity(Name='TestOpp',CloseDate=System.today(),StageName='2-Identified', Situation__c='Test', Problem__c='Test', Implication__c='Test', Need_PayOff__c='Test', Involves_Active_Partners__c='Yes');
        insert opp;
        
        // Create an Task record to test your Trigger and relate it with the Opp created
        Task t = new Task(Priority='Normal',whatId=opp.id,Subject='Validate Opportunity',Status='Not Started');
        insert t;
        
        t.Status ='Completed';
        update t;

        //t.Subject='Opportunity Outcome';
        //update t;
        
    }
    
    @IsTest static void TestStageUpdateToQualified()
    {   
    
        Account acc = new Account(Name='Abcde');
        insert acc;

         
        Contact cont = new Contact();
        cont.FirstName ='FiestName';
        cont.LastName ='LastName';
        cont.accountid =acc.id;
        cont.MailingCountry='Australia';
        insert cont;


        // Create an Opportunity record
        Opportunity opp = new Opportunity(Name='TestOpp',CloseDate=System.today(),StageName='3-Validated', Forecast_Delivery_Start_Date__c=NULL, Forecast_Delivery_End_Date__c = NULL, Involves_Active_Partners__c='No');
        insert opp;
        
        Id pricebookId = Test.getStandardPricebookId();

        //Create your product
        Product2 prod = new Product2(Name = 'Product X',ProductCode = 'Pro-X',isActive = true);
        insert prod;

        //Create your pricebook entry
        PricebookEntry pbEntry = new PricebookEntry(Pricebook2Id = pricebookId, Product2Id = prod.Id, UnitPrice = 100.00, IsActive = true);
        insert pbEntry;

        //create your opportunity line item.  This assumes you already have an opportunity created, called opp
        OpportunityLineItem oli = new OpportunityLineItem(OpportunityId = opp.Id, Quantity = 5, PricebookEntryId = pbEntry.Id, TotalPrice = pbEntry.UnitPrice);
        insert oli;
        
        OpportunityContactRole ocr = new OpportunityContactRole(ContactId=cont.id,OpportunityId=opp.id, Role='Decision Maker',IsPrimary=True);
        insert ocr;

        
        // Create an Task record to test your Trigger and relate it with the Opp created
        Task t = new Task(Priority='Normal',whatId=opp.id,Subject='Qualify Opportunity',Status='Not Started');
        insert t;
        
        t.Status ='Completed';
        update t;
    
        
    }
    
    
        @IsTest static void TestStageUpdateToQualified_DatesIncluded()
    {   
    
        Account acc = new Account(Name='Abcde');
        insert acc;

         
        Contact cont = new Contact();
        cont.FirstName ='FiestName';
        cont.LastName ='LastName';
        cont.accountid =acc.id;
        cont.MailingCountry='Australia';
        insert cont;


        // Create an Opportunity record
        Opportunity opp = new Opportunity(Name='TestOpp',CloseDate=System.today(),StageName='3-Validated', Forecast_Delivery_Start_Date__c=system.TODAY(), Forecast_Delivery_End_Date__c = system.TODAY(), Involves_Active_Partners__c='No');
        insert opp;
        
        Id pricebookId = Test.getStandardPricebookId();

        //Create your product
        Product2 prod = new Product2(Name = 'Product X',ProductCode = 'Pro-X',isActive = true);
        insert prod;

        //Create your pricebook entry
        PricebookEntry pbEntry = new PricebookEntry(Pricebook2Id = pricebookId, Product2Id = prod.Id, UnitPrice = 100.00, IsActive = true);
        insert pbEntry;

        //create your opportunity line item.  This assumes you already have an opportunity created, called opp
        OpportunityLineItem oli = new OpportunityLineItem(OpportunityId = opp.Id, Quantity = 5, PricebookEntryId = pbEntry.Id, TotalPrice = pbEntry.UnitPrice);
        insert oli;
        
        OpportunityContactRole ocr = new OpportunityContactRole(ContactId=cont.id,OpportunityId=opp.id, Role='Decision Maker',IsPrimary=True);
        insert ocr;

        
        // Create an Task record to test your Trigger and relate it with the Opp created
        Task t = new Task(Priority='Normal',whatId=opp.id,Subject='Qualify Opportunity',Status='Not Started');
        insert t;
        
        t.Status ='Completed';
        update t;
    
        
    }
    
    @IsTest static void TestStageUpdateToQualified_DateFromNOTIncluded()
    {   
    
        Account acc = new Account(Name='Abcde');
        insert acc;

         
        Contact cont = new Contact();
        cont.FirstName ='FiestName';
        cont.LastName ='LastName';
        cont.accountid =acc.id;
        cont.MailingCountry='Australia';
        insert cont;


        // Create an Opportunity record
        Opportunity opp = new Opportunity(Name='TestOpp',CloseDate=System.today(),StageName='3-Validated', Forecast_Delivery_Start_Date__c=NULL, Forecast_Delivery_End_Date__c = system.TODAY(), Involves_Active_Partners__c='No');
        insert opp;
        
        Id pricebookId = Test.getStandardPricebookId();

        //Create your product
        Product2 prod = new Product2(Name = 'Product X',ProductCode = 'Pro-X',isActive = true);
        insert prod;

        //Create your pricebook entry
        PricebookEntry pbEntry = new PricebookEntry(Pricebook2Id = pricebookId, Product2Id = prod.Id, UnitPrice = 100.00, IsActive = true);
        insert pbEntry;

        //create your opportunity line item.  This assumes you already have an opportunity created, called opp
        OpportunityLineItem oli = new OpportunityLineItem(OpportunityId = opp.Id, Quantity = 5, PricebookEntryId = pbEntry.Id, TotalPrice = pbEntry.UnitPrice);
        insert oli;
        
        OpportunityContactRole ocr = new OpportunityContactRole(ContactId=cont.id,OpportunityId=opp.id, Role='Decision Maker',IsPrimary=True);
        insert ocr;

        
        // Create an Task record to test your Trigger and relate it with the Opp created
        Task t = new Task(Priority='Normal',whatId=opp.id,Subject='Qualify Opportunity',Status='Not Started');
        insert t;
        
        t.Status ='Completed';
        update t;
    
        
    }
    
        @IsTest static void TestStageUpdateToQualified_DateToNOTIncluded()
    {   
    
        Account acc = new Account(Name='Abcde');
        insert acc;

         
        Contact cont = new Contact();
        cont.FirstName ='FiestName';
        cont.LastName ='LastName';
        cont.accountid =acc.id;
        cont.MailingCountry='Australia';
        insert cont;


        // Create an Opportunity record
        Opportunity opp = new Opportunity(Name='TestOpp',CloseDate=System.today(),StageName='3-Validated', Forecast_Delivery_Start_Date__c=system.TODAY(), Forecast_Delivery_End_Date__c = NULL, Involves_Active_Partners__c='No');
        insert opp;
        
        Id pricebookId = Test.getStandardPricebookId();

        //Create your product
        Product2 prod = new Product2(Name = 'Product X',ProductCode = 'Pro-X',isActive = true);
        insert prod;

        //Create your pricebook entry
        PricebookEntry pbEntry = new PricebookEntry(Pricebook2Id = pricebookId, Product2Id = prod.Id, UnitPrice = 100.00, IsActive = true);
        insert pbEntry;

        //create your opportunity line item.  This assumes you already have an opportunity created, called opp
        OpportunityLineItem oli = new OpportunityLineItem(OpportunityId = opp.Id, Quantity = 5, PricebookEntryId = pbEntry.Id, TotalPrice = pbEntry.UnitPrice);
        insert oli;
        
        OpportunityContactRole ocr = new OpportunityContactRole(ContactId=cont.id,OpportunityId=opp.id, Role='Decision Maker',IsPrimary=True);
        insert ocr;

        
        // Create an Task record to test your Trigger and relate it with the Opp created
        Task t = new Task(Priority='Normal',whatId=opp.id,Subject='Qualify Opportunity',Status='Not Started');
        insert t;
        
        t.Status ='Completed';
        update t;
    
        
    }
    
    @IsTest static void TestStageUpdateToProposal()
    {   
        // Create an Opportunity record
        Opportunity opp = new Opportunity(Name='TestOpp',CloseDate=System.today(),StageName='4-Qualified',Google_Drive_URL__c='www.google.com');
        insert opp;
                
          
        // Create an Task record to test your Trigger and relate it with the Opp created
        Task t = new Task(Priority='Normal',whatId=opp.id,Subject='Create quote and submit for approval',Status='Not Started');
        insert t;
        
        t.Status ='Completed';
        update t;
    
        
    }
    
    @IsTest static void TestStageUpdateToCommercialAgreement()
    {   
        // Create an Opportunity record
        Opportunity opp = new Opportunity(Name='TestOpp',CloseDate=System.today(),StageName='5-Proposal');
        insert opp;
        
              
        // Create an Task record to test your Trigger and relate it with the Opp created
        Task t = new Task(Priority='Normal',whatId=opp.id,Subject='Proposal Outcome',Status='Not Started',Proposal_Outcome__c='Commercial Agreement');
        insert t;
        
        t.Status ='Completed';
        update t;
    
        
    }
    
    @IsTest static void TestStageUpdateToLost1()
    {   
        // Create an Opportunity record
        Opportunity opp = new Opportunity(Name='TestOpp',CloseDate=System.today(),StageName='5-Proposal');
        insert opp;
        
        
        
        // Create an Task record to test your Trigger and relate it with the Opp created
        Task t = new Task(Priority='Normal',whatId=opp.id,Subject='Proposal Outcome',Status='Not Started', Proposal_Outcome__c='Lost', Loss_Abandonment_Reason__c='Budget');
        insert t;
        
        t.Status ='Completed';
        update t;
    
        
    }
    
    @IsTest static void TestStageUpdateToAbandoned1()
    {   
        // Create an Opportunity record
        Opportunity opp = new Opportunity(Name='TestOpp',CloseDate=System.today(),StageName='5-Proposal');
        insert opp;
        
        
        
        // Create an Task record to test your Trigger and relate it with the Opp created
        Task t = new Task(Priority='Normal',whatId=opp.id,Subject='Proposal Outcome',Status='Not Started', Proposal_Outcome__c='Abandoned', Loss_Abandonment_Reason__c='Budget');
        insert t;
        
        t.Status ='Completed';
        update t;
    
        
    }
    
    @IsTest static void TestStageUpdateToWon()
    {   
        // Create an Opportunity record
        Opportunity opp = new Opportunity(Name='TestOpp',CloseDate=System.today(),StageName='6-Commercial Agreement');
        insert opp;
        
                
        // Create an Task record to test your Trigger and relate it with the Opp created
        Task t = new Task(Priority='Normal',whatId=opp.id,Subject='Proposal Outcome',Status='Not Started', Opportunity_Outcome__c='Won', Loss_Abandonment_Reason__c='Budget');
        insert t;
        
        t.Status ='Completed';
        update t;
    
        
    }
    
    
    @IsTest static void TestStageUpdateToLost2()
    {   
        // Create an Opportunity record
        Opportunity opp = new Opportunity(Name='TestOpp',CloseDate=System.today(),StageName='6-Commercial Agreement');
        insert opp;
        
                
        // Create an Task record to test your Trigger and relate it with the Opp created
        Task t = new Task(Priority='Normal',whatId=opp.id,Subject='Opportunity Outcome',Status='Not Started', Opportunity_Outcome__c='Lost', Loss_Abandonment_Reason__c='Budget');
        insert t;
        
        t.Status ='Completed';
        update t;
    
        
    }
    
    @IsTest static void TestStageUpdateToAbandoned2()
    {   
        // Create an Opportunity record
        Opportunity opp = new Opportunity(Name='TestOpp',CloseDate=System.today(),StageName='6-Commercial Agreement');
        insert opp;
        
              
        // Create an Task record to test your Trigger and relate it with the Opp created
        Task t = new Task(Priority='Normal',whatId=opp.id,Subject='Opportunity Outcome',Status='Not Started', Opportunity_Outcome__c='Abandoned', Loss_Abandonment_Reason__c='Budget');
        insert t;
        
        t.Status ='Completed';
        update t;
    
        
    }
}
Abhijeet Anand 6Abhijeet Anand 6
Can you please share the lines of your class which are not covered by your test class?
Wes McCarthyWes McCarthy
Sure.  Thanks.  I think these are the only ones that arent covered:


    List<Id> OppIds=new List<Id>();
    for(Task t:trigger.new)
    {
        if(t.Status=='Completed')
        {
            if(t.whatId != null && String.valueOf(t.whatId).startsWith('006')==TRUE) //check if the task is associated with an Opp
            {
                OppIds.add(t.whatId);
                //System.debug('In here:' + t.whatid);
            }//if 2
        }//if 1
    }//for
        
    map<id,Opportunity> OpptaskMap = new map<id,Opportunity>([SELECT Id, Situation__c, Forecast_Delivery_Start_Date__c, Forecast_Delivery_End_Date__c, Bypass_Validation_Rule__c, Problem__c, Implication__c, Need_Payoff__c , Involves_Active_Partners__c, Google_Drive_URL__c, StageName, (Select ID From OpportunityLineItems) FROM Opportunity WHERE Id IN :OppIds]);
    
    
    List<OpportunityContactRole> OCR = [select id from OpportunityContactRole where OpportunityId IN :oppIds];
    List<OpportunityPartner> OPartner = [select id from OpportunityPartner where OpportunityId in :oppIds];