+ Start a Discussion
Ben AllingtonBen Allington 

Triggers Test Class won't run

I am very new to apex development but I have created a class for whenever scrum team is created,
the trigger looks up via account, gathers the account id, queries salesforce to get all contact id related to account id, and shares team record. The class is like so
ScrumTeamSharing
trigger ScrumTeamSharing on agf__ADM_Scrum_Team__c(before insert) {
	if (trigger.isInsert) {
//teamid=a6PA0000000J1AdMAK
//agf__ADM_Scrum_Team__c.Account_ID__c = associated account;
//agf__ADM_Scrum_Team__c.Id = team id;
		List <agf__ADM_Scrum_Team__Share> rShare = new List <agf__ADM_Scrum_Team__Share>();
		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');
		         }
		    }	
		}
	}
My test class is as follows
ScrumTeamSharingTest
@isTest 
private class ScrumTeamSharingTest {
	
	@isTest static void testTeamSharing() {
		//create contact for test
		List<Contact> users = new List<Contact>();
		agf__ADM_Scrum_Team__c t = new agf__ADM_Scrum_Team__c();
		Account a = new Account(Name='Test Account');
		t.Name='testTeam';
		t.Account_ID__c=a.Id;
		insert a;
		insert t;
		System.debug('Inserted team & acct: ' + t.Name + ' ' + a.Name);
		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;
		}
}
And when it runs the error which I am recieving is like so
Error
ScrumTeamSharingTest: (0/1) Passed

 METHOD RESULT 
testTeamSharing : Fail

 STACK TRACE 
Class.ScrumTeamSharingTest.testTeamSharing: line 11, column 1

 MESSAGE 
System.DmlException: Insert failed. First exception on row 0; first error: CANNOT_INSERT_UPDATE_ACTIVATE_ENTITY, DedupeReminder: execution of AfterInsert

caused by: System.DmlException: Insert failed. First exception on row 0; first error: INVALID_CROSS_REFERENCE_KEY, invalid cross reference id: []

Trigger.DedupeReminder: line 7, column 1: []
Art Smorodin 7Art Smorodin 7
Hi, 

have you tries switching around the order of your Insert statemtns? Looks like you are trying to use a.id value before actually inserting Account a into the DB. It will not exist at that point. Try this instead: 
@isTest 
private class ScrumTeamSharingTest {
	
	@isTest static void testTeamSharing() {
		//create contact for test
		List<Contact> users = new List<Contact>();
		Account a = new Account(Name='Test Account');
		insert a;
		agf__ADM_Scrum_Team__c t = new agf__ADM_Scrum_Team__c();
		t.Name='testTeam';
		t.Account_ID__c=a.Id;
		insert t;
		System.debug('Inserted team & acct: ' + t.Name + ' ' + a.Name);
		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;
		}
}

 
Ben AllingtonBen Allington
No still got the exact same problem :(
Mike BonnerMike Bonner
Looks like you are getting an error in a different trigger and your trigger isn't actually running. I am not famliar with the DedupeReminder trigger (assuming it si custom). Based on the name maybe it is throwing an error on duplicate account name? You could try using the the test class name instead of 'Test Account'.