I have somecustom objecy with a lookup users and want to give this users some permissions. I read and tried this https://developer.salesforce.com/docs/atlas.en-us.apexcode.meta/apexcode/apex_bulk_sharing_creating_with_apex.htm but is didn't work. Test failed and i dont understand part with "Creating Apex Managed Sharing"
For example i have object Test with lookup user field Manager and that user must have read-write access
test class doent work on line : System.assertEquals(JobSharing.manualShareRead(j.Id, user2Id), true);
UPD: Trigger works now, but test still failed.
public class JobSharing {
public static boolean manualShareRead(Id recordId, Id userOrGroupId){
Job__Share jobShr = new Job__Share();
jobShr.ParentId = recordId;
jobShr.UserOrGroupId = userOrGroupId;
jobShr.AccessLevel = 'Read';
jobShr.RowCause = Schema.Job__Share.RowCause.Manual;
Database.SaveResult sr = Database.insert(jobShr,false);
if(sr.isSuccess()){
return true;
}
else {
if(err.getStatusCode() == StatusCode.FIELD_FILTER_VALIDATION_EXCEPTION &&
err.getMessage().contains('AccessLevel')){
return true;
}
else{
return false;
}
}
}
}
@isTest
private class JobSharingTest {
static testMethod void testManualShareRead(){
List<User> users = [SELECT Id FROM User WHERE IsActive = true LIMIT 2];
Id User1Id = users[0].Id;
Id User2Id = users[1].Id;
Job__c j = new Job__c();
j.Name = 'Test Job';
j.OwnerId = user1Id;
insert j;
System.assertEquals(JobSharing.manualShareRead(j.Id, user2Id), true);
List<Job__Share> jShrs = [SELECT Id, UserOrGroupId, AccessLevel,
RowCause FROM job__share WHERE ParentId = :j.Id AND UserOrGroupId= :user2Id];
System.assertEquals(jShrs.size(), 1, 'Set the object\'s sharing model to Private.');
System.assertEquals(jShrs[0].AccessLevel, 'Read');
System.assertEquals(jShrs[0].RowCause, 'Manual');
System.assertEquals(jShrs[0].UserOrGroupId, user2Id);
delete j;
System.assertEquals(JobSharing.manualShareRead(j.Id, user2Id), false);
}
}
Trigger
trigger JobApexSharing on Job__c (after insert) {
if(trigger.isInsert){
// Create a new list of sharing objects for Job
List<Job__Share> jobShrs = new List<Job__Share>();
// Declare variables for recruiting and hiring manager sharing
Job__Share recruiterShr;
Job__Share hmShr;
for(Job__c job : trigger.new){
// Instantiate the sharing objects
recruiterShr = new Job__Share();
hmShr = new Job__Share();
// Set the ID of record being shared
recruiterShr.ParentId = job.Id;
hmShr.ParentId = job.Id;
// Set the ID of user or group being granted access
recruiterShr.UserOrGroupId = job.Recruiter__c;
hmShr.UserOrGroupId = job.Hiring_Manager__c;
// Set the access level
recruiterShr.AccessLevel = 'edit';
hmShr.AccessLevel = 'read';
// Set the Apex sharing reason for hiring manager and recruiter
recruiterShr.RowCause = Schema.Job__Share.RowCause.Recruiter__c;
hmShr.RowCause = Schema.Job__Share.RowCause.Hiring_Manager__c;
// Add objects to list for insert
jobShrs.add(recruiterShr);
jobShrs.add(hmShr);
}
Database.SaveResult[] lsr = Database.insert(jobShrs,false);
Integer i=0;
for(Database.SaveResult sr : lsr){
if(!sr.isSuccess()){
Database.Error err = sr.getErrors()[0];
if(!(err.getStatusCode() == StatusCode.FIELD_FILTER_VALIDATION_EXCEPTION
&& err.getMessage().contains('AccessLevel'))){
trigger.newMap.get(jobShrs[i].ParentId).
addError(
'Unable to grant sharing access due to following exception: '
+ err.getMessage());
}
}
i++;
}
}
}