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.actions;
017
018 import static org.junit.Assert.assertEquals;
019 import static org.junit.Assert.assertFalse;
020 import static org.junit.Assert.assertTrue;
021 import mocks.MockEmailNotificationService;
022
023 import org.junit.Ignore;
024 import org.junit.Test;
025 import org.kuali.rice.kew.actions.BlanketApproveTest.NotifySetup;
026 import org.kuali.rice.kew.api.WorkflowDocument;
027 import org.kuali.rice.kew.api.WorkflowDocumentFactory;
028 import org.kuali.rice.kew.api.exception.WorkflowException;
029 import org.kuali.rice.kew.service.KEWServiceLocator;
030 import org.kuali.rice.kew.test.KEWTestCase;
031 import org.kuali.rice.kew.test.TestUtilities;
032 import org.kuali.rice.kew.api.KewApiConstants;
033
034 public class DisapproveActionTest extends KEWTestCase {
035
036 protected void loadTestData() throws Exception {
037 loadXmlFile("ActionsConfig.xml");
038 }
039
040 @Test public void testDisapprove() throws Exception {
041 WorkflowDocument document = WorkflowDocumentFactory.createDocument(getPrincipalIdForName("ewestfal"), NotifySetup.DOCUMENT_TYPE_NAME);
042 document.route("");
043
044 document = WorkflowDocumentFactory.loadDocument(getPrincipalIdForName("jhopf"), document.getDocumentId());
045 assertTrue("This user should have an approve request", document.isApprovalRequested());
046 document.approve("");
047
048 document = WorkflowDocumentFactory.loadDocument(getPrincipalIdForName("ewestfal"), document.getDocumentId());
049 assertTrue("This user should have an approve request", document.isApprovalRequested());
050 document.approve("");//ewestfal had force action rule
051
052 document = WorkflowDocumentFactory.loadDocument(getPrincipalIdForName("rkirkend"), document.getDocumentId());
053 assertTrue("This user should have an approve request", document.isApprovalRequested());
054 document.approve("");
055
056 //this be the role delegate of jitrue
057 document = WorkflowDocumentFactory.loadDocument(getPrincipalIdForName("natjohns"), document.getDocumentId());
058 assertTrue("This user should have an approve request", document.isApprovalRequested());
059 document.approve("");
060
061 document = WorkflowDocumentFactory.loadDocument(getPrincipalIdForName("bmcgough"), document.getDocumentId());
062 assertTrue("This user should have an approve request", document.isApprovalRequested());
063 // assert that the document is at the same node before and after disapprove
064 TestUtilities.assertAtNode(document, NotifySetup.NOTIFY_FINAL_NODE);
065 document.disapprove("");
066 TestUtilities.assertAtNode(document, NotifySetup.NOTIFY_FINAL_NODE);
067 // reload just to double check
068 document = WorkflowDocumentFactory.loadDocument(getPrincipalIdForName("bmcgough"), document.getDocumentId());
069 TestUtilities.assertAtNode(document, NotifySetup.NOTIFY_FINAL_NODE);
070
071 assertTrue("Document should be disapproved", document.isDisapproved());
072 document = WorkflowDocumentFactory.loadDocument(getPrincipalIdForName("ewestfal"), document.getDocumentId());
073 assertTrue("ack should be requested as part of disapprove notification", document.isAcknowledgeRequested());
074
075 document = WorkflowDocumentFactory.loadDocument(getPrincipalIdForName("jhopf"), document.getDocumentId());
076 assertTrue("ack should be requested as part of disapprove notification", document.isAcknowledgeRequested());
077
078 document = WorkflowDocumentFactory.loadDocument(getPrincipalIdForName("rkirkend"), document.getDocumentId());
079 assertTrue("ack should be requested as part of disapprove notification", document.isAcknowledgeRequested());
080
081 //jitrue while part of original approval chain did not take approve action and therefore should
082 //not get action
083 document = WorkflowDocumentFactory.loadDocument(getPrincipalIdForName("jitrue"), document.getDocumentId());
084 assertFalse("ack should be requested as part of disapprove notification", document.isAcknowledgeRequested());
085
086 document = WorkflowDocumentFactory.loadDocument(getPrincipalIdForName("natjohns"), document.getDocumentId());
087 assertTrue("ack should be requested as part of disapprove notification", document.isAcknowledgeRequested());
088
089 //shenl part of approval chain but didn't take action
090 document = WorkflowDocumentFactory.loadDocument(getPrincipalIdForName("shenl"), document.getDocumentId());
091 assertFalse("ack should be requested as part of disapprove notification", document.isAcknowledgeRequested());
092
093 //check that all the emailing went right.
094 assertEquals("jhopf should have been sent an approve email", 1, getMockEmailService().immediateReminderEmailsSent("jhopf", document.getDocumentId(), KewApiConstants.ACTION_REQUEST_APPROVE_REQ));
095 assertEquals("jhopf should have been sent an ack email", 1, getMockEmailService().immediateReminderEmailsSent("jhopf", document.getDocumentId(), KewApiConstants.ACTION_REQUEST_ACKNOWLEDGE_REQ));
096
097 assertEquals("ewestfal should have been sent an approve email", 1, getMockEmailService().immediateReminderEmailsSent("ewestfal", document.getDocumentId(), KewApiConstants.ACTION_REQUEST_APPROVE_REQ));
098 assertEquals("ewestfal should have been sent an ack email", 1, getMockEmailService().immediateReminderEmailsSent("ewestfal", document.getDocumentId(), KewApiConstants.ACTION_REQUEST_ACKNOWLEDGE_REQ));
099
100 //rkirkend is a primary delegate and therefore should not receive email notification
101 assertEquals("rkirkend should not have been sent an approve email", 0, getMockEmailService().immediateReminderEmailsSent("rkirkend", document.getDocumentId(), KewApiConstants.ACTION_REQUEST_APPROVE_REQ));
102 assertEquals("rkirkend should have been sent an ack email", 1, getMockEmailService().immediateReminderEmailsSent("rkirkend", document.getDocumentId(), KewApiConstants.ACTION_REQUEST_ACKNOWLEDGE_REQ));
103
104 //temay is rkirkend primary delegate she should have received notification
105 assertEquals("temay should have been sent an approve email", 1, getMockEmailService().immediateReminderEmailsSent("temay", document.getDocumentId(), KewApiConstants.ACTION_REQUEST_APPROVE_REQ));
106
107 //there should be no ack emails for temay
108 assertEquals("temay should have been sent an ack email", 0, getMockEmailService().immediateReminderEmailsSent("temay", document.getDocumentId(), KewApiConstants.ACTION_REQUEST_ACKNOWLEDGE_REQ));
109
110 // pmckown is a secondary delegate here so he should NOT have received a notification
111 assertEquals("pmckown should not have been sent an approve email", 0, getMockEmailService().immediateReminderEmailsSent("pmckown", document.getDocumentId(), KewApiConstants.ACTION_REQUEST_APPROVE_REQ));
112 assertEquals("pmckown should not have been sent an ack email", 0, getMockEmailService().immediateReminderEmailsSent("pmckown", document.getDocumentId(), KewApiConstants.ACTION_REQUEST_ACKNOWLEDGE_REQ));
113
114 //this is a secondary delegator and should receive notifications
115 assertEquals("jitrue should have been sent an approve email", 1, getMockEmailService().immediateReminderEmailsSent("jitrue", document.getDocumentId(), KewApiConstants.ACTION_REQUEST_APPROVE_REQ));
116 //no ack emails to jitrue
117 assertEquals("jitrue should have been sent an ack email", 0, getMockEmailService().immediateReminderEmailsSent("jitrue", document.getDocumentId(), KewApiConstants.ACTION_REQUEST_ACKNOWLEDGE_REQ));
118
119 //the 2nd delegates should NOT receive notifications by default
120 assertEquals("natjohns should not have been sent an approve email", 0, getMockEmailService().immediateReminderEmailsSent("natjohns", document.getDocumentId(), KewApiConstants.ACTION_REQUEST_APPROVE_REQ));
121 //2ndary delegate
122 assertEquals("natjohns should not have been sent an ack email", 1, getMockEmailService().immediateReminderEmailsSent("natjohns", document.getDocumentId(), KewApiConstants.ACTION_REQUEST_ACKNOWLEDGE_REQ));
123 assertEquals("shenl should not have been sent an approve email", 0, getMockEmailService().immediateReminderEmailsSent("shenl", document.getDocumentId(), KewApiConstants.ACTION_REQUEST_APPROVE_REQ));
124 assertEquals("shenl should not have been sent an ack email", 0, getMockEmailService().immediateReminderEmailsSent("shenl", document.getDocumentId(), KewApiConstants.ACTION_REQUEST_ACKNOWLEDGE_REQ));
125
126 assertEquals("bmcgough should have been sent an approve email", 1, getMockEmailService().immediateReminderEmailsSent("bmcgough", document.getDocumentId(), KewApiConstants.ACTION_REQUEST_APPROVE_REQ));
127 assertEquals("bmcgough should not have been sent an ack email", 0, getMockEmailService().immediateReminderEmailsSent("bmcgough", document.getDocumentId(), KewApiConstants.ACTION_REQUEST_ACKNOWLEDGE_REQ));
128 }
129
130 /**
131 * Tests whether the initator who disapproved a doc gets an acknowledgement
132 *
133 */
134 @Ignore("This test will fail until KULRICE-752 is resolved")
135 @Test public void testInitiatorRoleDisapprove() throws WorkflowException {
136 // test initiator disapproval of their own doc via InitiatorRoleAttribute
137 WorkflowDocument document = WorkflowDocumentFactory.createDocument(getPrincipalIdForName("arh14"), "InitiatorRoleApprovalTest");
138 document.route("routing document");
139
140 document = WorkflowDocumentFactory.loadDocument(getPrincipalIdForName("arh14"), document.getDocumentId());
141 document.disapprove("disapproving the document");
142
143 document = WorkflowDocumentFactory.loadDocument(getPrincipalIdForName("arh14"), document.getDocumentId());
144 assertFalse("Initiator should not have an Ack request from disapproval because they were the disapprover user", document.isAcknowledgeRequested());
145 }
146
147 /**
148 * Tests whether the initator who disapproved a doc gets an acknowledgement
149 *
150 */
151 @Ignore("This test will fail until KULRICE-752 is resolved")
152 @Test public void testInitiatorDisapprove() throws WorkflowException {
153 // test initiator disapproval, via normal request with forceAction=true
154 WorkflowDocument document = WorkflowDocumentFactory.createDocument(getPrincipalIdForName("ewestfal"), NotifySetup.DOCUMENT_TYPE_NAME);
155 document.route("");
156
157 document = WorkflowDocumentFactory.loadDocument(getPrincipalIdForName("ewestfal"), document.getDocumentId());
158 document.disapprove("");
159
160 document = WorkflowDocumentFactory.loadDocument(getPrincipalIdForName("ewestfal"), document.getDocumentId());
161 assertFalse("Initiator should not have an Ack request from disapproval because they were the disapprover user", document.isAcknowledgeRequested());
162 }
163
164 @Test public void testDisapproveByArbitraryRecipient() throws WorkflowException {
165 // test approval by some other person
166 WorkflowDocument document = WorkflowDocumentFactory.createDocument(getPrincipalIdForName("ewestfal"), "BlanketApproveSequentialTest");
167 document.route("");
168
169 document = WorkflowDocumentFactory.loadDocument(getPrincipalIdForName("bmcgough"), document.getDocumentId());
170 document.disapprove("disapproving as bmcgough");
171
172 document = WorkflowDocumentFactory.loadDocument(getPrincipalIdForName("bmcgough"), document.getDocumentId());
173 assertFalse("Acknowledge was incorrectly sent to non-initiator disapprover", document.isAcknowledgeRequested());
174
175 document = WorkflowDocumentFactory.loadDocument(getPrincipalIdForName("ewestfal"), document.getDocumentId());
176 assertTrue("Acknowledge was not sent to initiator", document.isAcknowledgeRequested());
177 }
178
179 private MockEmailNotificationService getMockEmailService() {
180 return (MockEmailNotificationService)KEWServiceLocator.getActionListEmailService();
181 }
182 }