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
Daniel DlugosDaniel Dlugos 

Simple test class for apex trigger on task

I'm just learning the basics of Apex, and I could use a little help writing a test class for a basic trigger I have that prevents users from deleting tasks. I've been at this for over a week now, and I've just hit a wall with it.

Could anyone help me out with a test class for this? I'll be sure to make it best answer :)

Thanks in advance.
trigger NoDeleteOnTask on Task (before delete)
{
   
    if(trigger.isDelete){
        Set<Id> allowedProfileIds = new Set<Id>();
        for(Profile p :[SELECT Id FROM Profile WHERE (Name = 'System Administrator' )]){
            allowedProfileIds.add(p.Id);
        }

        for (Task a : Trigger.old){
            if(!allowedProfileIds.contains(UserInfo.getProfileId())){
                a.addError('Task\'s can\'t be deleted. Please contact the system administrator if you require further assistance.');
            }
        }
    }
}

 
Best Answer chosen by Daniel Dlugos
Abdul KhatriAbdul Khatri
Here you go. Please mark the best answer if helped
 
@isTest
public class NoDeleteOnTask_Test {  
    @testSetup static void setupTestData() {
		Id adminProfId = [Select id from Profile WHERE Name=:'System Administrator'].Id;
        User adminUser = new User();
        adminUser.FirstName = 'Admin';
        adminUser.LastName = 'testUser';
        adminUser.Email = 'AdmintestUserak@test.com';
        adminUser.Username = 'AdmintestUserak@test.com';
        adminUser.ProfileId = adminProfId;
        adminUser.IsActive = true;
        adminUser.LanguageLocaleKey = 'en_US';
        adminUser.LocaleSidKey = 'en_US';
        adminUser.Alias = adminUser.FirstName.substring(0,1) + adminUser.LastName.substring(0,4);
        adminUser.EmailEncodingKey = 'UTF-8';
        adminUser.TimeZoneSidKey = 'GMT';        
        insert adminUser;

		Id stdProfId = [Select id from Profile WHERE Name=:'Standard User'].Id;
        User stdUser = new User();
        stdUser.FirstName = 'Admin';
        stdUser.LastName = 'testUser';
        stdUser.Email = 'stdtestUserak@test.com';
        stdUser.Username = 'stdtestUserak@test.com';
        stdUser.ProfileId = stdProfId;
        stdUser.IsActive = true;
        stdUser.LanguageLocaleKey = 'en_US';
        stdUser.LocaleSidKey = 'en_US';
        stdUser.Alias = stdUser.FirstName.substring(0,1) + stdUser.LastName.substring(0,4);
        stdUser.EmailEncodingKey = 'UTF-8';
        stdUser.TimeZoneSidKey = 'GMT';        
        insert stdUser;
       
        Task taskData = new Task(Priority = 'Normal',Subject = 'Test',Status = 'Scheduled', OwnerId = stdUser.Id);
        insert taskData;
        
    }
    
    static testMethod void test_admin_must_be_able_to_delete_task(){
     	User adminUser = [SELECT Id FROM User WHERE Username = 'AdmintestUserak@test.com'];
        Task taskData = [SELECT Id FROM Task Where Subject = 'Test' LIMIT 1];
        
        System.runAs(adminUser)
        {    
            delete taskData;
        }
        
        try{
        	taskData = [SELECT Id FROM Task Where Subject = 'Test' LIMIT 1];
        }catch(Exception ex){
            system.assert(true);
        }       
        
    }   
    
    static testMethod void test_user_must_not_be_able_to_delete_task(){
     	User stdUser = [SELECT Id FROM User WHERE Username = 'stdtestUserak@test.com'];
        Task taskData = [SELECT Id FROM Task Where Subject = 'Test' LIMIT 1];
        
        System.runAs(stdUser)
        {   
            try {
            	delete taskData;
            }catch(Exception ex){
                system.debug('ex : ' + ex.getMessage());
                system.assert(ex.getMessage().contains('Task\'s can\'t be deleted'));
            }
        }       
    }     
}

 

All Answers

Abdul KhatriAbdul Khatri
Here you go. Please mark the best answer if helped
 
@isTest
public class NoDeleteOnTask_Test {  
    @testSetup static void setupTestData() {
		Id adminProfId = [Select id from Profile WHERE Name=:'System Administrator'].Id;
        User adminUser = new User();
        adminUser.FirstName = 'Admin';
        adminUser.LastName = 'testUser';
        adminUser.Email = 'AdmintestUserak@test.com';
        adminUser.Username = 'AdmintestUserak@test.com';
        adminUser.ProfileId = adminProfId;
        adminUser.IsActive = true;
        adminUser.LanguageLocaleKey = 'en_US';
        adminUser.LocaleSidKey = 'en_US';
        adminUser.Alias = adminUser.FirstName.substring(0,1) + adminUser.LastName.substring(0,4);
        adminUser.EmailEncodingKey = 'UTF-8';
        adminUser.TimeZoneSidKey = 'GMT';        
        insert adminUser;

		Id stdProfId = [Select id from Profile WHERE Name=:'Standard User'].Id;
        User stdUser = new User();
        stdUser.FirstName = 'Admin';
        stdUser.LastName = 'testUser';
        stdUser.Email = 'stdtestUserak@test.com';
        stdUser.Username = 'stdtestUserak@test.com';
        stdUser.ProfileId = stdProfId;
        stdUser.IsActive = true;
        stdUser.LanguageLocaleKey = 'en_US';
        stdUser.LocaleSidKey = 'en_US';
        stdUser.Alias = stdUser.FirstName.substring(0,1) + stdUser.LastName.substring(0,4);
        stdUser.EmailEncodingKey = 'UTF-8';
        stdUser.TimeZoneSidKey = 'GMT';        
        insert stdUser;
       
        Task taskData = new Task(Priority = 'Normal',Subject = 'Test',Status = 'Scheduled', OwnerId = stdUser.Id);
        insert taskData;
        
    }
    
    static testMethod void test_admin_must_be_able_to_delete_task(){
     	User adminUser = [SELECT Id FROM User WHERE Username = 'AdmintestUserak@test.com'];
        Task taskData = [SELECT Id FROM Task Where Subject = 'Test' LIMIT 1];
        
        System.runAs(adminUser)
        {    
            delete taskData;
        }
        
        try{
        	taskData = [SELECT Id FROM Task Where Subject = 'Test' LIMIT 1];
        }catch(Exception ex){
            system.assert(true);
        }       
        
    }   
    
    static testMethod void test_user_must_not_be_able_to_delete_task(){
     	User stdUser = [SELECT Id FROM User WHERE Username = 'stdtestUserak@test.com'];
        Task taskData = [SELECT Id FROM Task Where Subject = 'Test' LIMIT 1];
        
        System.runAs(stdUser)
        {   
            try {
            	delete taskData;
            }catch(Exception ex){
                system.debug('ex : ' + ex.getMessage());
                system.assert(ex.getMessage().contains('Task\'s can\'t be deleted'));
            }
        }       
    }     
}

 
This was selected as the best answer
Wilfredo Morillo 20Wilfredo Morillo 20
Here's the test Class for your Trigger, I like doing valid and invalid test. I create a test user and run try to delete from a administrator user and also from an standard user. 
 
@isTest
public class NoDeleteOnTaskTest{

    Public Static Task testTask = new task();
    Public Static User testUser = new User();
    
    Public Static Void CreateTestUser(String ProfileName){
        
             testUser.alias = 'alias';
             testUser.IsActive = true;
             testUser.email = 'TestAdmin@test.com';
             testUser.emailencodingkey = 'ISO-8859-1';
             testUser.firstname = 'Test';
             testUser.lastname = 'User';
             testUser.languagelocalekey = 'en_US';
             testUser.localesidkey = 'en_US';
             testUser.ProfileId = [Select id from profile where name =:ProfileName limit 1].id;
             testUser.UserRoleid = [select id from userrole limit 1].id;
             testUser.timezonesidkey = 'America/New_York';
             testUser.UserName = 'noAdmin@test.com';
   
        Insert testUser;   
       
        
    }
        @isTest
        Public Static void AdminDeleteTask(){
         	test.startTest();
            
            CreateTestUser('System Administrator');
            
            system.runAs(testUser){
            testTask.Subject = 'TestTask';
            insert testTask;
            
            Database.DeleteResult deleteTaskResult = database.delete(testTask.id);
            system.debug(deleteTaskResult); 
           
            system.assertEquals(true, deleteTaskResult.success,'Task was not deleted.');          
                 
            } 
            test.StopTest();
        }
    @isTest
        Public Static void NotAdminDeleteTask(){
            test.startTest();
            
            CreateTestUser('Standard User');
            
            system.runAs(testUser){
           testTask.Subject = 'TestTask';
            insert testTask;
                 try{
                    database.delete(testTask.id);
                 }Catch(Exception e){
                      system.assertEquals(true, e.getMessage().contains('Task\'s can\'t be deleted.'),'Task was deleted.');  
                 }   
            }
            test.StopTest();
        }
    }
Let me know if anything. 

Wil, 
Daniel DlugosDaniel Dlugos
Thank you both, this was very helpful
Alvaro MattosAlvaro Mattos
Hello guys, actually this is a very helpful post. Thank you very much. @Daniel Dlugos Task Trigger when changed to Event object works as expected and @Abdul Khatri's Test Class for Task reaches 100% (very good code, congratulations). However, regarding Event Test Class, after change all references from Task to Event and update fields on Event Insert line (require different ones), I got only 71%. This workaround needs to avoid not only Task deletion, but Event as well. So, I do appreciate if @Abdul Khatri's could help me to adjust Task Class in order to work with Event too. Unfortunately, this is an unbelievable pending idea for more than 9 years ( https://goo.gl/qRmwCB - Ability to prevent deletion of Activity History ).
Alvaro MattosAlvaro Mattos
Using @Wilfredo Morillo 20 Code I also got 71% only.