+ Start a Discussion
Ben AllingtonBen Allington 

Apex sharing trigger test no coverage

Firstly I am relatively inexperienced with apex but im trying to learn.
Basic background I have created a class so that:
Whenever scrum team is created 'agf_ADM_scrum_team__c'
look up via account, gather the account ids, query salesforce to get all contact ids that are related to the account id, and share the team record. I have written a basic after insert trigger.

ScrumTeamSharing
 
trigger ScrumTeamSharing on agf__ADM_Scrum_Team__c(after insert) {
    if (trigger.isInsert) {
//teamid=a6PA0000000J1AdMAK
//agf__ADM_Scrum_Team__c.Account_ID__c = associated account;
//agf__ADM_Scrum_Team__c.Id = team id;
        agf__ADM_Scrum_Team__Share TeamShare;

        for(agf__ADM_Scrum_Team__c ADM : Trigger.new){
            TeamShare = new agf__ADM_Scrum_Team__Share();
            String IdTeam = ADM.Id;
            String assAcc = ADM.Account_ID__c;

            List<Account> alist = [SELECT Id, Name FROM Account WHERE Id=:assAcc];

            System.debug('a' + alist);

            List<Contact> clist = [SELECT Id, Name FROM Contact WHERE Contact.AccountId IN :alist];

            System.debug('c' + clist);
            
            // Set ID of record being shared
            TeamShare.ParentId = ADM.Id;

            // Set ID of user or group being granted access

            // Set Access Level
            TeamShare.AccessLevel = 'Read';

            //Parse contact Id into the sharing list
            Integer i = clist.size();
            while(i > 0) {
                TeamShare.UserOrGroupId = clist[i].Id;//add to the team reports
                i--;
                    }
                }

                    // Insert the sharing record and capture the save result. 
              // The false parameter allows for partial processing if multiple records passed 
              // into the operation.
              Database.SaveResult sr = Database.insert(TeamShare,false);

              // Process the save results.
              if(sr.isSuccess()){
                 // Indicates success
                 System.debug('Save Success');
              }
              else {
                 // Get first save result error.
                 Database.Error err = sr.getErrors()[0];
                 
                 // Check if the error is related to trival access level.
                 // Access level must be more permissive than the object's default.
                 // These sharing records are not required and thus an insert exception is acceptable. 
                 if(err.getStatusCode() == StatusCode.FIELD_FILTER_VALIDATION_EXCEPTION  &&  
                          err.getMessage().contains('AccessLevel')){
                    // Indicates success.
                    System.debug('Success on mapping error');
                 }
                 else{
                    // Indicates failure.
                    System.debug('Failed to map error');
                 }
            }   
        }
    }
This could probably use improvement so if you can suggest anything I would appreciated it greatly. 
As for the test class it runs and passes but has 0 code coverage.
its here below

SharingTest
@isTest 
private class ScrumTeamSharingTest {
	
	@isTest static void testTeamSharing() {
		//create contact for test
		agf__ADM_Scrum_Team__c t = new agf__ADM_Scrum_Team__c();
		t.Name='testTeam';
		t.agf__Cloud__c='IT';
		insert t;
		List<Contact> users = new List<Contact>();
		Account a = new Account();
		a.Name = 'TestAcc';
		insert a;
		t.Account_ID__c=a.Id;
		System.Assert(a.Id != null, 'The Test Account did not insert properly, please check validation rules and other mechanisms');
		for (Integer j=0; j<5;j++) { //j number of contacts per account
			users.add(new Contact(firstname ='Test'+j,
								  lastname  ='Test'+j,
								  AccountId =a.Id));
		}
		insert users;
		upsert t;
		Id User1Id = users[0].Id;
        Id User2Id = users[1].Id;



		//System.Assert(users.Id != null, 'The users did not insert properly, please check validation rules and other mechanisms');
		System.Assert(t.Id != null, 'The team did not insert properly, please check validation rules and other mechanisms');
		System.debug('Inserted team & acct: ' + t.Name + ' ' + a.Name);
		}
}

This is where im a little confused if someone could show me what it should look like that would be fantastic.

Thanks again
 
Amit Chaudhary 8Amit Chaudhary 8
Please update your test class like below
@isTest 
private class ScrumTeamSharingTest 
{
	@isTest static void testTeamSharing() 
	{
		Account a = new Account();
		a.Name = 'TestAcc';
		insert a;
		System.Assert(a.Id != null, 'The Test Account did not insert properly, please check validation rules and other mechanisms');

		List<Contact> users = new List<Contact>();
		for (Integer j=0; j<5;j++) { //j number of contacts per account
			users.add(new Contact(firstname ='Test'+j,
								  lastname  ='Test'+j,
								  AccountId =a.Id));
		}
		insert users;

		agf__ADM_Scrum_Team__c t = new agf__ADM_Scrum_Team__c();
		t.Name='testTeam';
		t.Account_ID__c=a.Id;
		t.agf__Cloud__c='IT';
		insert t;
		
	}
}

Let us know if this will help you