001    /*
002     * Copyright 2005-2007 The Kuali Foundation
003     *
004     *
005     * Licensed under the Educational Community License, Version 2.0 (the "License");
006     * you may not use this file except in compliance with the License.
007     * You may obtain a copy of the License at
008     *
009     * http://www.opensource.org/licenses/ecl2.php
010     *
011     * Unless required by applicable law or agreed to in writing, software
012     * distributed under the License is distributed on an "AS IS" BASIS,
013     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014     * See the License for the specific language governing permissions and
015     * limitations under the License.
016     */
017    package org.kuali.rice.kew.notification;
018    
019    import static org.junit.Assert.assertEquals;
020    import static org.junit.Assert.assertNull;
021    import mocks.MockEmailNotificationService;
022    
023    import org.junit.Test;
024    import org.kuali.rice.kew.api.WorkflowDocument;
025    import org.kuali.rice.kew.api.WorkflowDocumentFactory;
026    import org.kuali.rice.kew.api.action.ActionRequestType;
027    import org.kuali.rice.kew.doctype.bo.DocumentType;
028    import org.kuali.rice.kew.preferences.Preferences;
029    import org.kuali.rice.kew.preferences.service.PreferencesService;
030    import org.kuali.rice.kew.service.KEWServiceLocator;
031    import org.kuali.rice.kew.test.KEWTestCase;
032    import org.kuali.rice.kew.util.KEWConstants;
033    
034    
035    public class NotificationServiceTest extends KEWTestCase {
036    
037            protected void loadTestData() throws Exception {
038            loadXmlFile("NotificationConfig.xml");
039        }
040    
041            /**
042             * Tests that when a user is routed to twice at the same time that only email is sent to them.
043             */
044            @Test public void testNoDuplicateEmails() throws Exception {
045                    WorkflowDocument document = WorkflowDocumentFactory.createDocument(getPrincipalIdForName("user1"), "NotificationTest");
046                    document.route("");
047    
048                    assertEquals("rkirkend should only have one email.", 1, getMockEmailService().immediateReminderEmailsSent("rkirkend", document.getDocumentId(), KEWConstants.ACTION_REQUEST_APPROVE_REQ));
049                    assertEquals("ewestfal should only have one email.", 1, getMockEmailService().immediateReminderEmailsSent("ewestfal", document.getDocumentId(), KEWConstants.ACTION_REQUEST_APPROVE_REQ));
050                    assertEquals("jhopf should only have one email.", 1, getMockEmailService().immediateReminderEmailsSent("jhopf", document.getDocumentId(), KEWConstants.ACTION_REQUEST_APPROVE_REQ));
051                    // bmcgough is doing primary delegation so he should not recieve an email notification
052                    assertEquals("bmcgough should have no emails.", 0, getMockEmailService().immediateReminderEmailsSent("bmcgough", document.getDocumentId(), KEWConstants.ACTION_REQUEST_APPROVE_REQ));
053                    // jitrue should have no email because he is a secondary delegate and his default preferences should be set up to not send an email
054                    assertEquals("jitrue should have no emails.", 0, getMockEmailService().immediateReminderEmailsSent("jitrue", document.getDocumentId(), KEWConstants.ACTION_REQUEST_APPROVE_REQ));
055                    // user1 took action so they should _not_ be sent any emails
056                    assertEquals("user1 should have no emails.", 0, getMockEmailService().immediateReminderEmailsSent("user1", document.getDocumentId(), KEWConstants.ACTION_REQUEST_APPROVE_REQ));
057    
058            }
059    
060            /**
061             * Tests that the notification preferences for emails work properly.  There are four different preferences:
062             *
063             * 1) Email notification type (none, immediate, daily, weekly) - defaults to immediate
064             * 2) Send primary delegation notifications - defaults to true
065             * 3) Send secondary delegation notifications - defaults to false
066             */
067            @Test public void testEmailPreferences() throws Exception {
068                    String ewestfalPrincipalId = getPrincipalIdForName("ewestfal");
069                    String jitruePrincipalId = getPrincipalIdForName("jitrue");
070                    String rkirkendPrincipalId = getPrincipalIdForName("rkirkend");
071                    String jhopfPrincipalId = getPrincipalIdForName("jhopf");
072                    String bmcgoughPrincipalId = getPrincipalIdForName("bmcgough");
073                    String user1PrincipalId = getPrincipalIdForName("user1");
074    
075                    // test that the users with secondary delegations have default preferences
076                    assertDefaultNotificationPreferences(ewestfalPrincipalId);
077                    assertDefaultNotificationPreferences(jitruePrincipalId);
078                    assertDefaultNotificationPreferences(rkirkendPrincipalId);
079                    assertDefaultNotificationPreferences(jhopfPrincipalId);
080                    assertDefaultNotificationPreferences(bmcgoughPrincipalId);
081                    // the rest of the default setup is actually tested by testNoDuplicateEmails
082    
083                    // now turn on secondary notification for ewestfal and jitrue, turn off email notification for ewestfal
084                    Preferences prefs = getPreferencesService().getPreferences(ewestfalPrincipalId);
085                    prefs.setNotifySecondaryDelegation(KEWConstants.PREFERENCES_YES_VAL);
086                    prefs.setEmailNotification(KEWConstants.EMAIL_RMNDR_NO_VAL);
087                    getPreferencesService().savePreferences(ewestfalPrincipalId, prefs);
088                    prefs = getPreferencesService().getPreferences(jitruePrincipalId);
089                    prefs.setNotifySecondaryDelegation(KEWConstants.PREFERENCES_YES_VAL);
090                    getPreferencesService().savePreferences(jitruePrincipalId, prefs);
091    
092                    // also turn off primary delegation notification for rkirkend
093                    prefs = getPreferencesService().getPreferences(rkirkendPrincipalId);
094                    prefs.setNotifyPrimaryDelegation(KEWConstants.PREFERENCES_NO_VAL);
095                    getPreferencesService().savePreferences(rkirkendPrincipalId, prefs);
096    
097                    // also turn notification to daily for bmcgough
098                    prefs = getPreferencesService().getPreferences(bmcgoughPrincipalId);
099                    prefs.setEmailNotification(KEWConstants.EMAIL_RMNDR_DAY_VAL);
100                    getPreferencesService().savePreferences(bmcgoughPrincipalId, prefs);
101    
102                    // also turn off notification for jhopf
103                    prefs = getPreferencesService().getPreferences(jhopfPrincipalId);
104                    prefs.setEmailNotification(KEWConstants.EMAIL_RMNDR_NO_VAL);
105                    getPreferencesService().savePreferences(jhopfPrincipalId, prefs);
106    
107                    // route the document
108                    WorkflowDocument document = WorkflowDocumentFactory.createDocument(user1PrincipalId, "NotificationTest");
109                    document.route("");
110    
111                    // both ewestfal and jitrue should have one email
112                    assertEquals("ewestfal should have no emails.", 0, getMockEmailService().immediateReminderEmailsSent("ewestfal", document.getDocumentId(), KEWConstants.ACTION_REQUEST_APPROVE_REQ));
113                    assertEquals("jitrue should have one email.", 1, getMockEmailService().immediateReminderEmailsSent("jitrue", document.getDocumentId(), KEWConstants.ACTION_REQUEST_APPROVE_REQ));
114    
115                    // rkirkend (the primary delegate) should now have no emails
116                    assertEquals("rkirkend should have no emails.", 0, getMockEmailService().immediateReminderEmailsSent("rkirkend", document.getDocumentId(), KEWConstants.ACTION_REQUEST_APPROVE_REQ));
117    
118                    // jhopf should now have no emails since his top-level requests are no longer notified
119                    assertEquals("jhopf should have no emails.", 0, getMockEmailService().immediateReminderEmailsSent("jhopf", document.getDocumentId(), KEWConstants.ACTION_REQUEST_APPROVE_REQ));
120    
121                    // bmcgough should now have no emails since his notification preference is DAILY
122                    assertEquals("bmcgough should have no emails.", 0, getMockEmailService().immediateReminderEmailsSent("bmcgough", document.getDocumentId(), KEWConstants.ACTION_REQUEST_APPROVE_REQ));
123            }
124    
125            /**
126             * Tests that the fromNotificationAddress on the document type works properly.  Used to test implementation of KULWF-628.
127             */
128            @Test public void testDocumentTypeNotificationFromAddress() throws Exception {
129                    String user1PrincipalId = getPrincipalIdForName("user1");
130    
131                    // first test that the notification from addresses are configured correctly
132                    DocumentType documentType = KEWServiceLocator.getDocumentTypeService().findByName("NotificationTest");
133                    assertNull("Wrong notification from address, should be null.", documentType.getNotificationFromAddress());
134            assertNull("Wrong actual notification from address, should be null.", documentType.getActualNotificationFromAddress());
135    
136                    // test the parent document type
137                    documentType = KEWServiceLocator.getDocumentTypeService().findByName("NotificationFromAddressParent");
138                    assertEquals("Wrong notification from address.", "fakey@mcfakey.com", documentType.getNotificationFromAddress());
139    
140                    // test a child document type which overrides the parent's address
141                    documentType = KEWServiceLocator.getDocumentTypeService().findByName("NotificationFromAddressChild");
142                    assertEquals("Wrong notification from address.", "fakey@mcchild.com", documentType.getNotificationFromAddress());
143    
144                    // test a child document type which doesn't override the parent's address
145                    documentType = KEWServiceLocator.getDocumentTypeService().findByName("NotificationFromAddressChildInherited");
146                    assertEquals("Wrong notification from address.", "fakey@mcfakey.com", documentType.getNotificationFromAddress());
147    
148                    // Do an app specific route to a document which should send an email to fakey@mcchild.com
149                    WorkflowDocument document = WorkflowDocumentFactory.createDocument(user1PrincipalId, "NotificationFromAddressChild");
150                    document.adHocToPrincipal(ActionRequestType.APPROVE, "Initial", "", getPrincipalIdForName("ewestfal"), "", true);
151                    document.route("");
152    
153                    // verify that ewestfal was sent an email
154                    assertEquals("ewestfal should have an email.", 1, getMockEmailService().immediateReminderEmailsSent("ewestfal", document.getDocumentId(), KEWConstants.ACTION_REQUEST_APPROVE_REQ));
155    
156                    // we currently have no way from this test to determine the email address used for notification
157            }
158    
159            private void assertDefaultNotificationPreferences(String principalId) throws Exception {
160                    Preferences prefs = getPreferencesService().getPreferences(principalId);
161                    assertEquals(KEWConstants.EMAIL_RMNDR_IMMEDIATE, prefs.getEmailNotification());
162                    assertEquals(KEWConstants.PREFERENCES_YES_VAL, prefs.getNotifyPrimaryDelegation());
163                    assertEquals(KEWConstants.PREFERENCES_NO_VAL, prefs.getNotifySecondaryDelegation());
164            }
165    
166            private PreferencesService getPreferencesService() {
167                    return KEWServiceLocator.getPreferencesService();
168            }
169    
170            private MockEmailNotificationService getMockEmailService() {
171                    return (MockEmailNotificationService)KEWServiceLocator.getActionListEmailService();
172            }
173    
174    }