PageRenderTime 44ms CodeModel.GetById 17ms RepoModel.GetById 0ms app.codeStats 0ms

/jira-project/jira-components/jira-tests-parent/jira-tests-unit/src/test/java/com/atlassian/jira/workflow/TestIssueWorkflowManagerImpl.java

https://bitbucket.org/ahmed_bilal_360factors/jira7-core
Java | 221 lines | 163 code | 46 blank | 12 comment | 3 complexity | 1e74dda949fe8460ecc46af1a8fe8b38 MD5 | raw file
Possible License(s): Apache-2.0
  1. package com.atlassian.jira.workflow;
  2. import com.atlassian.jira.issue.Issue;
  3. import com.atlassian.jira.issue.IssueManager;
  4. import com.atlassian.jira.issue.MutableIssue;
  5. import com.atlassian.jira.junit.rules.InitMockitoMocks;
  6. import com.atlassian.jira.permission.ProjectPermissions;
  7. import com.atlassian.jira.project.Project;
  8. import com.atlassian.jira.security.JiraAuthenticationContext;
  9. import com.atlassian.jira.security.PermissionManager;
  10. import com.atlassian.jira.user.ApplicationUser;
  11. import com.atlassian.plugin.PluginAccessor;
  12. import com.google.common.collect.ImmutableList;
  13. import com.opensymphony.workflow.Workflow;
  14. import com.opensymphony.workflow.loader.ActionDescriptor;
  15. import com.opensymphony.workflow.loader.WorkflowDescriptor;
  16. import org.hamcrest.Matcher;
  17. import org.hamcrest.Matchers;
  18. import org.junit.Assert;
  19. import org.junit.Before;
  20. import org.junit.Rule;
  21. import org.junit.Test;
  22. import org.mockito.Mock;
  23. import java.util.Collection;
  24. import java.util.List;
  25. import java.util.Map;
  26. import static org.hamcrest.Matchers.allOf;
  27. import static org.junit.Assert.assertEquals;
  28. import static org.junit.Assert.assertTrue;
  29. import static org.mockito.Matchers.argThat;
  30. import static org.mockito.Matchers.eq;
  31. import static org.mockito.Mockito.mock;
  32. import static org.mockito.Mockito.when;
  33. /**
  34. * @since v6.2.2
  35. */
  36. public class TestIssueWorkflowManagerImpl {
  37. public static final long WORKFLOW_ID = 1L;
  38. public static final String TST_PROJECT_KEY = "TST";
  39. public static final String ISSUE_TEST_ONE_KEY = "TST-1";
  40. public static final long ISSUE_TEST_ONE_ID = 1L;
  41. public static final int NOT_EXISTENT_ACTION_ID = 9999;
  42. public static final int START_PROGRESS_ACTION_ID = 1;
  43. @Rule
  44. public final InitMockitoMocks initMockitoMocks = new InitMockitoMocks(this);
  45. @Mock
  46. private IssueManager issueManager;
  47. @Mock
  48. private WorkflowManager workflowManager;
  49. @Mock
  50. private JiraAuthenticationContext authenticationContext;
  51. @Mock
  52. private PluginAccessor pluginAccessor;
  53. @Mock
  54. private ApplicationUser currentUser;
  55. @Mock
  56. private Issue issueTestOne;
  57. @Mock
  58. private MutableIssue mutableIssueTestOne;
  59. @Mock
  60. private PermissionManager permissionManager;
  61. private final ActionDescriptor startProgressAction = mock(ActionDescriptor.class, "Start progress action descriptor");
  62. @Before
  63. public void setUp() throws Exception {
  64. // create TST project
  65. final Project project = mock(Project.class);
  66. when(project.getKey()).thenReturn(TST_PROJECT_KEY);
  67. // create TST-1 issue
  68. when(issueTestOne.getProjectObject()).thenReturn(project);
  69. when(issueTestOne.getKey()).thenReturn(ISSUE_TEST_ONE_KEY);
  70. when(issueTestOne.getId()).thenReturn(ISSUE_TEST_ONE_ID);
  71. when(issueTestOne.getWorkflowId()).thenReturn(WORKFLOW_ID);
  72. // init issue manager, auth context, user permission
  73. when(issueManager.getIssueObject(ISSUE_TEST_ONE_ID)).thenReturn(mutableIssueTestOne);
  74. when(authenticationContext.getUser()).thenReturn(currentUser);
  75. setHasTransitionPermission(true);
  76. // matcher for crazy map that needs to be passed into workflow#getAvailableActions
  77. //noinspection unchecked
  78. final Matcher<Map<?, ?>> expectedInputMapMatcher = allOf(
  79. hasEntry("pkey", TST_PROJECT_KEY),
  80. hasEntry("issue", issueTestOne),
  81. hasEntry(WorkflowFunctionUtils.ORIGINAL_ISSUE_KEY, mutableIssueTestOne)
  82. );
  83. // prepare workflow with one action and bind it to managers
  84. final Workflow workflow = mock(Workflow.class);
  85. when(workflow.getAvailableActions(eq(WORKFLOW_ID), argThat(expectedInputMapMatcher))).thenReturn(new int[]{START_PROGRESS_ACTION_ID});
  86. when(workflowManager.makeWorkflow(currentUser)).thenReturn(workflow);
  87. final WorkflowDescriptor jiraWorkflowDescriptor = mock(WorkflowDescriptor.class);
  88. when(jiraWorkflowDescriptor.getAction(START_PROGRESS_ACTION_ID)).thenReturn(startProgressAction);
  89. final JiraWorkflow jiraWorkflow = mock(JiraWorkflow.class);
  90. when(jiraWorkflow.getDescriptor()).thenReturn(jiraWorkflowDescriptor);
  91. when(workflowManager.getWorkflow(issueTestOne)).thenReturn(jiraWorkflow);
  92. }
  93. private void setHasTransitionPermission(final boolean hasPermission) {
  94. when(permissionManager.hasPermission(eq(ProjectPermissions.TRANSITION_ISSUES), eq(issueTestOne), eq(currentUser))).thenReturn(hasPermission);
  95. }
  96. @Test
  97. public void testGetAvailableActions() throws Exception {
  98. final IssueWorkflowManagerImpl issueWorkflowManager = new IssueWorkflowManagerImpl(issueManager, workflowManager, null, permissionManager);
  99. final Collection<ActionDescriptor> availableActions = issueWorkflowManager.getAvailableActions(issueTestOne, currentUser);
  100. Assert.assertThat(availableActions, Matchers.containsInAnyOrder(startProgressAction));
  101. }
  102. @Test
  103. public void testGetAvailableActionIdsWhenUserHasTransitionPermission() throws Exception {
  104. final IssueWorkflowManagerImpl issueWorkflowManager = new IssueWorkflowManagerImpl(issueManager, workflowManager, null, permissionManager);
  105. final Iterable<Integer> availableActionIds = toIterable(issueWorkflowManager.getAvailableActionIds(issueTestOne, TransitionOptions.defaults(), currentUser));
  106. Assert.assertThat(availableActionIds, Matchers.hasItem(START_PROGRESS_ACTION_ID));
  107. }
  108. @Test
  109. public void testGetAvailableActionIdsWhenUserDoesntHaveTransitionPermission() throws Exception {
  110. setHasTransitionPermission(false);
  111. final IssueWorkflowManagerImpl issueWorkflowManager = new IssueWorkflowManagerImpl(issueManager, workflowManager, null, permissionManager);
  112. final Iterable<Integer> availableActionIds = toIterable(issueWorkflowManager.getAvailableActionIds(issueTestOne, TransitionOptions.defaults(), currentUser));
  113. Assert.assertThat(availableActionIds, Matchers.<Integer>emptyIterable());
  114. }
  115. @Test
  116. public void testIsValidActionWhenUserHasTransitionPermission() throws Exception {
  117. final IssueWorkflowManagerImpl issueWorkflowManager = new IssueWorkflowManagerImpl(issueManager, workflowManager, null, permissionManager);
  118. Assert.assertTrue("Action from workflow should be valid as transition permission was granted",
  119. issueWorkflowManager.isValidAction(issueTestOne, START_PROGRESS_ACTION_ID, currentUser));
  120. Assert.assertFalse("Action which is not in workflow should not be valid",
  121. issueWorkflowManager.isValidAction(issueTestOne, NOT_EXISTENT_ACTION_ID, currentUser));
  122. }
  123. @Test
  124. public void testIsValidActionWhenUserDoesntHaveTransitionPermission() throws Exception {
  125. setHasTransitionPermission(false);
  126. final IssueWorkflowManagerImpl issueWorkflowManager = new IssueWorkflowManagerImpl(issueManager, workflowManager, null, permissionManager);
  127. Assert.assertFalse("Any action from workflow should be invalid as transition permission was NOT granted",
  128. issueWorkflowManager.isValidAction(issueTestOne, START_PROGRESS_ACTION_ID, currentUser));
  129. Assert.assertFalse("Action which is not in workflow should not be valid",
  130. issueWorkflowManager.isValidAction(issueTestOne, NOT_EXISTENT_ACTION_ID, currentUser));
  131. }
  132. @Test
  133. public void testPermissionsCheckSkippedWhenAsked() throws Exception {
  134. setHasTransitionPermission(false);
  135. final IssueWorkflowManagerImpl issueWorkflowManager = new IssueWorkflowManagerImpl(issueManager, workflowManager, null, permissionManager);
  136. // Verify that the transition permission is in place
  137. Assert.assertFalse("Any action from workflow should be invalid as transition permission was NOT granted",
  138. issueWorkflowManager.isValidAction(issueTestOne, START_PROGRESS_ACTION_ID, currentUser));
  139. final TransitionOptions transitionOptions = new TransitionOptions.Builder().skipPermissions().build();
  140. Assert.assertTrue("Transition permission shouldn't be checked if we ask to skip it",
  141. issueWorkflowManager.isValidAction(issueTestOne, START_PROGRESS_ACTION_ID, transitionOptions, currentUser));
  142. }
  143. @Test
  144. public void testDeprecatedMethodsDelegatesCallToNewMethodsWithUserFromAuthenticationContext() throws Exception {
  145. final List<ActionDescriptor> expectedResult = ImmutableList.of();
  146. // deprecated methods should delegate query (after getting current user from authentication context) to overriden methods
  147. final IssueWorkflowManagerImpl issueWorkflowManager = new IssueWorkflowManagerImpl(issueManager, workflowManager, authenticationContext, permissionManager) {
  148. @Override
  149. public Collection<ActionDescriptor> getAvailableActions(final Issue issue, final TransitionOptions transitionOptions, final ApplicationUser user) {
  150. assertEquals("Expected to get currently logged in user", currentUser, user);
  151. return expectedResult;
  152. }
  153. @Override
  154. public List<ActionDescriptor> getSortedAvailableActions(final Issue issue, final TransitionOptions transitionOptions, final ApplicationUser user) {
  155. assertEquals("Expected to get currently logged in user", currentUser, user);
  156. return expectedResult;
  157. }
  158. };
  159. // check if deprecated methods returns exactly the same object that we do return in overriden methods above
  160. assertTrue("Method did not return expected value from delegated method",
  161. expectedResult == issueWorkflowManager.getSortedAvailableActions(issueTestOne));
  162. assertTrue("Method did not return expected value from delegated method",
  163. expectedResult == issueWorkflowManager.getAvailableActions(issueTestOne));
  164. }
  165. private Matcher<Map<?, ?>> hasEntry(final Object k, final Object v) {
  166. return Matchers.hasEntry(k, v);
  167. }
  168. private Iterable<Integer> toIterable(final int[] intArray) {
  169. final Integer[] integerArray = new Integer[intArray.length];
  170. for (int i = 0; i < intArray.length; i++) {
  171. integerArray[i] = intArray[i];
  172. }
  173. return ImmutableList.copyOf(integerArray);
  174. }
  175. }