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
Kenny OseniKenny Oseni 

HELP PLEASE: System.LimitException: npsp:Too many SOQL queries: 101

I know similar questions have been asked in this forum but the answers provided is not peculair to my case. I am trying to deploy changes from sandbox to production but a specific Apex Test Class is failing (all 5 test methods failed due to System.LimitException: npsp:Too many SOQL queries: 101). I have the screenshot of the errors as well as the actual Apex Test Class below. I am an Admin and just learning to code so its difficult for me to resolve this on my own. 

I would really appreciate if I can get this resolved soon. ThanksValidation Errors

Here is the Apex Test Class
 
/*
   This test class covers the following Apex classes, methods, and triggers
    TicketAFTER (trigger)
    TicketBEFORE (trigger)
    ContactCalculations.updateFirstLastfromTrigger
    SoapboxTranslation_Utilities.ticketLevelplusHolderFromTrigger
    
*/

@isTest
public class Test_Tickets {
    
/** SETUP METHODS **/
    static List<Opportunity> setupContactRegistrations(Contact con1, Contact con2) {
        TestData.newCampaignSetting('Event');
        TestData.newOppSettings();
        //create 3 events
        Campaign evt1 = TestData.newEvent(datetime.now());
        Campaign evt2 = TestData.newEvent(datetime.now().adddays(-1));
        Campaign evt3 = TestData.newEvent(datetime.now().adddays(-3));
        insert evt1;
        insert evt2;
        insert evt3;
        //create a regsitration to each event for each contact
        Opportunity reg11 = TestData.newRegistration(con1, evt1);
        Opportunity reg21 = TestData.newRegistration(con1, evt2);
        Opportunity reg31 = TestData.newRegistration(con1, evt3);
        Opportunity reg12 = TestData.newRegistration(con2, evt1);
        Opportunity reg22 = TestData.newRegistration(con2, evt2);
        Opportunity reg32 = TestData.newRegistration(con2, evt3);
        insert reg11;
        insert reg21;
        insert reg31;
        insert reg12;
        insert reg22;
        insert reg32;
        Opportunity[] opplist = new Opportunity[]{reg11,reg21,reg31,reg12,reg22,reg32};
        return opplist;
    }
    
/** TICKET TRANSLATION TESTS **/
     
    static private testmethod void testTicketLevelMapping() {
        system.debug('begin ticketlevelmapping test');
        //first, create two contacts and registrations for them to 3 different events
        Contact con1 = TestData.newContact();
        Contact con2 = TestData.newContact();
        insert con1;
        insert con2;
        Opportunity[] reglist = setupContactRegistrations(con1, con2);
        //then get the 3 events and member levels fields
        Campaign evt1 = [Select Id, MemberLevels__c, NonmemberLevels__c, StudentLevels__c from Campaign where Id = :reglist[0].CampaignId];
        Campaign evt2 = [Select Id, MemberLevels__c, NonmemberLevels__c, StudentLevels__c from Campaign where Id = :reglist[1].CampaignId];
        Campaign evt3 = [Select Id, MemberLevels__c, NonmemberLevels__c, StudentLevels__c from Campaign where Id = :reglist[2].CampaignId];
        //for event 1, Education Program and Student are student levels, Member and Guest Pass are member levels and Admin Comp & nonmember are nonmember levels
        evt1.MemberLevels__c = 'Member;Guest Pass';
        evt1.NonmemberLevels__c = 'Admin Comp;Nonmember';
        evt1.StudentLevels__c = 'Education Program;Student';
        //for event 2, Member and Education Program are the member levels, Guest Pass & Nonmember are the nonmember levels, and Student is the only student level
        evt2.MemberLevels__c = 'Member;Education Program';
        evt2.NonmemberLevels__c = 'Nonmember;Guest Pass';
        evt2.StudentLevels__c = 'Student';
        //event 3 has no levels designated
        update evt1;
        update evt2;
        //for each event make 1 member, 1 nonmember, 1 student, 1 education program, 1 guest pass, 1 admin comp ticket
        String[] typelist = new String[]{'Admin Comp','Education Program','Guest Pass','Member','Nonmember','Student'};
        sbxe1__Ticket__c[] tickets1 = new sbxe1__Ticket__c[]{};
        sbxe1__Ticket__c[] tickets2 = new sbxe1__Ticket__c[]{};
        sbxe1__Ticket__c[] tickets3 = new sbxe1__Ticket__c[]{};     
        for (String tickettype : typelist) {
            tickets1.add(TestData.newTicket(reglist[0],tickettype));
        }
        for (String tickettype : typelist) {
            tickets2.add(TestData.newTicket(reglist[1],tickettype));
        }
        for (String tickettype : typelist) {
            tickets3.add(TestData.newTicket(reglist[2],tickettype));
        }
        //now insert all of these tickets
        Test.startTest();
        insert tickets1;
        insert tickets2;
        insert tickets3;
        Test.stopTest();
        //gather up the ticket groups again
        tickets1 = [Select Id, sbxe1__sbx_Campaign__c, sbxe1__sbx_TicketType__c, Ticket_TypeList__c from sbxe1__Ticket__c where sbxe1__sbx_Campaign__c = :evt1.Id order by sbxe1__sbx_TicketType__c ASC];
        tickets2 = [Select Id, sbxe1__sbx_Campaign__c, sbxe1__sbx_TicketType__c, Ticket_TypeList__c from sbxe1__Ticket__c where sbxe1__sbx_Campaign__c = :evt2.Id order by sbxe1__sbx_TicketType__c ASC];
        tickets3 = [Select Id, sbxe1__sbx_Campaign__c, sbxe1__sbx_TicketType__c, Ticket_TypeList__c from sbxe1__Ticket__c where sbxe1__sbx_Campaign__c = :evt3.Id order by sbxe1__sbx_TicketType__c ASC];
        //first show that the education program ticket for evt3 is of type 'general' because evt3 has no levels designated 
        system.assertequals('Education Program',tickets3[1].sbxe1__sbx_TicketType__c);
        system.assertequals('General',tickets3[1].Ticket_TypeList__c);
        //then, show that the education program ticket for evt1 is a student type, but it is a member type for evt2
        system.assertEquals('Education Program', tickets1[1].sbxe1__sbx_TicketType__c, tickets2[1].sbxe1__sbx_TicketType__c);
        system.assertEquals('Student',tickets1[1].Ticket_TypeList__c);
        system.assertEquals('Member',tickets2[1].Ticket_TypeList__c);       
    }
    
    static private testmethod void testTicketHolderMatching() {
        //edit the tickets before insert so that some match and some don't. insert and check
        system.debug('begin ticketholdermatching test');
        //first, create two contacts and registrations for them to 3 different events
        Contact con1 = TestData.newContact();
        Contact con2 = TestData.newContact();
        con1.LastName='Last1';
        con1.FirstName='First1';
        con1.Email = 'con1@email.com';
        con2.LastName='Last2';
        con2.FirstName='First2';
        con2.Email='con2@email.com';
        insert con1;
        insert con2;
        Opportunity[] reglist = setupContactRegistrations(con1, con2);
        //make a ticket that matches con1 on a con1 registration
        sbxe1__Ticket__c ticket1y = TestData.newTicket(reglist[0]);
        ticket1y.sbxe1__sbx_FirstName__c = con1.FirstName;
        ticket1y.sbxe1__sbx_LastName__c = con1.LastName;
        ticket1y.sbxe1__sbx_Email__c = con1.Email;
        //make a ticket that matches con1 on a con2 registration;
        sbxe1__Ticket__c ticket1n = TestData.newTicket(reglist[3]);
        ticket1n.sbxe1__sbx_FirstName__c = con1.FirstName;
        ticket1n.sbxe1__sbx_LastName__c = con1.LastName;
        ticket1n.sbxe1__sbx_Email__c = con1.Email;
        //system.debug('ticket1n pre-insert: '+ticket1n);
        //make a ticket that matches con2 on a con2 registration;
        sbxe1__Ticket__c ticket2y = TestData.newTicket(reglist[3]);
        ticket2y.sbxe1__sbx_FirstName__c = con2.FirstName;
        ticket2y.sbxe1__sbx_LastName__c = con2.LastName;
        ticket2y.sbxe1__sbx_Email__c = con2.Email;
        //now insert the tickets to match the ticket holders to purchasers
        Test.startTest();
        insert ticket1y;
        insert ticket1n;
        insert ticket2y;
        Test.stopTest();
        //get the tickets back
        //system.debug('ticket1n opp: '+ticket1n.sbxe1__sbx_Opportunity__c);
        //system.debug('ticket1n lastname: '+ticket1n.sbxe1__sbx_LastName__c);
        //system.debug('query opp: '+reglist[3].Id);
        //system.debug('query lastname: '+con1.LastName);
        ticket1y = [Select Id, sbxe1__sbx_Opportunity__c, sbxe1__sbx_LastName__c, sbxe1__sbx_TicketHolderContact__c from sbxe1__Ticket__c where sbxe1__sbx_Opportunity__c = :reglist[0].Id and sbxe1__sbx_LastName__c = :con1.LastName];
        ticket1n = [Select Id, sbxe1__sbx_Opportunity__c, sbxe1__sbx_LastName__c, sbxe1__sbx_TicketHolderContact__c from sbxe1__Ticket__c where sbxe1__sbx_Opportunity__c = :reglist[3].Id and sbxe1__sbx_LastName__c = :con1.LastName];
        ticket2y = [Select Id, sbxe1__sbx_Opportunity__c, sbxe1__sbx_LastName__c, sbxe1__sbx_TicketHolderContact__c from sbxe1__Ticket__c where sbxe1__sbx_Opportunity__c = :reglist[3].Id and sbxe1__sbx_LastName__c = :con2.LastName];
        //show that the ticket holder for ticket1y is contact 1, ticket1n has no ticket holder, and contact 2 is the holder for ticket2y
        system.assertequals(con1.Id,ticket1y.sbxe1__sbx_TicketHolderContact__c);
        system.assertequals(null,ticket1n.sbxe1__sbx_TicketHolderContact__c);
        system.assertequals(con2.Id,ticket2y.sbxe1__sbx_TicketHolderContact__c);
    }

    
/** FIRST LAST TRIGGER TESTS **/
  
    static private testmethod void testFirstLastInsert() {
        system.debug('begin firstlast insert test');
        //first, create two contacts and registrations for them to 3 different events
        Contact con1 = TestData.newContact();
        Contact con2 = TestData.newContact();
        insert con1;
        insert con2;
        Opportunity[] opplist = setupContactRegistrations(con1, con2);
        
        //create tickets for both contacts to all three events (for all, attended =true)        
        sbxe1__Ticket__c tick11 = TestData.newTicket(opplist[0], true);
        tick11.sbxe1__sbx_TicketHolderContact__c = con1.Id;
        sbxe1__Ticket__c tick21 = TestData.newTicket(opplist[1], true);
        tick21.sbxe1__sbx_TicketHolderContact__c = con1.Id;
        sbxe1__Ticket__c tick31 = TestData.newTicket(opplist[2], true);
        tick31.sbxe1__sbx_TicketHolderContact__c = con1.Id;
        sbxe1__Ticket__c tick12 = TestData.newTicket(opplist[3], true);
        tick12.sbxe1__sbx_TicketHolderContact__c = con2.Id;
        sbxe1__Ticket__c tick22 = TestData.newTicket(opplist[4], true);
        tick22.sbxe1__sbx_TicketHolderContact__c = con2.Id;
        sbxe1__Ticket__c tick32 = TestData.newTicket(opplist[5], true);
        tick32.sbxe1__sbx_TicketHolderContact__c = con2.Id;
        sbxe1__Ticket__c[] ticketlist = new sbxe1__Ticket__c[]{tick11, tick21, tick31, tick12, tick22, tick32};
        //system.debug('ticketlist before insert: '+ticketlist);
        Test.starttest();
        insert ticketlist;
        Test.stoptest();
        con1 = [Select Id, FirstEvent__c, LastEvent__c from Contact where Id=:con1.Id];
        con2 = [Select Id, FirstEvent__c, LastEvent__c from Contact where Id=:con2.Id];
        system.assertequals(opplist[2].CampaignId, con1.FirstEvent__c);
        system.assertequals(opplist[0].CampaignId, con2.LastEvent__c);
        map<Id, Contact> cmap = new map<Id, Contact>{con1.Id => con1, con2.Id => con2}; //used to get around async testing issues                
    }
    
    static private testmethod void testFirstLastUpdate() {      
        system.debug('begin firstlast update test');
        //first, create two contacts and registrations for them to 3 different events
        Contact con1 = TestData.newContact();
        Contact con2 = TestData.newContact();
        insert con1;
        insert con2;
        Opportunity[] opplist = setupContactRegistrations(con1, con2);
        
        //create tickets for both contacts to all three events (for all, attended =true)        
        sbxe1__Ticket__c tick11 = TestData.newTicket(opplist[0], true);
        tick11.sbxe1__sbx_TicketHolderContact__c = con1.Id;
        sbxe1__Ticket__c tick21 = TestData.newTicket(opplist[1], true);
        tick21.sbxe1__sbx_TicketHolderContact__c = con1.Id;
        sbxe1__Ticket__c tick31 = TestData.newTicket(opplist[2], true);
        tick31.sbxe1__sbx_TicketHolderContact__c = con1.Id;
        sbxe1__Ticket__c tick12 = TestData.newTicket(opplist[3], true);
        tick12.sbxe1__sbx_TicketHolderContact__c = con2.Id;
        sbxe1__Ticket__c tick22 = TestData.newTicket(opplist[4], true);
        tick22.sbxe1__sbx_TicketHolderContact__c = con2.Id;
        sbxe1__Ticket__c tick32 = TestData.newTicket(opplist[5], true);
        tick32.sbxe1__sbx_TicketHolderContact__c = con2.Id;
        sbxe1__Ticket__c[] ticketlist = new sbxe1__Ticket__c[]{tick11, tick21, tick31, tick12, tick22, tick32};
        insert ticketlist;
        
        //set contact first and last event to make sure they are as they should be on insert (tested in another test method)
        con1.FirstEvent__c = opplist[2].CampaignId;
        con1.LastEvent__c = opplist[0].CampaignId;
        con2.FirstEvent__c = opplist[2].CampaignId;
        con2.LastEvent__c = opplist[0].CampaignId;
        update con1;
        update con2;
        
        // change so con2 never attended anything
        tick12.sbxe1__sbx_Attended__c = false;
        tick22.sbxe1__sbx_Attended__c = false;
        tick32.sbxe1__sbx_Attended__c = false;
        //system.debug('ticket list before update: '+ticketlist);
        Test.startTest();
        update ticketlist;
        Test.stopTest();
        con2 = [Select Id, FirstEvent__c, LastEvent__c from Contact where Id=:con2.Id];
        system.assertequals(null, con2.FirstEvent__c);
        system.assertequals(null, con2.LastEvent__c);
    }
    
    static private testmethod void testFirstLastDelete() {
        system.debug('begin firstlast delete test');
        //first, create two contacts and registrations for them to 3 different events
        Contact con1 = TestData.newContact();
        Contact con2 = TestData.newContact();
        insert con1;
        insert con2;
        Opportunity[] opplist = setupContactRegistrations(con1, con2);
        
        //create tickets for both contacts to all three events (for all, attended =true)        
        sbxe1__Ticket__c tick11 = TestData.newTicket(opplist[0], true);
        tick11.sbxe1__sbx_TicketHolderContact__c = con1.Id;
        sbxe1__Ticket__c tick21 = TestData.newTicket(opplist[1], true);
        tick21.sbxe1__sbx_TicketHolderContact__c = con1.Id;
        sbxe1__Ticket__c tick31 = TestData.newTicket(opplist[2], true);
        tick31.sbxe1__sbx_TicketHolderContact__c = con1.Id;
        sbxe1__Ticket__c tick12 = TestData.newTicket(opplist[3], true);
        tick12.sbxe1__sbx_TicketHolderContact__c = con2.Id;
        sbxe1__Ticket__c tick22 = TestData.newTicket(opplist[4], true);
        tick22.sbxe1__sbx_TicketHolderContact__c = con2.Id;
        sbxe1__Ticket__c tick32 = TestData.newTicket(opplist[5], true);
        tick32.sbxe1__sbx_TicketHolderContact__c = con2.Id;
        sbxe1__Ticket__c[] ticketlist = new sbxe1__Ticket__c[]{tick11, tick21, tick31, tick12, tick22, tick32};
        insert ticketlist;
        
        //set contact first and last event to make sure they are as they should be on insert (tested in another test method)
        con1.FirstEvent__c = opplist[2].CampaignId;
        con1.LastEvent__c = opplist[0].CampaignId;
        con2.FirstEvent__c = opplist[2].CampaignId;
        con2.LastEvent__c = opplist[0].CampaignId;
        update con1;
        update con2;

        //delete ticket21 (con1 ticket to event 2), and confirm that this does not change first or last events
        Test.startTest();
        delete tick21;
        Test.stopTest();
        con1 = [Select Id, FirstEvent__c, LastEvent__c from Contact where Id=:con1.Id];
        system.assertequals(opplist[2].CampaignId, con1.FirstEvent__c);
        system.assertequals(opplist[0].CampaignId, con1.LastEvent__c);      
    }           

}

 
Best Answer chosen by Kenny Oseni
Kenny OseniKenny Oseni
I was able to get a friend to work on the code, so what he did was bulkify the DMLs in the test class and all the test methods passed the test! Below is the Correct Code
 
/*
   This test class covers the following Apex classes, methods, and triggers
    TicketAFTER (trigger)
    TicketBEFORE (trigger)
    ContactCalculations.updateFirstLastfromTrigger
    SoapboxTranslation_Utilities.ticketLevelplusHolderFromTrigger
    
*/

@isTest
public class Test_Tickets {
    
/** SETUP METHODS **/
    static List<Opportunity> setupContactRegistrations(Contact con1, Contact con2) {

        TestData.newCampaignSetting('Event');
        TestData.newOppSettings();

        //create 3 events
        Campaign evt1 = TestData.newEvent(datetime.now());
        Campaign evt2 = TestData.newEvent(datetime.now().adddays(-1));
        Campaign evt3 = TestData.newEvent(datetime.now().adddays(-3));
        
        List<Campaign> campaignList = new List<Campaign>();

        campaignList.add(evt1);
        campaignList.add(evt2);
        campaignList.add(evt3);

        insert campaignList;
       
        //create a registration to each event for each contact
        Opportunity reg11 = TestData.newRegistration(con1, evt1);
        Opportunity reg21 = TestData.newRegistration(con1, evt2);
        Opportunity reg31 = TestData.newRegistration(con1, evt3);
        Opportunity reg12 = TestData.newRegistration(con2, evt1);
        Opportunity reg22 = TestData.newRegistration(con2, evt2);
        Opportunity reg32 = TestData.newRegistration(con2, evt3);
        
        List<Opportunity> oppList = new List<Opportunity>();

        oppList.add(reg11);
        oppList.add(reg21);
        oppList.add(reg31);
        oppList.add(reg12);
        oppList.add(reg22);
        oppList.add(reg32);

        insert oppList;
        
        //Opportunity[] opplist = new Opportunity[]{reg11,reg21,reg31,reg12,reg22,reg32};
        return opplist;
    }
    
/** TICKET TRANSLATION TESTS **/
     
    static private testmethod void testTicketLevelMapping() {

        system.debug('begin ticketlevelmapping test');

        //first, create two contacts and registrations for them to 3 different events

        List<Contact> contactList = new List<Contact>();
        Contact con1 = TestData.newContact();
        Contact con2 = TestData.newContact();
        
        contactList.add(con1);
        contactList.add(con2);

        insert contactList;


        Opportunity[] reglist = setupContactRegistrations(con1, con2);

        //then get the 3 events and member levels fields
        
        Campaign evt1 = [Select Id, MemberLevels__c, NonmemberLevels__c, StudentLevels__c from Campaign where Id = :reglist[0].CampaignId];

        Campaign evt2 = [Select Id, MemberLevels__c, NonmemberLevels__c, StudentLevels__c from Campaign where Id = :reglist[1].CampaignId];
        
        Campaign evt3 = [Select Id, MemberLevels__c, NonmemberLevels__c, StudentLevels__c from Campaign where Id = :reglist[2].CampaignId];

        //for event 1, Education Program and Student are student levels, Member and Guest Pass are member levels and Admin Comp & nonmember are nonmember levels
        evt1.MemberLevels__c = 'Member;Guest Pass';
        evt1.NonmemberLevels__c = 'Admin Comp;Nonmember';
        evt1.StudentLevels__c = 'Education Program;Student';
        
        //for event 2, Member and Education Program are the member levels, Guest Pass & Nonmember are the nonmember levels, and Student is the only student level
        evt2.MemberLevels__c = 'Member;Education Program';
        evt2.NonmemberLevels__c = 'Nonmember;Guest Pass';
        evt2.StudentLevels__c = 'Student';
        
        //event 3 has no levels designated
        update evt1;
        update evt2;
        

        //for each event make 1 member, 1 nonmember, 1 student, 1 education program, 1 guest pass, 1 admin comp ticket
        String[] typelist = new String[]{'Admin Comp','Education Program','Guest Pass','Member','Nonmember','Student'};
        sbxe1__Ticket__c[] tickets1 = new sbxe1__Ticket__c[]{};
        sbxe1__Ticket__c[] tickets2 = new sbxe1__Ticket__c[]{};
        sbxe1__Ticket__c[] tickets3 = new sbxe1__Ticket__c[]{};     
        for (String tickettype : typelist) {
            tickets1.add(TestData.newTicket(reglist[0],tickettype));
        }
        for (String tickettype : typelist) {
            tickets2.add(TestData.newTicket(reglist[1],tickettype));
        }
        for (String tickettype : typelist) {
            tickets3.add(TestData.newTicket(reglist[2],tickettype));
        }

        //now insert all of these tickets
        Test.startTest();
        insert tickets1;
        insert tickets2;
        insert tickets3;
        Test.stopTest();

        //gather up the ticket groups again
        tickets1 = [Select Id, sbxe1__sbx_Campaign__c, sbxe1__sbx_TicketType__c, Ticket_TypeList__c from sbxe1__Ticket__c where sbxe1__sbx_Campaign__c = :evt1.Id order by sbxe1__sbx_TicketType__c ASC];
        tickets2 = [Select Id, sbxe1__sbx_Campaign__c, sbxe1__sbx_TicketType__c, Ticket_TypeList__c from sbxe1__Ticket__c where sbxe1__sbx_Campaign__c = :evt2.Id order by sbxe1__sbx_TicketType__c ASC];
        tickets3 = [Select Id, sbxe1__sbx_Campaign__c, sbxe1__sbx_TicketType__c, Ticket_TypeList__c from sbxe1__Ticket__c where sbxe1__sbx_Campaign__c = :evt3.Id order by sbxe1__sbx_TicketType__c ASC];
        //first show that the education program ticket for evt3 is of type 'general' because evt3 has no levels designated 
        system.assertequals('Education Program',tickets3[1].sbxe1__sbx_TicketType__c);
        system.assertequals('General',tickets3[1].Ticket_TypeList__c);
        //then, show that the education program ticket for evt1 is a student type, but it is a member type for evt2
        system.assertEquals('Education Program', tickets1[1].sbxe1__sbx_TicketType__c, tickets2[1].sbxe1__sbx_TicketType__c);
        system.assertEquals('Student',tickets1[1].Ticket_TypeList__c);
        system.assertEquals('Member',tickets2[1].Ticket_TypeList__c);   


    }
    
    static private testmethod void testTicketHolderMatching() {

        //edit the tickets before insert so that some match and some don't. insert and check
        system.debug('begin ticketholdermatching test');
        
        //first, create two contacts and registrations for them to 3 different events
        Contact con1 = TestData.newContact();
        Contact con2 = TestData.newContact();
        con1.LastName='Last1';
        con1.FirstName='First1';
        con1.Email = 'con1@email.com';
        con2.LastName='Last2';
        con2.FirstName='First2';
        con2.Email='con2@email.com';

        List<Contact> contactList = new List<Contact>();
        contactList.add(con1);
        contactList.add(con2);
        insert contactList;


        Opportunity[] reglist = setupContactRegistrations(con1, con2);
        //make a ticket that matches con1 on a con1 registration
        sbxe1__Ticket__c ticket1y = TestData.newTicket(reglist[0]);
        ticket1y.sbxe1__sbx_FirstName__c = con1.FirstName;
        ticket1y.sbxe1__sbx_LastName__c = con1.LastName;
        ticket1y.sbxe1__sbx_Email__c = con1.Email;
        //make a ticket that matches con1 on a con2 registration;
        sbxe1__Ticket__c ticket1n = TestData.newTicket(reglist[3]);
        ticket1n.sbxe1__sbx_FirstName__c = con1.FirstName;
        ticket1n.sbxe1__sbx_LastName__c = con1.LastName;
        ticket1n.sbxe1__sbx_Email__c = con1.Email;
        //system.debug('ticket1n pre-insert: '+ticket1n);
        //make a ticket that matches con2 on a con2 registration;
        sbxe1__Ticket__c ticket2y = TestData.newTicket(reglist[3]);
        ticket2y.sbxe1__sbx_FirstName__c = con2.FirstName;
        ticket2y.sbxe1__sbx_LastName__c = con2.LastName;
        ticket2y.sbxe1__sbx_Email__c = con2.Email;
        //now insert the tickets to match the ticket holders to purchasers
        
        Test.startTest();

        List<sbxe1__Ticket__c> ticketList = new List<sbxe1__Ticket__c>();

        ticketList.add(ticket1y);
        ticketList.add(ticket1n);
        ticketList.add(ticket2y);

        insert ticketList;
        
        Test.stopTest();


        //get the tickets back
        //system.debug('ticket1n opp: '+ticket1n.sbxe1__sbx_Opportunity__c);
        //system.debug('ticket1n lastname: '+ticket1n.sbxe1__sbx_LastName__c);
        //system.debug('query opp: '+reglist[3].Id);
        //system.debug('query lastname: '+con1.LastName);
        ticket1y = [Select Id, sbxe1__sbx_Opportunity__c, sbxe1__sbx_LastName__c, sbxe1__sbx_TicketHolderContact__c from sbxe1__Ticket__c where sbxe1__sbx_Opportunity__c = :reglist[0].Id and sbxe1__sbx_LastName__c = :con1.LastName];
        ticket1n = [Select Id, sbxe1__sbx_Opportunity__c, sbxe1__sbx_LastName__c, sbxe1__sbx_TicketHolderContact__c from sbxe1__Ticket__c where sbxe1__sbx_Opportunity__c = :reglist[3].Id and sbxe1__sbx_LastName__c = :con1.LastName];
        ticket2y = [Select Id, sbxe1__sbx_Opportunity__c, sbxe1__sbx_LastName__c, sbxe1__sbx_TicketHolderContact__c from sbxe1__Ticket__c where sbxe1__sbx_Opportunity__c = :reglist[3].Id and sbxe1__sbx_LastName__c = :con2.LastName];
        //show that the ticket holder for ticket1y is contact 1, ticket1n has no ticket holder, and contact 2 is the holder for ticket2y
        system.assertequals(con1.Id,ticket1y.sbxe1__sbx_TicketHolderContact__c);
        system.assertequals(null,ticket1n.sbxe1__sbx_TicketHolderContact__c);
        system.assertequals(con2.Id,ticket2y.sbxe1__sbx_TicketHolderContact__c);
    }

    
/** FIRST LAST TRIGGER TESTS **/
  
    static private testmethod void testFirstLastInsert() {
        system.debug('begin firstlast insert test');
        //first, create two contacts and registrations for them to 3 different events
        Contact con1 = TestData.newContact();
        Contact con2 = TestData.newContact();
        List<Contact> contactList = new List<Contact>();
        contactList.add(con1);
        contactList.add(con2);
        insert contactList;


        Opportunity[] opplist = setupContactRegistrations(con1, con2);
        
        //create tickets for both contacts to all three events (for all, attended =true)        
        sbxe1__Ticket__c tick11 = TestData.newTicket(opplist[0], true);
        tick11.sbxe1__sbx_TicketHolderContact__c = con1.Id;
        sbxe1__Ticket__c tick21 = TestData.newTicket(opplist[1], true);
        tick21.sbxe1__sbx_TicketHolderContact__c = con1.Id;
        sbxe1__Ticket__c tick31 = TestData.newTicket(opplist[2], true);
        tick31.sbxe1__sbx_TicketHolderContact__c = con1.Id;
        sbxe1__Ticket__c tick12 = TestData.newTicket(opplist[3], true);
        tick12.sbxe1__sbx_TicketHolderContact__c = con2.Id;
        sbxe1__Ticket__c tick22 = TestData.newTicket(opplist[4], true);
        tick22.sbxe1__sbx_TicketHolderContact__c = con2.Id;
        sbxe1__Ticket__c tick32 = TestData.newTicket(opplist[5], true);
        tick32.sbxe1__sbx_TicketHolderContact__c = con2.Id;
        sbxe1__Ticket__c[] ticketlist = new sbxe1__Ticket__c[]{tick11, tick21, tick31, tick12, tick22, tick32};
        //system.debug('ticketlist before insert: '+ticketlist);

        Test.starttest();
        insert ticketlist;
        Test.stoptest();
        
        con1 = [Select Id, FirstEvent__c, LastEvent__c from Contact where Id=:con1.Id];
        con2 = [Select Id, FirstEvent__c, LastEvent__c from Contact where Id=:con2.Id];
        system.assertequals(opplist[2].CampaignId, con1.FirstEvent__c);
        system.assertequals(opplist[0].CampaignId, con2.LastEvent__c);
        map<Id, Contact> cmap = new map<Id, Contact>{con1.Id => con1, con2.Id => con2}; //used to get around async testing issues                
    }
    
    static private testmethod void testFirstLastUpdate() {  

        system.debug('begin firstlast update test');
        //first, create two contacts and registrations for them to 3 different events
        Contact con1 = TestData.newContact();
        Contact con2 = TestData.newContact();
        
        List<Contact> contactList = new List<Contact>();
        contactList.add(con1);
        contactList.add(con2);
        insert contactList;

        Opportunity[] opplist = setupContactRegistrations(con1, con2);
        
        //create tickets for both contacts to all three events (for all, attended =true)        
        sbxe1__Ticket__c tick11 = TestData.newTicket(opplist[0], true);
        tick11.sbxe1__sbx_TicketHolderContact__c = con1.Id;
        sbxe1__Ticket__c tick21 = TestData.newTicket(opplist[1], true);
        tick21.sbxe1__sbx_TicketHolderContact__c = con1.Id;
        sbxe1__Ticket__c tick31 = TestData.newTicket(opplist[2], true);
        tick31.sbxe1__sbx_TicketHolderContact__c = con1.Id;
        sbxe1__Ticket__c tick12 = TestData.newTicket(opplist[3], true);
        tick12.sbxe1__sbx_TicketHolderContact__c = con2.Id;
        sbxe1__Ticket__c tick22 = TestData.newTicket(opplist[4], true);
        tick22.sbxe1__sbx_TicketHolderContact__c = con2.Id;
        sbxe1__Ticket__c tick32 = TestData.newTicket(opplist[5], true);
        tick32.sbxe1__sbx_TicketHolderContact__c = con2.Id;
        sbxe1__Ticket__c[] ticketlist = new sbxe1__Ticket__c[]{tick11, tick21, tick31, tick12, tick22, tick32};
        insert ticketlist;
        
        //set contact first and last event to make sure they are as they should be on insert (tested in another test method)
        con1.FirstEvent__c = opplist[2].CampaignId;
        con1.LastEvent__c = opplist[0].CampaignId;
        con2.FirstEvent__c = opplist[2].CampaignId;
        con2.LastEvent__c = opplist[0].CampaignId;
        //update con1;
        //update con2;
        update contactList;

        // change so con2 never attended anything
        tick12.sbxe1__sbx_Attended__c = false;
        tick22.sbxe1__sbx_Attended__c = false;
        tick32.sbxe1__sbx_Attended__c = false;
        //system.debug('ticket list before update: '+ticketlist);

        Test.startTest();
        update ticketlist;
        Test.stopTest();
        
        con2 = [Select Id, FirstEvent__c, LastEvent__c from Contact where Id=:con2.Id];
        system.assertequals(null, con2.FirstEvent__c);
        system.assertequals(null, con2.LastEvent__c);
    }
    
    static private testmethod void testFirstLastDelete() {

        system.debug('begin firstlast delete test');

        //first, create two contacts and registrations for them to 3 different events
        Contact con1 = TestData.newContact();
        Contact con2 = TestData.newContact();

        List<Contact> contactList = new List<Contact>();
        contactList.add(con1);
        contactList.add(con2);
        insert contactList;


        Opportunity[] opplist = setupContactRegistrations(con1, con2);
        
        //create tickets for both contacts to all three events (for all, attended =true)        
       sbxe1__Ticket__c tick11 = TestData.newTicket(opplist[0], true);
       tick11.sbxe1__sbx_TicketHolderContact__c = con1.Id;
       sbxe1__Ticket__c tick21 = TestData.newTicket(opplist[1], true);
       tick21.sbxe1__sbx_TicketHolderContact__c = con1.Id;
       sbxe1__Ticket__c tick31 = TestData.newTicket(opplist[2], true);
       tick31.sbxe1__sbx_TicketHolderContact__c = con1.Id;
       sbxe1__Ticket__c tick12 = TestData.newTicket(opplist[3], true);
       tick12.sbxe1__sbx_TicketHolderContact__c = con2.Id;
       sbxe1__Ticket__c tick22 = TestData.newTicket(opplist[4], true);
       tick22.sbxe1__sbx_TicketHolderContact__c = con2.Id;
       sbxe1__Ticket__c tick32 = TestData.newTicket(opplist[5], true);
       tick32.sbxe1__sbx_TicketHolderContact__c = con2.Id;
       sbxe1__Ticket__c[] ticketlist = new sbxe1__Ticket__c[]{tick11, tick21, tick31, tick12, tick22, tick32};
       insert ticketlist;
        
        //set contact first and last event to make sure they are as they should be on insert (tested in another test method)

       con1.FirstEvent__c = opplist[2].CampaignId;
       con1.LastEvent__c = opplist[0].CampaignId;
       con2.FirstEvent__c = opplist[2].CampaignId;
       con2.LastEvent__c = opplist[0].CampaignId;
       //update con1;
       //update con2;

       update contactList;;
     }
}

Regards

All Answers

Nikhil Shringarpure 32Nikhil Shringarpure 32
System.LimitException: Too many SOQL queries: 101
Knowledge Article Number000181404
DescriptionThe "System.LimitException: Too many SOQL queries: 101" error appears when you've hit theExecution Governor Limit, which means you can run up to a total 100 SOQL queries in a single call or context.  All the SOQL queries in triggers fired from one call or context will be counted against the limit of 100.
ResolutionTo fix the issue, you'll need to change your code in such a way that the number of SOQL fired is less than 100. If you need to change the context then you can use @future annotation which will run the code asynchronously.

Here are some best practices that will stop the error messages and/or help you avoid hitting the Governors Limit: 

 
1. Since Apex runs on a multi-tenant platform, the Apex runtime engine strictly enforces limits to ensure code doesn't monopolize shared resources. Learn about theGovernors Limit.
2. Avoid SOQL queries that are inside FOR loops. 
3. Check out the Salesforce Developer Blog where you can find Best Practices for Triggers.
4. Review best practices for Trigger and Bulk requests on our Force.com Apex Code Developer's Guide. 
5. Be sure you're following the key coding principals for Apex Code in our Developer's Guide.

Important: Salesforce cannot disable the Governors Limit or raise it. Following the best practices above should ensure that you don't hit this limit in the future.
Nikhil Shringarpure 32Nikhil Shringarpure 32
The above gives you generic info on Governor limits especially for the error that you are receiving, since you said you are an admin and you are just starting out, in your code you are executing SOQL calls of more than 100 in your trigger.
Kenny OseniKenny Oseni
Thanks @Nikhil, but I actually need help the exact part of the code that needs to be changed, like where do I add the @future annotation. Kindly look at the code please and advise on what exactly should be adjusted. Thanks
Kenny OseniKenny Oseni
I was able to get a friend to work on the code, so what he did was bulkify the DMLs in the test class and all the test methods passed the test! Below is the Correct Code
 
/*
   This test class covers the following Apex classes, methods, and triggers
    TicketAFTER (trigger)
    TicketBEFORE (trigger)
    ContactCalculations.updateFirstLastfromTrigger
    SoapboxTranslation_Utilities.ticketLevelplusHolderFromTrigger
    
*/

@isTest
public class Test_Tickets {
    
/** SETUP METHODS **/
    static List<Opportunity> setupContactRegistrations(Contact con1, Contact con2) {

        TestData.newCampaignSetting('Event');
        TestData.newOppSettings();

        //create 3 events
        Campaign evt1 = TestData.newEvent(datetime.now());
        Campaign evt2 = TestData.newEvent(datetime.now().adddays(-1));
        Campaign evt3 = TestData.newEvent(datetime.now().adddays(-3));
        
        List<Campaign> campaignList = new List<Campaign>();

        campaignList.add(evt1);
        campaignList.add(evt2);
        campaignList.add(evt3);

        insert campaignList;
       
        //create a registration to each event for each contact
        Opportunity reg11 = TestData.newRegistration(con1, evt1);
        Opportunity reg21 = TestData.newRegistration(con1, evt2);
        Opportunity reg31 = TestData.newRegistration(con1, evt3);
        Opportunity reg12 = TestData.newRegistration(con2, evt1);
        Opportunity reg22 = TestData.newRegistration(con2, evt2);
        Opportunity reg32 = TestData.newRegistration(con2, evt3);
        
        List<Opportunity> oppList = new List<Opportunity>();

        oppList.add(reg11);
        oppList.add(reg21);
        oppList.add(reg31);
        oppList.add(reg12);
        oppList.add(reg22);
        oppList.add(reg32);

        insert oppList;
        
        //Opportunity[] opplist = new Opportunity[]{reg11,reg21,reg31,reg12,reg22,reg32};
        return opplist;
    }
    
/** TICKET TRANSLATION TESTS **/
     
    static private testmethod void testTicketLevelMapping() {

        system.debug('begin ticketlevelmapping test');

        //first, create two contacts and registrations for them to 3 different events

        List<Contact> contactList = new List<Contact>();
        Contact con1 = TestData.newContact();
        Contact con2 = TestData.newContact();
        
        contactList.add(con1);
        contactList.add(con2);

        insert contactList;


        Opportunity[] reglist = setupContactRegistrations(con1, con2);

        //then get the 3 events and member levels fields
        
        Campaign evt1 = [Select Id, MemberLevels__c, NonmemberLevels__c, StudentLevels__c from Campaign where Id = :reglist[0].CampaignId];

        Campaign evt2 = [Select Id, MemberLevels__c, NonmemberLevels__c, StudentLevels__c from Campaign where Id = :reglist[1].CampaignId];
        
        Campaign evt3 = [Select Id, MemberLevels__c, NonmemberLevels__c, StudentLevels__c from Campaign where Id = :reglist[2].CampaignId];

        //for event 1, Education Program and Student are student levels, Member and Guest Pass are member levels and Admin Comp & nonmember are nonmember levels
        evt1.MemberLevels__c = 'Member;Guest Pass';
        evt1.NonmemberLevels__c = 'Admin Comp;Nonmember';
        evt1.StudentLevels__c = 'Education Program;Student';
        
        //for event 2, Member and Education Program are the member levels, Guest Pass & Nonmember are the nonmember levels, and Student is the only student level
        evt2.MemberLevels__c = 'Member;Education Program';
        evt2.NonmemberLevels__c = 'Nonmember;Guest Pass';
        evt2.StudentLevels__c = 'Student';
        
        //event 3 has no levels designated
        update evt1;
        update evt2;
        

        //for each event make 1 member, 1 nonmember, 1 student, 1 education program, 1 guest pass, 1 admin comp ticket
        String[] typelist = new String[]{'Admin Comp','Education Program','Guest Pass','Member','Nonmember','Student'};
        sbxe1__Ticket__c[] tickets1 = new sbxe1__Ticket__c[]{};
        sbxe1__Ticket__c[] tickets2 = new sbxe1__Ticket__c[]{};
        sbxe1__Ticket__c[] tickets3 = new sbxe1__Ticket__c[]{};     
        for (String tickettype : typelist) {
            tickets1.add(TestData.newTicket(reglist[0],tickettype));
        }
        for (String tickettype : typelist) {
            tickets2.add(TestData.newTicket(reglist[1],tickettype));
        }
        for (String tickettype : typelist) {
            tickets3.add(TestData.newTicket(reglist[2],tickettype));
        }

        //now insert all of these tickets
        Test.startTest();
        insert tickets1;
        insert tickets2;
        insert tickets3;
        Test.stopTest();

        //gather up the ticket groups again
        tickets1 = [Select Id, sbxe1__sbx_Campaign__c, sbxe1__sbx_TicketType__c, Ticket_TypeList__c from sbxe1__Ticket__c where sbxe1__sbx_Campaign__c = :evt1.Id order by sbxe1__sbx_TicketType__c ASC];
        tickets2 = [Select Id, sbxe1__sbx_Campaign__c, sbxe1__sbx_TicketType__c, Ticket_TypeList__c from sbxe1__Ticket__c where sbxe1__sbx_Campaign__c = :evt2.Id order by sbxe1__sbx_TicketType__c ASC];
        tickets3 = [Select Id, sbxe1__sbx_Campaign__c, sbxe1__sbx_TicketType__c, Ticket_TypeList__c from sbxe1__Ticket__c where sbxe1__sbx_Campaign__c = :evt3.Id order by sbxe1__sbx_TicketType__c ASC];
        //first show that the education program ticket for evt3 is of type 'general' because evt3 has no levels designated 
        system.assertequals('Education Program',tickets3[1].sbxe1__sbx_TicketType__c);
        system.assertequals('General',tickets3[1].Ticket_TypeList__c);
        //then, show that the education program ticket for evt1 is a student type, but it is a member type for evt2
        system.assertEquals('Education Program', tickets1[1].sbxe1__sbx_TicketType__c, tickets2[1].sbxe1__sbx_TicketType__c);
        system.assertEquals('Student',tickets1[1].Ticket_TypeList__c);
        system.assertEquals('Member',tickets2[1].Ticket_TypeList__c);   


    }
    
    static private testmethod void testTicketHolderMatching() {

        //edit the tickets before insert so that some match and some don't. insert and check
        system.debug('begin ticketholdermatching test');
        
        //first, create two contacts and registrations for them to 3 different events
        Contact con1 = TestData.newContact();
        Contact con2 = TestData.newContact();
        con1.LastName='Last1';
        con1.FirstName='First1';
        con1.Email = 'con1@email.com';
        con2.LastName='Last2';
        con2.FirstName='First2';
        con2.Email='con2@email.com';

        List<Contact> contactList = new List<Contact>();
        contactList.add(con1);
        contactList.add(con2);
        insert contactList;


        Opportunity[] reglist = setupContactRegistrations(con1, con2);
        //make a ticket that matches con1 on a con1 registration
        sbxe1__Ticket__c ticket1y = TestData.newTicket(reglist[0]);
        ticket1y.sbxe1__sbx_FirstName__c = con1.FirstName;
        ticket1y.sbxe1__sbx_LastName__c = con1.LastName;
        ticket1y.sbxe1__sbx_Email__c = con1.Email;
        //make a ticket that matches con1 on a con2 registration;
        sbxe1__Ticket__c ticket1n = TestData.newTicket(reglist[3]);
        ticket1n.sbxe1__sbx_FirstName__c = con1.FirstName;
        ticket1n.sbxe1__sbx_LastName__c = con1.LastName;
        ticket1n.sbxe1__sbx_Email__c = con1.Email;
        //system.debug('ticket1n pre-insert: '+ticket1n);
        //make a ticket that matches con2 on a con2 registration;
        sbxe1__Ticket__c ticket2y = TestData.newTicket(reglist[3]);
        ticket2y.sbxe1__sbx_FirstName__c = con2.FirstName;
        ticket2y.sbxe1__sbx_LastName__c = con2.LastName;
        ticket2y.sbxe1__sbx_Email__c = con2.Email;
        //now insert the tickets to match the ticket holders to purchasers
        
        Test.startTest();

        List<sbxe1__Ticket__c> ticketList = new List<sbxe1__Ticket__c>();

        ticketList.add(ticket1y);
        ticketList.add(ticket1n);
        ticketList.add(ticket2y);

        insert ticketList;
        
        Test.stopTest();


        //get the tickets back
        //system.debug('ticket1n opp: '+ticket1n.sbxe1__sbx_Opportunity__c);
        //system.debug('ticket1n lastname: '+ticket1n.sbxe1__sbx_LastName__c);
        //system.debug('query opp: '+reglist[3].Id);
        //system.debug('query lastname: '+con1.LastName);
        ticket1y = [Select Id, sbxe1__sbx_Opportunity__c, sbxe1__sbx_LastName__c, sbxe1__sbx_TicketHolderContact__c from sbxe1__Ticket__c where sbxe1__sbx_Opportunity__c = :reglist[0].Id and sbxe1__sbx_LastName__c = :con1.LastName];
        ticket1n = [Select Id, sbxe1__sbx_Opportunity__c, sbxe1__sbx_LastName__c, sbxe1__sbx_TicketHolderContact__c from sbxe1__Ticket__c where sbxe1__sbx_Opportunity__c = :reglist[3].Id and sbxe1__sbx_LastName__c = :con1.LastName];
        ticket2y = [Select Id, sbxe1__sbx_Opportunity__c, sbxe1__sbx_LastName__c, sbxe1__sbx_TicketHolderContact__c from sbxe1__Ticket__c where sbxe1__sbx_Opportunity__c = :reglist[3].Id and sbxe1__sbx_LastName__c = :con2.LastName];
        //show that the ticket holder for ticket1y is contact 1, ticket1n has no ticket holder, and contact 2 is the holder for ticket2y
        system.assertequals(con1.Id,ticket1y.sbxe1__sbx_TicketHolderContact__c);
        system.assertequals(null,ticket1n.sbxe1__sbx_TicketHolderContact__c);
        system.assertequals(con2.Id,ticket2y.sbxe1__sbx_TicketHolderContact__c);
    }

    
/** FIRST LAST TRIGGER TESTS **/
  
    static private testmethod void testFirstLastInsert() {
        system.debug('begin firstlast insert test');
        //first, create two contacts and registrations for them to 3 different events
        Contact con1 = TestData.newContact();
        Contact con2 = TestData.newContact();
        List<Contact> contactList = new List<Contact>();
        contactList.add(con1);
        contactList.add(con2);
        insert contactList;


        Opportunity[] opplist = setupContactRegistrations(con1, con2);
        
        //create tickets for both contacts to all three events (for all, attended =true)        
        sbxe1__Ticket__c tick11 = TestData.newTicket(opplist[0], true);
        tick11.sbxe1__sbx_TicketHolderContact__c = con1.Id;
        sbxe1__Ticket__c tick21 = TestData.newTicket(opplist[1], true);
        tick21.sbxe1__sbx_TicketHolderContact__c = con1.Id;
        sbxe1__Ticket__c tick31 = TestData.newTicket(opplist[2], true);
        tick31.sbxe1__sbx_TicketHolderContact__c = con1.Id;
        sbxe1__Ticket__c tick12 = TestData.newTicket(opplist[3], true);
        tick12.sbxe1__sbx_TicketHolderContact__c = con2.Id;
        sbxe1__Ticket__c tick22 = TestData.newTicket(opplist[4], true);
        tick22.sbxe1__sbx_TicketHolderContact__c = con2.Id;
        sbxe1__Ticket__c tick32 = TestData.newTicket(opplist[5], true);
        tick32.sbxe1__sbx_TicketHolderContact__c = con2.Id;
        sbxe1__Ticket__c[] ticketlist = new sbxe1__Ticket__c[]{tick11, tick21, tick31, tick12, tick22, tick32};
        //system.debug('ticketlist before insert: '+ticketlist);

        Test.starttest();
        insert ticketlist;
        Test.stoptest();
        
        con1 = [Select Id, FirstEvent__c, LastEvent__c from Contact where Id=:con1.Id];
        con2 = [Select Id, FirstEvent__c, LastEvent__c from Contact where Id=:con2.Id];
        system.assertequals(opplist[2].CampaignId, con1.FirstEvent__c);
        system.assertequals(opplist[0].CampaignId, con2.LastEvent__c);
        map<Id, Contact> cmap = new map<Id, Contact>{con1.Id => con1, con2.Id => con2}; //used to get around async testing issues                
    }
    
    static private testmethod void testFirstLastUpdate() {  

        system.debug('begin firstlast update test');
        //first, create two contacts and registrations for them to 3 different events
        Contact con1 = TestData.newContact();
        Contact con2 = TestData.newContact();
        
        List<Contact> contactList = new List<Contact>();
        contactList.add(con1);
        contactList.add(con2);
        insert contactList;

        Opportunity[] opplist = setupContactRegistrations(con1, con2);
        
        //create tickets for both contacts to all three events (for all, attended =true)        
        sbxe1__Ticket__c tick11 = TestData.newTicket(opplist[0], true);
        tick11.sbxe1__sbx_TicketHolderContact__c = con1.Id;
        sbxe1__Ticket__c tick21 = TestData.newTicket(opplist[1], true);
        tick21.sbxe1__sbx_TicketHolderContact__c = con1.Id;
        sbxe1__Ticket__c tick31 = TestData.newTicket(opplist[2], true);
        tick31.sbxe1__sbx_TicketHolderContact__c = con1.Id;
        sbxe1__Ticket__c tick12 = TestData.newTicket(opplist[3], true);
        tick12.sbxe1__sbx_TicketHolderContact__c = con2.Id;
        sbxe1__Ticket__c tick22 = TestData.newTicket(opplist[4], true);
        tick22.sbxe1__sbx_TicketHolderContact__c = con2.Id;
        sbxe1__Ticket__c tick32 = TestData.newTicket(opplist[5], true);
        tick32.sbxe1__sbx_TicketHolderContact__c = con2.Id;
        sbxe1__Ticket__c[] ticketlist = new sbxe1__Ticket__c[]{tick11, tick21, tick31, tick12, tick22, tick32};
        insert ticketlist;
        
        //set contact first and last event to make sure they are as they should be on insert (tested in another test method)
        con1.FirstEvent__c = opplist[2].CampaignId;
        con1.LastEvent__c = opplist[0].CampaignId;
        con2.FirstEvent__c = opplist[2].CampaignId;
        con2.LastEvent__c = opplist[0].CampaignId;
        //update con1;
        //update con2;
        update contactList;

        // change so con2 never attended anything
        tick12.sbxe1__sbx_Attended__c = false;
        tick22.sbxe1__sbx_Attended__c = false;
        tick32.sbxe1__sbx_Attended__c = false;
        //system.debug('ticket list before update: '+ticketlist);

        Test.startTest();
        update ticketlist;
        Test.stopTest();
        
        con2 = [Select Id, FirstEvent__c, LastEvent__c from Contact where Id=:con2.Id];
        system.assertequals(null, con2.FirstEvent__c);
        system.assertequals(null, con2.LastEvent__c);
    }
    
    static private testmethod void testFirstLastDelete() {

        system.debug('begin firstlast delete test');

        //first, create two contacts and registrations for them to 3 different events
        Contact con1 = TestData.newContact();
        Contact con2 = TestData.newContact();

        List<Contact> contactList = new List<Contact>();
        contactList.add(con1);
        contactList.add(con2);
        insert contactList;


        Opportunity[] opplist = setupContactRegistrations(con1, con2);
        
        //create tickets for both contacts to all three events (for all, attended =true)        
       sbxe1__Ticket__c tick11 = TestData.newTicket(opplist[0], true);
       tick11.sbxe1__sbx_TicketHolderContact__c = con1.Id;
       sbxe1__Ticket__c tick21 = TestData.newTicket(opplist[1], true);
       tick21.sbxe1__sbx_TicketHolderContact__c = con1.Id;
       sbxe1__Ticket__c tick31 = TestData.newTicket(opplist[2], true);
       tick31.sbxe1__sbx_TicketHolderContact__c = con1.Id;
       sbxe1__Ticket__c tick12 = TestData.newTicket(opplist[3], true);
       tick12.sbxe1__sbx_TicketHolderContact__c = con2.Id;
       sbxe1__Ticket__c tick22 = TestData.newTicket(opplist[4], true);
       tick22.sbxe1__sbx_TicketHolderContact__c = con2.Id;
       sbxe1__Ticket__c tick32 = TestData.newTicket(opplist[5], true);
       tick32.sbxe1__sbx_TicketHolderContact__c = con2.Id;
       sbxe1__Ticket__c[] ticketlist = new sbxe1__Ticket__c[]{tick11, tick21, tick31, tick12, tick22, tick32};
       insert ticketlist;
        
        //set contact first and last event to make sure they are as they should be on insert (tested in another test method)

       con1.FirstEvent__c = opplist[2].CampaignId;
       con1.LastEvent__c = opplist[0].CampaignId;
       con2.FirstEvent__c = opplist[2].CampaignId;
       con2.LastEvent__c = opplist[0].CampaignId;
       //update con1;
       //update con2;

       update contactList;;
     }
}

Regards
This was selected as the best answer
Nikhil Shringarpure 32Nikhil Shringarpure 32
hey kenny glad it worked out, sorry was not able to look at your code, been travelling. Was going to look at it over the weekend, but good to know its resolved.

Nik
Kenny OseniKenny Oseni
Thanks Nik, I really appreciate your willingness to help!