You need to sign in to do that
Don't have an account?
Connor Toth
ProcessInstanceWorkItem Query Test fails on deploy (but works in sandbox)
Problem/Context:
@TestSetup
static void before() {
List<User> userList = createNewUserList(NUM_USERS, false);
insert new List<User>{userList[PENDING_APPROVER]};
userList[PENDING_SUBMITTER].CustomObj_Approver__c = userList[PENDING_APPROVER].Id;
insert new List<User>{userList[PENDING_SUBMITTER]};
CustomObject__c pendingObj = new CustomObject__c(
Name = PENDING_OBJ_NAME,
OwnerId = userList[PENDING_SUBMITTER].Id
);
insert new List<CustomObject__c>{pendingObj};
insertApprovalProcesses(userList[PENDING_SUBMITTER], userList[APPROVED_SUBMITTER], pendingPlan, approvedPlan);
}
private static void insertApprovalProcesses(User pendingSubmitter, CustomObject__c pendingObj) {
List<Approval.ProcessRequest> requestList;
List<Approval.ProcessResult> resultList;
Approval.ProcessSubmitRequest request;
requestList = new List<Approval.ProcessRequest>();
request = new Approval.ProcessSubmitRequest();
request.setObjectId(pendingObj.Id);
request.setSubmitterId(pendingSubmitter.Id);
requestList.add(request);
resultList = Approval.process(requestList);
for (Approval.ProcessResult result : resultList) {
System.assert(result.isSuccess(), 'Failed result: ' + result);
}
}
@IsTest
static void test() {
Id pendingApproverId = getUser(PENDING_APPROVER).Id;
Set<Id> approverIdSet = new Set<Id>{ pendingApproverId };
List<String> PENDING_STATUSES = new List<String>{null, 'Pending', 'Started'};
// When
Test.startTest();
Map<Id, ProcessInstanceWorkItem> resultMap = [
SELECT Id, ActorId
FROM ProcessInstanceWorkItem
WHERE ActorId IN :approverIdSet
AND ProcessInstance.Status IN :PENDING_STATUSES
];
Test.stopTest();
// Then
System.assert(!resultMap.isEmpty());
}
- Approval process exists identically on orgs DEV and INT.
- Test passes on DEV, but fails on deployment validation to INT
- Test failure on deployment validation is that the SOQL query returns 0 rows.
- enable SeeAllData
- Move around the Test.startTest and Test.stopTest methods
- Use StepsAndWorkItems related list on ProcessInstance
- Remove specific approval process Id on test
- Move data creation out of @TestSetup method
@TestSetup
static void before() {
List<User> userList = createNewUserList(NUM_USERS, false);
insert new List<User>{userList[PENDING_APPROVER]};
userList[PENDING_SUBMITTER].CustomObj_Approver__c = userList[PENDING_APPROVER].Id;
insert new List<User>{userList[PENDING_SUBMITTER]};
CustomObject__c pendingObj = new CustomObject__c(
Name = PENDING_OBJ_NAME,
OwnerId = userList[PENDING_SUBMITTER].Id
);
insert new List<CustomObject__c>{pendingObj};
insertApprovalProcesses(userList[PENDING_SUBMITTER], userList[APPROVED_SUBMITTER], pendingPlan, approvedPlan);
}
private static void insertApprovalProcesses(User pendingSubmitter, CustomObject__c pendingObj) {
List<Approval.ProcessRequest> requestList;
List<Approval.ProcessResult> resultList;
Approval.ProcessSubmitRequest request;
requestList = new List<Approval.ProcessRequest>();
request = new Approval.ProcessSubmitRequest();
request.setObjectId(pendingObj.Id);
request.setSubmitterId(pendingSubmitter.Id);
requestList.add(request);
resultList = Approval.process(requestList);
for (Approval.ProcessResult result : resultList) {
System.assert(result.isSuccess(), 'Failed result: ' + result);
}
}
@IsTest
static void test() {
Id pendingApproverId = getUser(PENDING_APPROVER).Id;
Set<Id> approverIdSet = new Set<Id>{ pendingApproverId };
List<String> PENDING_STATUSES = new List<String>{null, 'Pending', 'Started'};
// When
Test.startTest();
Map<Id, ProcessInstanceWorkItem> resultMap = [
SELECT Id, ActorId
FROM ProcessInstanceWorkItem
WHERE ActorId IN :approverIdSet
AND ProcessInstance.Status IN :PENDING_STATUSES
];
Test.stopTest();
// Then
System.assert(!resultMap.isEmpty());
}
Problem was that the Approval Process itself was defined to operate based on criteria associated with "Current User". This criteria was different in the two orgs. The Current User is not necessarily the Submitting User; when running tests, the Current User is the person running the test. The resolution to this issue was to run the Approval.process methods in a System.runAs block using the Submitting User.
All Answers
Check below link and try steps mentioned.
https://salesforce.stackexchange.com/questions/148768/how-to-unit-test-query-processinstanceworkitem-without-a-defined-approval-proces
Thanks,
Thanks,
Problem was that the Approval Process itself was defined to operate based on criteria associated with "Current User". This criteria was different in the two orgs. The Current User is not necessarily the Submitting User; when running tests, the Current User is the person running the test. The resolution to this issue was to run the Approval.process methods in a System.runAs block using the Submitting User.