View Javadoc

1   /**
2    * Copyright 2005-2013 The Kuali Foundation
3    *
4    * Licensed under the Educational Community License, Version 2.0 (the "License");
5    * you may not use this file except in compliance with the License.
6    * You may obtain a copy of the License at
7    *
8    * http://www.opensource.org/licenses/ecl2.php
9    *
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS,
12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   * See the License for the specific language governing permissions and
14   * limitations under the License.
15   */
16  package org.kuali.rice.kew.mail;
17  
18  import mocks.MockEmailNotificationService;
19  import mocks.MockEmailNotificationServiceImpl;
20  import org.junit.Test;
21  import org.kuali.rice.core.api.config.property.ConfigContext;
22  import org.kuali.rice.kew.api.KewApiServiceLocator;
23  import org.kuali.rice.kew.api.WorkflowDocument;
24  import org.kuali.rice.kew.api.WorkflowDocumentFactory;
25  import org.kuali.rice.kew.api.action.ActionRequestType;
26  import org.kuali.rice.kew.api.preferences.Preferences;
27  import org.kuali.rice.kew.service.KEWServiceLocator;
28  import org.kuali.rice.kew.test.KEWTestCase;
29  import org.kuali.rice.kew.api.KewApiConstants;
30  
31  import static org.junit.Assert.*;
32  
33  public class EmailReminderLifecycleTest extends KEWTestCase {
34      protected final org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(getClass());
35  
36      private static final String DEFAULT_EMAIL_CRON_WEEKLY = "0 0 2 ? * 2";
37      private static final String DEFAULT_EMAIL_CRON_DAILY = "0 0 1 * * ?";
38  
39  	private EmailReminderLifecycle emailReminderLifecycle;
40  
41  	/**
42  	 * This method used to reset email sending to false for both daily and weekly reminders
43  	 *
44  	 * @see org.kuali.rice.test.RiceTestCase#tearDown()
45  	 */
46  	@Override
47  	public void tearDown() throws Exception {
48          ConfigContext.getCurrentContextConfig().putProperty(KewApiConstants.DAILY_EMAIL_ACTIVE, "false");
49          ConfigContext.getCurrentContextConfig().putProperty(KewApiConstants.WEEKLY_EMAIL_ACTIVE, "false");
50  	    super.tearDown();
51  	}
52  
53  	@Test public void testDailyEmails() throws Exception {
54  		// fire daily every 2 seconds
55  		ConfigContext.getCurrentContextConfig().putProperty(KewApiConstants.DAILY_EMAIL_CRON_EXPRESSION, "0/2 * * * * ?");
56  		// turn daily on and weekly off
57  		ConfigContext.getCurrentContextConfig().putProperty(KewApiConstants.DAILY_EMAIL_ACTIVE, "true");
58  		ConfigContext.getCurrentContextConfig().putProperty(KewApiConstants.WEEKLY_EMAIL_ACTIVE, "false");
59  
60  		String ewestfalPrincipalId = getPrincipalIdForName("ewestfal");
61  		String rkirkendPrincipalId = getPrincipalIdForName("rkirkend");
62  		
63  		// setup ewestfal to recieve daily emails
64  		Preferences prefs = KewApiServiceLocator.getPreferencesService().getPreferences(ewestfalPrincipalId);
65          Preferences.Builder builder = Preferences.Builder.create(prefs);
66  		builder.setEmailNotification(KewApiConstants.DAILY);
67  		KewApiServiceLocator.getPreferencesService().savePreferences(ewestfalPrincipalId, builder.build());
68  
69  		WorkflowDocument document = WorkflowDocumentFactory.createDocument(rkirkendPrincipalId, "TestDocumentType");
70  		document.adHocToPrincipal(ActionRequestType.APPROVE, "", ewestfalPrincipalId, "", Boolean.TRUE);
71  		document.route("");
72  
73  		document = WorkflowDocumentFactory.loadDocument(ewestfalPrincipalId, document.getDocumentId());
74  		assertTrue(document.isApprovalRequested());
75  
76  		int emailsSent = getMockEmailService().immediateReminderEmailsSent("ewestfal", document.getDocumentId(), KewApiConstants.ACTION_REQUEST_APPROVE_REQ);
77  		assertEquals("ewestfal should have no emails.", 0, emailsSent);
78  
79  		// let's fire up the lifecycle
80  		emailReminderLifecycle = new EmailReminderLifecycle();
81  		LOG.info("testDailyEmails(): Starting EmailReminderLifeCycle");
82  		emailReminderLifecycle.start();
83  
84  		// sleep for 10 seconds
85  		Thread.sleep(10000);
86  
87  		// send daily reminder should have now been called
88  		assertTrue("daily reminder should have been called.", getMockEmailService().wasDailyReminderSent());
89  
90  		LOG.info("testDailyEmails(): Stopping EmailReminderLifeCycle");
91  		emailReminderLifecycle.stop();
92  
93  		// setting cron to empty so job will cease
94  		ConfigContext.getCurrentContextConfig().putProperty(KewApiConstants.DAILY_EMAIL_CRON_EXPRESSION, DEFAULT_EMAIL_CRON_DAILY);
95  
96  		// try restarting to verify rescheduling of tasks
97  		emailReminderLifecycle.start();
98  		emailReminderLifecycle.stop();
99  	}
100 
101 	@Test public void testWeeklyEmails() throws Exception {
102 		// fire daily every 2 seconds
103 		ConfigContext.getCurrentContextConfig().putProperty(KewApiConstants.WEEKLY_EMAIL_CRON_EXPRESSION, "0/2 * * * * ?");
104 		// turn weekly on and daily off
105 		ConfigContext.getCurrentContextConfig().putProperty(KewApiConstants.WEEKLY_EMAIL_ACTIVE, "true");
106 		ConfigContext.getCurrentContextConfig().putProperty(KewApiConstants.DAILY_EMAIL_ACTIVE, "false");
107 
108 		String ewestfalPrincipalId = getPrincipalIdForName("ewestfal");
109 		String rkirkendPrincipalId = getPrincipalIdForName("rkirkend");
110 		
111 		// setup ewestfal to recieve weekly emails
112 		Preferences prefs = KewApiServiceLocator.getPreferencesService().getPreferences(ewestfalPrincipalId);
113         Preferences.Builder builder = Preferences.Builder.create(prefs);
114 		builder.setEmailNotification(KewApiConstants.WEEKLY);
115 		KewApiServiceLocator.getPreferencesService().savePreferences(ewestfalPrincipalId, builder.build());
116 
117 		WorkflowDocument document = WorkflowDocumentFactory.createDocument(rkirkendPrincipalId, "TestDocumentType");
118 		document.adHocToPrincipal(ActionRequestType.APPROVE, "", ewestfalPrincipalId, "", Boolean.TRUE);
119 		document.route("");
120 
121 		document = WorkflowDocumentFactory.loadDocument(ewestfalPrincipalId, document.getDocumentId());
122 		assertTrue(document.isApprovalRequested());
123 
124 		int emailsSent = getMockEmailService().immediateReminderEmailsSent("ewestfal", document.getDocumentId(), KewApiConstants.ACTION_REQUEST_APPROVE_REQ);
125 		assertEquals("ewestfal should have no emails.", 0, emailsSent);
126 
127 		// let's fire up the lifecycle
128 		emailReminderLifecycle = new EmailReminderLifecycle();
129 		LOG.info("testWeeklyEmails(): Starting EmailReminderLifeCycle");
130 		emailReminderLifecycle.start();
131 
132 		assertTrue("EmailReminderLifecycle should have been started", emailReminderLifecycle.isStarted());
133 		
134 		// sleep for 10 seconds
135 		Thread.sleep(10000);
136 
137 		// send weekly reminder should have now been called
138 		assertTrue("weekly reminder should have been called.", getMockEmailService().wasWeeklyReminderSent());
139 
140 		LOG.info("testWeeklyEmails(): Stopping EmailReminderLifeCycle");
141 		emailReminderLifecycle.stop();
142 
143         // setting cron to empty so job will cease
144         ConfigContext.getCurrentContextConfig().putProperty(KewApiConstants.WEEKLY_EMAIL_CRON_EXPRESSION, DEFAULT_EMAIL_CRON_WEEKLY);
145 
146 		// try restarting to verify rescheduling of tasks
147 		emailReminderLifecycle.start();
148         emailReminderLifecycle.stop();
149 	}
150 
151 //	/**
152 //	 * Verify that no more messages are put in the queue if there are already weekly and daily reminders in the
153 //	 * queue
154 //	 * @throws Exception
155 //	 */
156 //	@Test
157 //	public void testEmailMessagesInQueue() throws Exception {
158 //
159 //		setUpConfigForEmail();
160 //
161 //		PersistedMessageBO dailyMessage = getMockDailyMessage();
162 //		PersistedMessageBO weeklyMessage = getMockWeeklyMessage();
163 //		KEWServiceLocator.getRouteQueueService().save(dailyMessage);
164 //		KEWServiceLocator.getRouteQueueService().save(weeklyMessage);
165 //
166 //		Collection messages = KEWServiceLocator.getRouteQueueService().findAll();
167 //		assertEquals("Should only be 2 items present in queue", 2, messages.size());
168 //
169 //		emailReminderLifecycle.start();
170 //
171 //		messages = KEWServiceLocator.getRouteQueueService().findAll();
172 //		assertEquals("Should only be 2 items present in queue", 2, messages.size());
173 //
174 //		PersistedMessageBO fetchedDaily = null;
175 //		PersistedMessageBO fetchedWeekly = null;
176 //
177 //		for (Iterator iter = messages.iterator(); iter.hasNext();) {
178 //			PersistedMessageBO fetchedMessage = (PersistedMessageBO) iter.next();
179 //			if (fetchedMessage.getMethodName().equals("sendDailyReminder")) {
180 //				fetchedDaily = fetchedMessage;
181 //			} else {
182 //				fetchedWeekly = fetchedMessage;
183 //			}
184 //		}
185 //		assertEquals("Daily message was re-inserted or removed when it should have been allowed to stay in queue for later processing", dailyMessage.getRouteQueueId(), fetchedDaily.getRouteQueueId());
186 //		assertEquals("Weekly message was re-inserted or removed when it should have been allowed to stay in queue for later processing", weeklyMessage.getRouteQueueId(), fetchedWeekly.getRouteQueueId());
187 //		assertTrue("Lifecycle should report itself as started", emailReminderLifecycle.isStarted());
188 //	}
189 //
190 //	/**
191 //	 * If only a daily is in the queue then the other reminder should be put in the queue
192 //	 *
193 //	 * @throws Exception
194 //	 */
195 //	@Test public void testOnlyDailyReminderInQueue() throws Exception {
196 //
197 //		setUpConfigForEmail();
198 //
199 //		PersistedMessageBO dailyMessage = getMockDailyMessage();
200 //		KEWServiceLocator.getRouteQueueService().save(dailyMessage);
201 //
202 //		Collection messages = KEWServiceLocator.getRouteQueueService().findAll();
203 //		assertEquals("Should only be 1 items present in queue", 1, messages.size());
204 //
205 //		emailReminderLifecycle.start();
206 //
207 //		messages = KEWServiceLocator.getRouteQueueService().findAll();
208 //		assertEquals("Should only be 2 items present in queue", 2, messages.size());
209 //
210 //		PersistedMessageBO fetchedDaily = null;
211 //		PersistedMessageBO fetchedWeekly = null;
212 //
213 //		for (Iterator iter = messages.iterator(); iter.hasNext();) {
214 //			PersistedMessageBO fetchedMessage = (PersistedMessageBO) iter.next();
215 //			if (fetchedMessage.getMethodName().equals("sendDailyReminder")) {
216 //				fetchedDaily = fetchedMessage;
217 //			} else {
218 //				fetchedWeekly = fetchedMessage;
219 //			}
220 //		}
221 //		assertEquals("Daily message was re-inserted or removed when it should have been allowed to stay in queue for later processing", dailyMessage.getRouteQueueId(), fetchedDaily.getRouteQueueId());
222 //		assertTrue(fetchedWeekly != null);
223 //		assertTrue("Lifecycle should report itself as started", emailReminderLifecycle.isStarted());
224 //	}
225 //
226 //	/**
227 //	 * If only a weekly reminder is in the queue then the other reminder should be put in the queue
228 //	 *
229 //	 * @throws Exception
230 //	 */
231 //	@Test public void testOnlyWeeklyReminderInQueue() throws Exception {
232 //
233 //		setUpConfigForEmail();
234 //
235 //		PersistedMessageBO weeklyMessage = getMockWeeklyMessage();
236 //		KEWServiceLocator.getRouteQueueService().save(weeklyMessage);
237 //
238 //		Collection messages = KEWServiceLocator.getRouteQueueService().findAll();
239 //		assertEquals("Should only be 1 items present in queue", 1, messages.size());
240 //
241 //		emailReminderLifecycle.start();
242 //
243 //		messages = KEWServiceLocator.getRouteQueueService().findAll();
244 //		assertEquals("Should only be 2 items present in queue", 2, messages.size());
245 //
246 //		PersistedMessageBO fetchedDaily = null;
247 //		PersistedMessageBO fetchedWeekly = null;
248 //
249 //		for (Iterator iter = messages.iterator(); iter.hasNext();) {
250 //			PersistedMessageBO fetchedMessage = (PersistedMessageBO) iter.next();
251 //			if (fetchedMessage.getMethodName().equals("sendDailyReminder")) {
252 //				fetchedDaily = fetchedMessage;
253 //			} else {
254 //				fetchedWeekly = fetchedMessage;
255 //			}
256 //		}
257 //		assertEquals("Weekly message was re-inserted or removed when it should have been allowed to stay in queue for later processing", weeklyMessage.getRouteQueueId(), fetchedWeekly.getRouteQueueId());
258 //		assertTrue("Daily message not sent", fetchedDaily != null);
259 //		assertTrue("Lifecycle should report itself as started", emailReminderLifecycle.isStarted());
260 //
261 //	}
262 //
263 //	/**
264 //	 * Tests that email reminder calls are sent to the queue when none are present.  New messages should
265 //	 * be set for the proper delay.
266 //	 *
267 //	 * @throws Exception
268 //	 */
269 //	@Test public void testNoEmailRemindersInQueue() throws Exception {
270 //
271 //		setUpConfigForEmail();
272 //
273 //		emailReminderLifecycle.start();
274 //		Collection messages = KEWServiceLocator.getRouteQueueService().findAll();
275 //		assertEquals("Should only be 2 items present in queue", 2, messages.size());
276 //		PersistedMessageBO fetchedDaily = null;
277 //		PersistedMessageBO fetchedWeekly = null;
278 //
279 //		for (Iterator iter = messages.iterator(); iter.hasNext();) {
280 //			PersistedMessageBO fetchedMessage = (PersistedMessageBO) iter.next();
281 //			if (fetchedMessage.getMethodName().equals("sendDailyReminder")) {
282 //				fetchedDaily = fetchedMessage;
283 //			} else {
284 //				fetchedWeekly = fetchedMessage;
285 //			}
286 //		}
287 //		assertNotNull("No daily message sent", fetchedDaily);
288 //		assertNotNull("No weekly message sent", fetchedWeekly);
289 //
290 //		assertTrue("Daily message not sent", fetchedDaily != null);
291 //		assertTrue("Weekly message not sent", fetchedWeekly != null);
292 //		assertTrue("Lifecycle should report itself as started", emailReminderLifecycle.isStarted());
293 //
294 //
295 //		AsynchronousCall methodCall = (AsynchronousCall)KSBServiceLocator.getMessageHelper().deserializeObject(fetchedWeekly.getPayload());
296 //		assertEquals("Weekly email not on a weekly delay", EmailReminderLifecycle.WEEKLY_DELAY, methodCall.getRepeatCallTimeIncrement().longValue());
297 //
298 //		methodCall = (AsynchronousCall)KSBServiceLocator.getMessageHelper().deserializeObject(fetchedDaily.getPayload());
299 //		assertEquals("Weekly email not on a weekly delay", EmailReminderLifecycle.DAILY_DELAY, methodCall.getRepeatCallTimeIncrement().longValue());
300 //	}
301 //
302 //	/**
303 //	 * the lifecycle should not blow up if this ip is the designated emailer but no email options are sent.  it should
304 //	 * do nothing and report started.
305 //	 *
306 //	 * @throws Exception
307 //	 */
308 //	@Test public void testNoEmailDatesInConfig() throws Exception {
309 //		KEWServiceLocator.getApplicationConstantsService().save(new ApplicationConstant(KewApiConstants.APP_CONST_EMAIL_FIRST_SEND_IP_KEY, Utilities.getIpNumber()));
310 //
311 //		Config config = ConfigContext.getCurrentContextConfig();
312 //		config.getProperties().remove(Config.FIRST_DAILY_EMAIL_DELIVERY_DATE);
313 //		config.getProperties().remove(Config.FIRST_WEEKLY_EMAIL_DELIVERY_DATE);
314 //		emailReminderLifecycle.start();
315 //		Collection messages = KEWServiceLocator.getRouteQueueService().findAll();
316 //		assertEquals("Should not be items present in queue", 0, messages.size());
317 //
318 //		assertTrue("Lifecycle should report itself as started", emailReminderLifecycle.isStarted());
319 //		emailReminderLifecycle.stop();
320 //		assertFalse("Lifecycle should not report itself as started", emailReminderLifecycle.isStarted());
321 //	}
322 //
323 //	/**
324 //	 * Keep the threadpool on and synchronous.  Start the lifecycle and verify that
325 //	 * the action list email service got called.
326 //	 * @throws Exception
327 //	 */
328 //	@Test public void testActionListEmailServiceBeingCalled() throws Exception {
329 //		KEWServiceLocator.getApplicationConstantsService().save(new ApplicationConstant(KewApiConstants.APP_CONST_EMAIL_FIRST_SEND_IP_KEY, Utilities.getIpNumber()));
330 //		Config config = ConfigContext.getCurrentContextConfig();
331 //		config.overrideProperty(Config.FIRST_DAILY_EMAIL_DELIVERY_DATE, DAILY_REMINDER_DATE);
332 //		config.overrideProperty(Config.FIRST_WEEKLY_EMAIL_DELIVERY_DATE, WEEKLY_REMINDER_DATE);
333 //		emailReminderLifecycle.start();
334 //		assertTrue("Send daily not called on email notification service", MockEmailNotificationServiceImpl.SEND_DAILY_REMINDER_CALLED);
335 //		assertTrue("Send weekly not called on email notification service", MockEmailNotificationServiceImpl.SEND_WEEKLY_REMINDER_CALLED);
336 //	}
337 //
338 //	private void setUpConfigForEmail() throws Exception {
339 //		KEWServiceLocator.getApplicationConstantsService().save(new ApplicationConstant(KewApiConstants.APP_CONST_EMAIL_FIRST_SEND_IP_KEY, Utilities.getIpNumber()));
340 //
341 //		Config config = ConfigContext.getCurrentContextConfig();
342 //		config.overrideProperty(Config.FIRST_DAILY_EMAIL_DELIVERY_DATE, DAILY_REMINDER_DATE);
343 //		config.overrideProperty(Config.FIRST_WEEKLY_EMAIL_DELIVERY_DATE, WEEKLY_REMINDER_DATE);
344 //
345 //	}
346 //
347 //
348 //	private PersistedMessageBO getMockDailyMessage() throws Exception {
349 //		PersistedMessageBO dailyMessage = new PersistedMessageBO();
350 //		dailyMessage.setServiceName(emailReminderLifecycle.getEmailServiceName().toString());
351 //		dailyMessage.setMethodName("sendDailyReminder");
352 //		dailyMessage.setQueueDate(new Timestamp(System.currentTimeMillis()));
353 //		dailyMessage.setQueuePriority(1);
354 //		dailyMessage.setQueueStatus("Q");
355 //		dailyMessage.setRetryCount(1);
356 //		dailyMessage.setIpNumber(Utilities.getIpNumber());
357 //		dailyMessage.setApplicationId("KEW");
358 //		dailyMessage.setPayload(KSBServiceLocator.getMessageHelper().serializeObject("payload"));
359 //		return dailyMessage;
360 //	}
361 //
362 //	private PersistedMessageBO getMockWeeklyMessage() throws Exception {
363 //		PersistedMessageBO weeklyMessage = new PersistedMessageBO();
364 //		weeklyMessage.setServiceName(emailReminderLifecycle.getEmailServiceName().toString());
365 //		weeklyMessage.setQueueDate(new Timestamp(System.currentTimeMillis()));
366 //		weeklyMessage.setMethodName("sendWeeklyReminder");
367 //		weeklyMessage.setQueuePriority(1);
368 //		weeklyMessage.setQueueStatus("Q");
369 //		weeklyMessage.setRetryCount(1);
370 //		weeklyMessage.setIpNumber(Utilities.getIpNumber());
371 //		weeklyMessage.setApplicationId("KEW");
372 //		weeklyMessage.setPayload(KSBServiceLocator.getMessageHelper().serializeObject("payload"));
373 //		return weeklyMessage;
374 //	}
375 
376 	private MockEmailNotificationService getMockEmailService() {
377         return (MockEmailNotificationService)KEWServiceLocator.getActionListEmailService();
378     }
379 
380 }