001 /*
002 * Copyright 2006-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
017 package org.kuali.rice.kew.actionlist;
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.ArrayList;
024 import java.util.Collection;
025 import java.util.List;
026
027 import org.junit.Test;
028 import org.kuali.rice.kew.actionitem.ActionItem;
029 import org.kuali.rice.kew.actions.asyncservices.ActionInvocation;
030 import org.kuali.rice.kew.api.WorkflowDocument;
031 import org.kuali.rice.kew.api.WorkflowDocumentFactory;
032 import org.kuali.rice.kew.api.action.ActionRequestType;
033 import org.kuali.rice.kew.preferences.Preferences;
034 import org.kuali.rice.kew.preferences.service.impl.PreferencesServiceImpl;
035 import org.kuali.rice.kew.rule.TestRuleAttribute;
036 import org.kuali.rice.kew.service.KEWServiceLocator;
037 import org.kuali.rice.kew.test.KEWTestCase;
038 import org.kuali.rice.kew.util.KEWConstants;
039 import org.kuali.rice.test.BaselineTestCase;
040 import org.springframework.transaction.TransactionStatus;
041 import org.springframework.transaction.support.TransactionCallback;
042 import org.springframework.transaction.support.TransactionTemplate;
043
044 /**
045 * Tests Outbox functionality
046 *
047 * @author Kuali Rice Team (rice.collab@kuali.org)
048 */
049 @BaselineTestCase.BaselineMode(BaselineTestCase.Mode.NONE)
050 public class OutboxTest extends KEWTestCase {
051
052 protected void loadTestData() throws Exception {
053 loadXmlFile("OutboxTestConfig.xml");
054 }
055
056 private void turnOnOutboxForUser(final String principalId) {
057 new TransactionTemplate(KEWServiceLocator.getPlatformTransactionManager()).execute(new TransactionCallback() {
058 public Object doInTransaction(TransactionStatus status) {
059 KEWServiceLocator.getUserOptionsService().save(principalId, PreferencesServiceImpl.USE_OUT_BOX, KEWConstants.PREFERENCES_YES_VAL);
060 return null;
061 }
062 });
063 }
064
065 @Test
066 public void testOutboxItemNotSavedOnSavedDocumentStatus() throws Exception {
067 final String rkirkendPrincipalId = getPrincipalIdForName("rkirkend");
068 List<String> recipients = new ArrayList<String>();
069 recipients.add(rkirkendPrincipalId);
070 TestRuleAttribute.setRecipientPrincipalIds("TestRole", "qualRole", recipients);
071
072 WorkflowDocument document = WorkflowDocumentFactory.createDocument(getPrincipalIdForName("quickstart"), "TestDocumentType");
073 document.route("");
074
075 document = WorkflowDocumentFactory.loadDocument(rkirkendPrincipalId, document.getDocumentId());
076 assertTrue("approve should be requested", document.isApprovalRequested());
077
078 turnOnOutboxForUser(rkirkendPrincipalId);
079
080 document.saveDocument("");
081
082 Collection<ActionItem> outbox = KEWServiceLocator.getActionListService().getOutbox(rkirkendPrincipalId, new ActionListFilter());
083 assertEquals("there should not be any outbox items", 0, outbox.size());
084 }
085
086 @Test
087 public void testTakeActionCreatesOutboxItem() throws Exception {
088
089 final String rkirkendPrincipalId = getPrincipalIdForName("rkirkend");
090 List<String> recipients = new ArrayList<String>();
091 recipients.add(rkirkendPrincipalId);
092 TestRuleAttribute.setRecipientPrincipalIds("TestRole", "qualRole", recipients);
093
094 WorkflowDocument document = WorkflowDocumentFactory.createDocument(getPrincipalIdForName("quickstart"), "TestDocumentType");
095 document.route("");
096
097 document = WorkflowDocumentFactory.loadDocument(rkirkendPrincipalId, document.getDocumentId());
098 assertTrue("approve should be requested", document.isApprovalRequested());
099
100 turnOnOutboxForUser(rkirkendPrincipalId);
101
102 document.approve("");
103
104 Collection<ActionItem> outbox = KEWServiceLocator.getActionListService().getOutbox(rkirkendPrincipalId, new ActionListFilter());
105 assertEquals("there should be an outbox item", 1, outbox.size());
106 }
107
108 @Test
109 public void testSingleOutboxItemPerDocument() throws Exception {
110 final String rkirkendPrincipalId = getPrincipalIdForName("rkirkend");
111 final String user1PrincipalId = getPrincipalIdForName("user1");
112 List<String> recipients = new ArrayList<String>();
113 recipients.add(rkirkendPrincipalId);
114 recipients.add(user1PrincipalId);
115 TestRuleAttribute.setRecipientPrincipalIds("TestRole", "qualRole", recipients);
116
117 WorkflowDocument document = WorkflowDocumentFactory.createDocument(getPrincipalIdForName("quickstart"), "TestDocumentType");
118 document.route("");
119
120 document = WorkflowDocumentFactory.loadDocument(rkirkendPrincipalId, document.getDocumentId());
121 assertTrue("approve should be requested", document.isApprovalRequested());
122
123 turnOnOutboxForUser(rkirkendPrincipalId);
124
125 document.adHocToPrincipal(ActionRequestType.APPROVE, "", user1PrincipalId, "", true);
126
127 document.approve("");
128
129 Collection<ActionItem> outbox = KEWServiceLocator.getActionListService().getOutbox(rkirkendPrincipalId, new ActionListFilter());
130 assertEquals("there should be an outbox item", 1, outbox.size());
131
132 document = WorkflowDocumentFactory.loadDocument(user1PrincipalId, document.getDocumentId());
133 assertTrue("approve should be requested", document.isApprovalRequested());
134
135 document.adHocToPrincipal(ActionRequestType.APPROVE, "", rkirkendPrincipalId, "", true);
136
137 document = WorkflowDocumentFactory.loadDocument(rkirkendPrincipalId, document.getDocumentId());
138 assertTrue("approve should be requested", document.isApprovalRequested());
139 document.approve("");
140
141 outbox = KEWServiceLocator.getActionListService().getOutbox(rkirkendPrincipalId, new ActionListFilter());
142 assertEquals("there should be an outbox item", 1, outbox.size());
143 }
144
145 @Test
146 public void testOnlyPersonWhoTookActionReceivesOutboxItem_Route() throws Exception {
147 final String rkirkendPrincipalId = getPrincipalIdForName("rkirkend");
148 final String user1PrincipalId = getPrincipalIdForName("user1");
149 List<String> recipients = new ArrayList<String>();
150 recipients.add(getPrincipalIdForName("rkirkend"));
151 recipients.add(getPrincipalIdForName("user1"));
152 TestRuleAttribute.setRecipientPrincipalIds("TestRole", "qualRole", recipients);
153
154 turnOnOutboxForUser(rkirkendPrincipalId);
155 turnOnOutboxForUser(user1PrincipalId);
156
157 WorkflowDocument document = WorkflowDocumentFactory.createDocument(getPrincipalIdForName("quickstart"), "TestDocumentType");
158 document.route("");
159
160 // verify test is sane and users have action items
161 assertFalse(KEWServiceLocator.getActionListService().getActionList(rkirkendPrincipalId, new ActionListFilter()).isEmpty());
162 assertFalse(KEWServiceLocator.getActionListService().getActionList(user1PrincipalId, new ActionListFilter()).isEmpty());
163
164 document = WorkflowDocumentFactory.loadDocument(user1PrincipalId, document.getDocumentId());
165 document.approve("");
166 // verify only user who took action has the outbox item
167 assertTrue(KEWServiceLocator.getActionListService().getOutbox(rkirkendPrincipalId, new ActionListFilter()).isEmpty());
168 assertEquals(1, KEWServiceLocator.getActionListService().getOutbox(user1PrincipalId, new ActionListFilter()).size());
169 }
170
171 @Test
172 public void testOnlyPersonWhoTookActionReceivesOutboxItem_BlanketApprove() throws Exception {
173 final String rkirkendPrincipalId = getPrincipalIdForName("rkirkend");
174 final String user1PrincipalId = getPrincipalIdForName("user1");
175 List<String> recipients = new ArrayList<String>();
176 recipients.add(rkirkendPrincipalId);
177 recipients.add(user1PrincipalId);
178 TestRuleAttribute.setRecipientPrincipalIds("TestRole", "qualRole", recipients);
179
180 turnOnOutboxForUser(rkirkendPrincipalId);
181 turnOnOutboxForUser(user1PrincipalId);
182
183 WorkflowDocument document = WorkflowDocumentFactory.createDocument(rkirkendPrincipalId, "TestDocumentType");
184 document.blanketApprove("");
185 // verify only user who took action has the outbox item
186 assertEquals("Wrong number of outbox items found for rkirkend", 0, KEWServiceLocator.getActionListService().getOutbox(rkirkendPrincipalId, new ActionListFilter()).size());
187 assertEquals("Wrong number of outbox items found for user1", 0, KEWServiceLocator.getActionListService().getOutbox(user1PrincipalId, new ActionListFilter()).size());
188
189 document = WorkflowDocumentFactory.createDocument(rkirkendPrincipalId, "TestDocumentType");
190 document.saveDocument("");
191 // verify test is sane and users have action items
192 assertEquals("Wrong number of action items found for rkirkend", 1, KEWServiceLocator.getActionListService().getActionList(rkirkendPrincipalId, new ActionListFilter()).size());
193 // verify that outboxes of two users are clear
194 assertEquals("Wrong number of outbox items found for rkirkend", 0, KEWServiceLocator.getActionListService().getOutbox(rkirkendPrincipalId, new ActionListFilter()).size());
195 assertEquals("Wrong number of outbox items found for user1", 0, KEWServiceLocator.getActionListService().getOutbox(user1PrincipalId, new ActionListFilter()).size());
196
197 document = WorkflowDocumentFactory.loadDocument(getPrincipalIdForName("rkirkend"), document.getDocumentId());
198 document.blanketApprove("");
199 // verify only user who took action has the outbox item
200 assertEquals("Wrong number of outbox items found for rkirkend", 1, KEWServiceLocator.getActionListService().getOutbox(rkirkendPrincipalId, new ActionListFilter()).size());
201 assertEquals("Wrong number of outbox items found for user1", 0, KEWServiceLocator.getActionListService().getOutbox(user1PrincipalId, new ActionListFilter()).size());
202 }
203
204 @Test
205 public void testOnlyPersonWhoTookActionReceivesOutboxItem_Workgroup() throws Exception {
206 final String rkirkendPrincipalId = getPrincipalIdForName("rkirkend");
207 final String user1PrincipalId = getPrincipalIdForName("user1");
208 final String ewestfalPrincipalId = getPrincipalIdForName("ewestfal");
209
210 turnOnOutboxForUser(rkirkendPrincipalId);
211 turnOnOutboxForUser(user1PrincipalId);
212
213 WorkflowDocument document = WorkflowDocumentFactory.createDocument(getPrincipalIdForName("user2"), "OutboxTestDocumentType");
214 document.route("");
215 // verify action items exist
216 assertEquals("Wrong number of action items found for rkirkend", 1, KEWServiceLocator.getActionListService().getActionList(rkirkendPrincipalId, new ActionListFilter()).size());
217 assertEquals("Wrong number of action items found for ewestfal", 1, KEWServiceLocator.getActionListService().getActionList(ewestfalPrincipalId, new ActionListFilter()).size());
218 assertEquals("Wrong number of action items found for user1", 1, KEWServiceLocator.getActionListService().getActionList(user1PrincipalId, new ActionListFilter()).size());
219 // verify outboxes are clear
220 assertEquals("Wrong number of outbox items found for rkirkend", 0, KEWServiceLocator.getActionListService().getOutbox(rkirkendPrincipalId, new ActionListFilter()).size());
221 assertEquals("Wrong number of outbox items found for ewestfal", 0, KEWServiceLocator.getActionListService().getOutbox(ewestfalPrincipalId, new ActionListFilter()).size());
222 assertEquals("Wrong number of outbox items found for user1", 0, KEWServiceLocator.getActionListService().getOutbox(user1PrincipalId, new ActionListFilter()).size());
223
224 document = WorkflowDocumentFactory.loadDocument(rkirkendPrincipalId, document.getDocumentId());
225 document.approve("");
226 // verify only user who took action has the outbox item
227 assertEquals("Wrong number of outbox items found for rkirkend", 1, KEWServiceLocator.getActionListService().getOutbox(rkirkendPrincipalId, new ActionListFilter()).size());
228 assertEquals("Wrong number of outbox items found for ewestfal", 0, KEWServiceLocator.getActionListService().getOutbox(ewestfalPrincipalId, new ActionListFilter()).size());
229 assertEquals("Wrong number of outbox items found for user1", 0, KEWServiceLocator.getActionListService().getOutbox(user1PrincipalId, new ActionListFilter()).size());
230 }
231
232 @Test
233 public void testOutBoxDefaultPreferenceOnConfigParam() throws Exception {
234 final String user1PrincipalId = getPrincipalIdForName("user1");
235 Preferences prefs = KEWServiceLocator.getPreferencesService().getPreferences(user1PrincipalId);
236 assertTrue("By default the user's pref should be outbox on", prefs.isUsingOutbox());
237
238 //TODO: this can no longer be set on the fly and grabbed through the preference service (default values are set at startup)
239 //TODO: this is a prime candidate for a mocking tool
240 /*ConfigContext.getCurrentContextConfig().putProperty(KEWConstants.USER_OPTIONS_DEFAULT_USE_OUTBOX_PARAM, "false");
241 final String natjohnsPrincipalId = getPrincipalIdForName("natjohns");
242 prefs = KEWServiceLocator.getPreferencesService().getPreferences(natjohnsPrincipalId);
243 assertFalse("The user's pref should be outbox off", prefs.isUsingOutbox());*/
244 }
245
246 @Test
247 public void testTakeMassActions() throws Exception {
248 final String rkirkendPrincipalId = getPrincipalIdForName("rkirkend");
249 List<String> recipients = new ArrayList<String>();
250 recipients.add(rkirkendPrincipalId);
251 TestRuleAttribute.setRecipientPrincipalIds("TestRole", "qualRole", recipients);
252 turnOnOutboxForUser(rkirkendPrincipalId);
253
254 WorkflowDocument document = WorkflowDocumentFactory.createDocument(getPrincipalIdForName("quickstart"), "TestDocumentType");
255 document.route("");
256
257 document = WorkflowDocumentFactory.loadDocument(rkirkendPrincipalId, document.getDocumentId());
258 assertTrue("approve should be requested", document.isApprovalRequested());
259
260 document = WorkflowDocumentFactory.createDocument(getPrincipalIdForName("user1"), "OutboxTestDocumentType");
261 document.route("");
262
263 document = WorkflowDocumentFactory.loadDocument(rkirkendPrincipalId, document.getDocumentId());
264 assertTrue("approve should be requested", document.isApprovalRequested());
265
266 List<ActionItem> actionList = new ArrayList<ActionItem>(KEWServiceLocator.getActionListService().getActionList(rkirkendPrincipalId, new ActionListFilter()));
267 List<ActionInvocation> invocations = new ArrayList<ActionInvocation>();
268 ActionToTake actionToTake = new ActionToTake();
269 ActionItem actionItem = new ActionItem();
270
271 for (ActionItem actinItem : actionList)
272 {
273 actionToTake.setActionItemId(actinItem.getId());
274 actionToTake.setActionTakenCd(actinItem.getActionRequestCd());
275 invocations.add(new ActionInvocation(actinItem.getId(), actionToTake.getActionTakenCd()));
276 }
277 KEWServiceLocator.getWorkflowDocumentService().takeMassActions(rkirkendPrincipalId, invocations);
278 assertEquals("Wrong number of outbox items found for rkirkendPrincipalId", 2, KEWServiceLocator.getActionListService().getOutbox(rkirkendPrincipalId, new ActionListFilter()).size());
279
280 }
281 }