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