From 58d7427d3f9f33123ff6d9a987e78e6bcce9d3cc Mon Sep 17 00:00:00 2001 From: N Smith Date: Thu, 3 Mar 2011 12:12:24 +0000 Subject: [PATCH] Fixing build failures. WebscriptTestSuite now references ActivitiWorkflowRestAPITest and JbpmWorkflowRestAPITest instead of WorkflowRestAPITest. git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@25995 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- .../repo/web/scripts/WebScriptTestSuite.java | 7 +- .../workflow/ActivitiWorkflowRestApiTest.java | 2 +- .../workflow/JBPMWorkflowRestApiTest.java | 2 +- .../scripts/workflow/WorkflowRestApiTest.java | 1728 ----------------- 4 files changed, 7 insertions(+), 1732 deletions(-) delete mode 100644 source/java/org/alfresco/repo/web/scripts/workflow/WorkflowRestApiTest.java diff --git a/source/java/org/alfresco/repo/web/scripts/WebScriptTestSuite.java b/source/java/org/alfresco/repo/web/scripts/WebScriptTestSuite.java index a8262b3635..e448299c6e 100644 --- a/source/java/org/alfresco/repo/web/scripts/WebScriptTestSuite.java +++ b/source/java/org/alfresco/repo/web/scripts/WebScriptTestSuite.java @@ -47,8 +47,10 @@ import org.alfresco.repo.web.scripts.wcm.WebProjectTest; import org.alfresco.repo.web.scripts.wcm.membership.WebProjectMembershipTest; import org.alfresco.repo.web.scripts.wcm.sandbox.AssetTest; import org.alfresco.repo.web.scripts.wcm.sandbox.SandboxTest; +import org.alfresco.repo.web.scripts.workflow.ActivitiWorkflowRestApiTest; +import org.alfresco.repo.web.scripts.workflow.JBPMWorkflowRestApiTest; import org.alfresco.repo.web.scripts.workflow.WorkflowModelBuilderTest; -import org.alfresco.repo.web.scripts.workflow.WorkflowRestApiTest; +import org.alfresco.repo.web.scripts.workflow.AbstractWorkflowRestApiTest; /** * Web Scripts test suite @@ -90,7 +92,8 @@ public class WebScriptTestSuite extends TestSuite suite.addTestSuite( WebProjectMembershipTest.class ); suite.addTestSuite( WebProjectTest.class ); suite.addTestSuite( WorkflowModelBuilderTest.class ); - suite.addTestSuite( WorkflowRestApiTest.class ); + suite.addTestSuite( ActivitiWorkflowRestApiTest.class ); + suite.addTestSuite( JBPMWorkflowRestApiTest.class ); // This uses a slightly different context // As such, we can't run it in the same suite as the others, diff --git a/source/java/org/alfresco/repo/web/scripts/workflow/ActivitiWorkflowRestApiTest.java b/source/java/org/alfresco/repo/web/scripts/workflow/ActivitiWorkflowRestApiTest.java index 7efe092208..1e6cdd2622 100644 --- a/source/java/org/alfresco/repo/web/scripts/workflow/ActivitiWorkflowRestApiTest.java +++ b/source/java/org/alfresco/repo/web/scripts/workflow/ActivitiWorkflowRestApiTest.java @@ -6,7 +6,7 @@ import java.util.HashMap; import org.alfresco.service.namespace.NamespaceService; import org.alfresco.service.namespace.QName; -public class ActivitiWorkflowRestApiTest extends WorkflowRestApiTest +public class ActivitiWorkflowRestApiTest extends AbstractWorkflowRestApiTest { private static final String ADHOC_WORKFLOW_DEFINITION_NAME = "activiti$activitiAdhoc"; diff --git a/source/java/org/alfresco/repo/web/scripts/workflow/JBPMWorkflowRestApiTest.java b/source/java/org/alfresco/repo/web/scripts/workflow/JBPMWorkflowRestApiTest.java index 010f9d02c1..d8578e2cc4 100644 --- a/source/java/org/alfresco/repo/web/scripts/workflow/JBPMWorkflowRestApiTest.java +++ b/source/java/org/alfresco/repo/web/scripts/workflow/JBPMWorkflowRestApiTest.java @@ -6,7 +6,7 @@ import org.springframework.extensions.webscripts.Status; import org.springframework.extensions.webscripts.TestWebScriptServer.GetRequest; import org.springframework.extensions.webscripts.TestWebScriptServer.Response; -public class JBPMWorkflowRestApiTest extends WorkflowRestApiTest +public class JBPMWorkflowRestApiTest extends AbstractWorkflowRestApiTest { private static final String ADHOC_WORKFLOW_DEFINITION_NAME = "jbpm$wf:adhoc"; private static final String REVIEW_WORKFLOW_DEFINITION_NAME = "jbpm$wf:review"; diff --git a/source/java/org/alfresco/repo/web/scripts/workflow/WorkflowRestApiTest.java b/source/java/org/alfresco/repo/web/scripts/workflow/WorkflowRestApiTest.java deleted file mode 100644 index f328b504ff..0000000000 --- a/source/java/org/alfresco/repo/web/scripts/workflow/WorkflowRestApiTest.java +++ /dev/null @@ -1,1728 +0,0 @@ -/* - * Copyright (C) 2005-2010 Alfresco Software Limited. - * - * This file is part of Alfresco - * - * Alfresco is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Alfresco is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with Alfresco. If not, see . - */ -package org.alfresco.repo.web.scripts.workflow; - -import java.io.Serializable; -import java.text.MessageFormat; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Date; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import org.alfresco.model.ContentModel; -import org.alfresco.repo.security.authentication.AuthenticationComponent; -import org.alfresco.repo.security.person.TestGroupManager; -import org.alfresco.repo.security.person.TestPersonManager; -import org.alfresco.repo.web.scripts.BaseWebScriptTest; -import org.alfresco.repo.workflow.WorkflowModel; -import org.alfresco.service.cmr.dictionary.TypeDefinition; -import org.alfresco.service.cmr.model.FileFolderService; -import org.alfresco.service.cmr.repository.NodeRef; -import org.alfresco.service.cmr.repository.NodeService; -import org.alfresco.service.cmr.repository.StoreRef; -import org.alfresco.service.cmr.search.SearchService; -import org.alfresco.service.cmr.security.AuthorityService; -import org.alfresco.service.cmr.security.MutableAuthenticationService; -import org.alfresco.service.cmr.security.PersonService; -import org.alfresco.service.cmr.workflow.WorkflowDefinition; -import org.alfresco.service.cmr.workflow.WorkflowInstance; -import org.alfresco.service.cmr.workflow.WorkflowNode; -import org.alfresco.service.cmr.workflow.WorkflowPath; -import org.alfresco.service.cmr.workflow.WorkflowService; -import org.alfresco.service.cmr.workflow.WorkflowTask; -import org.alfresco.service.cmr.workflow.WorkflowTaskDefinition; -import org.alfresco.service.cmr.workflow.WorkflowTaskState; -import org.alfresco.service.cmr.workflow.WorkflowTransition; -import org.alfresco.service.namespace.NamespaceService; -import org.alfresco.service.namespace.QName; -import org.alfresco.util.GUID; -import org.json.JSONArray; -import org.json.JSONException; -import org.json.JSONObject; -import org.springframework.context.ApplicationContext; -import org.springframework.extensions.surf.util.ISO8601DateFormat; -import org.springframework.extensions.webscripts.Status; -import org.springframework.extensions.webscripts.TestWebScriptServer.DeleteRequest; -import org.springframework.extensions.webscripts.TestWebScriptServer.GetRequest; -import org.springframework.extensions.webscripts.TestWebScriptServer.PutRequest; -import org.springframework.extensions.webscripts.TestWebScriptServer.Response; - -import com.ibm.icu.util.Calendar; - -/** - * @author Nick Smith - * @author Frederik Heremans - * - */ -public abstract class WorkflowRestApiTest extends BaseWebScriptTest -{ - protected final static String USER1 = "Bob" + GUID.generate(); - protected final static String USER2 = "Jane" + GUID.generate(); - protected final static String USER3 = "Nick" + GUID.generate(); - protected final static String GROUP ="Group" + GUID.generate(); - protected static final String URL_TASKS = "api/task-instances"; - protected static final String URL_USER_TASKS = "api/task-instances?authority={0}"; - protected static final String URL_USER_TASKS_PROPERTIES = "api/task-instances?authority={0}&properties={1}"; - protected static final String URL_TASKS_DUE_BEFORE = "api/task-instances?dueBefore={0}"; - protected static final String URL_TASKS_DUE_AFTER = "api/task-instances?dueAfter={0}"; - protected static final String URL_WORKFLOW_TASKS = "api/workflow-instances/{0}/task-instances"; - protected static final String URL_WORKFLOW_DEFINITIONS = "api/workflow-definitions"; - protected static final String URL_WORKFLOW_DEFINITION = "api/workflow-definitions/{0}"; - protected static final String URL_WORKFLOW_INSTANCES = "api/workflow-instances"; - protected static final String URL_WORKFLOW_INSTANCES_FOR_DEFINITION = "api/workflow-definitions/{0}/workflow-instances"; - protected static final String URL_WORKFLOW_INSTANCES_FOR_NODE = "api/node/{0}/{1}/{2}/workflow-instances"; - - protected static final String COMPANY_HOME = "/app:company_home"; - protected static final String TEST_CONTENT = "TestContent"; - protected static final String ADHOC_START_TASK_TYPE = "wf:submitAdhocTask"; - protected static final String ADHOC_TASK_TYPE = "wf:adhocTask"; - protected static final String ADHOC_TASK_COMPLETED_TYPE = "wf:completedAdhocTask"; - - - private TestPersonManager personManager; - private TestGroupManager groupManager; - - protected WorkflowService workflowService; - private NodeService nodeService; - private NamespaceService namespaceService; - private NodeRef packageRef; - private NodeRef contentNodeRef; - private AuthenticationComponent authenticationComponent; - - public void testTaskInstancesGet() throws Exception - { - String startedWorkflowId = null; - try - { - // Check USER2 starts with no tasks. - personManager.setUser(USER2); - Response response = sendRequest(new GetRequest(MessageFormat.format(URL_USER_TASKS, USER2)), 200); - assertEquals(Status.STATUS_OK, response.getStatus()); - String jsonStr = response.getContentAsString(); - JSONObject json = new JSONObject(jsonStr); - JSONArray results = json.getJSONArray("data"); - assertNotNull(results); - assertTrue(results.length() == 0); - - // Start workflow as USER1 and assign task to USER2. - personManager.setUser(USER1); - WorkflowDefinition adhocDef = workflowService.getDefinitionByName(getAdhocWorkflowDefinitionName()); - Map params = new HashMap(); - params.put(WorkflowModel.ASSOC_ASSIGNEE, personManager.get(USER2)); - Calendar dueDateCal = Calendar.getInstance(); - Date dueDate = dueDateCal.getTime(); - - params.put(WorkflowModel.PROP_DUE_DATE, dueDate); - params.put(WorkflowModel.PROP_PRIORITY, 1); - params.put(WorkflowModel.ASSOC_PACKAGE, packageRef); - - WorkflowPath adhocPath = workflowService.startWorkflow(adhocDef.getId(), params); - startedWorkflowId = adhocPath.getInstance().getId(); - WorkflowTask startTask = workflowService.getTasksForWorkflowPath(adhocPath.getId()).get(0); - workflowService.endTask(startTask.getId(), null); - - // Check USER2 now has one task. - List tasks = workflowService.getAssignedTasks(USER2, WorkflowTaskState.IN_PROGRESS); - WorkflowTask task = tasks.get(0); - - Map updateParams = new HashMap(1); - updateParams.put(WorkflowModel.PROP_DUE_DATE, new Date()); - workflowService.updateTask(task.getId(), updateParams, null, null); - - personManager.setUser(USER2); - response = sendRequest(new GetRequest(MessageFormat.format(URL_USER_TASKS, USER2)), 200); - jsonStr = response.getContentAsString(); - json = new JSONObject(jsonStr); - results = json.getJSONArray("data"); - assertNotNull(results); - assertTrue(results.length() == tasks.size()); - JSONObject result = results.getJSONObject(0); - - int totalItems = results.length(); - - String expUrl = "api/task-instances/" + task.getId(); - assertEquals(expUrl, result.getString("url")); - assertEquals(task.getName(), result.getString("name")); - assertEquals(task.getTitle(), result.getString("title")); - assertEquals(task.getDescription(), result.getString("description")); - assertEquals(task.getState().name(), result.getString("state")); - assertEquals( "api/workflow-paths/" + adhocPath.getId(), result.getString("path")); - assertFalse(result.getBoolean("isPooled")); - assertTrue(result.getBoolean("isEditable")); - assertTrue(result.getBoolean("isReassignable")); - assertFalse(result.getBoolean("isClaimable")); - assertFalse(result.getBoolean("isReleasable")); - - JSONObject owner = result.getJSONObject("owner"); - assertEquals(USER2, owner.getString("userName")); - assertEquals(personManager.getFirstName(USER2), owner.getString("firstName")); - assertEquals(personManager.getLastName(USER2), owner.getString("lastName")); - - JSONObject properties = result.getJSONObject("properties"); - assertNotNull(properties); - - JSONObject instance = result.getJSONObject("workflowInstance"); - assertNotNull(instance); - - // Check state filtering - checkTasksState(URL_TASKS + "?state=completed", WorkflowTaskState.COMPLETED); - checkTasksState(URL_TASKS + "?state=in_progress", WorkflowTaskState.IN_PROGRESS); - - // TODO: Add more tests to check pooled actors. - - // Check for priority filtering - checkPriorityFiltering(URL_TASKS + "?priority=2"); - - // Due after yesterday, started task should be in it - dueDateCal.add(Calendar.DAY_OF_MONTH, -1); - checkTasksPresent(MessageFormat.format(URL_TASKS_DUE_AFTER, ISO8601DateFormat.format(dueDateCal.getTime())), - true, - task.getId()); - - // Due before yesterday, started task shouldn't be in it - checkTasksPresent(MessageFormat.format(URL_TASKS_DUE_BEFORE, ISO8601DateFormat.format(dueDateCal.getTime())), - false, - task.getId()); - - // Due before tomorrow, started task should be in it - dueDateCal.add(Calendar.DAY_OF_MONTH, 2); - checkTasksPresent(MessageFormat.format(URL_TASKS_DUE_BEFORE, ISO8601DateFormat.format(dueDateCal.getTime())), - true, - task.getId()); - - // Due after tomorrow, started task shouldn't be in it - checkTasksPresent(MessageFormat.format(URL_TASKS_DUE_AFTER, ISO8601DateFormat.format(dueDateCal.getTime())), - false, - task.getId()); - - //checkFiltering(URL_TASKS + "?dueAfter=" + ISO8601DateFormat.format(dueDate)); - - //checkFiltering(URL_TASKS + "?dueBefore=" + ISO8601DateFormat.format(new Date())); - - // Check property filtering on the task assigned to USER2 - String customProperties = "bpm_description,bpm_priority"; - checkTaskPropertyFiltering(customProperties, Arrays.asList("bpm_description", "bpm_priority")); - - // Properties that aren't explicitally present on task should be returned as wel - customProperties = "bpm_unexistingProperty,bpm_description,bpm_priority"; - checkTaskPropertyFiltering(customProperties, Arrays.asList("bpm_description", "bpm_priority", "bpm_unexistingProperty")); - - // Check paging - int maxItems = 3; - for (int skipCount = 0; skipCount < totalItems; skipCount += maxItems) - { - // one of this should test situation when skipCount + maxItems > totalItems - checkPaging(MessageFormat.format(URL_USER_TASKS, USER2) + "&maxItems=" + maxItems + "&skipCount=" + skipCount, totalItems, maxItems, skipCount); - } - - // testing when skipCount > totalItems - checkPaging(MessageFormat.format(URL_USER_TASKS, USER2) + "&maxItems=" + maxItems + "&skipCount=" + (totalItems + 1), totalItems, maxItems, totalItems + 1); - - // check the exclude filtering - String exclude = "wf:submitAdhocTask"; - response = sendRequest(new GetRequest(URL_TASKS + "?exclude=" + exclude), 200); - assertEquals(Status.STATUS_OK, response.getStatus()); - jsonStr = response.getContentAsString(); - json = new JSONObject(jsonStr); - results = json.getJSONArray("data"); - assertNotNull(results); - - boolean adhocTasksPresent = false; - for (int i = 0; i < results.length(); i++) - { - JSONObject taskJSON = results.getJSONObject(i); - - String type = taskJSON.getString("name"); - if (exclude.equals(type)) - { - adhocTasksPresent = true; - break; - } - } - - assertFalse("Found wf:submitAdhocTask when they were supposed to be excluded", adhocTasksPresent); - } - finally - { - if(startedWorkflowId != null) - { - try { - // Cleanup - workflowService.cancelWorkflow(startedWorkflowId); - } - catch(Throwable t) - { - // Ignore exception while cleaning up - } - } - } - } - - public void testTaskInstancesForWorkflowGet() throws Exception - { - String startedWorkflowId = null; - try - { - // Check starts with no workflow. - personManager.setUser(USER2); - sendRequest(new GetRequest(MessageFormat.format(URL_WORKFLOW_TASKS, "Foo")), Status.STATUS_INTERNAL_SERVER_ERROR); - - // Start workflow as USER1 and assign task to USER2. - personManager.setUser(USER1); - WorkflowDefinition adhocDef = workflowService.getDefinitionByName(getAdhocWorkflowDefinitionName()); - Map params = new HashMap(); - params.put(WorkflowModel.ASSOC_ASSIGNEE, personManager.get(USER2)); - Calendar dueDateCal = Calendar.getInstance(); - Date dueDate = dueDateCal.getTime(); - - params.put(WorkflowModel.PROP_DUE_DATE, dueDate); - params.put(WorkflowModel.PROP_PRIORITY, 1); - params.put(WorkflowModel.ASSOC_PACKAGE, packageRef); - - WorkflowPath adhocPath = workflowService.startWorkflow(adhocDef.getId(), params); - startedWorkflowId = adhocPath.getInstance().getId(); - - // End start task. - WorkflowTask startTask = workflowService.getStartTask(startedWorkflowId); - String startTaskId = startTask.getId(); - workflowService.endTask(startTaskId, null); - - // Check USER2 now has one task. - List tasks = workflowService.getAssignedTasks(USER2, WorkflowTaskState.IN_PROGRESS); - assertEquals(1, tasks.size()); - WorkflowTask task = tasks.get(0); - - // Retrieve tasks using the workflow instance - String baseUrl = MessageFormat.format(URL_WORKFLOW_TASKS, startedWorkflowId); - - // Check returns the completed start task and the current task. - String adhocTaskId = task.getId(); - checkTasksMatch(baseUrl, startTaskId, adhocTaskId); - - String completedUrl = baseUrl + "?state="+WorkflowTaskState.COMPLETED; - checkTasksMatch(completedUrl, startTaskId); - - String inProgressUrl = baseUrl + "?state="+WorkflowTaskState.IN_PROGRESS; - checkTasksMatch(inProgressUrl, adhocTaskId); - - String user1Url = baseUrl + "?authority="+USER1; - checkTasksMatch(user1Url, startTaskId); - - String user2Url = baseUrl + "?authority="+USER2; - checkTasksMatch(user2Url, adhocTaskId); - - String user1CompletedURL = user1Url + "&state=" + WorkflowTaskState.COMPLETED; - checkTasksMatch(user1CompletedURL, startTaskId); - - String user1InProgressURL = user1Url + "&state=" + WorkflowTaskState.IN_PROGRESS; - checkTasksMatch(user1InProgressURL); - - String user2CompletedURL = user2Url + "&state=" + WorkflowTaskState.COMPLETED; - checkTasksMatch(user2CompletedURL); - - String user2InProgressURL = user2Url + "&state=" + WorkflowTaskState.IN_PROGRESS; - checkTasksMatch(user2InProgressURL, adhocTaskId); - } - finally - { - if(startedWorkflowId != null) - { - try { - // Cleanup - workflowService.cancelWorkflow(startedWorkflowId); - } - catch(Throwable t) - { - // Ignore exception while cleaning up - } - } - } - } - - public void testTaskInstanceGet() throws Exception - { - String startedWorkflowId = null; - - try { - //Start workflow as USER1 and assign task to USER2. - personManager.setUser(USER1); - WorkflowDefinition adhocDef = workflowService.getDefinitionByName(getAdhocWorkflowDefinitionName()); - Map params = new HashMap(); - params.put(WorkflowModel.ASSOC_ASSIGNEE, personManager.get(USER2)); - params.put(WorkflowModel.PROP_DUE_DATE, new Date()); - params.put(WorkflowModel.PROP_PRIORITY, 1); - params.put(WorkflowModel.ASSOC_PACKAGE, packageRef); - - WorkflowPath adhocPath = workflowService.startWorkflow(adhocDef.getId(), params); - startedWorkflowId = adhocPath.getInstance().getId(); - WorkflowTask startTask = workflowService.getTasksForWorkflowPath(adhocPath.getId()).get(0); - - // Get the start-task - Response response = sendRequest(new GetRequest(URL_TASKS + "/" + startTask.getId()), Status.STATUS_OK); - String jsonStr = response.getContentAsString(); - JSONObject json = new JSONObject(jsonStr); - JSONObject result = json.getJSONObject("data"); - assertNotNull(result); - - assertEquals(startTask.getId(), result.getString("id")); - assertEquals(URL_TASKS + "/" + startTask.getId(), result.getString("url")); - assertEquals(startTask.getName(), result.getString("name")); - assertEquals(startTask.getTitle(), result.getString("title")); - assertEquals(startTask.getDescription(), result.getString("description")); - - // Task should be in progress - assertEquals(startTask.getState().name(), result.getString("state")); - assertEquals(WorkflowTaskState.IN_PROGRESS.toString(), result.getString("state")); - assertEquals("api/workflow-paths/" + adhocPath.getId(), result.getString("path")); - - checkWorkflowTaskEditable(result); - checkWorkflowTaskOwner(result, USER1); - checkWorkflowTaskPropertiesPresent(result); - - checkWorkflowInstance(startTask.getPath().getInstance(), result.getJSONObject("workflowInstance")); - checkWorkflowTaskDefinition(startTask.getDefinition(), result.getJSONObject("definition")); - - // Finish the start-task, and fetch it again - workflowService.endTask(startTask.getId(), null); - startTask = workflowService.getTaskById(startTask.getId()); - - response = sendRequest(new GetRequest(URL_TASKS + "/" + startTask.getId()), Status.STATUS_OK); - jsonStr = response.getContentAsString(); - json = new JSONObject(jsonStr); - result = json.getJSONObject("data"); - assertNotNull(result); - - assertEquals(startTask.getId(), result.getString("id")); - assertEquals(URL_TASKS + "/" + startTask.getId(), result.getString("url")); - assertEquals(startTask.getName(), result.getString("name")); - assertEquals(startTask.getTitle(), result.getString("title")); - assertEquals(startTask.getDescription(), result.getString("description")); - - // Start task should be completed - assertEquals(startTask.getState().name(), result.getString("state")); - assertEquals(WorkflowTaskState.COMPLETED.toString(), result.getString("state")); - assertEquals("api/workflow-paths/" + adhocPath.getId(), result.getString("path")); - - checkWorkflowTaskReadOnly(result); - checkWorkflowTaskOwner(result, USER1); - checkWorkflowTaskPropertiesPresent(result); - - checkWorkflowInstance(startTask.getPath().getInstance(), result.getJSONObject("workflowInstance")); - checkWorkflowTaskDefinition(startTask.getDefinition(), result.getJSONObject("definition")); - - // Get the next active task - WorkflowTask firstTask = workflowService.getTasksForWorkflowPath(adhocPath.getId()).get(0); - - response = sendRequest(new GetRequest(URL_TASKS + "/" + firstTask.getId()), 200); - jsonStr = response.getContentAsString(); - json = new JSONObject(jsonStr); - result = json.getJSONObject("data"); - assertNotNull(result); - - assertEquals(firstTask.getId(), result.getString("id")); - assertEquals(URL_TASKS + "/" + firstTask.getId(), result.getString("url")); - assertEquals(firstTask.getName(), result.getString("name")); - assertEquals(firstTask.getTitle(), result.getString("title")); - assertEquals(firstTask.getDescription(), result.getString("description")); - - // Task should be in progress - assertEquals(firstTask.getState().name(), result.getString("state")); - assertEquals(WorkflowTaskState.IN_PROGRESS.toString(), result.getString("state")); - assertEquals("api/workflow-paths/" + adhocPath.getId(), result.getString("path")); - - checkWorkflowTaskEditable(result); - checkWorkflowTaskOwner(result, USER2); - checkWorkflowTaskPropertiesPresent(result); - - checkWorkflowInstance(firstTask.getPath().getInstance(), result.getJSONObject("workflowInstance")); - checkWorkflowTaskDefinition(firstTask.getDefinition(), result.getJSONObject("definition")); - - // Finish the task, and fetch it again - workflowService.endTask(firstTask.getId(), null); - firstTask = workflowService.getTaskById(firstTask.getId()); - - response = sendRequest(new GetRequest(URL_TASKS + "/" + firstTask.getId()), 200); - jsonStr = response.getContentAsString(); - json = new JSONObject(jsonStr); - result = json.getJSONObject("data"); - assertNotNull(result); - - assertEquals(firstTask.getId(), result.getString("id")); - assertEquals(URL_TASKS + "/" + firstTask.getId(), result.getString("url")); - assertEquals(firstTask.getName(), result.getString("name")); - assertEquals(firstTask.getTitle(), result.getString("title")); - assertEquals(firstTask.getDescription(), result.getString("description")); - - // The task should be completed - assertEquals(firstTask.getState().name(), result.getString("state")); - assertEquals(WorkflowTaskState.COMPLETED.toString(), result.getString("state")); - assertEquals("api/workflow-paths/" + adhocPath.getId(), result.getString("path")); - - checkWorkflowTaskReadOnly(result); - checkWorkflowTaskOwner(result, USER2); - checkWorkflowTaskPropertiesPresent(result); - - checkWorkflowInstance(firstTask.getPath().getInstance(), result.getJSONObject("workflowInstance")); - checkWorkflowTaskDefinition(firstTask.getDefinition(), result.getJSONObject("definition")); - - } - finally - { - if(startedWorkflowId != null) - { - try { - // Cleanup - workflowService.deleteWorkflow(startedWorkflowId); - } - catch(Throwable t) - { - // Ignore exception while cleaning up - } - } - } - } - - private void checkWorkflowTaskPropertiesPresent(JSONObject taskJson) throws Exception - { - JSONObject properties = taskJson.getJSONObject("properties"); - assertNotNull(properties); - assertTrue(properties.has("bpm_priority")); - assertTrue(properties.has("bpm_description")); - assertTrue(properties.has("bpm_reassignable")); - } - private void checkWorkflowTaskReadOnly(JSONObject taskJson) throws Exception - { - // Task shouldn't be editable and reassignable, since it's completed - assertFalse(taskJson.getBoolean("isPooled")); - assertFalse(taskJson.getBoolean("isEditable")); - assertFalse(taskJson.getBoolean("isReassignable")); - assertFalse(taskJson.getBoolean("isClaimable")); - assertFalse(taskJson.getBoolean("isReleasable")); - } - - private void checkWorkflowTaskOwner(JSONObject taskJson, String user) throws Exception - { - JSONObject owner = taskJson.getJSONObject("owner"); - assertEquals(user, owner.getString("userName")); - assertEquals(personManager.getFirstName(user), owner.getString("firstName")); - assertEquals(personManager.getLastName(user), owner.getString("lastName")); - } - - private void checkWorkflowTaskEditable(JSONObject taskJson) throws Exception - { - assertFalse(taskJson.getBoolean("isPooled")); - assertTrue(taskJson.getBoolean("isEditable")); - assertTrue(taskJson.getBoolean("isReassignable")); - assertFalse(taskJson.getBoolean("isClaimable")); - assertFalse(taskJson.getBoolean("isReleasable")); - } - - private void checkWorkflowInstance(WorkflowInstance wfInstance, JSONObject instance) throws Exception - { - assertNotNull(instance); - assertEquals(wfInstance.getId(), instance.getString("id")); - assertTrue(instance.has("url")); - assertEquals(wfInstance.getDefinition().getName(), instance.getString("name")); - assertEquals(wfInstance.getDefinition().getTitle(), instance.getString("title")); - assertEquals(wfInstance.getDefinition().getDescription(), instance.getString("description")); - assertEquals(wfInstance.isActive(), instance.getBoolean("isActive")); - assertTrue(instance.has("startDate")); - - JSONObject initiator = instance.getJSONObject("initiator"); - - assertEquals(USER1, initiator.getString("userName")); - assertEquals(personManager.getFirstName(USER1), initiator.getString("firstName")); - assertEquals(personManager.getLastName(USER1), initiator.getString("lastName")); - } - - private void checkWorkflowTaskDefinition(WorkflowTaskDefinition wfDefinition, JSONObject definition) throws Exception - { - assertNotNull(definition); - - assertEquals(wfDefinition.getId(), definition.getString("id")); - assertTrue(definition.has("url")); - - JSONObject type = definition.getJSONObject("type"); - TypeDefinition startType = (wfDefinition).getMetadata(); - - assertNotNull(type); - - assertEquals(startType.getName().toPrefixString(), type.getString("name")); - assertEquals(startType.getTitle(), type.getString("title")); - assertEquals(startType.getDescription(), type.getString("description")); - assertTrue(type.has("url")); - - JSONObject node = definition.getJSONObject("node"); - WorkflowNode startNode = wfDefinition.getNode(); - - assertNotNull(node); - - assertEquals(startNode.getName(), node.getString("name")); - assertEquals(startNode.getTitle(), node.getString("title")); - assertEquals(startNode.getDescription(), node.getString("description")); - assertEquals(startNode.isTaskNode(), node.getBoolean("isTaskNode")); - - JSONArray transitions = node.getJSONArray("transitions"); - WorkflowTransition[] startTransitions = startNode.getTransitions(); - - assertNotNull(transitions); - - assertEquals(startTransitions.length, transitions.length()); - - for (int i = 0; i < transitions.length(); i++) - { - JSONObject transition = transitions.getJSONObject(i); - WorkflowTransition startTransition = startTransitions[i]; - - assertNotNull(transition); - - assertEquals(startTransition.getId(), transition.getString("id")); - assertEquals(startTransition.getTitle(), transition.getString("title")); - assertEquals(startTransition.getDescription(), transition.getString("description")); - assertEquals(startTransition.isDefault(), transition.getBoolean("isDefault")); - assertTrue(transition.has("isHidden")); - } - - } - - public void testTaskInstancePut() throws Exception - { - String startedWorkflowId = null; - - try - { - // Start workflow as USER1 and assign task to USER2. - personManager.setUser(USER1); - WorkflowDefinition adhocDef = workflowService.getDefinitionByName(getAdhocWorkflowDefinitionName()); - Map params = new HashMap(); - params.put(WorkflowModel.ASSOC_ASSIGNEE, personManager.get(USER2)); - params.put(WorkflowModel.PROP_DUE_DATE, new Date()); - params.put(WorkflowModel.PROP_PRIORITY, 1); - params.put(WorkflowModel.ASSOC_PACKAGE, packageRef); - - WorkflowPath adhocPath = workflowService.startWorkflow(adhocDef.getId(), params); - startedWorkflowId = adhocPath.getInstance().getId(); - WorkflowTask startTask = workflowService.getStartTask(adhocPath.getInstance().getId()); - - // Finish the start-task - workflowService.endTask(startTask.getId(), null); - - WorkflowTask firstTask = workflowService.getTasksForWorkflowPath(adhocPath.getId()).get(0); - - Response getResponse = sendRequest(new GetRequest(URL_TASKS + "/" + firstTask.getId()), 200); - - JSONObject jsonProperties = new JSONObject(getResponse.getContentAsString()).getJSONObject("data").getJSONObject("properties"); - - // make some changes in existing properties - jsonProperties.remove(qnameToString(WorkflowModel.ASSOC_PACKAGE)); - jsonProperties.put(qnameToString(WorkflowModel.PROP_COMMENT), "Edited comment"); - jsonProperties.put(qnameToString(WorkflowModel.PROP_DUE_DATE), ISO8601DateFormat.format(new Date())); - jsonProperties.put(qnameToString(WorkflowModel.PROP_DESCRIPTION), "Edited description"); - jsonProperties.put(qnameToString(WorkflowModel.PROP_PRIORITY), 1); - - // Add some custom properties, which are not defined in typeDef - jsonProperties.put("customIntegerProperty", 1234); - jsonProperties.put("customBooleanProperty", Boolean.TRUE); - jsonProperties.put("customStringProperty", "Property value"); - - // test USER3 can not update the task - personManager.setUser(USER3); - Response unauthResponse = sendRequest(new PutRequest(URL_TASKS + "/" + firstTask.getId(), jsonProperties.toString(), "application/json"), 401); - assertEquals(Status.STATUS_UNAUTHORIZED, unauthResponse.getStatus()); - - - // test USER2 (the task owner) can update the task - personManager.setUser(USER2); - Response putResponse = sendRequest(new PutRequest(URL_TASKS + "/" + firstTask.getId(), jsonProperties.toString(), "application/json"), 200); - - assertEquals(Status.STATUS_OK, putResponse.getStatus()); - String jsonStr = putResponse.getContentAsString(); - JSONObject json = new JSONObject(jsonStr); - JSONObject result = json.getJSONObject("data"); - assertNotNull(result); - - JSONObject editedJsonProperties = result.getJSONObject("properties"); - compareProperties(jsonProperties, editedJsonProperties); - - // test USER1 (the task workflow initiator) can update the task - personManager.setUser(USER1); - putResponse = sendRequest(new PutRequest(URL_TASKS + "/" + firstTask.getId(), jsonProperties.toString(), "application/json"), 200); - - assertEquals(Status.STATUS_OK, putResponse.getStatus()); - jsonStr = putResponse.getContentAsString(); - json = new JSONObject(jsonStr); - result = json.getJSONObject("data"); - assertNotNull(result); - - editedJsonProperties = result.getJSONObject("properties"); - compareProperties(jsonProperties, editedJsonProperties); - - // Reassign the task to USER3 using taskInstance PUT - jsonProperties = new JSONObject(); - jsonProperties.put(qnameToString(ContentModel.PROP_OWNER), USER3); - putResponse = sendRequest(new PutRequest(URL_TASKS + "/" + firstTask.getId(), jsonProperties.toString(), "application/json"), 200); - assertEquals(Status.STATUS_OK, putResponse.getStatus()); - - // test USER3 (now the task owner) can update the task - personManager.setUser(USER3); - - jsonProperties.put(qnameToString(WorkflowModel.PROP_COMMENT), "Edited comment by USER3"); - putResponse = sendRequest(new PutRequest(URL_TASKS + "/" + firstTask.getId(), jsonProperties.toString(), "application/json"), 200); - - assertEquals(Status.STATUS_OK, putResponse.getStatus()); - - jsonStr = putResponse.getContentAsString(); - json = new JSONObject(jsonStr); - result = json.getJSONObject("data"); - assertNotNull(result); - - editedJsonProperties = result.getJSONObject("properties"); - compareProperties(jsonProperties, editedJsonProperties); - } - finally - { - if(startedWorkflowId != null) - { - try { - // Cleanup - workflowService.deleteWorkflow(startedWorkflowId); - } - catch(Throwable t) - { - // Ignore exception while cleaning up - } - } - } - } - - public void testTaskInstancePutCompletedTask() throws Exception - { - String startedWorkflowId = null; - try - { - // Start workflow as USER1 and assign to self - personManager.setUser(USER1); - WorkflowDefinition adhocDef = workflowService.getDefinitionByName(getAdhocWorkflowDefinitionName()); - Map params = new HashMap(); - params.put(WorkflowModel.ASSOC_ASSIGNEE, personManager.get(USER1)); - params.put(WorkflowModel.PROP_DUE_DATE, new Date()); - params.put(WorkflowModel.PROP_PRIORITY, 1); - params.put(WorkflowModel.ASSOC_PACKAGE, packageRef); - - WorkflowPath adhocPath = workflowService.startWorkflow(adhocDef.getId(), params); - startedWorkflowId = adhocPath.getInstance().getId(); - WorkflowTask startTask = workflowService.getTasksForWorkflowPath(adhocPath.getId()).get(0); - - // Finish the start-task - workflowService.endTask(startTask.getId(), null); - - Response getResponse = sendRequest(new GetRequest(URL_TASKS + "/" + startTask.getId()), 200); - - JSONObject jsonProperties = new JSONObject(getResponse.getContentAsString()).getJSONObject("data").getJSONObject("properties"); - - // Make a change - jsonProperties.put(qnameToString(WorkflowModel.PROP_DESCRIPTION), "Edited description"); - - // Update task. An error is expected, since the task is completed (and not editable) - sendRequest(new PutRequest(URL_TASKS + "/" + startTask.getId(), jsonProperties.toString(), "application/json"), - Status.STATUS_UNAUTHORIZED); - } - finally - { - if(startedWorkflowId != null) - { - try { - // Cleanup - workflowService.deleteWorkflow(startedWorkflowId); - } - catch(Throwable t) - { - // Ignore exception while cleaning up - } - } - } - } - - public void testWorkflowDefinitionsGet() throws Exception - { - Response response = sendRequest(new GetRequest(URL_WORKFLOW_DEFINITIONS), 200); - assertEquals(Status.STATUS_OK, response.getStatus()); - JSONObject json = new JSONObject(response.getContentAsString()); - JSONArray results = json.getJSONArray("data"); - assertNotNull(results); - assertTrue(results.length() > 0); - - boolean adhocWorkflowPresent = false; - - for (int i = 0; i < results.length(); i++) - { - JSONObject workflowDefinitionJSON = results.getJSONObject(i); - - assertTrue(workflowDefinitionJSON.has("id")); - assertTrue(workflowDefinitionJSON.getString("id").length() > 0); - - assertTrue(workflowDefinitionJSON.has("url")); - String url = workflowDefinitionJSON.getString("url"); - assertTrue(url.length() > 0); - assertTrue(url.startsWith("api/workflow-definitions/")); - - assertTrue(workflowDefinitionJSON.has("name")); - assertTrue(workflowDefinitionJSON.getString("name").length() > 0); - - assertTrue(workflowDefinitionJSON.has("title")); - assertTrue(workflowDefinitionJSON.getString("title").length() > 0); - - assertTrue(workflowDefinitionJSON.has("description")); - assertTrue(workflowDefinitionJSON.getString("description").length() > 0); - - if(getAdhocWorkflowDefinitionName().equals(workflowDefinitionJSON.getString("name"))) - { - adhocWorkflowPresent = true; - } - } - - assertTrue("Adhoc workflow definition was returned", adhocWorkflowPresent); - - // filter the workflow definitions and check they are not returned - String exclude = getAdhocWorkflowDefinitionName(); - response = sendRequest(new GetRequest(URL_WORKFLOW_DEFINITIONS + "?exclude=" + exclude), 200); - assertEquals(Status.STATUS_OK, response.getStatus()); - json = new JSONObject(response.getContentAsString()); - results = json.getJSONArray("data"); - assertNotNull(results); - - adhocWorkflowPresent = false; - for (int i = 0; i < results.length(); i++) - { - JSONObject workflowDefinitionJSON = results.getJSONObject(i); - - String name = workflowDefinitionJSON.getString("name"); - if (exclude.equals(name)) - { - adhocWorkflowPresent = true; - break; - } - } - - assertFalse("Found adhoc workflow when it was supposed to be excluded", adhocWorkflowPresent); - - // filter with a wildcard and ensure they all get filtered out - exclude = getAdhocWorkflowDefinitionName() + ", jbpm$wcmwf:*"; - response = sendRequest(new GetRequest(URL_WORKFLOW_DEFINITIONS + "?exclude=" + exclude), 200); - assertEquals(Status.STATUS_OK, response.getStatus()); - json = new JSONObject(response.getContentAsString()); - results = json.getJSONArray("data"); - assertNotNull(results); - - adhocWorkflowPresent = false; - boolean wcmWorkflowsPresent = false; - for (int i = 0; i < results.length(); i++) - { - JSONObject workflowDefinitionJSON = results.getJSONObject(i); - - String name = workflowDefinitionJSON.getString("name"); - if (name.equals(getAdhocWorkflowDefinitionName())) - { - adhocWorkflowPresent = true; - } - if (name.startsWith("jbpm$wcmwf:")) - { - wcmWorkflowsPresent = true; - } - } - - assertFalse("Found adhoc workflow when it was supposed to be excluded", adhocWorkflowPresent); - assertFalse("Found a WCM workflow when they were supposed to be excluded", wcmWorkflowsPresent); - } - - public void testWorkflowDefinitionGet() throws Exception - { - - // Get the latest definition for the adhoc-workflow - WorkflowDefinition wDef = workflowService.getDefinitionByName(getAdhocWorkflowDefinitionName()); - - String responseUrl = MessageFormat.format( - URL_WORKFLOW_DEFINITION, wDef.getId()); - - Response response = sendRequest(new GetRequest(responseUrl), Status.STATUS_OK); - JSONObject json = new JSONObject(response.getContentAsString()); - JSONObject workflowDefinitionJSON = json.getJSONObject("data"); - assertNotNull(workflowDefinitionJSON); - - // Check fields - assertTrue(workflowDefinitionJSON.has("id")); - assertTrue(workflowDefinitionJSON.getString("id").length() > 0); - - assertTrue(workflowDefinitionJSON.has("url")); - String url = workflowDefinitionJSON.getString("url"); - assertTrue(url.length() > 0); - assertTrue(url.startsWith("api/workflow-definitions/")); - - assertTrue(workflowDefinitionJSON.has("name")); - assertTrue(workflowDefinitionJSON.getString("name").length() > 0); - assertEquals(getAdhocWorkflowDefinitionName(), workflowDefinitionJSON.getString("name")); - - assertTrue(workflowDefinitionJSON.has("title")); - assertTrue(workflowDefinitionJSON.getString("title").length() > 0); - - assertTrue(workflowDefinitionJSON.has("description")); - assertTrue(workflowDefinitionJSON.getString("description").length() > 0); - - assertTrue(workflowDefinitionJSON.has("startTaskDefinitionUrl")); - String startTaskDefUrl = workflowDefinitionJSON.getString("startTaskDefinitionUrl"); - assertEquals(startTaskDefUrl, "api/classes/" - + getSafeDefinitionName(ADHOC_START_TASK_TYPE)); - - assertTrue(workflowDefinitionJSON.has("startTaskDefinitionType")); - assertEquals(ADHOC_START_TASK_TYPE, workflowDefinitionJSON.getString("startTaskDefinitionType")); - - // Check task-definitions - JSONArray taskDefinitions = workflowDefinitionJSON.getJSONArray("taskDefinitions"); - assertNotNull(taskDefinitions); - - // Two task definitions should be returned. Start-task is not included - assertEquals(2, taskDefinitions.length()); - - // Should be adhoc-task - JSONObject firstTaskDefinition = (JSONObject) taskDefinitions.get(0); - checkTaskDefinitionTypeAndUrl(ADHOC_TASK_TYPE, firstTaskDefinition); - - // Should be adhoc completed task - JSONObject secondTaskDefinition = (JSONObject) taskDefinitions.get(1); - checkTaskDefinitionTypeAndUrl(ADHOC_TASK_COMPLETED_TYPE, secondTaskDefinition); - } - - private void checkTaskDefinitionTypeAndUrl(String expectedTaskType, JSONObject taskDefinition) throws Exception - { - // Check type - assertTrue(taskDefinition.has("type")); - assertEquals(expectedTaskType, taskDefinition.getString("type")); - - // Check URL - assertTrue(taskDefinition.has("url")); - assertEquals("api/classes/" - + getSafeDefinitionName(expectedTaskType), taskDefinition.getString("url")); - } - - private String getSafeDefinitionName(String definitionName) { - return definitionName.replace(":", "_"); - } - - - public void testWorkflowInstanceGet() throws Exception - { - String startedWorkflowId = null; - - try - { - //Start workflow as USER1 and assign task to USER2. - personManager.setUser(USER1); - WorkflowDefinition adhocDef = workflowService.getDefinitionByName(getAdhocWorkflowDefinitionName()); - Map params = new HashMap(); - params.put(WorkflowModel.ASSOC_ASSIGNEE, personManager.get(USER2)); - Date dueDate = new Date(); - params.put(WorkflowModel.PROP_WORKFLOW_DUE_DATE, dueDate); - params.put(WorkflowModel.PROP_WORKFLOW_PRIORITY, 1); - params.put(WorkflowModel.ASSOC_PACKAGE, packageRef); - params.put(WorkflowModel.PROP_CONTEXT, packageRef); - - WorkflowPath adhocPath = workflowService.startWorkflow(adhocDef.getId(), params); - startedWorkflowId = adhocPath.getInstance().getId(); - WorkflowTask startTask = workflowService.getTasksForWorkflowPath(adhocPath.getId()).get(0); - startTask = workflowService.endTask(startTask.getId(), null); - - WorkflowInstance adhocInstance = startTask.getPath().getInstance(); - - Response response = sendRequest(new GetRequest(URL_WORKFLOW_INSTANCES + "/" + adhocInstance.getId() + "?includeTasks=true"), 200); - assertEquals(Status.STATUS_OK, response.getStatus()); - String jsonStr = response.getContentAsString(); - JSONObject json = new JSONObject(jsonStr); - JSONObject result = json.getJSONObject("data"); - assertNotNull(result); - - assertEquals(adhocInstance.getId(), result.getString("id")); - assertTrue(result.opt("message").equals(JSONObject.NULL)); - assertEquals(adhocInstance.getDefinition().getName(), result.getString("name")); - assertEquals(adhocInstance.getDefinition().getTitle(), result.getString("title")); - assertEquals(adhocInstance.getDefinition().getDescription(), result.getString("description")); - assertEquals(adhocInstance.isActive(), result.getBoolean("isActive")); - assertEquals(ISO8601DateFormat.format(adhocInstance.getStartDate()), result.getString("startDate")); - assertNotNull(result.getString("dueDate")); - assertNotNull(result.getString("endDate")); - assertEquals(1, result.getInt("priority")); - JSONObject initiator = result.getJSONObject("initiator"); - - assertEquals(USER1, initiator.getString("userName")); - assertEquals(personManager.getFirstName(USER1), initiator.getString("firstName")); - assertEquals(personManager.getLastName(USER1), initiator.getString("lastName")); - - assertEquals(adhocInstance.getContext().toString(), result.getString("context")); - assertEquals(adhocInstance.getWorkflowPackage().toString(), result.getString("package")); - assertNotNull(result.getString("startTaskInstanceId")); - - JSONObject jsonDefinition = result.getJSONObject("definition"); - WorkflowDefinition adhocDefinition = adhocInstance.getDefinition(); - - assertNotNull(jsonDefinition); - - assertEquals(adhocDefinition.getId(), jsonDefinition.getString("id")); - assertEquals(adhocDefinition.getName(), jsonDefinition.getString("name")); - assertEquals(adhocDefinition.getTitle(), jsonDefinition.getString("title")); - assertEquals(adhocDefinition.getDescription(), jsonDefinition.getString("description")); - assertEquals(adhocDefinition.getVersion(), jsonDefinition.getString("version")); - assertEquals(adhocDefinition.getStartTaskDefinition().getMetadata().getName().toPrefixString(namespaceService), jsonDefinition.getString("startTaskDefinitionType")); - assertTrue(jsonDefinition.has("taskDefinitions")); - - JSONArray tasks = result.getJSONArray("tasks"); - assertTrue(tasks.length() > 1); - } - finally - { - if(startedWorkflowId != null) - { - try { - // Cleanup - workflowService.deleteWorkflow(startedWorkflowId); - } - catch(Throwable t) - { - // Ignore exception while cleaning up - } - } - } - } - - public void testWorkflowInstancesGet() throws Exception - { - String startedWorkflowId = null; - try - { - //Start workflow as USER1 and assign task to USER2. - personManager.setUser(USER1); - WorkflowDefinition adhocDef = workflowService.getDefinitionByName(getAdhocWorkflowDefinitionName()); - Map params = new HashMap(); - params.put(WorkflowModel.ASSOC_ASSIGNEE, personManager.get(USER2)); - Date dueDate = new Date(); - params.put(WorkflowModel.PROP_WORKFLOW_DUE_DATE, dueDate); - params.put(WorkflowModel.PROP_WORKFLOW_PRIORITY, 1); - params.put(WorkflowModel.ASSOC_PACKAGE, packageRef); - params.put(WorkflowModel.PROP_CONTEXT, packageRef); - - WorkflowPath adhocPath = workflowService.startWorkflow(adhocDef.getId(), params); - startedWorkflowId = adhocPath.getInstance().getId(); - WorkflowTask startTask = workflowService.getTasksForWorkflowPath(adhocPath.getId()).get(0); - WorkflowInstance adhocInstance = startTask.getPath().getInstance(); - workflowService.endTask(startTask.getId(), null); - - // Get Workflow Instance Collection - Response response = sendRequest(new GetRequest(URL_WORKFLOW_INSTANCES), 200); - assertEquals(Status.STATUS_OK, response.getStatus()); - String jsonStr = response.getContentAsString(); - JSONObject json = new JSONObject(jsonStr); - JSONArray result = json.getJSONArray("data"); - assertNotNull(result); - - int totalItems = result.length(); - for (int i = 0; i < result.length(); i++) - { - checkSimpleWorkflowInstanceResponse(result.getJSONObject(i)); - } - - Response forDefinitionResponse = sendRequest(new GetRequest(MessageFormat.format(URL_WORKFLOW_INSTANCES_FOR_DEFINITION, adhocDef.getId())), 200); - assertEquals(Status.STATUS_OK, forDefinitionResponse.getStatus()); - String forDefinitionJsonStr = forDefinitionResponse.getContentAsString(); - JSONObject forDefinitionJson = new JSONObject(forDefinitionJsonStr); - JSONArray forDefinitionResult = forDefinitionJson.getJSONArray("data"); - assertNotNull(forDefinitionResult); - - for (int i = 0; i < forDefinitionResult.length(); i++) - { - checkSimpleWorkflowInstanceResponse(forDefinitionResult.getJSONObject(i)); - } - - // create a date an hour ago to test filtering - Calendar hourAgoCal = Calendar.getInstance(); - hourAgoCal.setTime(dueDate); - hourAgoCal.add(Calendar.HOUR_OF_DAY, -1); - Date anHourAgo = hourAgoCal.getTime(); - - Calendar hourLater = Calendar.getInstance(); - hourLater.setTime(dueDate); - hourLater.add(Calendar.HOUR_OF_DAY, 1); - Date anHourLater = hourLater.getTime(); - - // filter by initiator - checkFiltering(URL_WORKFLOW_INSTANCES + "?initiator=" + USER1); - - // filter by startedAfter - checkFiltering(URL_WORKFLOW_INSTANCES + "?startedAfter=" + ISO8601DateFormat.format(anHourAgo)); - - // filter by startedBefore - checkFiltering(URL_WORKFLOW_INSTANCES + "?startedBefore=" + ISO8601DateFormat.format(anHourLater)); - - // filter by dueAfter - checkFiltering(URL_WORKFLOW_INSTANCES + "?dueAfter=" + ISO8601DateFormat.format(anHourAgo)); - - // filter by dueBefore - checkFiltering(URL_WORKFLOW_INSTANCES + "?dueBefore=" + ISO8601DateFormat.format(anHourLater)); - - if (adhocInstance.getEndDate() != null) - { - // filter by completedAfter - checkFiltering(URL_WORKFLOW_INSTANCES + "?completedAfter=" + ISO8601DateFormat.format(adhocInstance.getEndDate())); - - // filter by completedBefore - checkFiltering(URL_WORKFLOW_INSTANCES + "?completedBefore=" + ISO8601DateFormat.format(adhocInstance.getEndDate())); - } - - // filter by priority - checkFiltering(URL_WORKFLOW_INSTANCES + "?priority=1"); - - // filter by state - checkFiltering(URL_WORKFLOW_INSTANCES + "?state=active"); - - // filter by definition name - checkFiltering(URL_WORKFLOW_INSTANCES + "?definitionName=" + getAdhocWorkflowDefinitionName()); - - // paging - int maxItems = 3; - for (int skipCount = 0; skipCount < totalItems; skipCount += maxItems) - { - checkPaging(URL_WORKFLOW_INSTANCES + "?maxItems=" + maxItems + "&skipCount=" + skipCount, totalItems, maxItems, skipCount); - } - - // check the exclude filtering - String exclude = getAdhocWorkflowDefinitionName(); - response = sendRequest(new GetRequest(URL_WORKFLOW_INSTANCES + "?exclude=" + exclude), 200); - assertEquals(Status.STATUS_OK, response.getStatus()); - jsonStr = response.getContentAsString(); - json = new JSONObject(jsonStr); - JSONArray results = json.getJSONArray("data"); - assertNotNull(results); - - boolean adhocWorkflowPresent = false; - for (int i = 0; i < results.length(); i++) - { - JSONObject workflowInstanceJSON = results.getJSONObject(i); - - String type = workflowInstanceJSON.getString("name"); - if (exclude.equals(type)) - { - adhocWorkflowPresent = true; - break; - } - } - assertFalse("Found adhoc workflows when they were supposed to be excluded", adhocWorkflowPresent); - - } - finally - { - if(startedWorkflowId != null) - { - try { - // Cleanup - workflowService.deleteWorkflow(startedWorkflowId); - } - catch(Throwable t) - { - // Ignore exception while cleaning up - } - } - } - } - - public void testWorkflowInstancesForNodeGet() throws Exception - { - //Start workflow as USER1 and assign task to USER2. - personManager.setUser(USER1); - WorkflowDefinition adhocDef = workflowService.getDefinitionByName(getAdhocWorkflowDefinitionName()); - Map params = new HashMap(); - params.put(WorkflowModel.ASSOC_ASSIGNEE, personManager.get(USER2)); - params.put(WorkflowModel.PROP_DUE_DATE, new Date()); - params.put(WorkflowModel.PROP_PRIORITY, 1); - params.put(WorkflowModel.ASSOC_PACKAGE, packageRef); - - nodeService.addChild(packageRef, contentNodeRef, - WorkflowModel.ASSOC_PACKAGE_CONTAINS, QName.createQName(NamespaceService.CONTENT_MODEL_1_0_URI, - QName.createValidLocalName((String)nodeService.getProperty( - contentNodeRef, ContentModel.PROP_NAME)))); - - WorkflowPath adhocPath = workflowService.startWorkflow(adhocDef.getId(), params); - - String url = MessageFormat.format(URL_WORKFLOW_INSTANCES_FOR_NODE, contentNodeRef.getStoreRef().getProtocol(), contentNodeRef.getStoreRef().getIdentifier(), contentNodeRef.getId()); - Response response = sendRequest(new GetRequest(url), 200); - - assertEquals(Status.STATUS_OK, response.getStatus()); - String jsonStr = response.getContentAsString(); - JSONObject json = new JSONObject(jsonStr); - JSONArray result = json.getJSONArray("data"); - assertNotNull(result); - - assertTrue(result.length() > 0); - - workflowService.cancelWorkflow(adhocPath.getInstance().getId()); - - Response afterCancelResponse = sendRequest(new GetRequest(url), 200); - - assertEquals(Status.STATUS_OK, afterCancelResponse.getStatus()); - String afterCancelJsonStr = afterCancelResponse.getContentAsString(); - JSONObject afterCancelJson = new JSONObject(afterCancelJsonStr); - JSONArray afterCancelResult = afterCancelJson.getJSONArray("data"); - assertNotNull(afterCancelResult); - - assertTrue(afterCancelResult.length() == 0); - } - - public void testWorkflowInstanceDelete() throws Exception - { - //Start workflow as USER1 and assign task to USER2. - personManager.setUser(USER1); - WorkflowDefinition adhocDef = workflowService.getDefinitionByName(getAdhocWorkflowDefinitionName()); - Map params = new HashMap(); - params.put(WorkflowModel.ASSOC_ASSIGNEE, personManager.get(USER2)); - Date dueDate = new Date(); - params.put(WorkflowModel.PROP_DUE_DATE, dueDate); - params.put(WorkflowModel.PROP_PRIORITY, 1); - params.put(WorkflowModel.ASSOC_PACKAGE, packageRef); - params.put(WorkflowModel.PROP_CONTEXT, packageRef); - - WorkflowPath adhocPath = workflowService.startWorkflow(adhocDef.getId(), params); - WorkflowTask startTask = workflowService.getTasksForWorkflowPath(adhocPath.getId()).get(0); - startTask = workflowService.endTask(startTask.getId(), null); - - WorkflowInstance adhocInstance = startTask.getPath().getInstance(); - - // attempt to delete workflow as a user that is not the initiator - personManager.setUser(USER3); - String instanceId = adhocInstance.getId(); - sendRequest(new DeleteRequest(URL_WORKFLOW_INSTANCES + "/" + instanceId), Status.STATUS_FORBIDDEN); - - // make sure workflow instance is still present - assertNotNull(workflowService.getWorkflowById(instanceId)); - - // now delete as initiator of workflow - personManager.setUser(USER1); - sendRequest(new DeleteRequest(URL_WORKFLOW_INSTANCES + "/" + instanceId), Status.STATUS_OK); - - WorkflowInstance instance = workflowService.getWorkflowById(instanceId); - if(instance!=null) - { - assertFalse("The deleted workflow is still active!", instance.isActive()); - } - - List instances = workflowService.getActiveWorkflows(adhocInstance.getDefinition().getId()); - for (WorkflowInstance activeInstance : instances) - { - assertFalse(instanceId.equals(activeInstance.getId())); - } - - // Try deleting an non-existent workflow instance, should result in 404 - sendRequest(new DeleteRequest(URL_WORKFLOW_INSTANCES + "/" + instanceId), Status.STATUS_NOT_FOUND); - } - - public void testReviewProcessFlow() throws Exception - { - // Approve path - runReviewFlow(true); - - // Create package again, since WF is deleteds - packageRef = workflowService.createPackage(null); - - // Reject path - runReviewFlow(false); - } - - public void testReviewPooledProcessFlow() throws Exception - { - // Approve path - runReviewPooledFlow(true); - - // Create package again, since WF is deleteds - packageRef = workflowService.createPackage(null); - - // Reject path - runReviewPooledFlow(false); - } - - protected void runReviewFlow(boolean approve) throws Exception - { - String startedWorkflowId = null; - try - { - // Start workflow as USER1 - personManager.setUser(USER1); - WorkflowDefinition reviewDef = workflowService.getDefinitionByName(getReviewWorkflowDefinitionName()); - Map params = new HashMap(); - // Reviewer is USER2 - params.put(WorkflowModel.ASSOC_ASSIGNEE, personManager.get(USER2)); - Date dueDate = new Date(); - params.put(WorkflowModel.PROP_DUE_DATE, dueDate); - params.put(WorkflowModel.PROP_PRIORITY, 1); - params.put(WorkflowModel.ASSOC_PACKAGE, packageRef); - params.put(WorkflowModel.PROP_CONTEXT, packageRef); - - WorkflowPath reviewPath = workflowService.startWorkflow(reviewDef.getId(), params); - startedWorkflowId = reviewPath.getInstance().getId(); - WorkflowTask startTask = workflowService.getTasksForWorkflowPath(reviewPath.getId()).get(0); - - // End start task - startTask = workflowService.endTask(startTask.getId(), null); - - // Check of task is available in list of reviewer, USER2 - personManager.setUser(USER2); - Response response = sendRequest(new GetRequest(MessageFormat.format(URL_USER_TASKS, USER2)), 200); - assertEquals(Status.STATUS_OK, response.getStatus()); - String jsonStr = response.getContentAsString(); - JSONObject json = new JSONObject(jsonStr); - JSONArray results = json.getJSONArray("data"); - assertNotNull(results); - assertEquals(1, results.length()); - - String taskId = results.getJSONObject(0).getString("id"); - - // Delegate approval/rejection to implementing engine-test - if(approve) - { - approveTask(taskId); - } - else - { - rejectTask(taskId); - } - - // 'Approved'/'Rejected' task should be available for initiator - personManager.setUser(USER1); - response = sendRequest(new GetRequest(MessageFormat.format(URL_USER_TASKS, USER1)), 200); - assertEquals(Status.STATUS_OK, response.getStatus()); - jsonStr = response.getContentAsString(); - json = new JSONObject(jsonStr); - results = json.getJSONArray("data"); - assertNotNull(results); - assertEquals(1, results.length()); - - // Correct task type check - String taskType = results.getJSONObject(0).getString("name"); - if(approve) - { - assertEquals("wf:approvedTask", taskType); - } - else - { - assertEquals("wf:rejectedTask", taskType); - } - } - finally - { - if(startedWorkflowId != null) - { - try { - // Cleanup - workflowService.deleteWorkflow(startedWorkflowId); - } - catch(Throwable t) - { - // Ignore exception while cleaning up - } - } - } - } - - protected void runReviewPooledFlow(boolean approve) throws Exception - { - String startedWorkflowId = null; - try - { - // Start workflow as USER1 - personManager.setUser(USER1); - WorkflowDefinition reviewDef = workflowService.getDefinitionByName(getReviewPooledWorkflowDefinitionName()); - Map params = new HashMap(); - - // Reviewer is group GROUP - params.put(WorkflowModel.ASSOC_GROUP_ASSIGNEE, groupManager.get(GROUP)); - Date dueDate = new Date(); - params.put(WorkflowModel.PROP_DUE_DATE, dueDate); - params.put(WorkflowModel.PROP_PRIORITY, 1); - params.put(WorkflowModel.ASSOC_PACKAGE, packageRef); - params.put(WorkflowModel.PROP_CONTEXT, packageRef); - - WorkflowPath reviewPath = workflowService.startWorkflow(reviewDef.getId(), params); - startedWorkflowId = reviewPath.getInstance().getId(); - - WorkflowTask startTask = workflowService.getTasksForWorkflowPath(reviewPath.getId()).get(0); - - // End start task - startTask = workflowService.endTask(startTask.getId(), null); - - // Check if task is NOT available in list USER3, not a member of the group - personManager.setUser(USER3); - Response response = sendRequest(new GetRequest(MessageFormat.format(URL_USER_TASKS, USER3)), 200); - assertEquals(Status.STATUS_OK, response.getStatus()); - String jsonStr = response.getContentAsString(); - JSONObject json = new JSONObject(jsonStr); - JSONArray results = json.getJSONArray("data"); - assertNotNull(results); - assertEquals(0, results.length()); - - // Check if task is available in list of reviewer, member of GROUP: USER2 - personManager.setUser(USER2); - response = sendRequest(new GetRequest(MessageFormat.format(URL_USER_TASKS, USER2)), 200); - assertEquals(Status.STATUS_OK, response.getStatus()); - jsonStr = response.getContentAsString(); - json = new JSONObject(jsonStr); - results = json.getJSONArray("data"); - assertNotNull(results); - assertEquals(1, results.length()); - - // Check if task is claimable and pooled - JSONObject taskJson = results.getJSONObject(0); - String taskId = taskJson.getString("id"); - assertTrue(taskJson.getBoolean("isClaimable")); - assertTrue(taskJson.getBoolean("isPooled")); - - // Claim task, using PUT, updating the owner - JSONObject properties = new JSONObject(); - properties.put(qnameToString(ContentModel.PROP_OWNER), USER2); - sendRequest(new PutRequest(URL_TASKS + "/" + taskId, properties.toString(), "application/json"), 200); - - // Check if task insn't claimable anymore - response = sendRequest(new GetRequest(MessageFormat.format(URL_USER_TASKS, USER2)), 200); - assertEquals(Status.STATUS_OK, response.getStatus()); - jsonStr = response.getContentAsString(); - json = new JSONObject(jsonStr); - results = json.getJSONArray("data"); - assertNotNull(results); - assertEquals(1, results.length()); - - taskJson = results.getJSONObject(0); - assertFalse(taskJson.getBoolean("isClaimable")); - assertTrue(taskJson.getBoolean("isPooled")); - - - // Delegate approval/rejection to implementing engine-test - if(approve) - { - approveTask(taskId); - } - else - { - rejectTask(taskId); - } - - // 'Approved'/'Rejected' task should be available for initiator - personManager.setUser(USER1); - response = sendRequest(new GetRequest(MessageFormat.format(URL_USER_TASKS, USER1)), 200); - assertEquals(Status.STATUS_OK, response.getStatus()); - jsonStr = response.getContentAsString(); - json = new JSONObject(jsonStr); - results = json.getJSONArray("data"); - assertNotNull(results); - assertEquals(1, results.length()); - - // Correct task type check - String taskType = results.getJSONObject(0).getString("name"); - if(approve) - { - assertEquals("wf:approvedTask", taskType); - } - else - { - assertEquals("wf:rejectedTask", taskType); - } - } - finally - { - if(startedWorkflowId != null) - { - try { - // Cleanup - workflowService.deleteWorkflow(startedWorkflowId); - } - catch(Throwable t) - { - // Ignore exception while cleaning up - } - } - } - - } - - protected abstract void approveTask(String taskId) throws Exception; - - protected abstract void rejectTask(String taskId) throws Exception; - - protected abstract String getAdhocWorkflowDefinitionName(); - - protected abstract String getReviewWorkflowDefinitionName(); - - protected abstract String getReviewPooledWorkflowDefinitionName(); - - @Override - protected void setUp() throws Exception - { - super.setUp(); - ApplicationContext appContext = getServer().getApplicationContext(); - - namespaceService = (NamespaceService) appContext.getBean("NamespaceService"); - workflowService = (WorkflowService) appContext.getBean("WorkflowService"); - MutableAuthenticationService authenticationService = (MutableAuthenticationService) appContext.getBean("AuthenticationService"); - PersonService personService = (PersonService) appContext.getBean("PersonService"); - SearchService searchService = (SearchService) appContext.getBean("SearchService"); - FileFolderService fileFolderService = (FileFolderService) appContext.getBean("FileFolderService"); - nodeService = (NodeService) appContext.getBean("NodeService"); - - AuthorityService authorityService = (AuthorityService) appContext.getBean("AuthorityService"); - personManager = new TestPersonManager(authenticationService, personService, nodeService); - groupManager = new TestGroupManager(authorityService, searchService); - - authenticationComponent = (AuthenticationComponent) appContext.getBean("authenticationComponent"); - - personManager.createPerson(USER1); - personManager.createPerson(USER2); - personManager.createPerson(USER3); - - authenticationComponent.setSystemUserAsCurrentUser(); - - groupManager.addUserToGroup(GROUP, USER2); - - packageRef = workflowService.createPackage(null); - - NodeRef companyHome = searchService.selectNodes(nodeService.getRootNode(StoreRef.STORE_REF_WORKSPACE_SPACESSTORE), COMPANY_HOME, null, namespaceService, false).get(0); - - contentNodeRef = fileFolderService.create(companyHome, TEST_CONTENT + System.currentTimeMillis(), ContentModel.TYPE_CONTENT).getNodeRef(); - - authenticationComponent.clearCurrentSecurityContext(); - } - - /* (non-Javadoc) - * @see junit.framework.TestCase#tearDown() - */ - @Override - protected void tearDown() throws Exception - { - super.tearDown(); - authenticationComponent.setSystemUserAsCurrentUser(); - groupManager.clearGroups(); - personManager.clearPeople(); - authenticationComponent.clearCurrentSecurityContext(); - } - - private String qnameToString(QName qName) - { - String separator = Character.toString(QName.NAMESPACE_PREFIX); - - return qName.toPrefixString(namespaceService).replaceFirst(separator, "_"); - } - - private void compareProperties(JSONObject before, JSONObject after) throws JSONException - { - for (String name : JSONObject.getNames(after)) - { - if (before.has(name)) - { - if (before.get(name) instanceof JSONArray) - { - for (int i = 0; i < before.getJSONArray(name).length(); i++) - { - assertEquals(before.getJSONArray(name).get(i), after.getJSONArray(name).get(i)); - } - } - else - { - assertEquals(before.get(name), after.get(name)); - } - } - } - } - - private void checkSimpleWorkflowInstanceResponse(JSONObject json) throws JSONException - { - assertTrue(json.has("id")); - assertTrue(json.getString("id").length() > 0); - - assertTrue(json.has("url")); - assertTrue(json.getString("url").startsWith(URL_WORKFLOW_INSTANCES)); - - assertTrue(json.has("name")); - assertTrue(json.getString("name").length() > 0); - - assertTrue(json.has("title")); - assertTrue(json.getString("title").length() > 0); - - assertTrue(json.has("description")); - assertTrue(json.getString("description").length() > 0); - - assertTrue(json.has("isActive")); - - assertTrue(json.has("startDate")); - assertTrue(json.getString("startDate").length() > 0); - - assertTrue(json.has("endDate")); - - assertTrue(json.has("initiator")); - Object initiator = json.get("initiator"); - if (!initiator.equals(JSONObject.NULL)) - { - assertTrue(((JSONObject) initiator).has("userName")); - assertTrue(((JSONObject) initiator).has("firstName")); - assertTrue(((JSONObject) initiator).has("lastName")); - } - - assertTrue(json.has("definitionUrl")); - assertTrue(json.getString("definitionUrl").startsWith(URL_WORKFLOW_DEFINITIONS)); - } - - private void checkPriorityFiltering(String url) throws Exception - { - JSONObject json = getDataFromRequest(url); - JSONArray result = json.getJSONArray("data"); - assertNotNull(result); - assertTrue(result.length() > 0); - - for(int i=0; i taskIds = Arrays.asList(ids); - JSONObject json = getDataFromRequest(url); - JSONArray result = json.getJSONArray("data"); - assertNotNull(result); - - ArrayList resultIds = new ArrayList(result.length()); - for(int i=0; i taskIds = Arrays.asList(ids); - JSONObject json = getDataFromRequest(url); - JSONArray result = json.getJSONArray("data"); - assertNotNull(result); - - ArrayList resultIds = new ArrayList(result.length()); - for(int i=0; i expectedProperties) throws Exception - { - JSONObject data = getDataFromRequest(MessageFormat.format(URL_USER_TASKS_PROPERTIES, USER2, propertiesParamValue)); - JSONArray taskArray = data.getJSONArray("data"); - assertEquals(1, taskArray.length()); - - JSONObject taskProperties = taskArray.getJSONObject(0).getJSONObject("properties"); - assertNotNull(taskProperties); - - int expectedNumberOfProperties = 0; - if(expectedProperties != null) - { - expectedNumberOfProperties = expectedProperties.size(); - } - // Check right number of properties - assertEquals(expectedNumberOfProperties, taskProperties.length()); - - // Check if all properties are present - if(expectedProperties != null) - { - for(String prop : expectedProperties) - { - assertTrue(taskProperties.has(prop)); - } - } - } - - private void checkFiltering(String url) throws Exception - { - JSONObject json = getDataFromRequest(url); - JSONArray result = json.getJSONArray("data"); - assertNotNull(result); - - assertTrue(result.length() > 0); - } - - private void checkPaging(String url, int totalItems, int maxItems, int skipCount) throws Exception - { - Response response = sendRequest(new GetRequest(url), 200); - - assertEquals(Status.STATUS_OK, response.getStatus()); - String jsonStr = response.getContentAsString(); - JSONObject json = new JSONObject(jsonStr); - - JSONArray data = json.getJSONArray("data"); - JSONObject paging = json.getJSONObject("paging"); - - assertNotNull(data); - assertNotNull(paging); - - assertTrue(data.length() >= 0); - assertTrue(data.length() <= maxItems); - - assertEquals(totalItems, paging.getInt("totalItems")); - assertEquals(maxItems, paging.getInt("maxItems")); - assertEquals(skipCount, paging.getInt("skipCount")); - } -}