1   
2   
3   
4   
5   
6   
7   
8   
9   
10  
11  
12  
13  
14  
15  
16  package org.kuali.rice.kew.actions;
17  
18  import org.junit.Test;
19  import org.kuali.rice.kew.actionitem.ActionItem;
20  import org.kuali.rice.kew.actionrequest.ActionRequestValue;
21  import org.kuali.rice.kew.api.WorkflowDocument;
22  import org.kuali.rice.kew.api.WorkflowDocumentFactory;
23  import org.kuali.rice.kew.api.action.ActionRequest;
24  import org.kuali.rice.kew.api.action.ActionRequestStatus;
25  import org.kuali.rice.kew.api.action.ActionRequestType;
26  import org.kuali.rice.kew.api.action.AdHocToPrincipal;
27  import org.kuali.rice.kew.api.exception.WorkflowException;
28  import org.kuali.rice.kew.service.KEWServiceLocator;
29  import org.kuali.rice.kew.test.KEWTestCase;
30  import org.kuali.rice.kew.test.TestUtilities;
31  import org.kuali.rice.kim.api.KimConstants;
32  import org.kuali.rice.kim.api.group.Group;
33  import org.kuali.rice.kim.api.identity.Person;
34  import org.kuali.rice.kim.api.services.KimApiServiceLocator;
35  import org.kuali.rice.test.BaselineTestCase;
36  
37  import java.util.ArrayList;
38  import java.util.Collection;
39  import java.util.Iterator;
40  import java.util.List;
41  
42  import static org.junit.Assert.*;
43  
44  @BaselineTestCase.BaselineMode(BaselineTestCase.Mode.NONE)
45  public class AdHocRouteTest extends KEWTestCase {
46  
47  	private static final String ADHOC_DOC = "AdhocRouteTest";
48  	private static final String ADHOC_NO_NODE_DOC = "AdHocNoNodeTest";
49      private static final String ADHOC_PRIORITY_PARALLEL_DOC = "AdhocRouteTest-PriorityParallel";
50  	private String docId;
51  
52      protected void loadTestData() throws Exception {
53          loadXmlFile("ActionsConfig.xml");
54      }
55  
56      @Test
57      public void testRequestLabel() throws Exception{
58      	String note = "test note";
59      	Person per = KimApiServiceLocator.getPersonService().getPersonByPrincipalName("rkirkend");
60      	WorkflowDocument doc = WorkflowDocumentFactory.createDocument(per.getPrincipalId(), ADHOC_DOC);
61  
62      	docId = doc.getDocumentId();
63  
64      	doc.adHocToPrincipal(ActionRequestType.FYI, "AdHoc", "annotation1", getPrincipalIdForName("dewey"), "respDesc1", false, note);
65  
66      	doc = getDocument(per.getPrincipalId(), docId);
67      	List<ActionRequestValue> actionRequests = KEWServiceLocator.getActionRequestService().findAllActionRequestsByDocumentId(docId);
68      	for(ActionRequestValue arv : actionRequests){
69      		assertTrue("The note we passed in should equal the one we get out. note=["+ note +"]", note.equals(arv.getRequestLabel()));
70      	}
71      }
72  
73  	@Test
74  	public void testParallelAdHocRouting() throws Exception {
75      	WorkflowDocument doc = WorkflowDocumentFactory.createDocument(getPrincipalIdForName("rkirkend"), ADHOC_DOC);
76      	docId = doc.getDocumentId();
77      	doc.adHocToPrincipal(ActionRequestType.APPROVE, "AdHoc", "annotation1", getPrincipalIdForName("dewey"), "respDesc1", false);
78  
79      	doc = getDocument("dewey");
80      	assertFalse("User andlee should not have an approve request yet.  Document not yet routed.", doc.isApprovalRequested());
81  
82      	doc.adHocToGroup(ActionRequestType.APPROVE, "AdHoc", "annotation2", getGroupIdForName(KimConstants.KIM_GROUP_WORKFLOW_NAMESPACE_CODE, "WorkflowAdmin"), "respDesc2", true);
83  
84      	doc = getDocument("quickstart");
85      	assertFalse("User should not have approve request yet.  Document not yet routed.", doc.isApprovalRequested());
86  
87      	doc = getDocument("rkirkend");
88      	doc.route("");
89  
90      	
91      	List<ActionRequest> actionRequests = doc.getRootActionRequests();
92      	for (ActionRequest actionRequest : actionRequests) {
93      		assertTrue("Request should be an adhoc request.", actionRequest.isAdHocRequest());
94      	}
95  
96      	
97      	WorkflowDocument deweyDoc = getDocument("dewey");
98      	assertTrue("Dewey should have an approve request", deweyDoc.isApprovalRequested());
99  
100 		doc = getDocument("ewestfal");
101 										
102     	assertTrue("WorkflowAdmin should have an approve request", doc.isApprovalRequested());
103 
104     	deweyDoc.approve("");
105     	doc.approve("");
106     	doc = getDocument("user1");
107     	doc.approve("");
108     	assertTrue("The document should be final", doc.isFinal());
109     }
110 
111     
112 
113 
114 
115 
116 
117 	@Test
118 	public void testAdHocToInitiator() throws Exception {
119         final String ADHOC_NODE = "AdHoc";
120         WorkflowDocument doc = WorkflowDocumentFactory.createDocument(getPrincipalIdForName("rkirkend"), ADHOC_DOC);
121         docId = doc.getDocumentId();
122         doc.adHocToPrincipal(ActionRequestType.APPROVE, ADHOC_NODE, "annotation1", getPrincipalIdForName("rkirkend"), "", true);
123 
124         doc.route("");
125         assertTrue(doc.isEnroute());
126 
127         doc = getDocument("rkirkend");
128         assertTrue("rkirkend should have an approval request on the document", doc.isApprovalRequested());
129         TestUtilities.assertAtNodeNew(doc, ADHOC_NODE);
130 
131         
132         doc = WorkflowDocumentFactory.createDocument(getPrincipalIdForName("rkirkend"), ADHOC_DOC);
133         docId = doc.getDocumentId();
134         doc.adHocToPrincipal(ActionRequestType.APPROVE, ADHOC_NODE, "annotation1", getPrincipalIdForName("rkirkend"), "", false);
135 
136         doc.route("");
137         assertTrue(doc.isEnroute());
138 
139         doc = getDocument("rkirkend");
140         assertFalse("rkirkend should NOT have an approval request on the document", doc.isApprovalRequested());
141         TestUtilities.assertAtNodeNew(doc, "One");
142         doc = getDocument("user1");
143         assertTrue("user1 should have an approval request on the document", doc.isApprovalRequested());
144     }
145 
146 	@Test
147 	public void testSerialAdHocRouting() throws Exception {
148     	WorkflowDocument doc = WorkflowDocumentFactory.createDocument(getPrincipalIdForName("rkirkend"), ADHOC_DOC);
149     	docId = doc.getDocumentId();
150     	doc.route("");
151     	doc = getDocument("user1");
152     	doc.adHocToPrincipal(ActionRequestType.APPROVE, "One", "annotation1", getPrincipalIdForName("user2"), "", false);
153     	doc.adHocToPrincipal(ActionRequestType.APPROVE, "One", "annotation1", getPrincipalIdForName("rkirkend"), "", true);
154     	doc.approve("");
155     	doc = getDocument("rkirkend");
156     	assertFalse("rkirkend should not have the document at this point 'S' activation", doc.isApprovalRequested());
157     	doc = getDocument("user2");
158     	assertTrue("user2 should have an approve request", doc.isApprovalRequested());
159     	doc.approve("");
160     	doc = getDocument("rkirkend");
161     	doc.approve("");
162     	assertTrue("The document should be final", doc.isFinal());
163     }
164 
165 	@Test
166     public void testRepeatedAdHocRouting() throws Exception {
167         final String ADHOC_NODE = "AdHoc";
168         WorkflowDocument doc = WorkflowDocumentFactory.createDocument(getPrincipalIdForName("rkirkend"), ADHOC_DOC);
169         docId = doc.getDocumentId();
170         doc.adHocToPrincipal(ActionRequestType.APPROVE, ADHOC_NODE, "annotation1", getPrincipalIdForName("user2"), "", false);
171         doc.route("");
172         doc = getDocument("rkirkend");
173         assertFalse("rkirkend should NOT have an approval request on the document", doc.isApprovalRequested());
174         
175         doc = getDocument("user1");
176         assertFalse("user1 should NOT have an approval request on the document", doc.isApprovalRequested());
177 
178         doc = getDocument("user2");
179         assertTrue("user2 should have an approval request on document", doc.isApprovalRequested());
180         doc.adHocToPrincipal(ActionRequestType.APPROVE, ADHOC_NODE, "annotation1", getPrincipalIdForName("user3"), "", false);
181         doc.approve("");
182         doc = getDocument("user2");
183         assertFalse("user2 should NOT have an approval request on the document", doc.isApprovalRequested());
184 
185         doc = getDocument("user3");
186         assertTrue("user3 should have an approval request on document", doc.isApprovalRequested());
187         doc.adHocToPrincipal(ActionRequestType.APPROVE, ADHOC_NODE, "annotation1", getPrincipalIdForName("rkirkend"), "", true);
188         doc.approve("");
189         doc = getDocument("user3");
190         assertFalse("user3 should NOT have an approval request on the document", doc.isApprovalRequested());
191 
192         doc = getDocument("rkirkend");
193         assertTrue("rkirkend should have an approval request on document", doc.isApprovalRequested());
194         doc.approve("");
195         doc = getDocument("rkirkend");
196         assertFalse("rkirkend should NOT have an approval request on the document", doc.isApprovalRequested());
197 
198         
199         doc = getDocument("user1");
200         assertTrue("user1 should have an approval request on document", doc.isApprovalRequested());
201         doc.approve("");
202         doc = getDocument("user1");
203         assertFalse("user1 should NOT have an approval request on the document", doc.isApprovalRequested());
204 
205         
206         doc = getDocument("rkirkend");
207         assertFalse("rkirkend should NOT have an approval request on the document", doc.isApprovalRequested());
208         doc = getDocument("user2");
209         assertFalse("user2 should NOT have an approval request on the document", doc.isApprovalRequested());
210         doc = getDocument("user3");
211         assertFalse("user3 should NOT have an approval request on the document", doc.isApprovalRequested());
212 
213         assertTrue("The document should be final", doc.isFinal());
214     }
215 
216     @Test public void testAdHocWhenDocumentIsInitiated() throws Exception {
217     	WorkflowDocument document = WorkflowDocumentFactory.createDocument(getPrincipalIdForName("ewestfal"), "TakeWorkgroupAuthorityDoc");
218         document.saveDocumentData();
219         assertTrue(document.isInitiated());
220 
221         document.adHocToPrincipal(ActionRequestType.APPROVE, "My Annotation", getPrincipalIdForName("rkirkend"), "", true);
222         document.adHocToPrincipal(ActionRequestType.FYI, "My Annotation", getPrincipalIdForName("user1"), "", true);
223 
224         
225         document = WorkflowDocumentFactory.loadDocument(getPrincipalIdForName("rkirkend"), document.getDocumentId());
226         assertFalse(document.isApprovalRequested());
227         document = WorkflowDocumentFactory.loadDocument(getPrincipalIdForName("user1"), document.getDocumentId());
228         assertFalse(document.isFYIRequested());
229 
230         
231         document = WorkflowDocumentFactory.loadDocument(getPrincipalIdForName("ewestfal"), document.getDocumentId());
232         document.route("");
233         document = WorkflowDocumentFactory.loadDocument(getPrincipalIdForName("rkirkend"), document.getDocumentId());
234         assertTrue(document.isApprovalRequested());
235         document = WorkflowDocumentFactory.loadDocument(getPrincipalIdForName("user1"), document.getDocumentId());
236         assertTrue(document.isFYIRequested());
237     }
238 
239     @Test public void testAdHocWhenDocumentIsFinal() throws Exception {
240         WorkflowDocument document = WorkflowDocumentFactory.createDocument(getPrincipalIdForName("ewestfal"), "TakeWorkgroupAuthorityDoc");
241         document.route("");
242         TestUtilities.assertAtNodeNew(document, "WorkgroupByDocument");
243 
244         try {
245         	document.adHocToPrincipal(ActionRequestType.APPROVE, "AdHoc", "", getPrincipalIdForName("ewestfal"), "", true);
246         	fail("document should not be allowed to route to nodes that are complete");
247 		} catch (Exception e) {
248 		}
249 
250 
251         document = WorkflowDocumentFactory.loadDocument(getPrincipalIdForName("rkirkend"), document.getDocumentId());
252         assertTrue("rkirkend should have request", document.isApprovalRequested());
253         document.approve("");
254 
255         assertTrue("Document should be final", document.isFinal());
256 
257         document = WorkflowDocumentFactory.loadDocument(getPrincipalIdForName("user1"), document.getDocumentId());
258         List<ActionRequest> requests = document.getRootActionRequests();
259         for (ActionRequest request : requests) {
260 			if (request.isActivated()) {
261 				fail("Active requests should not be present on a final document");
262 			}
263 		}
264 
265         
266         try {
267         	document.adHocToPrincipal(ActionRequestType.APPROVE, "WorkgroupByDocument", "", getPrincipalIdForName("ewestfal"), "", true);
268         	fail("Should not be allowed to adhoc approve to a final document.");
269         } catch (Exception e) {
270 
271         }
272 
273         
274         document = WorkflowDocumentFactory.loadDocument(getPrincipalIdForName("rkirkend"), document.getDocumentId());
275         assertFalse("rkirkend should not have an FYI request.", document.isFYIRequested());
276     	document.adHocToPrincipal(ActionRequestType.FYI, "WorkgroupByDocument", "", getPrincipalIdForName("rkirkend"), "", true);
277     	document = WorkflowDocumentFactory.loadDocument(getPrincipalIdForName("rkirkend"), document.getDocumentId());
278     	assertTrue("rkirkend should have an FYI request", document.isFYIRequested());
279     }
280 
281     @Test public void testAdHocWhenDocumentIsSaved() throws Exception {
282     	WorkflowDocument document = WorkflowDocumentFactory.createDocument(getPrincipalIdForName("ewestfal"), "TakeWorkgroupAuthorityDoc");
283         document.saveDocument("");
284 
285         
286 
287         assertTrue("Document should be saved.", document.isSaved());
288     	document.adHocToPrincipal(ActionRequestType.FYI, "AdHoc", "", getPrincipalIdForName("rkirkend"), "", true);
289     	document = WorkflowDocumentFactory.loadDocument(getPrincipalIdForName("rkirkend"), document.getDocumentId());
290     	assertTrue("rkirkend should have an FYI request", document.isFYIRequested());
291     }
292 
293     @Test public void testAdHocFieldsSavedCorrectly() throws Exception  {
294     	WorkflowDocument doc = WorkflowDocumentFactory.createDocument(getPrincipalIdForName("rkirkend"), ADHOC_DOC);
295     	docId = doc.getDocumentId();
296     	doc.route("");
297     	
298     	List<String> oldRequestIds = new ArrayList<String>();
299         for (Iterator iterator = KEWServiceLocator.getActionRequestService().findAllActionRequestsByDocumentId(doc.getDocumentId()).iterator(); iterator.hasNext();) {
300             oldRequestIds.add(((ActionRequestValue) iterator.next()).getActionRequestId());
301         }
302 
303         
304         doc = getDocument("user1");
305     	doc.adHocToPrincipal(ActionRequestType.APPROVE, "One", "annotation1", getPrincipalIdForName("user2"), "respDesc", false);
306 
307     	
308     	ActionRequestValue request = null;
309     	for (Iterator iter = KEWServiceLocator.getActionRequestService().findAllActionRequestsByDocumentId(doc.getDocumentId()).iterator(); iter.hasNext();) {
310             ActionRequestValue actionRequest = (ActionRequestValue) iter.next();
311             if (!oldRequestIds.contains(actionRequest.getActionRequestId())) {
312                 request = actionRequest;
313                 break;
314             }
315         }
316     	assertNotNull("Could not find adhoc routed action request", request);
317 
318     	
319         assertEquals("wrong person", request.getPrincipalId(), getPrincipalIdForName("user2"));
320     	assertEquals("annotation incorrect", "annotation1", request.getAnnotation());
321     	assertEquals("action requested code incorrect", request.getActionRequested(), ActionRequestType.APPROVE.getCode());
322     	assertEquals("responsibility desc incorrect", request.getResponsibilityDesc(), "respDesc");
323     	assertEquals("wrong force action", request.getForceAction(), Boolean.FALSE);
324 
325     }
326 
327 	@Test
328 	public void testAdHocDissaprovedDocument() throws Exception {
329     	WorkflowDocument doc = WorkflowDocumentFactory.createDocument(getPrincipalIdForName("ewestfal"), ADHOC_DOC);
330     	docId = doc.getDocumentId();
331     	doc.route("");
332 
333     	doc = getDocument("user1");
334     	TestUtilities.assertAtNodeNew(doc, "One");
335     	doc.disapprove("");
336     	TestUtilities.assertAtNodeNew(doc, "One");
337     	
338 
339     	doc.adHocToPrincipal(ActionRequestType.FYI, "One", "", getPrincipalIdForName("rkirkend"), "", true);
340     	doc.adHocToPrincipal(ActionRequestType.ACKNOWLEDGE, "One", "", getPrincipalIdForName("user2"), "", true);
341 
342     	doc = getDocument("rkirkend");
343     	assertTrue(doc.isFYIRequested());
344     	doc.fyi();
345     	doc = getDocument("user2");
346     	assertTrue(doc.isAcknowledgeRequested());
347     	doc.acknowledge("");
348 
349     	
350     	doc = WorkflowDocumentFactory.createDocument(getPrincipalIdForName("rkirkend"), ADHOC_DOC);
351     	docId = doc.getDocumentId();
352     	doc.route("");
353 
354     	doc = getDocument("user1");
355     	doc.disapprove("");
356 
357     	
358     	try {
359     		doc.adHocToPrincipal(ActionRequestType.APPROVE, "One", "", getPrincipalIdForName("rkirkend"), "", true);
360     		fail("should have thrown exception cant adhoc approvals on dissaproved documents");
361     	} catch (Exception e) {
362 
363     	}
364 
365     	
366     	try {
367     		doc.adHocToPrincipal(ActionRequestType.COMPLETE, "One", "", getPrincipalIdForName("rkirkend"), "", true);
368     		fail("should have thrown exception cant ad hoc completes on dissaproved documents");
369     	} catch (Exception e) {
370 
371     	}
372 
373         
374         try {
375             doc.adHocToPrincipal(ActionRequestType.ACKNOWLEDGE, "", getPrincipalIdForName("user1"), "", true);
376         } catch (Exception e) {
377             e.printStackTrace();
378             fail("should have thrown exception cant ad hoc completes on dissaproved documents");
379     }
380 
381         
382         try {
383             doc.adHocToPrincipal(ActionRequestType.FYI, "", getPrincipalIdForName("user1"), "", true);
384         } catch (Exception e) {
385             e.printStackTrace();
386             fail("should have thrown exception cant ad hoc completes on dissaproved documents");
387         }
388 
389     }
390 
391     
392 
393 
394 
395 	@Test
396 	public void testAdHocNoNodeName() throws Exception {
397     	WorkflowDocument doc = WorkflowDocumentFactory.createDocument(getPrincipalIdForName("user1"), ADHOC_DOC);
398     	docId = doc.getDocumentId();
399 
400 		
401 		
402 
403     	doc.adHocToPrincipal(ActionRequestType.APPROVE, "", getPrincipalIdForName("jitrue"), "", false);
404     	doc.adHocToGroup(ActionRequestType.APPROVE, "", getGroupIdForName(KimConstants.KIM_GROUP_WORKFLOW_NAMESPACE_CODE, "NonSIT"), "", false);
405     	doc.route("");
406 
407 		
408 		
409     	doc = getDocument("user1");
410     	assertFalse(doc.isApprovalRequested());
411     	doc = getDocument("jitrue");
412     	assertTrue(doc.isApprovalRequested());
413 		
414 		
415     	TestUtilities.assertAtNodeNew(doc, "AdHoc");
416 
417     	
418     	doc = getDocument("jitrue");
419     	TestUtilities.assertAtNodeNew(doc, "AdHoc");
420     	doc.disapprove("");
421     	
422     	TestUtilities.assertAtNodeNew(doc, "AdHoc");
423     	assertTrue(doc.isDisapproved());
424     	
425 
426     	doc.adHocToPrincipal(ActionRequestType.FYI, "", getPrincipalIdForName("rkirkend"), "", true);
427     	doc.adHocToPrincipal(ActionRequestType.ACKNOWLEDGE, "", getPrincipalIdForName("user2"), "", true);
428 
429     	doc.adHocToGroup(ActionRequestType.ACKNOWLEDGE, "", getGroupIdForName(KimConstants.KIM_GROUP_WORKFLOW_NAMESPACE_CODE, "NonSIT"), "", true);
430 
431     	
432     	doc = getDocument("rkirkend");
433     	assertTrue(doc.isFYIRequested());
434     	doc.fyi();
435 
436 		
437 		
438     	doc = getDocument("user3");
439     	assertTrue(doc.isAcknowledgeRequested());
440 
441 		
442 		
443     	doc = getDocument("user2");
444     	assertTrue(doc.isAcknowledgeRequested());
445     	doc.acknowledge("");
446 
447 		
448 		
449     	doc = getDocument("user3");
450     	assertFalse(doc.isAcknowledgeRequested());
451 
452 		
453 		
454     	doc = getDocument("user1");
455     	assertTrue(doc.isAcknowledgeRequested());
456     	doc.acknowledge("");
457 
458     	
459     	TestUtilities.assertNumberOfPendingRequests(doc.getDocumentId(), 0);
460 
461 		
462 		
463     	try {
464     		doc.adHocToPrincipal(ActionRequestType.APPROVE, "", getPrincipalIdForName("rkirkend"), "", true);
465     		fail("should have thrown exception cant adhoc approvals on dissaproved documents");
466 		} catch (Exception e) {
467 		}
468     	
469     	try {
470     		doc.adHocToPrincipal(ActionRequestType.COMPLETE, "", getPrincipalIdForName("rkirkend"), "", true);
471     		fail("should have thrown exception cant ad hoc completes on dissaproved documents");
472 		} catch (Exception e) {
473 		}
474 
475     }
476 	
477 	@Test
478 	public void testAdHocWithRequestLabel_ToPrincipal() throws Exception {
479 		WorkflowDocument doc = WorkflowDocumentFactory.createDocument(getPrincipalIdForName("user1"), ADHOC_DOC);
480 		String label = "MY PRINCIPAL LABEL";
481 		doc.adHocToPrincipal(ActionRequestType.APPROVE, null, "", getPrincipalIdForName("ewestfal"), "", true, label);
482 		
483 		List<ActionRequestValue> actionRequests = KEWServiceLocator.getActionRequestService().findPendingRootRequestsByDocId(doc.getDocumentId());
484 		assertEquals("Shoudl have 1 request.", 1, actionRequests.size());
485 		ActionRequestValue actionRequest = actionRequests.get(0);
486 		assertEquals("Should be an approve request", ActionRequestType.APPROVE.getCode(), actionRequest.getActionRequested());
487 		assertEquals("Invalid request label", label, actionRequest.getRequestLabel());
488 		assertEquals("Request should be initialized", ActionRequestStatus.INITIALIZED.getCode(), actionRequest.getStatus());
489 		
490 		
491 		doc.route("");
492 		
493 		Collection<ActionItem> actionItems = KEWServiceLocator.getActionListService().getActionListForSingleDocument(doc.getDocumentId());
494 		assertEquals("Should have 1 action item.", 1, actionItems.size());
495 		ActionItem actionItem = actionItems.iterator().next();
496 		assertEquals("ActionItem should be constructed from request.", actionRequest.getActionRequestId(), actionItem.getActionRequestId());
497 		assertEquals("ActionItem should have same label", label, actionItem.getRequestLabel());
498 	}
499 
500 	@Test
501 	public void testAdHocWithRequestLabel_ToGroup() throws Exception {
502 		WorkflowDocument doc = WorkflowDocumentFactory.createDocument(getPrincipalIdForName("user1"), ADHOC_DOC);
503 		String label = "MY GROUP LABEL";
504 		Group workflowAdmin = KEWServiceLocator.getIdentityHelperService().getGroupByName("KR-WKFLW", "WorkflowAdmin");
505 		doc.adHocToGroup(ActionRequestType.APPROVE, null, "", workflowAdmin.getId(), "", true, label);
506 		
507 		List<ActionRequestValue> actionRequests = KEWServiceLocator.getActionRequestService().findPendingRootRequestsByDocId(doc.getDocumentId());
508 		assertEquals("Should have 1 request.", 1, actionRequests.size());
509 		ActionRequestValue actionRequest = actionRequests.get(0);
510 		assertEquals("Should be an approve request", ActionRequestType.APPROVE.getCode(), actionRequest.getActionRequested());
511 		assertEquals("Invalid request label", label, actionRequest.getRequestLabel());
512 		assertEquals("Request should be initialized", ActionRequestStatus.INITIALIZED.getCode(), actionRequest.getStatus());
513 		
514 		
515 		doc.route("");
516 		
517 		Collection<ActionItem> actionItems = KEWServiceLocator.getActionListService().getActionListForSingleDocument(doc.getDocumentId());
518 		assertTrue("Should have more than 1 action item.", actionItems.size() > 1);
519 		for (ActionItem actionItem : actionItems) {
520 			assertEquals("ActionItem should be constructed from request.", actionRequest.getActionRequestId(), actionItem.getActionRequestId());
521 			assertEquals("ActionItem should have same label", label, actionItem.getRequestLabel());
522 		}
523 	}
524 
525 	   @Test
526 	    public void testAdHocWithNoNodes() throws Exception {
527 	        WorkflowDocument doc = WorkflowDocumentFactory.createDocument(getPrincipalIdForName("user1"), ADHOC_NO_NODE_DOC);
528 	        String label = "MY PRINCIPAL LABEL";
529 	        
530 	        
531 	        doc.adHocToPrincipal(ActionRequestType.FYI, null, "", getPrincipalIdForName("ewestfal"), "", true, label);
532 	        
533 	        List<ActionRequestValue> actionRequests = KEWServiceLocator.getActionRequestService().findPendingRootRequestsByDocId(doc.getDocumentId());
534 	        assertEquals("Should have 1 request.", 1, actionRequests.size());
535 	        ActionRequestValue actionRequest = actionRequests.get(0);
536 	        assertEquals("Should be a FYI request", ActionRequestType.FYI.getCode(), actionRequest.getActionRequested());
537 	        assertEquals("Invalid request label", label, actionRequest.getRequestLabel());
538 	        assertEquals("Request should be initialized", ActionRequestStatus.INITIALIZED.getCode(), actionRequest.getStatus());
539 	        
540 	        
541 	        doc.route("");
542 	        
543 	        Collection<ActionItem> actionItems = KEWServiceLocator.getActionListService().getActionListForSingleDocument(doc.getDocumentId());
544 	        assertEquals("Should have 0 action item.", 0, actionItems.size());
545 	        
546 	        
547 	        
548 	    }
549 
550     
551 
552 
553     @Test
554     public void testAdHocWithPriorityParallelActivation() throws Exception {
555         String user1 = getPrincipalIdForName("user1");
556         String user2 = getPrincipalIdForName("user2");
557         String user3 = getPrincipalIdForName("user3");
558         String testuser1 = getPrincipalIdForName("testuser1");
559         String testuser2 = getPrincipalIdForName("testuser2");
560         String testuser3 = getPrincipalIdForName("testuser3");
561 
562         WorkflowDocument document = WorkflowDocumentFactory.createDocument(user1, ADHOC_PRIORITY_PARALLEL_DOC);
563 
564         
565         
566         
567         
568         
569         
570         
571         
572         
573         AdHocToPrincipal.Builder adHocToPrincipal = AdHocToPrincipal.Builder.create(ActionRequestType.ACKNOWLEDGE, null, user2);
574         adHocToPrincipal.setPriority(1);
575         document.adHocToPrincipal(adHocToPrincipal.build(), "");
576 
577         adHocToPrincipal.setPriority(2);
578         adHocToPrincipal.setActionRequested(ActionRequestType.APPROVE);
579         adHocToPrincipal.setTargetPrincipalId(user3);
580         document.adHocToPrincipal(adHocToPrincipal.build(), "");
581 
582         adHocToPrincipal.setTargetPrincipalId(testuser1);
583         document.adHocToPrincipal(adHocToPrincipal.build(), "");
584 
585         adHocToPrincipal.setActionRequested(ActionRequestType.ACKNOWLEDGE);
586         adHocToPrincipal.setTargetPrincipalId(testuser2);
587         document.adHocToPrincipal(adHocToPrincipal.build(), "");
588 
589         adHocToPrincipal.setPriority(3);
590         adHocToPrincipal.setActionRequested(ActionRequestType.FYI);
591         adHocToPrincipal.setTargetPrincipalId(testuser3);
592         document.adHocToPrincipal(adHocToPrincipal.build(), "");
593 
594         
595         document.route("");
596         assertTrue(document.isEnroute());
597 
598         
599         List<ActionRequest> rootActionRequests = document.getRootActionRequests();
600         assertEquals("Should have 5 root action requests", 5, rootActionRequests.size());
601         ActionRequest user2Request = null;
602         ActionRequest user3Request = null;
603         ActionRequest testuser1Request = null;
604         ActionRequest testuser2Request = null;
605         ActionRequest testuser3Request = null;
606         for (ActionRequest actionRequest : rootActionRequests) {
607             if (user2.equals(actionRequest.getPrincipalId())) {
608                 user2Request = actionRequest;
609             } else if (user3.equals(actionRequest.getPrincipalId())) {
610                 user3Request = actionRequest;
611             } else if (testuser1.equals(actionRequest.getPrincipalId())) {
612                 testuser1Request = actionRequest;
613             } else if (testuser2.equals(actionRequest.getPrincipalId())) {
614                 testuser2Request = actionRequest;
615             } else if (testuser3.equals(actionRequest.getPrincipalId())) {
616                 testuser3Request = actionRequest;
617             }
618         }
619         
620         assertNotNull(user2Request);
621         assertEquals(ActionRequestStatus.ACTIVATED, user2Request.getStatus());
622         assertNotNull(user3Request);
623         assertEquals(ActionRequestStatus.ACTIVATED, user3Request.getStatus());
624         assertNotNull(testuser1Request);
625         assertEquals(ActionRequestStatus.ACTIVATED, testuser1Request.getStatus());
626         assertNotNull(testuser2Request);
627         assertEquals(ActionRequestStatus.ACTIVATED, testuser2Request.getStatus());
628         assertNotNull(testuser3Request);
629         assertEquals(ActionRequestStatus.INITIALIZED, testuser3Request.getStatus());
630 
631         
632         document.switchPrincipal(user3);
633         assertTrue(document.isApprovalRequested());
634         document.approve("");
635         assertTrue(document.isEnroute());
636 
637         
638         document.switchPrincipal(testuser3);
639         assertFalse(document.isFYIRequested());
640 
641         
642         document.switchPrincipal(testuser1);
643         assertTrue(document.isApprovalRequested());
644         document.approve("");
645 
646         
647         assertTrue(document.isProcessed());
648 
649         
650         document.switchPrincipal(testuser3);
651         assertTrue(document.isFYIRequested());
652         document.fyi();
653 
654         
655         assertTrue(document.isProcessed());
656         document.switchPrincipal(user2);
657         assertTrue(document.isAcknowledgeRequested());
658         document.acknowledge("");
659         assertTrue(document.isProcessed());
660         document.switchPrincipal(testuser2);
661         assertTrue(document.isAcknowledgeRequested());
662         document.acknowledge("");
663 
664         
665         assertTrue(document.isFinal());
666     }
667 
668 	
669     private WorkflowDocument getDocument(String netid) throws WorkflowException {
670     	return WorkflowDocumentFactory.loadDocument(getPrincipalIdForName(netid), docId);
671     }
672     private WorkflowDocument getDocument(String principalId, String docId) throws WorkflowException {
673     	return WorkflowDocumentFactory.loadDocument(principalId, docId);
674     }
675 
676 }