001 /**
002 * Copyright 2005-2011 The Kuali Foundation
003 *
004 * Licensed under the Educational Community License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 * http://www.opensource.org/licenses/ecl2.php
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 * See the License for the specific language governing permissions and
014 * limitations under the License.
015 */
016 package org.kuali.rice.kew.actionrequest;
017
018
019 import static org.junit.Assert.assertEquals;
020 import static org.junit.Assert.assertFalse;
021 import static org.junit.Assert.assertTrue;
022
023 import java.util.HashSet;
024 import java.util.List;
025 import java.util.Set;
026
027 import org.junit.Test;
028 import org.kuali.rice.kew.api.document.DocumentRefreshQueue;
029 import org.kuali.rice.kew.api.WorkflowDocument;
030 import org.kuali.rice.kew.api.WorkflowDocumentFactory;
031 import org.kuali.rice.kew.api.action.ActionRequest;
032 import org.kuali.rice.kew.messaging.MessageServiceNames;
033 import org.kuali.rice.kew.routeheader.DocumentRouteHeaderValue;
034 import org.kuali.rice.kew.service.KEWServiceLocator;
035 import org.kuali.rice.kew.test.KEWTestCase;
036
037 /**
038 * Tests the reference implementation of the {@link DocumentRefreshQueue}.
039 *
040 * @author Kuali Rice Team (rice.collab@kuali.org)
041 */
042 public class DocumentRefreshQueueTest extends KEWTestCase {
043
044 protected void loadTestData() throws Exception {
045 loadXmlFile("ActionRequestsConfig.xml");
046 }
047
048 @Test public void testDocumentRequeueSingleNode() throws Exception {
049 WorkflowDocument document = WorkflowDocumentFactory.createDocument(getPrincipalIdForName("ewestfal"), SeqSetup.DOCUMENT_TYPE_NAME);
050 document.route("");
051 document = WorkflowDocumentFactory.loadDocument(getPrincipalIdForName("ewestfal"), document.getDocumentId());
052 assertTrue(document.isEnroute());
053 List<ActionRequest> requests = document.getRootActionRequests();
054 assertEquals("Should be 2 requests.", 2, requests.size());
055 // save off request ids
056
057 Set<String> requestIds = new HashSet<String>();
058 for (ActionRequest request : requests) {
059 requestIds.add(request.getId());
060 }
061
062 DocumentRouteHeaderValue documentH = KEWServiceLocator.getRouteHeaderService().getRouteHeader(document.getDocumentId());
063 DocumentRefreshQueue documentRequeuer = MessageServiceNames.getDocumentRequeuerService(documentH.getDocumentType().getApplicationId(), documentH.getDocumentId(), 0);
064 documentRequeuer.refreshDocument(document.getDocumentId());
065
066 document = WorkflowDocumentFactory.loadDocument(getPrincipalIdForName("bmcgough"), document.getDocumentId());
067 assertTrue(document.isEnroute());
068 requests = document.getRootActionRequests();
069 assertEquals("Should be 2 requests.", 2, requests.size());
070 for (ActionRequest requestVO : requests) {
071 assertTrue("Request ids should be different.", !requestIds.contains(requestVO.getId()));
072 }
073 assertTrue(document.isApprovalRequested());
074 document.approve("");
075
076 // now there should just be a pending request to ryan, let's requeue again, because of force action = false we should still
077 // have only one pending request to ryan
078 documentRequeuer.refreshDocument(document.getDocumentId());
079 document = WorkflowDocumentFactory.loadDocument(getPrincipalIdForName("rkirkend"), document.getDocumentId());
080 assertTrue(document.isEnroute());
081 requests = document.getRootActionRequests();
082 assertEquals("Should be 2 requests.", 2, requests.size());
083 // there should only be one pending request to rkirkend
084 boolean pendingToRkirkend = false;
085 for (ActionRequest requestVO : requests)
086 {
087 if (requestVO.getPrincipalId().equals(getPrincipalIdForName("rkirkend")) && requestVO.isActivated())
088 {
089 assertFalse("rkirkend has too many requests!", pendingToRkirkend);
090 pendingToRkirkend = true;
091 } else
092 {
093 assertTrue("previous request to all others should be done.", requestVO.isDone());
094 }
095 }
096 assertTrue(document.isApprovalRequested());
097 }
098
099 private class SeqSetup {
100 public static final String DOCUMENT_TYPE_NAME = "DRSeqDocType";
101 public static final String ADHOC_NODE = "AdHoc";
102 public static final String WORKFLOW_DOCUMENT_NODE = "WorkflowDocument";
103 public static final String WORKFLOW_DOCUMENT_2_NODE = "WorkflowDocument2";
104 }
105
106 }