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
William Boyce 22William Boyce 22 

Test class for schedulable Apex with queues

Hello community!  I am having trouble creating a test class for the following code.  Any assistance would be greatly appreciated. Thank you in advance for your help!

global class Reassign implements Schedulable {
    global void execute(SchedulableContext ctx) {
        // Define 'inprogress' and 'newqueue' string variables
        String inprogress;
        String newqueue;
        
        // Find 'In Progress' queue Id and assign to 'inprogress'
        inprogress = [SELECT Id from Group where Name = 'In Progress' and Type = 'Queue'].Id;
        // Find 'New' queue Id and assign to 'newqueue'
        newqueue = [SELECT Id from Group where Name = 'New' and Type = 'Queue'].Id;
        
        // Create lists for cases
        List<Case> cases1 = [SELECT Id, CaseNumber, OwnerId
                            FROM Case
                            WHERE RecordTypeId = '0124u00000060pmAAA' 
                            AND (Status = 'In Progress' OR Status = 'Outreach Attempted')];
        
        List <Case> cases2 = New List<Case>();
        
        List<Case> newcases1 = [SELECT Id
                              From Case
                              Where RecordTypeId = '0124u00000060pmAAA'
                              AND Status = 'New'];
        
        List <Case> newcases2 = New List<Case>();
        
        // Change the owner and status for each Case in the list and add to respective queue
        for (Case c : cases1){
            c.OwnerId = inprogress;
            c.Status = 'In Progress';
            cases2.add(c);
        }
        update cases2;
        
        for (Case d : newcases1){
            d.OwnerId = newqueue;
            newcases2.add(d);
        }
        update newcases2;
    }
}
Best Answer chosen by William Boyce 22
Daniel AhlDaniel Ahl
Hello William!

I've written a testclass for this, should cover 100%!
 
@isTest
public class TestReassign {
    @testSetup 
    static void testSetup() {
        List<Group> groups = new List<Group>();
        Group inProgressGroup = new Group(Name = 'In Progress', Type = 'Queue');
        Group newGroup = new Group(Name = 'New', Type = 'Queue');
        groups.add(inProgressGroup);
        groups.add(newGroup);
        insert Groups;
        
        List<Case> cases = new List<Case>();
        Case cs1 = new Case(Status = 'In Progress', RecordTypeId = '0124u00000060pmAAA');
        cases.add(cs1);
        Case cs2 = new Case(Status = 'New', RecordTypeId = '0124u00000060pmAAA');
        cases.add(cs2);
        insert cases;
    }
    
    @isTest
    private static void testClass() {
        
        Test.StartTest();
        Reassign reassignSchedule = new Reassign();
        String scheduleTime = '0 0 23 * * ?'; 
        system.schedule('Testing Reassign Class.', scheduleTime, reassignSchedule); 
        Test.stopTest(); 

    }
}

 

All Answers

Daniel AhlDaniel Ahl
Hello William!

I've written a testclass for this, should cover 100%!
 
@isTest
public class TestReassign {
    @testSetup 
    static void testSetup() {
        List<Group> groups = new List<Group>();
        Group inProgressGroup = new Group(Name = 'In Progress', Type = 'Queue');
        Group newGroup = new Group(Name = 'New', Type = 'Queue');
        groups.add(inProgressGroup);
        groups.add(newGroup);
        insert Groups;
        
        List<Case> cases = new List<Case>();
        Case cs1 = new Case(Status = 'In Progress', RecordTypeId = '0124u00000060pmAAA');
        cases.add(cs1);
        Case cs2 = new Case(Status = 'New', RecordTypeId = '0124u00000060pmAAA');
        cases.add(cs2);
        insert cases;
    }
    
    @isTest
    private static void testClass() {
        
        Test.StartTest();
        Reassign reassignSchedule = new Reassign();
        String scheduleTime = '0 0 23 * * ?'; 
        system.schedule('Testing Reassign Class.', scheduleTime, reassignSchedule); 
        Test.stopTest(); 

    }
}

 
This was selected as the best answer
William Boyce 22William Boyce 22
Thank you Daniel!  That was a great help!  From your code I was able to get to where I needed to be.  I did have to make a couple of updates to the code.  I first needed to add "LIMIT 1" to my queue queries so they only returned a single value.  I then needed to add the QueuesObject variable that defines the sObjectType for the queues.  Once I updated those pieces I was able to get proper coverage and push to production.  Thank you for the help! 

Here is the final code for anyone else who comes across this:

Apex Class:
global class Reassign implements Schedulable {
    global void execute(SchedulableContext ctx) {
        // Define 'inprogress' and 'newqueue' string variables
        String inprogress;
        String newqueue;
        
        // Find 'In Progress' queue Id and assign to 'inprogress'
        inprogress = [SELECT Id from Group where Name = 'In Progress' and Type = 'Queue' LIMIT 1].Id;
        // Find 'New' queue Id and assign to 'newqueue'
        newqueue = [SELECT Id from Group where Name = 'New' and Type = 'Queue' LIMIT 1].Id;
        
        // Create lists for cases
        List<Case> cases1 = [SELECT Id, CaseNumber, OwnerId
                            FROM Case
                            WHERE RecordTypeId = '0124u00000060pmAAA' 
                            AND (Status = 'In Progress' OR Status = 'Outreach Attempted')];
        
        List <Case> cases2 = New List<Case>();
        
        List<Case> newcases1 = [SELECT Id
                              From Case
                              Where RecordTypeId = '0124u00000060pmAAA'
                              AND Status = 'New'];
        
        List <Case> newcases2 = New List<Case>();
        
        // Change the owner and status for each Case in the list and add to respective queue
        for (Case c : cases1){
            c.OwnerId = inprogress;
            c.Status = 'In Progress';
            cases2.add(c);
        }
        update cases2;
        
        for (Case d : newcases1){
            d.OwnerId = newqueue;
            newcases2.add(d);
        }
        update newcases2;
    }
}

TestClass:
@isTest
public class ReassignTest {
    @testSetup 
    static void testSetup() {
        List<Group> groups = new List<Group>();
        Group inProgressGroup = new Group(Name = 'In Progress', Type = 'Queue');
        Group newGroup = new Group(Name = 'New', Type = 'Queue');
        groups.add(inProgressGroup);
        groups.add(newGroup);
        insert Groups;
        
        List<QueuesObject> queues = new List<QueuesObject>();
        QueuesObject inprogressQueue = new QueuesObject(QueueID = inProgressGroup.id, SObjectType = 'Case');
        QueuesObject newQueue = new QueuesObject(QueueID = newGroup.id, SObjectType = 'Case');
        queues.add(inprogressQueue);
        queues.add(newQueue);
        insert queues;
        
        List<Case> cases = new List<Case>();
        Case cs1 = new Case(Status = 'In Progress', RecordTypeId = '0124u00000060pmAAA');
        cases.add(cs1);
        Case cs2 = new Case(Status = 'New', RecordTypeId = '0124u00000060pmAAA');
        cases.add(cs2);
        insert cases;
    }
    
    @isTest
    private static void testClass() {
        
        Test.StartTest();
        eConnectReassign reassignSchedule = new Reassign();
        String scheduleTime = '0 0 23 * * ?'; 
        system.schedule('Testing Reassign Class.', scheduleTime, reassignSchedule); 
        Test.stopTest(); 

    }
}