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
RBLopezRBLopez 

Test class on CampaignMemberStatus

Hi all,

 

I've written a trigger that creates new campaignmemberstatus' on campaign insert based on some custom settings. The test code is causing me some difficulties. I've narrowed it down to the fact that my query of current CampaignMemberStatus' never returns any results (despite working just fine in the sandbox). Any help would be appreciated!

 

Trigger code:

/**** GET APPROPRIATE STATUSES FROM CAMPAIGN SETTINGS OBJECT ****/	
	
	Map <Id, Map<Integer,List<String>>> statusmap = new Map<Id, Map<Integer, List<String>>>(); //map of record type Ids to campaign status ordered list (sort order to label,hasresponded)
	
	Schema.DescribeSObjectResult describe = Schema.SObjectType.Campaign;
	List<RecordTypeInfo> typeslist = describe.getRecordTypeInfos(); //list of all record types for Campaign
	
	Map <String, CampaignSetting__c> allsettings = CampaignSetting__c.getAll(); //map of all custom campaign settings, string = record type name

	for (RecordTypeInfo recordtype : typeslist) {
		String tempname = recordtype.getName();
		try { //only works if settings exist for this record type
			list<String> statuslist = allsettings.get(tempname).StatusList__c.split('::',0);
			list<String> respondedlist = allsettings.get(tempname).StatusResponded__c.split('::',0);
			integer loopcount = 0;						
			Map <Integer, List<String>> innermap = new Map<Integer, List<String>>();
			for (String status : statuslist) {
				innermap.put(loopcount, new String[]{statuslist[loopcount],respondedlist[loopcount]});
				loopcount++;
			}
			statusmap.put(recordtype.getRecordTypeId(),innermap);	
		}	
		catch (Exception e) {
			//fail silently if no custom settings for this record type exist
		}		
	}
	
	system.debug('statusmap: '+statusmap);

/**** CAMPAIGNS IN TRIGGER ****/


	List<CampaignMemberStatus> dummylist = new List<CampaignMemberStatus>();
	List<CampaignMemberStatus> deletelist = new List<CampaignMemberStatus>();
	List<CampaignMemberStatus> insertlist = new List<CampaignMemberStatus>();
	system.debug('newMap '+Trigger.newMap);
	List<CampaignMemberStatus> queryresults = [Select Id, CampaignId, IsDefault from CampaignMemberStatus WHERE CampaignId in :Trigger.newMap.keySet()];
	system.debug('queryresults: '+queryresults);
	for (CampaignMemberStatus status : queryresults) {
		if (statusmap.containsKey(Trigger.newMap.get(status.CampaignId).RecordTypeId)) { //delete statuses from campaigns that will get new member status'
			deletelist.add(status);
		}
	}
	system.debug('deletelist: '+deletelist);
	for (Campaign camp : Trigger.newMap.values()) {
		if (statusmap.containsKey(camp.RecordTypeId)) { //if there are settings for this campaign's record type	
			integer ordercount = 0;					
			for (Integer statusorder : statusmap.get(camp.RecordTypeId).keySet()) { //for each status in the setting
				List<String> valueslist = statusmap.get(camp.RecordTypeId).get(statusorder); //get the values as list. order is 0 = label, 1 = hasresponded
				CampaignMemberStatus newmemb = new CampaignMemberStatus(CampaignId=camp.Id,SortOrder=statusorder, Label=valueslist[0], HasResponded=Boolean.valueOf(valueslist[1]));
				if (statusorder == 0) {
					newmemb.IsDefault = true;
				}
				insertlist.add(newmemb);
				ordercount++;
			}
			dummylist.add(new CampaignMemberStatus(CampaignID = camp.Id, SortOrder=ordercount, Label='Dummy',IsDefault= true));		//set as default so all old values can be deleted
			system.debug('dummylist: '+dummylist);
		}		
	}
	system.debug('insertlist: '+insertlist);
	insert dummylist;	
	delete deletelist;
	insert insertlist;
	for (CampaignMemberStatus status : dummylist) {
		status.IsDefault = false; //take away default status so dummy values can be deleted
	}
	delete dummylist;			
	
}

 

Test Code (mainly to test a VF page that inserts a new campaign of a specific record type):

I'm not getting very far because the controller.generateMeeting() method inserts the campaign, and that is where it fails.

    static testMethod void Schedulingtest() {
    	//set up committee to schedule
        Committee__c committee = new Committee__c(Name='Test');
        insert committee;
        Contact con1 = createContact();
        Contact con2 = createContact();
        Contact con3 = createContact();
        insert con1;
        insert con2;
        insert con3;
        Term__c term1 = new Term__c(Name='test',Member__c=con1.Id,Committee__c=committee.Id, Stage__c='Elected', End_Date__c=date.today().adddays(30));
        Term__c term2 = new Term__c(Name='test',Member__c=con2.Id,Committee__c=committee.Id, Stage__c='Elected', Start_Date__c=date.today().adddays(30));
        Term__c term3 = new Term__c(Name='test',Member__c=con3.Id,Committee__c=committee.Id, Stage__c='Elected', End_Date__c=date.today().adddays(-30));
        insert term1;
        insert term2;
        insert term3;
        
        CampaignSetting__c setting = new CampaignSetting__c(Name='Meeting', RecordTypeID__c='012K00000008oehIAA',StatusList__c='On List::Invited::RSVP Yes::Attended::Declined::No Show',StatusResponded__c='false::false::true::true::false::false');
        insert setting;
        
        //instantiate scheduler controller
        ApexPages.currentPage().getParameters().put('id', committee.Id);
        ApexPages.StandardController StdController = new ApexPages.StandardController(committee);
        ScheduleMeetingController controller = new ScheduleMeetingController(StdController);
        
        //create name, then run scheduler with defaults (invite current members only)
        controller.themeeting.Name='Active only meeting';
        controller.generateMeeting();
        Campaign Meeting1 = [Select Id, NumberofContacts from Campaign where Id = :controller.themeeting.id];
        system.assertequals(1,Meeting1.NumberofContacts); //verify that 1 invitation/campaign membership was added and the meeting created

 

 

pankaj singla 39pankaj singla 39
Hi Lopez,

You have to use SeeAllData=true in the test class to have results in the CampaignMemberStatus Query. Let me know in case it still not works for you.

Thanks and Regards,
Pankaj