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
Shri BEShri BE 

trigger test class code coverage problem

Hi,

Written Trigger on Campaign Member and it is working fine as expected. I wrote a test class for the trigger and code coverage is 48%. Need assistance to complete the test class and deploy into production. Below is my Trigger and Test Class.
 
Trigger :

trigger insertCustomObj on CampaignMember (after insert, after update) {

    System.debug('---- Entered Trigger ----'); 
    
    List<Customer_Profile__c> customProfileList = new List<Customer_Profile__c>();    
    Set<Id> accountIds = new Set<Id>();    
    
    for(CampaignMember cm : Trigger.new) {
        System.debug('---- Inside CampaignMember : ----');
        accountIds.add(cm.contactId);
    }
    
    Map<Id, List<Account>> accMap = new Map<Id, List<Account>>();
    
    if(!accountIds.isEmpty()){
        System.debug('---- Checking Account Id : ----');
        for(Account acc: [SELECT id, name, personcontactId FROM Account WHERE personcontactId IN:accountIds]){
            personAccountIds.add(acc.Id);
            if(!accMap.containsKey(acc.personcontactId)){
                accMap.put(acc.personcontactId, new List<Account>{acc});
            }
            else{
                List<Account> accList = accMap.get(acc.personcontactId);
                accList.add(acc);
                accMap.put(acc.personcontactId, accList);
            }
        }
    }            
    
    Set<Id> personAccountIds = new Set<Id>();
    List<Customer_Profile__c> existingCustomerProfiles = [SELECT id, business_accounts__c, person_accounts__c FROM Customer_Profile__c WHERE person_accounts__c IN :personAccountIds];
    
    Set<String> bizAcctCombo = new Set<String>();
    for(Customer_Profile__c cp : existingCustomerProfiles) {
        bizAcctCombo.add(String.valueOf(cp.business_accounts__c) + String.valueOf(cp.person_accounts__c));
    }
    
    List<CampaignMember> campaignMembers = [SELECT id, campaign.business_accounts__c, contactId FROM CampaignMember WHERE Id IN :Trigger.newMap.keyset()];
    
    for(CampaignMember cm : campaignMembers) {
        if(accMap.containsKey(cm.contactId)){
            for(Account a: accMap.get(cm.contactId)){
                String bizAcctString = String.valueOf(cm.campaign.business_accounts__c) + String.valueOf(a.id);
                if (!bizAcctCombo.contains(bizAcctString)) {
                    Customer_Profile__c cusObj = new Customer_Profile__c();
                    cusObj.person_accounts__c = a.id;  
                    cusObj.Business_accounts__c = cm.campaign.business_accounts__c ;
                    customProfileList.add(cusObj);
                    bizAcctCombo.add(bizAcctString);
                }
            }
        }
        System.debug('--- Customer Profile List ---' + customProfileList.size());
    }
    try{
        if(customProfileList.size()>0) {
            System.debug('--- Inside CustomObj ---');
            insert customProfileList;
        }
        System.debug('--- Total Custom Object Inserted---'); 
    }
    
    catch (Exception e){
        System.debug('The following exception has occurred: ' + e.getLineNumber() + ' : '  + e.getMessage());
    }    
}
 
Test Class :

@isTest(SeeAllData = true)
private class insertCustomObjTest {
    private static testMethod void insertCustomObj() {
        system.debug('Started Member Insert Test Class');        
        Test.startTest();                    
            Account acct = new Account (Name = 'Test Account');
            insert acct;
            system.debug('Inserted Account, ID: ' + acct.id);
            
            Contact con = new Contact (FirstName = 'Sample', LastName = 'Contact', AccountId = acct.Id);
            insert con;
            system.debug('Inserted Contact, ID: ' + con.id);            

            Campaign camp = new Campaign (Name = 'Test', IsActive = TRUE);
            insert camp;
            system.debug('Inserted Campaign, ID: ' + camp.id);

            CampaignMember member = new CampaignMember (contactId = con.id, Status = 'sent', CampaignId = camp.Id);
            insert member;
            system.debug('Inserted CampaignMember, ID: ' + member.Id);
            system.debug('CampaignMember Status: ' + member.Status);
            system.debug('CampaignId Status: ' + member.CampaignId);
            system.debug('This should fire the Trigger');
            
            Customer_Profile__c testCusobj = new Customer_Profile__c (Name = 'Test Account');
            insert testCusobj;
            system.debug('Inserted Custom Object, ID: ' + testCusobj.id);
        Test.stopTest();
        
        List<Contact> ChgContact = [Select Id, Name FROM Contact WHERE Id = :con.Id];
        System.Debug (ChgContact[0].Id);
    }
}

Thanks in advance.
Raj VakatiRaj Vakati
Try this code and make sure please set all the required fields to work 

 
@isTest
Private Class CampaignMemberTest
{

	static Testmethod void CampaignMemberEx()
	{
	
		
	  
	    
        Profile pf= [Select Id from profile where Name='System Administrator']; 
        
        String orgId=UserInfo.getOrganizationId(); 
        String dateString=String.valueof(Datetime.now()).replace(' ','').replace(':','').replace('-','') ;
        Integer RandomId=Integer.valueOf(Math.rint(Math.random()*1000000)); 
        String uniqueName=orgId+dateString+RandomId; 
        User uu=new User(firstname = 'ABC', 
                         lastName = 'XYZ', 
                         email = uniqueName + '@test' + orgId + '.org', 
                         Username = uniqueName + '@test' + orgId + '.org', 
                         EmailEncodingKey = 'ISO-8859-1', 
                         Alias = uniqueName.substring(18, 23), 
                         TimeZoneSidKey = 'America/Los_Angeles', 
                         LocaleSidKey = 'en_US', 
                         LanguageLocaleKey = 'en_US', 
                         ProfileId = pf.Id
                        ); 
        
        
        insert uu;
			Test.StartTest();
			 
		System.runAs(u){
			
			// Create a personal account and COntact here 
			
	 Account acct = new Account();
     acct.Name = ‘Test Account’;
	 
 Insert acct;
 Contact con=new Contact();
        con.LastName='Shahid';
        con.AccountId=acct.Id;
        con.Contact_Level__c='Manager';
        con.Phone='123';
        con.Contact_Status__c='open';
        con.Became_an_MQL_Lead_Date__c=null;
 Insert con;
 
 Customer_Profile__c co = new Customer_Profile__c() ;
 co.Name ='YTTTTT';
 co.person_accounts__c  = acct.Id ;
 insert co ; 
 
 
 Campaign c=new Campaign();
        c.Name='Email';
        c.IsActive=True;
       Insert c;
 Campaignmember cm=new Campaignmember();
        cm.ContactId=con.Id;
        cm.CampaignId=c.Id;
        cm.Status='Responded';
 Insert cm;
			 
	Campaignmember cm1=new Campaignmember();
        cm1.ContactId=con.Id;
        cm1.CampaignId=c.Id;
        cm1.Status='Responded';
 Insert cm1;
			 	
		
		}
Test.StopTest();
	}
}

 
Shri BEShri BE
Hi Raj,

Same Code Coverage. It is not coming inside the below for Loop. Could you check and help.
 
for(Account acc: [SELECT id, name, personcontactId FROM Account WHERE personcontactId IN:accountIds]){
            personAccountIds.add(acc.Id);
            if(!accMap.containsKey(acc.personcontactId)){
                accMap.put(acc.personcontactId, new List<Account>{acc});
            }
            else{
                List<Account> accList = accMap.get(acc.personcontactId);
                accList.add(acc);
                accMap.put(acc.personcontactId, accList);
            }
        }

for(Account a: accMap.get(cm.contactId)){
                String bizAcctString = String.valueOf(cm.campaign.business_accounts__c) + String.valueOf(a.id);
                if (!bizAcctCombo.contains(bizAcctString)) {
                    Customer_Profile__c cusObj = new Customer_Profile__c();
                    cusObj.person_accounts__c = a.id;  
                    cusObj.Business_accounts__c = cm.campaign.business_accounts__c ;
                    customProfileList.add(cusObj);
                    bizAcctCombo.add(bizAcctString);
                }
            }
Thanks.
 
Raj VakatiRaj Vakati
Try this


You need to set up a personal account and contact  in such way to meet all the data logic is executed ..
@isTest
Private Class CampaignMemberTest
{

	static Testmethod void CampaignMemberEx()
	{
	
		
	  
	    
        Profile pf= [Select Id from profile where Name='System Administrator']; 
        
        String orgId=UserInfo.getOrganizationId(); 
        String dateString=String.valueof(Datetime.now()).replace(' ','').replace(':','').replace('-','') ;
        Integer RandomId=Integer.valueOf(Math.rint(Math.random()*1000000)); 
        String uniqueName=orgId+dateString+RandomId; 
        User uu=new User(firstname = 'ABC', 
                         lastName = 'XYZ', 
                         email = uniqueName + '@test' + orgId + '.org', 
                         Username = uniqueName + '@test' + orgId + '.org', 
                         EmailEncodingKey = 'ISO-8859-1', 
                         Alias = uniqueName.substring(18, 23), 
                         TimeZoneSidKey = 'America/Los_Angeles', 
                         LocaleSidKey = 'en_US', 
                         LanguageLocaleKey = 'en_US', 
                         ProfileId = pf.Id
                        ); 
        
        
        insert uu;
			Test.StartTest();
			 
		System.runAs(u){
			
			// Create a personal account and COntact here 
			
	
	
RecordType personAccountRecordType =  [SELECT Id FROM RecordType WHERE Name = 'Person Account' and SObjectType = 'Account'];
Account acct = new Account();

// for person accounts we can not update the Name field instead we have to update the    FirstName and LastName individually

 acct.FirstName = 'Fred';
 acct.LastName = 'Smith';
acct.personBirthDate = Date.newInstance(1980,5,11);
acct.personMailingStreet = '33 Lincoln Street';
acct.personMailingCity = 'London';
acct.personMailingPostalCode = 'E8 WH1';
acct.personMailingCountry = 'GB';
acct.personEmail = 'axel@sales.com';
acct.personHomePhone = '+44 (1234) 788145';
acct.personMobilePhone = '+44 (1234) 963371'; 
 acct.RecordType = personAccountRecordType;
 insert acct;

	
 Contact con=new Contact();
        con.LastName='Shahid';
        con.AccountId=acct.Id;
        con.Contact_Level__c='Manager';
        con.Phone='123';
        con.Contact_Status__c='open';
        con.Became_an_MQL_Lead_Date__c=null;
 Insert con;
 
 Customer_Profile__c co = new Customer_Profile__c() ;
 co.Name ='YTTTTT';
<b> co.person_accounts__c  = acct.Id ;
</b> insert co ; 
 
 
 Campaign c=new Campaign();
        c.Name='Email';
        c.IsActive=True;
       Insert c;
 Campaignmember cm=new Campaignmember();
        cm.ContactId=con.Id;
        cm.CampaignId=c.Id;
        cm.Status='Responded';
 Insert cm;
			 
	Campaignmember cm1=new Campaignmember();
        cm1.ContactId=con.Id;
        cm1.CampaignId=c.Id;
        cm1.Status='Responded';
 Insert cm1;
			 	
		
		}
Test.StopTest();
	}
}