blob: bf79cfde56d719ea2223cf149ddb84b12caf433b [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2012 Boeing.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Boeing - initial API and implementation
*******************************************************************************/
package org.eclipse.osee.ats.client.integration.tests.ats.core.client.workflow.transition;
import static org.mockito.Mockito.when;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import org.eclipse.osee.ats.api.data.AtsAttributeTypes;
import org.eclipse.osee.ats.api.data.AtsRelationTypes;
import org.eclipse.osee.ats.api.task.IAtsTaskService;
import org.eclipse.osee.ats.api.team.IAtsTeamDefinition;
import org.eclipse.osee.ats.api.user.IAtsUser;
import org.eclipse.osee.ats.api.util.IAtsChangeSet;
import org.eclipse.osee.ats.api.workdef.IAtsStateDefinition;
import org.eclipse.osee.ats.api.workdef.JaxAtsWorkDef;
import org.eclipse.osee.ats.api.workdef.StateType;
import org.eclipse.osee.ats.api.workdef.model.ReviewBlockType;
import org.eclipse.osee.ats.api.workdef.model.RuleDefinitionOption;
import org.eclipse.osee.ats.api.workflow.IAtsTask;
import org.eclipse.osee.ats.api.workflow.IAtsTeamWorkflow;
import org.eclipse.osee.ats.api.workflow.IAtsWorkItemService;
import org.eclipse.osee.ats.api.workflow.state.IAtsStateManager;
import org.eclipse.osee.ats.api.workflow.transition.IAtsTransitionManager;
import org.eclipse.osee.ats.api.workflow.transition.TransitionOption;
import org.eclipse.osee.ats.api.workflow.transition.TransitionResult;
import org.eclipse.osee.ats.api.workflow.transition.TransitionResults;
import org.eclipse.osee.ats.client.integration.AtsClientIntegrationTestSuite;
import org.eclipse.osee.ats.client.integration.tests.AtsClientService;
import org.eclipse.osee.ats.client.integration.tests.ats.core.client.AtsTestUtil;
import org.eclipse.osee.ats.client.integration.tests.ats.core.client.AtsTestUtil.AtsTestUtilState;
import org.eclipse.osee.ats.core.client.review.DecisionReviewArtifact;
import org.eclipse.osee.ats.core.client.review.DecisionReviewManager;
import org.eclipse.osee.ats.core.client.review.DecisionReviewState;
import org.eclipse.osee.ats.core.client.review.PeerToPeerReviewArtifact;
import org.eclipse.osee.ats.core.client.team.TeamWorkFlowArtifact;
import org.eclipse.osee.ats.core.client.workflow.AbstractWorkflowArtifact;
import org.eclipse.osee.ats.core.workflow.state.TeamState;
import org.eclipse.osee.ats.core.workflow.transition.TransitionFactory;
import org.eclipse.osee.ats.core.workflow.transition.TransitionHelper;
import org.eclipse.osee.ats.core.workflow.transition.TransitionManager;
import org.eclipse.osee.framework.core.enums.DemoUsers;
import org.eclipse.osee.framework.core.enums.SystemUser;
import org.eclipse.osee.framework.core.util.Result;
import org.eclipse.osee.framework.jdk.core.type.OseeCoreException;
import org.eclipse.osee.framework.ui.ws.AWorkspace;
import org.junit.AfterClass;
import org.junit.Assert;
import org.junit.Before;
import org.junit.BeforeClass;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
/**
* Test unit for {@link TransitionManager}
*
* @author Donald G. Dunne
*/
public class TransitionManagerTest {
private static List<AbstractWorkflowArtifact> EMPTY_AWAS = new ArrayList<>();
public static String WORK_DEF_TARGETED_VERSION_FILE_NAME =
"support/WorkDef_Team_TransitionManagerTest_TargetedVersion.ats";
public static String WORK_DEF_WIDGET_REQUIRED_TRANSITION_FILE_NAME =
"support/WorkDef_Team_TransitionManagerTest_WidgetRequiredTransition.ats";
private static String WORK_DEF_WIDGET_REQUIRED_COMPLETION_FILE_NAME =
"support/WorkDef_Team_TransitionManagerTest_WidgetRequiredCompletion.ats";
// @formatter:off
@Mock private IAtsTeamWorkflow teamWf;
@Mock private IAtsTask task;
@Mock private IAtsStateDefinition toStateDef;
@Mock private IAtsWorkItemService workItemService;
@Mock private IAtsTaskService taskService;
@Mock private IAtsStateManager teamWfStateMgr, taskStateMgr;
// @formatter:on
@Before
public void setup() {
MockitoAnnotations.initMocks(this);
}
@BeforeClass
public static void before() throws OseeCoreException {
AtsClientService.get().clearCaches();
}
@BeforeClass
@AfterClass
public static void cleanup() throws OseeCoreException {
AtsTestUtil.cleanup();
}
@org.junit.Test
public void testHandleTransitionValidation__NoAwas() throws OseeCoreException {
AtsTestUtil.cleanupAndReset("TransitionManagerTest-A");
TransitionHelper helper =
new TransitionHelper(getClass().getSimpleName(), EMPTY_AWAS, AtsTestUtil.getImplementStateDef().getName(),
Arrays.asList(AtsClientService.get().getUserService().getCurrentUser()), null,
AtsClientService.get().createChangeSet(getClass().getSimpleName()), AtsClientService.get().getServices(),
TransitionOption.None);
IAtsTransitionManager transMgr = TransitionFactory.getTransitionManager(helper);
TransitionResults results = new TransitionResults();
transMgr.handleTransitionValidation(results);
Assert.assertTrue(results.contains(TransitionResult.NO_WORKFLOWS_PROVIDED_FOR_TRANSITION));
}
@org.junit.Test
public void testHandleTransitionValidation__ToStateNotNull() throws OseeCoreException {
TransitionHelper helper = new TransitionHelper(getClass().getSimpleName(), Arrays.asList(AtsTestUtil.getTeamWf()),
null, Arrays.asList(AtsClientService.get().getUserService().getCurrentUser()), null,
AtsClientService.get().createChangeSet(getClass().getSimpleName()), AtsClientService.get().getServices(),
TransitionOption.None);
IAtsTransitionManager transMgr = TransitionFactory.getTransitionManager(helper);
TransitionResults results = new TransitionResults();
transMgr.handleTransitionValidation(results);
Assert.assertTrue(results.contains(TransitionResult.TO_STATE_CANT_BE_NULL));
}
@org.junit.Test
public void testHandleTransitionValidation__InvalidToState() throws OseeCoreException {
TransitionHelper helper = new TransitionHelper(getClass().getSimpleName(), Arrays.asList(AtsTestUtil.getTeamWf()),
"InvalidStateName", Arrays.asList(AtsClientService.get().getUserService().getCurrentUser()), null,
AtsClientService.get().createChangeSet(getClass().getSimpleName()), AtsClientService.get().getServices(),
TransitionOption.None);
IAtsTransitionManager transMgr = TransitionFactory.getTransitionManager(helper);
TransitionResults results = new TransitionResults();
transMgr.handleTransitionValidation(results);
Assert.assertTrue(results.contains(
"Transition-To State [InvalidStateName] does not exist for Work Definition [" + AtsTestUtil.getTeamWf().getWorkDefinition().getName() + "]"));
}
@org.junit.Test
public void testHandleTransitionValidation__MustBeAssigned() throws OseeCoreException {
AtsTestUtil.cleanupAndReset("TransitionManagerTest-B");
TeamWorkFlowArtifact teamArt = AtsTestUtil.getTeamWf();
IAtsTeamDefinition teamDef = teamArt.getTeamDefinition();
Assert.assertNotNull(teamDef);
TransitionHelper helper = new TransitionHelper(getClass().getSimpleName(), Arrays.asList(teamArt),
AtsTestUtil.getImplementStateDef().getName(),
Arrays.asList(AtsClientService.get().getUserService().getCurrentUser()), null,
AtsClientService.get().createChangeSet(getClass().getSimpleName()), AtsClientService.get().getServices(),
TransitionOption.None);
helper.setExecuteChanges(true);
IAtsTransitionManager transMgr = TransitionFactory.getTransitionManager(helper);
TransitionResults results = new TransitionResults();
// First transition should be valid cause Joe Smith is assigned cause he created
transMgr.handleTransitionValidation(results);
Assert.assertTrue(results.toString(), results.isEmpty());
// Un-Assign Joe Smith
results.clear();
Assert.assertFalse(helper.isPrivilegedEditEnabled());
Assert.assertFalse(helper.isOverrideAssigneeCheck());
teamArt.getStateMgr().setAssignee(
AtsClientService.get().getUserServiceClient().getUserFromToken(DemoUsers.Alex_Kay));
transMgr.handleTransitionValidation(results);
Assert.assertTrue(results.contains(AtsTestUtil.getTeamWf(), TransitionResult.MUST_BE_ASSIGNED));
// Set PrivilegedEditEnabled edit enabled; no errors
results.clear();
Assert.assertFalse(helper.isOverrideAssigneeCheck());
helper.addTransitionOption(TransitionOption.PrivilegedEditEnabled);
Assert.assertTrue(helper.isPrivilegedEditEnabled());
teamArt.getStateMgr().setAssignee(
AtsClientService.get().getUserServiceClient().getUserFromToken(DemoUsers.Alex_Kay));
transMgr.handleTransitionValidation(results);
Assert.assertTrue(results.isEmpty());
// Set OverrideAssigneeCheck
results.clear();
helper.removeTransitionOption(TransitionOption.PrivilegedEditEnabled);
helper.addTransitionOption(TransitionOption.OverrideAssigneeCheck);
Assert.assertFalse(helper.isPrivilegedEditEnabled());
Assert.assertTrue(helper.isOverrideAssigneeCheck());
teamArt.getStateMgr().setAssignee(
AtsClientService.get().getUserServiceClient().getUserFromToken(DemoUsers.Alex_Kay));
transMgr.handleTransitionValidation(results);
Assert.assertTrue(results.isEmpty());
// Set UnAssigned, should be able to transition cause will be assigned as convenience
results.clear();
helper.removeTransitionOption(TransitionOption.OverrideAssigneeCheck);
Assert.assertFalse(helper.isPrivilegedEditEnabled());
Assert.assertFalse(helper.isOverrideAssigneeCheck());
teamArt.getStateMgr().setAssignee(
AtsClientService.get().getUserServiceClient().getUserFromToken(SystemUser.UnAssigned));
transMgr.handleTransitionValidation(results);
Assert.assertTrue(getResultsAndDebug(results, teamArt, helper), results.isEmpty());
// cleanup test
teamArt.getStateMgr().setAssignee(
AtsClientService.get().getUserServiceClient().getUserFromToken(SystemUser.UnAssigned));
}
private String getResultsAndDebug(TransitionResults results, TeamWorkFlowArtifact teamArt, TransitionHelper helper) {
StringBuilder sb = new StringBuilder(results.toString());
sb.append("\n\n");
sb.append("assignees: ");
sb.append(teamArt.getStateMgr().getAssigneesStr());
sb.append("\n\n");
sb.append("transitionOptions: ");
sb.append(helper.getTransitionOptions());
return sb.toString();
}
@org.junit.Test
public void testHandleTransitionValidation__WorkingBranchTransitionable() throws OseeCoreException {
AtsTestUtil.cleanupAndReset("TransitionManagerTest-C");
TeamWorkFlowArtifact teamArt = AtsTestUtil.getTeamWf();
MockTransitionHelper helper = new MockTransitionHelper(getClass().getSimpleName(), Arrays.asList(teamArt),
AtsTestUtil.getImplementStateDef().getName(),
Arrays.asList(AtsClientService.get().getUserService().getCurrentUser()), null,
AtsClientService.get().createChangeSet(getClass().getSimpleName()), TransitionOption.None);
IAtsTransitionManager transMgr = TransitionFactory.getTransitionManager(helper);
TransitionResults results = new TransitionResults();
// this should pass
transMgr.handleTransitionValidation(results);
Assert.assertTrue("Test wasn't reset to allow transition", results.isEmpty());
// attempt to transition to Implement with working branch
helper.setWorkingBranchInWork(true);
helper.setBranchInCommit(false);
transMgr.handleTransitionValidation(results);
Assert.assertTrue(results.contains(AtsTestUtil.getTeamWf(), TransitionResult.WORKING_BRANCH_EXISTS));
// attempt to cancel workflow with working branch
results.clear();
helper.setWorkingBranchInWork(true);
helper.setBranchInCommit(false);
helper.setToStateName(TeamState.Cancelled.getName());
transMgr.handleTransitionValidation(results);
Assert.assertTrue(
results.contains(AtsTestUtil.getTeamWf(), TransitionResult.DELETE_WORKING_BRANCH_BEFORE_CANCEL));
// attempt to transition workflow with branch being committed
results.clear();
helper.setWorkingBranchInWork(true);
helper.setBranchInCommit(true);
helper.setToStateName(TeamState.Implement.getName());
transMgr.handleTransitionValidation(results);
Assert.assertTrue(results.contains(AtsTestUtil.getTeamWf(), TransitionResult.WORKING_BRANCH_BEING_COMMITTED));
}
@org.junit.Test
public void testHandleTransitionValidation__NoSystemUser() throws OseeCoreException {
AtsTestUtil.cleanupAndReset("TransitionManagerTest-D");
TeamWorkFlowArtifact teamArt = AtsTestUtil.getTeamWf();
MockTransitionHelper helper = new MockTransitionHelper(getClass().getSimpleName(), Arrays.asList(teamArt),
AtsTestUtil.getImplementStateDef().getName(),
Arrays.asList(AtsClientService.get().getUserService().getCurrentUser()), null,
AtsClientService.get().createChangeSet(getClass().getSimpleName()), TransitionOption.None);
IAtsTransitionManager transMgr = TransitionFactory.getTransitionManager(helper);
TransitionResults results = new TransitionResults();
// First transition should be valid cause Joe Smith is assigned cause he created
transMgr.handleTransitionValidation(results);
Assert.assertTrue(results.isEmpty());
helper.setSystemUser(true);
transMgr.handleTransitionValidation(results);
Assert.assertTrue(results.contains(TransitionResult.CAN_NOT_TRANSITION_AS_SYSTEM_USER));
results.clear();
helper.setSystemUser(false);
helper.setSystemUserAssigned(true);
transMgr.handleTransitionValidation(results);
Assert.assertTrue(results.contains(teamArt, TransitionResult.CAN_NOT_TRANSITION_WITH_SYSTEM_USER_ASSIGNED));
}
@org.junit.Test
public void testIsStateTransitionable__ValidateXWidgets__RequiredForTransition() throws OseeCoreException {
AtsTestUtil.cleanupAndReset("TransitionManagerTest-1");
TeamWorkFlowArtifact teamArt = AtsTestUtil.getTeamWf();
MockTransitionHelper helper = new MockTransitionHelper(getClass().getSimpleName(), Arrays.asList(teamArt),
AtsTestUtil.getImplementStateDef().getName(),
Arrays.asList(AtsClientService.get().getUserService().getCurrentUser()), null,
AtsClientService.get().createChangeSet(getClass().getSimpleName()), TransitionOption.None);
IAtsStateDefinition fromStateDef = AtsTestUtil.getAnalyzeStateDef();
fromStateDef.getLayoutItems().clear();
IAtsTransitionManager transMgr = TransitionFactory.getTransitionManager(helper);
TransitionResults results = new TransitionResults();
// test that normal transition works
transMgr.handleTransitionValidation(results);
Assert.assertTrue("Test wasn't reset to allow transition", results.isEmpty());
// test that two widgets validate
transMgr.handleTransitionValidation(results);
Assert.assertTrue(results.isEmpty());
// test that estHours required fails validation
results.clear();
loadWorkDefForTest(WORK_DEF_WIDGET_REQUIRED_TRANSITION_FILE_NAME);
transMgr.handleTransitionValidation(results);
Assert.assertTrue(results.contains("[Estimated Hours] is required for transition"));
Assert.assertTrue(results.contains("[Work Package] is required for transition"));
}
@org.junit.Test
public void testIsStateTransitionable__ValidateXWidgets__RequiredForCompletion() throws OseeCoreException {
AtsTestUtil.cleanupAndReset("TransitionManagerTest-2");
TeamWorkFlowArtifact teamArt = AtsTestUtil.getTeamWf();
MockTransitionHelper helper = new MockTransitionHelper(getClass().getSimpleName(), Arrays.asList(teamArt),
AtsTestUtil.getImplementStateDef().getName(),
Arrays.asList(AtsClientService.get().getUserService().getCurrentUser()), null,
AtsClientService.get().createChangeSet(getClass().getSimpleName()), TransitionOption.None);
IAtsStateDefinition fromStateDef = AtsTestUtil.getAnalyzeStateDef();
fromStateDef.getLayoutItems().clear();
IAtsTransitionManager transMgr = TransitionFactory.getTransitionManager(helper);
TransitionResults results = new TransitionResults();
// test that normal transition works
transMgr.handleTransitionValidation(results);
Assert.assertTrue("Test wasn't reset to allow transition", results.isEmpty());
// test that two widgets validate
transMgr.handleTransitionValidation(results);
Assert.assertTrue(results.isEmpty());
// test that neither are required for transition to implement
results.clear();
helper.setToStateName(AtsTestUtil.getImplementStateDef().getName());
transMgr.handleTransitionValidation(results);
Assert.assertTrue(results.isEmpty());
// test that Work Package only widget required for normal transition
results.clear();
helper.setToStateName(AtsTestUtil.getCompletedStateDef().getName());
loadWorkDefForTest(WORK_DEF_WIDGET_REQUIRED_COMPLETION_FILE_NAME);
transMgr.handleTransitionValidation(results);
Assert.assertTrue(results.contains("[Estimated Hours] is required for transition to [Completed]"));
Assert.assertTrue(results.contains("[Work Package] is required for transition"));
// test that neither are required for transition to canceled
results.clear();
helper.setToStateName(AtsTestUtil.getCancelledStateDef().getName());
transMgr.handleTransitionValidation(results);
Assert.assertTrue(results.isEmpty());
// test that neither are required for transition to completed if overrideValidation is set
results.clear();
helper.setToStateName(AtsTestUtil.getCompletedStateDef().getName());
helper.setOverrideTransitionValidityCheck(true);
transMgr.handleTransitionValidation(results);
Assert.assertTrue(results.isEmpty());
}
@org.junit.Test
public void testIsStateTransitionable__ValidateTasks() throws OseeCoreException {
TransitionResults results = new TransitionResults();
when(teamWf.isTeamWorkflow()).thenReturn(true);
// validate that if rule exists and is working, then transition with tasks is ok
when(teamWf.getStateDefinition()).thenReturn(toStateDef);
when(toStateDef.getStateType()).thenReturn(StateType.Working);
when(toStateDef.hasRule(RuleDefinitionOption.AllowTransitionWithoutTaskCompletion.name())).thenReturn(true);
TransitionManager.validateTaskCompletion(results, teamWf, toStateDef, taskService);
Assert.assertTrue(results.isEmpty());
// test only check if Team Workflow
when(toStateDef.hasRule(RuleDefinitionOption.AllowTransitionWithoutTaskCompletion.name())).thenReturn(false);
TransitionManager.validateTaskCompletion(results, task, toStateDef, taskService);
Assert.assertTrue(results.isEmpty());
// test not check if working state
when(teamWf.getStateMgr()).thenReturn(teamWfStateMgr);
when(teamWfStateMgr.getStateType()).thenReturn(StateType.Working);
TransitionManager.validateTaskCompletion(results, teamWf, toStateDef, taskService);
Assert.assertTrue(results.isEmpty());
// test transition to completed; all tasks are completed
when(toStateDef.getStateType()).thenReturn(StateType.Completed);
when(taskService.getTask(teamWf)).thenReturn(Collections.singleton(task));
when(task.getStateMgr()).thenReturn(taskStateMgr);
when(taskStateMgr.getStateType()).thenReturn(StateType.Completed);
TransitionManager.validateTaskCompletion(results, teamWf, toStateDef, taskService);
Assert.assertTrue(results.isEmpty());
// test transtion to completed; task is not completed
when(taskStateMgr.getStateType()).thenReturn(StateType.Working);
TransitionManager.validateTaskCompletion(results, teamWf, toStateDef, taskService);
Assert.assertTrue(results.contains(TransitionResult.TASKS_NOT_COMPLETED.getDetails()));
}
@org.junit.Test
public void testIsStateTransitionable__RequireTargetedVersion__FromTeamDef() throws OseeCoreException {
AtsTestUtil.cleanupAndReset("TransitionManagerTest-4");
TeamWorkFlowArtifact teamArt = AtsTestUtil.getTeamWf();
IAtsChangeSet changes = AtsClientService.get().createChangeSet(getClass().getSimpleName());
MockTransitionHelper helper = new MockTransitionHelper(getClass().getSimpleName(), Arrays.asList(teamArt),
AtsTestUtil.getImplementStateDef().getName(),
Arrays.asList(AtsClientService.get().getUserService().getCurrentUser()), null, changes, TransitionOption.None);
IAtsTransitionManager transMgr = TransitionFactory.getTransitionManager(helper);
TransitionResults results = new TransitionResults();
// validate that can transition
transMgr.handleTransitionValidation(results);
Assert.assertTrue(results.isEmpty());
// validate that can't transition without targeted version when team def rule is set
AtsClientService.get().getArtifact(teamArt.getTeamDefinition()).addAttributeFromString(
AtsAttributeTypes.RuleDefinition, RuleDefinitionOption.RequireTargetedVersion.name());
AtsClientService.get().getArtifact(teamArt.getTeamDefinition()).persist(getClass().getSimpleName());
results.clear();
transMgr.handleTransitionValidation(results);
Assert.assertTrue(results.contains(teamArt, TransitionResult.MUST_BE_TARGETED_FOR_VERSION));
// set targeted version; transition validation should succeed
results.clear();
AtsClientService.get().getVersionService().setTargetedVersion(teamArt, AtsTestUtil.getVerArt1(), changes);
transMgr.handleTransitionValidation(results);
Assert.assertTrue(results.isEmpty());
}
@org.junit.Test
public void testIsStateTransitionable__RequireTargetedVersion__FromPageDef() throws OseeCoreException {
AtsTestUtil.cleanupAndReset("TransitionManagerTest-5");
TeamWorkFlowArtifact teamArt = AtsTestUtil.getTeamWf();
IAtsChangeSet changes = AtsClientService.get().createChangeSet(getClass().getSimpleName());
MockTransitionHelper helper = new MockTransitionHelper(getClass().getSimpleName(), Arrays.asList(teamArt),
AtsTestUtil.getImplementStateDef().getName(),
Arrays.asList(AtsClientService.get().getUserService().getCurrentUser()), null, changes, TransitionOption.None);
IAtsTransitionManager transMgr = TransitionFactory.getTransitionManager(helper);
TransitionResults results = new TransitionResults();
// validate that can transition
transMgr.handleTransitionValidation(results);
Assert.assertTrue(results.isEmpty());
// validate that can't transition without targeted version when team def rule is set
loadWorkDefForTest(WORK_DEF_TARGETED_VERSION_FILE_NAME);
results.clear();
transMgr.handleTransitionValidation(results);
Assert.assertTrue(results.contains(teamArt, TransitionResult.MUST_BE_TARGETED_FOR_VERSION));
// set targeted version; transition validation should succeed
results.clear();
AtsClientService.get().getVersionService().setTargetedVersion(teamArt, AtsTestUtil.getVerArt1(), changes);
transMgr.handleTransitionValidation(results);
Assert.assertTrue(results.isEmpty());
}
private void loadWorkDefForTest(String workDefFilename) {
try {
String atsDsl = AWorkspace.getOseeInfResource(workDefFilename, AtsClientIntegrationTestSuite.class);
JaxAtsWorkDef jaxWorkDef = new JaxAtsWorkDef();
jaxWorkDef.setName(AtsTestUtil.WORK_DEF_NAME);
jaxWorkDef.setWorkDefDsl(atsDsl);
AtsTestUtil.importWorkDefinition(jaxWorkDef);
AtsClientService.get().getWorkDefinitionService().clearCaches();
} catch (Exception ex) {
throw new OseeCoreException(ex, "Error importing " + workDefFilename);
}
}
@org.junit.Test
public void testIsStateTransitionable__ReviewsCompleted() throws OseeCoreException {
AtsTestUtil.cleanupAndReset("TransitionManagerTest-6");
TeamWorkFlowArtifact teamArt = AtsTestUtil.getTeamWf();
MockTransitionHelper helper = new MockTransitionHelper(getClass().getSimpleName(), Arrays.asList(teamArt),
AtsTestUtil.getImplementStateDef().getName(),
Arrays.asList(AtsClientService.get().getUserService().getCurrentUser()), null,
AtsClientService.get().createChangeSet(getClass().getSimpleName()), TransitionOption.None);
IAtsTransitionManager transMgr = TransitionFactory.getTransitionManager(helper);
TransitionResults results = new TransitionResults();
// validate that can transition
transMgr.handleTransitionValidation(results);
Assert.assertTrue(results.isEmpty());
IAtsChangeSet changes = AtsClientService.get().createChangeSet(getClass().getSimpleName());
DecisionReviewArtifact decArt =
AtsTestUtil.getOrCreateDecisionReview(ReviewBlockType.None, AtsTestUtilState.Analyze, changes);
teamArt.addRelation(AtsRelationTypes.TeamWorkflowToReview_Review, decArt);
changes.execute();
// validate that can transition cause non-blocking review
results.clear();
transMgr.handleTransitionValidation(results);
Assert.assertTrue(results.isEmpty());
// validate that can transition cause no transition blocking review
results.clear();
decArt.setSoleAttributeValue(AtsAttributeTypes.ReviewBlocks, ReviewBlockType.Commit.name());
transMgr.handleTransitionValidation(results);
Assert.assertTrue(results.isEmpty());
// validate that can NOT transition cause blocking review
results.clear();
decArt.setSoleAttributeValue(AtsAttributeTypes.ReviewBlocks, ReviewBlockType.Transition.name());
transMgr.handleTransitionValidation(results);
Assert.assertTrue(results.contains(teamArt, TransitionResult.COMPLETE_BLOCKING_REVIEWS));
decArt.setSoleAttributeValue(AtsAttributeTypes.Decision, "yes");
decArt.persist(getClass().getSimpleName());
// validate that can transition cause review completed
changes = AtsClientService.get().createChangeSet(getClass().getSimpleName());
Result result = DecisionReviewManager.transitionTo(decArt, DecisionReviewState.Completed,
AtsClientService.get().getUserService().getCurrentUser(), false, changes);
Assert.assertTrue(result.getText(), result.isTrue());
changes.execute();
results.clear();
transMgr.handleTransitionValidation(results);
Assert.assertTrue(results.isEmpty());
}
/**
* Test that artifacts can be transitioned to the same state without error. (i.e.: An action in Implement can be
* transition to Implement a second time and the TransitionManager will just ignore this second, redundant
* transition)
*/
@org.junit.Test
public void testIsStateTransitionable__ToSameState() throws OseeCoreException {
AtsTestUtil.cleanupAndReset("TransitionManagerTest-8");
TeamWorkFlowArtifact teamArt01 = AtsTestUtil.getTeamWf();
TeamWorkFlowArtifact teamArt02 = AtsTestUtil.getTeamWf2();
//1. Initially transition workflows to Implement
MockTransitionHelper helper = new MockTransitionHelper(getClass().getSimpleName(),
Arrays.asList(teamArt01, teamArt02), AtsTestUtil.getImplementStateDef().getName(),
Arrays.asList(AtsClientService.get().getUserService().getCurrentUser()), null,
AtsClientService.get().createChangeSet(getClass().getSimpleName()), TransitionOption.None);
IAtsTransitionManager transMgr = TransitionFactory.getTransitionManager(helper);
TransitionResults results = new TransitionResults();
transMgr.handleTransitionValidation(results);
Assert.assertTrue(results.isEmpty());
//2. redundant transition workflows to Implement
MockTransitionHelper helper01 = new MockTransitionHelper(getClass().getSimpleName(),
Arrays.asList(teamArt01, teamArt02), AtsTestUtil.getImplementStateDef().getName(),
Arrays.asList(AtsClientService.get().getUserService().getCurrentUser()), null,
AtsClientService.get().createChangeSet(getClass().getSimpleName()), TransitionOption.None);
IAtsTransitionManager transMgr01 = TransitionFactory.getTransitionManager(helper01);
TransitionResults results01 = new TransitionResults();
transMgr01.handleTransitionValidation(results01);
Assert.assertTrue(results01.isEmpty());
//3. Transition one TeamWf to Complete
MockTransitionHelper helper02 = new MockTransitionHelper(getClass().getSimpleName(), Arrays.asList(teamArt01),
AtsTestUtil.getCompletedStateDef().getName(),
Arrays.asList(AtsClientService.get().getUserService().getCurrentUser()), null,
AtsClientService.get().createChangeSet(getClass().getSimpleName()), TransitionOption.None);
IAtsTransitionManager transMgr02 = TransitionFactory.getTransitionManager(helper02);
TransitionResults results02 = new TransitionResults();
transMgr02.handleTransitionValidation(results02);
Assert.assertTrue(results02.isEmpty());
//4. redundant transition workflows to Implement
MockTransitionHelper helper03 = new MockTransitionHelper(getClass().getSimpleName(),
Arrays.asList(teamArt01, teamArt02), AtsTestUtil.getCompletedStateDef().getName(),
Arrays.asList(AtsClientService.get().getUserService().getCurrentUser()), null,
AtsClientService.get().createChangeSet(getClass().getSimpleName()), TransitionOption.None);
IAtsTransitionManager transMgr03 = TransitionFactory.getTransitionManager(helper03);
TransitionResults results03 = new TransitionResults();
transMgr03.handleTransitionValidation(results03);
Assert.assertTrue(results03.isEmpty());
}
@org.junit.Test
public void testHandleTransitionValidation__AssigneesUpdate() throws OseeCoreException {
AtsTestUtil.cleanupAndReset("TransitionManagerTest-E");
TeamWorkFlowArtifact teamArt = AtsTestUtil.getTeamWf();
List<IAtsUser> assigneesBefore = teamArt.getAssignees();
Assert.assertTrue(assigneesBefore.size() > 0);
MockTransitionHelper helper = new MockTransitionHelper(getClass().getSimpleName(), Arrays.asList(teamArt),
AtsTestUtil.getImplementStateDef().getName(), teamArt.getAssignees(), null,
AtsClientService.get().createChangeSet(getClass().getSimpleName()), TransitionOption.None);
IAtsTransitionManager transMgr = TransitionFactory.getTransitionManager(helper);
TransitionResults results = new TransitionResults();
TransitionResults results01 = new TransitionResults();
transMgr.handleTransitionValidation(results);
Assert.assertTrue(results.isEmpty());
results01 = transMgr.handleAll();
Assert.assertTrue(results01.isEmpty());
List<IAtsUser> assigneesAfter = teamArt.getAssignees();
Assert.assertTrue(assigneesAfter.containsAll(assigneesBefore));
Assert.assertTrue(assigneesBefore.containsAll(assigneesAfter));
}
@org.junit.Test
public void testHandleTransitionValidation__AssigneesNull() throws OseeCoreException {
AtsTestUtil.cleanupAndReset("TransitionManagerTest-F");
TeamWorkFlowArtifact teamArt = AtsTestUtil.getTeamWf();
List<IAtsUser> assigneesBefore = teamArt.getAssignees();
Assert.assertTrue(assigneesBefore.size() > 0);
MockTransitionHelper helper = new MockTransitionHelper(getClass().getSimpleName(), Arrays.asList(teamArt),
AtsTestUtil.getImplementStateDef().getName(), null, null,
AtsClientService.get().createChangeSet(getClass().getSimpleName()), TransitionOption.None);
helper.setExecuteChanges(true);
IAtsTransitionManager transMgr = TransitionFactory.getTransitionManager(helper);
TransitionResults results = new TransitionResults();
TransitionResults results01 = new TransitionResults();
transMgr.handleTransitionValidation(results);
Assert.assertTrue(results.isEmpty());
results01 = transMgr.handleAll();
Assert.assertTrue(results01.isEmpty());
List<IAtsUser> assigneesAfter = teamArt.getAssignees();
Assert.assertTrue(assigneesAfter.containsAll(assigneesBefore));
Assert.assertTrue(assigneesBefore.containsAll(assigneesAfter));
}
@org.junit.Test
public void testHandleTransition__PercentComplete() throws OseeCoreException {
AtsTestUtil.cleanupAndReset("TransitionManagerTest-G");
TeamWorkFlowArtifact teamArt = AtsTestUtil.getTeamWf();
// Setup - Transition to Implement
IAtsChangeSet changes = AtsClientService.get().createChangeSet("create");
Result result = AtsTestUtil.transitionTo(AtsTestUtilState.Implement,
AtsClientService.get().getUserService().getCurrentUser(), changes, TransitionOption.OverrideAssigneeCheck);
changes.execute();
Assert.assertTrue("Transition Error: " + result.getText(), result.isTrue());
Assert.assertEquals("Implement", teamArt.getCurrentStateName());
Assert.assertEquals(0, teamArt.getSoleAttributeValue(AtsAttributeTypes.PercentComplete, 0).intValue());
// Transition to completed should set percent to 100
changes.clear();
MockTransitionHelper helper = new MockTransitionHelper(getClass().getSimpleName(), Arrays.asList(teamArt),
AtsTestUtil.getCompletedStateDef().getName(),
Arrays.asList(AtsClientService.get().getUserService().getCurrentUser()), null, changes, TransitionOption.None);
IAtsTransitionManager transMgr = TransitionFactory.getTransitionManager(helper);
TransitionResults results = new TransitionResults();
transMgr.handleTransition(results);
changes.execute();
Assert.assertTrue("Transition Error: " + results.toString(), results.isEmpty());
Assert.assertEquals("Completed", teamArt.getCurrentStateName());
Assert.assertEquals(100, teamArt.getSoleAttributeValue(AtsAttributeTypes.PercentComplete, 100).intValue());
// Transition to Implement should set percent to 0
changes.clear();
helper = new MockTransitionHelper(getClass().getSimpleName(), Arrays.asList(teamArt),
AtsTestUtil.getImplementStateDef().getName(),
Arrays.asList(AtsClientService.get().getUserService().getCurrentUser()), null, changes, TransitionOption.None);
transMgr = TransitionFactory.getTransitionManager(helper);
results = new TransitionResults();
transMgr.handleTransition(results);
changes.execute();
Assert.assertTrue("Transition Error: " + results.toString(), results.isEmpty());
Assert.assertEquals("Implement", teamArt.getCurrentStateName());
Assert.assertEquals(0, teamArt.getSoleAttributeValue(AtsAttributeTypes.PercentComplete, 0).intValue());
// Transition to Cancelled should set percent to 0
changes.clear();
helper = new MockTransitionHelper(getClass().getSimpleName(), Arrays.asList(teamArt),
AtsTestUtil.getCancelledStateDef().getName(),
Arrays.asList(AtsClientService.get().getUserService().getCurrentUser()), null, changes, TransitionOption.None);
transMgr = TransitionFactory.getTransitionManager(helper);
results = new TransitionResults();
transMgr.handleTransition(results);
changes.execute();
Assert.assertTrue("Transition Error: " + results.toString(), results.isEmpty());
Assert.assertEquals("Cancelled", teamArt.getCurrentStateName());
Assert.assertEquals(100, teamArt.getSoleAttributeValue(AtsAttributeTypes.PercentComplete, 100).intValue());
}
@org.junit.Test
public void testIsStateTransitionable__ReviewsCancelled() throws OseeCoreException {
AtsTestUtil.cleanupAndReset("TransitionManagerTest-Cancel");
TeamWorkFlowArtifact teamArt = AtsTestUtil.getTeamWf();
TransitionResults results = new TransitionResults();
// create a peer to peer review
IAtsChangeSet changes = AtsClientService.get().createChangeSet(getClass().getSimpleName());
PeerToPeerReviewArtifact peerReview =
AtsTestUtil.getOrCreatePeerReview(ReviewBlockType.Transition, AtsTestUtilState.Analyze, changes);
changes.relate(teamArt, AtsRelationTypes.TeamWorkflowToReview_Review, peerReview);
changes.execute();
// transition workflow to cancelled - peer review not cancelled
changes.clear();
TransitionHelper transHelper = new TransitionHelper("Transition Team Workflow Review", Arrays.asList(teamArt),
"Cancelled", new ArrayList<IAtsUser>(), "", changes, AtsClientService.get().getServices(),
TransitionOption.OverrideAssigneeCheck);
transHelper.setTransitionUser(AtsClientService.get().getUserService().getCurrentUser());
TransitionManager mgr = new TransitionManager(transHelper);
results = mgr.handleAll();
changes.execute();
Assert.assertTrue(results.contains(teamArt, TransitionResult.CANCEL_REVIEWS_BEFORE_CANCEL));
// transition workflow again - peer review cancelled
results.clear();
changes.clear();
transHelper = new TransitionHelper("Transition Team Workflow Review", Arrays.asList(peerReview), "Cancelled",
new ArrayList<IAtsUser>(), "", changes, AtsClientService.get().getServices(),
TransitionOption.OverrideAssigneeCheck);
transHelper.setTransitionUser(AtsClientService.get().getUserService().getCurrentUser());
mgr = new TransitionManager(transHelper);
results = mgr.handleAll();
changes.execute();
Assert.assertTrue(results.isEmpty());
}
}