package org.bonitasoft.forms.server.api.impl;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import org.bonitasoft.console.common.server.utils.BPMEngineAPIUtil;
import org.bonitasoft.engine.api.IdentityAPI;
import org.bonitasoft.engine.api.ProcessAPI;
import org.bonitasoft.engine.api.ProfileAPI;
import org.bonitasoft.engine.bpm.flownode.HumanTaskInstance;
import org.bonitasoft.engine.profile.Profile;
import org.bonitasoft.engine.profile.ProfileCriterion;
import org.bonitasoft.engine.session.APISession;
import org.bonitasoft.forms.client.model.Expression;
import org.bonitasoft.forms.client.model.FormAction;
import org.bonitasoft.forms.client.model.exception.ForbiddenFormAccessException;
import org.bonitasoft.forms.server.api.IFormExpressionsAPI;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.Spy;
import org.mockito.runners.MockitoJUnitRunner;
@RunWith(MockitoJUnitRunner.class)
public class FormWorkflowAPIImplTest {
@Mock
private APISession session;
private final Locale locale = new Locale("en");
@Mock
private Map<String, Serializable> context;
@Mock
private List<FormAction> actions;
@Mock
private ProcessAPI processApi;
@Mock
private IdentityAPI identityApi;
@Mock
private BPMEngineAPIUtil bpmEngineAPIUtil;
@Mock
private IFormExpressionsAPI formExpressionsAPI;
@Spy
private FormWorkflowAPIImpl formWorkflowAPIImpl;
@Mock
private List<Expression> expressions;
@Mock
private HumanTaskInstance humanTaskInstance;
@Before
public void setUp() throws Exception {
formWorkflowAPIImpl = spy(new FormWorkflowAPIImpl());
expressions = new ArrayList<Expression>();
doReturn(bpmEngineAPIUtil).when(formWorkflowAPIImpl).getBpmEngineAPIUtil();
doReturn(processApi).when(bpmEngineAPIUtil).getProcessAPI(session);
}
@Test
public void should_canUserSeeProcessInstance_call_engine_api() throws Exception {
checkCanUserSeeProcessInstanceWhenApiReturn(true);
}
@Test
public void should_canUserSeeProcessInstance_call_engine_api_false() throws Exception {
checkCanUserSeeProcessInstanceWhenApiReturn(false);
}
private void checkCanUserSeeProcessInstanceWhenApiReturn(final boolean expected) throws Exception {
final long userId = 25L;
final long processInstanceId = 1L;
//given
doReturn(userId).when(session).getUserId();
doReturn(expected).when(processApi).isInvolvedInProcessInstance(userId, processInstanceId);
//when
final boolean canUserSeeProcessInstance = formWorkflowAPIImpl.canUserSeeProcessInstance(session, processInstanceId);
//then
verify(processApi).isInvolvedInProcessInstance(userId, processInstanceId);
assertThat(canUserSeeProcessInstance).as("should return " + expected).isEqualTo(expected);
}
@Test
public void should_canUserSeeHumanTask_call_engine_api() throws Exception {
final boolean expected = true;
checkCanUserSeeHumanTaskWhenApiReturn(expected);
}
@Test
public void should_canUserSeeHumanTask_call_engine_api_false() throws Exception {
final boolean expected = false;
checkCanUserSeeHumanTaskWhenApiReturn(expected);
}
private void checkCanUserSeeHumanTaskWhenApiReturn(final boolean expected) throws Exception {
final long userId = 25L;
final long humanTaskInstanceId = 1L;
//given
doReturn(userId).when(session).getUserId();
doReturn(expected).when(processApi).isInvolvedInHumanTaskInstance(userId, humanTaskInstanceId);
//when
final boolean canUserSeeHumanTask = formWorkflowAPIImpl.canUserSeeHumanTask(session, -1L, humanTaskInstanceId);
//then
verify(processApi).isInvolvedInHumanTaskInstance(userId, humanTaskInstanceId);
assertThat(canUserSeeHumanTask).as("should return " + expected).isEqualTo(expected);
}
@Test
public void it_should_call_evaluateActivityInitialExpressions() throws Exception {
// Given
formWorkflowAPIImpl = spy(new FormWorkflowAPIImpl());
final long processDefinitionID = -1;
final long activityInstanceID = 1;
expressions = new ArrayList<Expression>();
// When
formWorkflowAPIImpl.getEvaluateConditionExpressions(session, actions, locale, context,
processDefinitionID, activityInstanceID, formExpressionsAPI);
// Then
verify(formExpressionsAPI).evaluateActivityInitialExpressions(session, activityInstanceID, expressions, locale, true, context);
verify(formExpressionsAPI, never()).evaluateProcessInitialExpressions(session, processDefinitionID, expressions, locale, context);
}
@Test
public void it_should_call_evaluateProcessInitialExpressions() throws Exception {
// Given
final long processDefinitionID = 1;
final long activityInstanceID = -1;
// When
formWorkflowAPIImpl.getEvaluateConditionExpressions(session, actions, locale, context,
processDefinitionID, activityInstanceID, formExpressionsAPI);
// Then
verify(formExpressionsAPI).evaluateProcessInitialExpressions(session, processDefinitionID, expressions, locale, context);
verify(formExpressionsAPI, never()).evaluateActivityInitialExpressions(session, activityInstanceID, expressions, locale, true, context);
}
@Test
public void it_should_not_call_evaluateProcessInitialExpressions_nor_evaluateActivityInitialExpressions() throws Exception {
// Given
final long processDefinitionID = -1;
final long activityInstanceID = -1;
// When
formWorkflowAPIImpl.getEvaluateConditionExpressions(session, actions, locale, context,
processDefinitionID, activityInstanceID, formExpressionsAPI);
// Then
verify(formExpressionsAPI, never()).evaluateProcessInitialExpressions(session, processDefinitionID, expressions, locale, context);
verify(formExpressionsAPI, never()).evaluateActivityInitialExpressions(session, activityInstanceID, expressions, locale, true, context);
}
@Test
public void asignTaskIfNotAssigned_should_call_engine() throws Exception {
// Given
final long userId = 25L;
final long activityInstanceID = 42L;
doReturn(humanTaskInstance).when(processApi).getHumanTaskInstance(activityInstanceID);
doReturn(0L).when(humanTaskInstance).getAssigneeId();
doReturn(userId).when(session).getUserId();
// When
formWorkflowAPIImpl.assignTaskIfNotAssigned(session, activityInstanceID, session.getUserId());
// Then
verify(processApi).assignUserTask(activityInstanceID, userId);
}
@Test
public void asignTaskIfNotAssigned_should_not_call_engine_if_the_task_is_already_assigned() throws Exception {
// Given
final long userId = 25L;
final long activityInstanceID = 42L;
doReturn(humanTaskInstance).when(processApi).getHumanTaskInstance(activityInstanceID);
doReturn(25L).when(humanTaskInstance).getAssigneeId();
doReturn(userId).when(session).getUserId();
// When
formWorkflowAPIImpl.assignTaskIfNotAssigned(session, activityInstanceID, session.getUserId());
// Then
verify(processApi, never()).assignUserTask(activityInstanceID, userId);
}
@Test(expected = ForbiddenFormAccessException.class)
public void asignTaskIfNotAssigned_should_throw_exception_if_the_task_is_already_assigned_to_someone_else() throws Exception {
// Given
final long userId = 25L;
final long activityInstanceID = 42L;
doReturn(humanTaskInstance).when(processApi).getHumanTaskInstance(activityInstanceID);
doReturn(33L).when(humanTaskInstance).getAssigneeId();
doReturn(userId).when(session).getUserId();
// When
formWorkflowAPIImpl.assignTaskIfNotAssigned(session, activityInstanceID, session.getUserId());
}
@Test
public void hasUserAdminProfileShouldReturnFalseForNOTAdminProfile() throws Exception {
final ProfileAPI profileAPI = mock(ProfileAPI.class);
final long userId = 488L;
final Profile profile = mock(Profile.class);
doReturn(Collections.singletonList(profile)).when(profileAPI).getProfilesForUser(userId, 0, 10, ProfileCriterion.NAME_ASC);
doReturn(userId).when(session).getUserId();
doReturn("User_Profile").when(profile).getName();
final boolean adminProfile = formWorkflowAPIImpl.hasUserAdminProfile(session, profileAPI);
assertThat(adminProfile).isFalse();
}
@Test
public void hasUserAdminProfileShouldReturnTrueForAdminProfileOnFirstPage() throws Exception {
final ProfileAPI profileAPI = mock(ProfileAPI.class);
final long userId = 488L;
final Profile profile = mock(Profile.class);
doReturn(Collections.singletonList(profile)).when(profileAPI).getProfilesForUser(userId, 0, 10, ProfileCriterion.NAME_ASC);
doReturn(userId).when(session).getUserId();
doReturn(formWorkflowAPIImpl.ADMIN_PROFILE_NAME).when(profile).getName();
final boolean adminProfile = formWorkflowAPIImpl.hasUserAdminProfile(session, profileAPI);
assertThat(adminProfile).isTrue();
}
@Test
public void hasUserAdminProfileShouldReturnTrueForAdminProfileOnSecondPage() throws Exception {
final ProfileAPI profileAPI = mock(ProfileAPI.class);
final long userId = 488L;
final Profile badProfile = mock(Profile.class);
doReturn(Collections.singletonList(badProfile)).when(profileAPI).getProfilesForUser(userId, 0, 10, ProfileCriterion.NAME_ASC);
doReturn("badProfileName").when(badProfile).getName();
final Profile adminProfile = mock(Profile.class);
doReturn(Collections.singletonList(adminProfile)).when(profileAPI).getProfilesForUser(userId, 10, 10, ProfileCriterion.NAME_ASC);
doReturn(formWorkflowAPIImpl.ADMIN_PROFILE_NAME).when(adminProfile).getName();
doReturn(userId).when(session).getUserId();
final boolean foundProfile = formWorkflowAPIImpl.hasUserAdminProfile(session, profileAPI);
assertThat(foundProfile).isTrue();
}
}