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
Luke BottomleyLuke Bottomley 

Test Code Coverage - Adding Lead automatically to Campaign

Hi,

I've written some code which will add a lead automatically to a campaign should it meet certain criteria.
Can anyone shed any light on why i'm only acheiving 50% code coverage with the test class? 
The assert passes so the Campaign Members are being created.
I've tried to insert campaign members also but this didn't help either.

Any ideas would be greatly appreciated!

n.b. I know it's bad practice to hard code the Campaign Id and i'll look to write this out at a later date.
 
trigger NewWebRegistrant on Lead (before insert) {

   List <Lead> LeadList = [Select Id,LeadSource FROM Lead WHERE LeadSource = 'New Web Registrant' AND Id IN :Trigger.new];
   List<CampaignMember> NewMembers = new List<CampaignMember>();
    
    	if (LeadList.size() > 0){
                
            for (Lead l: LeadList){
                
		newMembers.add(new CampaignMember(
                LeadId = l.Id,
                CampaignId = '701g000000073cH',
                Status = 'Not Yet Contacted'));   
  
              insert NewMembers;
            	system.debug('Members is list are' + NewMembers);
          }
    }
}
@isTest
public class TestTrigger {
    
    static testMethod void TestTrigger (){
        
        Set<Id> LeadsInserted = new Set <Id> ();
		
 		List<Lead> newLeads = new List <Lead>();
        
            for(Integer x = 0; x < 200; x++){
                Lead l = new Lead();
   		 l.FirstName = 'test';
         l.LastName = 'test' + x;
         l.Email = 'test@test.com';
         l.LeadSource = 'Test';
         l.Lead_Source_Detail_NEW__c ='Test';
               newLeads.add(l);
            }
        
        insert newLeads;
        

         //Test that for all leads are added to the campaign.      
        
         List<CampaignMember> Members= [Select Id,LeadId,CampaignId FROM CampaignMember WHERE CampaignId = '701g000000073cH'];
                for (CampaignMember cm : Members){
                    Boolean contains = (LeadsInserted).contains(cm.LeadId);
						System.assertEquals(contains, True);
                	}
               }
	}


 
Best Answer chosen by Luke Bottomley
Bhawani SharmaBhawani Sharma
Issue is, you are trying to fetch the lead from database before it actully inserted in the database. See  you triggering event. Update this to after insert.
Also, you dont need to query the lead as this lead in already in context. You can directly run a loop on Trigger.New

All Answers

Sameer Tyagi SFDCSameer Tyagi SFDC
Hi Luke, 

You need to do it after insert. 

Please correct line to

trigger NewWebRegistrant on Lead (after insert) 


Thanks & Regards, 
Sameer Tyagi 
http://mirketa.com/
Bhawani SharmaBhawani Sharma
Issue is, you are trying to fetch the lead from database before it actully inserted in the database. See  you triggering event. Update this to after insert.
Also, you dont need to query the lead as this lead in already in context. You can directly run a loop on Trigger.New
This was selected as the best answer
MithunPMithunP
Hi Luke,

Try below updated code.

Trigger
trigger NewWebRegistrant on Lead (after insert) {

   List<CampaignMember> NewMembers = new List<CampaignMember>();
                
            for (Lead l: trigger.new){
                
             newMembers.add(new CampaignMember(
                LeadId = l.Id,
                CampaignId = '701g000000073cH',
                Status = 'Not Yet Contacted'));   
  
              
                system.debug('Members is list are' + NewMembers);
          }
          insert NewMembers;
    
}
Test Class
@isTest
public class TestTrigger {
    
    static testMethod void TestTrigger (){
       
        Set<Id> LeadsInserted = new Set <Id> ();
        
        List<Lead> newLeads = new List <Lead>();
        
            for(Integer x = 0; x < 200; x++){
                Lead l = new Lead();
         l.FirstName = 'test';
         l.LastName = 'test' + x;
         l.Email = 'test@test.com';
         l.LeadSource = 'New Web Registrant';
         l.company  = 'testcmpy';
         l.Lead_Source_Detail_NEW__c ='Test';
               newLeads.add(l);
            }
        
        insert newLeads;
        
               }
    }

Best Regards,
Mithun.
Sameer Tyagi SFDCSameer Tyagi SFDC
Hi Luke, 

Here is the Correct Trigger Code and Test Class Code
Put your Campaign name instead of 'Your Campaign name';
trigger NewWebRegistrant on Lead (after insert) {
    list<Campaign> campaigns = [Select id from campaign where name = 'Your Campaign name' limit 1];
    List<CampaignMember> NewMembers = new List<CampaignMember>();
    for (Lead l: trigger.new){
        if(campaigns.size() > 0) {
            newMembers.add(new CampaignMember(
            LeadId = l.Id,
            Campaignid = campaigns[0].id,
            Status = 'Not Yet Contacted'));   
            system.debug('Members is list are' + NewMembers);
        }
        
    }
          insert NewMembers;
}

Test Class is
@isTest
public class TestTrigger {
    
    static testMethod void TestTrigger (){
        
        
         Lead l = new Lead();
         l.FirstName = 'test';
         l.LastName = 'test' ;
         l.company = 'Test Company';
         l.Email = 'test@test.com';
         l.LeadSource = 'Test';
         l.Lead_Source_Detail_NEW__c ='Test';
         Insert l;
        
    }
}

Sameer
Luke BottomleyLuke Bottomley
Thanks all. Changing the trigger to after update worked after a small amendment in the test class!