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
ilewi121ilewi121 

Next Activity Apex Test Help


I am working on an apex trigger/class to display the next activity subject & date on the account object. The code works fine, and a manual test will work, but when I run my apex tests, it says something isn't working. Have I written my test code wrong?

Here is the method:

public static void updateAcCountsAndActivities(Set<ID> accountIds){

     //Query all records and related activities
     List<Account> Accounts = [SELECT
   Id,
   TP_NextActivityDate__c,
   TP_NextActivitySubject__c,
         (SELECT Id, Subject, ActivityDate FROM OpenActivities WHERE ActivityDate >= TODAY AND ActivityDate <> NULL order by ActivityDate Desc LIMIT 1)
         FROM Account WHERE ID IN :AccountIds];

     List<Account> updateAccounts = new List<Account>();

     for (Account a : Accounts) {

   //Prepare comparison variables
   String NextActivitySubject = a.TP_NextActivitySubject__c;
   Date NextActivityDate = a.TP_NextActivityDate__c;

   //Compare variables with record
         if (a.OpenActivities.size() > 0) {
             for (OpenActivity act : a.OpenActivities) {
      NextActivityDate = act.ActivityDate;
      NextActivitySubject = act.Subject;
    }
   } else {
    NextActivityDate = null;
    NextActivitySubject = null;
   }

   //Update fields to match variables
         if ( a.TP_NextActivityDate__c != NextActivityDate || a.TP_NextActivitySubject__c != NextActivitySubject){
                 a.TP_NextActivityDate__c = NextActivityDate;
                 a.TP_NextActivitySubject__c = NextActivitySubject;
                 updateAccounts.add(a);
    }
     }

     //Commit the changes
     if(updateAccounts.size()>0) {
         try{
             update updateAccounts;
         }
             catch (Exception e) {
         }
     }
}

Here is a failing test:

public static testMethod void validateAccountCountsAndActivities() {

        //Create Account
  Account ac = new Account(
   Name='Test Account',
   Initial_Lead_Source__c='Cold Call',
   Initial_Lead_Source_Detail__c='Cold Call',
   Account_Type__c='Prospect',
   Account_Status__c='Not Contacted'
   );
  insert ac;

        //Create Contact
        Contact ct = new Contact(
                LastName='Test Contact',
                Email='testcontact@email.com',
                Account= ac
    );
        insert ct;

  // Verify
  ac = [SELECT ID, TP_NextActivityDate__c FROM Account Where ID = :ac.id];
        System.assertEquals(null,ac.TP_NextActivityDate__c);

  //Insert E1
        Event e1 = new Event(
            subject='Event One',
            whoId = ct.id,
            whatId = ac.id,
            startDateTime = Datetime.now().adddays(2),
            endDateTime = Datetime.now().adddays(2)
   );
        insert e1;

  // Verify
  ac = [SELECT ID, TP_NextActivityDate__c FROM Account Where ID = :ac.id];
        System.assertEquals(date.newinstance(e1.EndDateTime.year(),e1.EndDateTime.month(),e1.EndDateTime.day()),ac.TP_NextActivityDate__c);

    }

Error Message:
System.AssertException: Assertion Failed: Expected: 2014-01-24 00:00:00, Actual: null
Best Answer chosen by ilewi121
ilewi121ilewi121
I'm not sure I figured out how to get the NEXT open activity, but I was able to resolve the error if I went with the FARTHEST open activity:

Here is the method:

public static void updateAcCountsAndActivities(Set<ID> accountIds){

     //Query all records and related activities
     List<Account> Accounts = [SELECT
   Id,
   TP_NextActivityDate__c,
   TP_NextActivitySubject__c,
         (SELECT Id, Subject, ActivityDate FROM OpenActivities WHERE ActivityDate >= TODAY AND ActivityDate <> NULL order by ActivityDate Desc LIMIT 1)
         FROM Account WHERE ID IN :AccountIds];

     List<Account> updateAccounts = new List<Account>();

     for (Account a : Accounts) {

   //Prepare comparison variables
   String NextActivitySubject = a.TP_NextActivitySubject__c;
   Date NextActivityDate = a.TP_NextActivityDate__c;

   //Compare variables with record
         if (a.OpenActivities.size() > 0) {
             for (OpenActivity act : a.OpenActivities) {
      NextActivityDate = act.ActivityDate;
      NextActivitySubject = act.Subject;
    }
   } else {
    NextActivityDate = null;
    NextActivitySubject = null;
   }

   //Update fields to match variables
         if ( a.TP_NextActivityDate__c != NextActivityDate || a.TP_NextActivitySubject__c != NextActivitySubject){
                 a.TP_NextActivityDate__c = NextActivityDate;
                 a.TP_NextActivitySubject__c = NextActivitySubject;
                 updateAccounts.add(a);
    }
     }

     //Commit the changes
     if(updateAccounts.size()>0) {
         try{
             update updateAccounts;
         }
             catch (Exception e) {
         }
     }
}

And here is the test:

public static testMethod void validateAccountCountsAndActivities() {

        //Create Account
  Account ac = new Account(
   Name='Test Account',
   Initial_Lead_Source__c='Cold Call',
   Initial_Lead_Source_Detail__c='Cold Call',
   Account_Type__c='Prospect',
   Account_Status__c='Not Contacted'
   );
  insert ac;

        //Create Contact
        Contact ct = new Contact(
                LastName='Test Contact',
                Email='testcontact@email.com',
                Account= ac
    );
        insert ct;

  // Verify
  ac = [SELECT ID, TP_NextActivityDate__c FROM Account Where ID = :ac.id];
        System.assertEquals(null,ac.TP_NextActivityDate__c);

  //Insert E1
        Event e1 = new Event(
            subject='Event One',
            whoId = ct.id,
            whatId = ac.id,
            startDateTime = Datetime.now().adddays(2),
            endDateTime = Datetime.now().adddays(2)
   );
        insert e1;

  // Verify
  ac = [SELECT ID, TP_NextActivityDate__c FROM Account Where ID = :ac.id];
        System.assertEquals(date.newinstance(e1.EndDateTime.year(),e1.EndDateTime.month(),e1.EndDateTime.day()),ac.TP_NextActivityDate__c);

  //Insert T1
        Task t1 = new Task(
            subject='Task One',
            whoId = ct.id,
            whatId = ac.id,
            status='Completed',
            Priority='Normal',
            activitydate=Date.today().adddays(1));
        insert t1;

  // Verify
  ac = [SELECT ID, TP_NextActivityDate__c FROM Account Where ID = :ac.id];
        System.assertEquals(date.newinstance(e1.EndDateTime.year(),e1.EndDateTime.month(),e1.EndDateTime.day()),ac.TP_NextActivityDate__c);
 
  //Insert T2
        Task t2 = new Task(
            subject='Task Two',
            whoId = ct.id,
            whatId = ac.id,
            status='Not Started',
            Priority='Normal',
            activitydate=Date.today().adddays(3));
        insert t2;

  // Verify
  ac = [SELECT ID, TP_NextActivityDate__c FROM Account Where ID = :ac.id];
        System.assertEquals(t2.activitydate,ac.TP_NextActivityDate__c);

  //Remove T2
  t2.whoId = null;
        t2.whatId = null;
        update t2;

  // Verify
  ac = [SELECT ID, TP_NextActivityDate__c FROM Account Where ID = :ac.id];
        System.assertEquals(date.newinstance(e1.EndDateTime.year(),e1.EndDateTime.month(),e1.EndDateTime.day()),ac.TP_NextActivityDate__c);

  //Attach T2
        t2.whoId = ct.id;
  t2.whatId = ac.id;
        update t2;

  // Verify
  ac = [SELECT ID, TP_NextActivityDate__c FROM Account Where ID = :ac.id];
        System.assertEquals(t2.activitydate,ac.TP_NextActivityDate__c);
       
        //Delete E1
        delete e1;

        //Verify
  ac = [SELECT ID, TP_NextActivityDate__c FROM Account Where ID = :ac.id];
        System.assertEquals(t2.activitydate,ac.TP_NextActivityDate__c);

        //Insert E2
        Event e2 = new Event(
            subject='Event Two',
            whoId = ct.id,
            whatId = ac.id,
            startDateTime = Datetime.now().adddays(66),
            endDateTime = Datetime.now().adddays(66));
        insert e2;

        //Verify
  ac = [SELECT ID, TP_NextActivityDate__c FROM Account Where ID = :ac.id];
        System.assertEquals(date.newinstance(e2.EndDateTime.year(),e2.EndDateTime.month(),e2.EndDateTime.day()),ac.TP_NextActivityDate__c);

        //Delete All
  delete e2;
        delete t2;
           
        //Verify
  ac = [SELECT ID, TP_NextActivityDate__c FROM Account Where ID = :ac.id];
        System.assertEquals(null,ac.TP_NextActivityDate__c);

    }