001/**
002 * Copyright 2005-2015 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 */
016package edu.sampleu.admin;
017
018import org.apache.commons.lang.RandomStringUtils;
019import org.kuali.rice.testtools.selenium.AutomatedFunctionalTestUtils;
020import org.kuali.rice.testtools.selenium.WebDriverUtils;
021
022/**
023 *  @author Kuali Rice Team (rice.collab@kuali.org)
024 */
025public abstract class CampusActionListAftBase extends CampusAftBase {
026
027    /**
028     * AutomatedFunctionalTestUtils.PORTAL+"?channelTitle=Campus&channelUrl="+ WebDriverUtils
029     * .getBaseUrlString()+"/kr/lookup.do?methodToCall=start&businessObjectClassName=org.kuali.rice.location.impl.campus.CampusBo&docFormKey=88888888&returnLocation="+
030     * AutomatedFunctionalTestUtils.PORTAL_URL+ AutomatedFunctionalTestUtils.HIDE_RETURN_LINK;
031     */    
032    public static final String BOOKMARK_URL = AutomatedFunctionalTestUtils.PORTAL+"?channelTitle=Campus&channelUrl="+ WebDriverUtils
033            .getBaseUrlString()+"/kr/lookup.do?methodToCall=start&businessObjectClassName=org.kuali.rice.location.impl.campus.CampusBo&docFormKey=88888888&returnLocation="+
034            AutomatedFunctionalTestUtils.PORTAL_URL+ AutomatedFunctionalTestUtils.HIDE_RETURN_LINK;
035
036    @Override
037    protected String getBookmarkUrl() {
038        return BOOKMARK_URL;
039    }
040
041    private void assertActionListRequestGroup(String userInGroup, String group, String namespace, String actionCode, String beforeState, String afterState) throws InterruptedException {
042        namespaceCode = namespace;
043        String docId = testCreateActionRequestGroup(group, namespace, actionCode);
044        impersonateUser(userInGroup);
045        assertActionList(docId, actionCode, beforeState);
046        assertOutbox(docId, afterState);
047        selectTopFrame();
048    }
049
050    private void assertActionListRequestPerson(String user, String actionType, String beforeState, String afterState) throws Exception {
051        String[][] adhocRequests = new String [][]{{user, actionType}};
052        assertActionListRequestPerson(adhocRequests, beforeState, afterState);
053    }
054
055    private void assertActionListRequestPerson(String[][] adhocRequests, String beforeState, String afterState) throws Exception {
056        String docId = testCreateActionRequestPerson(adhocRequests);
057        impersonateUser(adhocRequests[0][0]);
058        assertActionList(docId, adhocRequests[0][1], beforeState);
059        assertOutbox(docId, afterState);
060        selectTopFrame();
061    }
062
063    protected String testCreateActionRequestGroup(String user, String namespace, String actionType) throws InterruptedException{
064        String docId = testCreateNew();
065        addAdHocRecipientsGroup(new String[]{user, actionType, namespace});
066        checkForDocError();
067        waitAndClickByName("methodToCall.route");
068        waitForProgress("Submitting...");
069
070        reattemptPrimaryKey();
071
072        waitForTextPresent("Document was successfully submitted");
073        waitAndClickByName("methodToCall.close");
074
075        return docId;
076    }
077
078    /**
079     * Creates an Action Request in a users action list.
080     *
081     * Initiates a new maintenance document (Component BO) with added adHoc request to create an action request
082     * in a users action list for the document
083     * @param userActions 2d array containing username, action pairs. (ex: "fred","A")
084     *
085     * @return documentID of the newly initiated document to which the created action request applies.
086     */
087    protected String testCreateActionRequestPerson(String[][] userActions) throws InterruptedException {
088        String docId = testCreateNew();
089        if (!userActions[0][0].isEmpty()){
090            addAdHocRecipientsPerson(userActions);
091        }
092
093        checkForDocError();
094        waitAndClickByName("methodToCall.route");
095        waitForProgress("Submitting...");
096
097        reattemptPrimaryKey();
098
099        waitForTextPresent("Document was successfully submitted");
100        waitAndClickByName("methodToCall.close");
101
102        return docId;
103    }
104
105    private void reattemptPrimaryKey() throws InterruptedException {
106        int attempts = 0;
107        while (hasDocError() && extractErrorText().contains("a record with the same primary key already exists.") &&
108                ++attempts <= 3) {
109            jGrowl("record with the same primary key already exists trying another, attempt: " + attempts);
110            clearTextByName("document.newMaintainableObject.code"); // primary key
111            jiraAwareTypeByName("document.newMaintainableObject.code", RandomStringUtils.randomAlphanumeric(2));
112            waitAndClickByName("methodToCall.route");
113            waitForProgress("Submitting...");
114        }
115    }
116
117    public void testActionListAcknowledgeGroup() throws Exception {
118        assertActionListRequestGroup("fran", "RecipeMasters", "KR-WKFLW", "K", "PROCESSED", "FINAL");
119        passed();
120    }
121
122    /**
123     * tests the Acknowledge ActionRequest.
124     * Creates an Acknowledge request for a user. Then performs the Acknowledge action.
125     * @throws Exception
126     */
127    public void testActionListAcknowledgePerson() throws Exception {
128        assertActionListRequestPerson("erin", "K", "PROCESSED", "FINAL");
129        passed();
130    }
131
132    /**
133     * tests the Acknowledge ActionRequest.
134     * Creates an Acknowledge request for a user and an approve request for a different user.
135     * Then performs the Acknowledge action.
136     * @throws Exception
137     */
138    public void testActionListAcknowledgePerson_WithPendingApprove() throws Exception {
139        String[][] adhocRequests = new String [][]{{"fred","A"},{"fran","K"}};
140        String docId = testCreateActionRequestPerson(adhocRequests);
141        impersonateUser("fran");
142        assertActionList(docId, "K", "ENROUTE");
143        assertOutbox(docId, "ENROUTE");
144        selectTopFrame();
145        passed();
146    }
147
148    /**
149     * tests the Acknowledge ActionRequest.
150     * Creates an Acknowledge request for a user and an approve request for a different user.
151     * Then performs the Acknowledge action.
152     * @throws Exception
153     */
154    public void testActionListAcknowledgePerson_WithPendingAcknowledge() throws Exception {
155        String[][] adhocRequests = new String [][]{{"fred","K"},{"fran","K"}};
156        String docId = testCreateActionRequestPerson(adhocRequests);
157        impersonateUser("fran");
158        assertActionList(docId, "K", "PROCESSED");
159        assertOutbox(docId, "PROCESSED");
160        selectTopFrame();
161        passed();
162    }
163
164    /**
165     * tests the Approve ActionRequest.
166     * Creates an approve request for a user. Then performs the Approve action.
167     * @throws Exception
168     */
169    public void testActionListApprovePerson() throws Exception {
170        assertActionListRequestPerson("fred", "A", "ENROUTE", "FINAL");
171        passed();
172    }
173
174    /**
175     * tests the Approve ActionRequest.
176     * Creates an Approve request for a user and a separate approve request for a different user.
177     * Then performs the first users Approve action.
178     * @throws Exception
179     */
180    public void testActionListApprovePerson_WithPendingApprove() throws Exception {
181        String[][] adhocRequests = new String [][]{{"fred","A"},{"fran","A"}};
182        assertActionListRequestPerson(adhocRequests, "ENROUTE", "ENROUTE");
183        passed();
184    }
185
186    /**
187     * tests the Approve ActionRequest.
188     * Creates an Approve request for a user and a separate approve request for a different user.
189     * Then performs the first users Approve action.
190     * @throws Exception
191     */
192    public void testActionListApprovePerson_WithPendingAcknowledge() throws Exception {
193        String[][] adhocRequests = new String [][]{{"fran","A"},{"fred","K"}};
194        assertActionListRequestPerson(adhocRequests, "ENROUTE", "PROCESSED");
195        passed();
196    }
197
198    public void testActionListApproveGroup() throws Exception {
199        assertActionListRequestGroup("fred", "RecipeMasters", "KR-WKFLW", "A", "ENROUTE", "FINAL");
200        passed();
201    }
202
203    public void testActionListCompleteGroup() throws Exception {
204        assertActionListRequestGroup("dev1", "Kuali Developers", "KUALI", "C", "ENROUTE", "FINAL");
205        passed();
206    }
207
208    /**
209     * tests the complete ActionRequest.
210     * Creates an complete request for a user. Then performs the Complete action.
211     * @throws Exception
212     */
213    public void testActionListCompletePerson() throws Exception {
214        assertActionListRequestPerson("fran", "C", "ENROUTE", "FINAL");
215        passed();
216    }
217
218    public void testActionListCompletePerson_WithPendingAcknowledge() throws Exception {
219        String[][] adhocRequests = new String [][]{{"fran","C"},{"fred","K"}};
220        assertActionListRequestPerson(adhocRequests, "ENROUTE", "PROCESSED");
221        passed();
222    }
223
224    public void testActionListDisapproveGroup() throws Exception {
225        assertActionListRequestGroup("director", "ChickenRecipeMasters", "KR-WKFLW", "D", "ENROUTE", "DISAPPROVED");
226        passed();
227    }
228
229    /**
230     * tests the  ActionRequest.
231     * Creates an approve request for a user. Then performs the Disapprove action.
232     * @throws Exception
233     */
234    public void testActionListDisapprovePerson() throws Exception {
235        assertActionListRequestPerson("fred", "D", "ENROUTE", "DISAPPROVED");
236        passed();
237    }
238
239    public void testActionListFyiGroup() throws Exception {
240        assertActionListRequestGroup("dev2", "Kuali Developers", "KUALI", "F", "FINAL", "FINAL");
241        passed();
242    }
243
244    /**
245     * tests the FYI ActionRequest.
246     * Creates an FYI request for a user. Then performs the FYI action.
247     * @throws Exception
248     */
249    public void testActionListFyiPerson() throws Exception {
250        assertActionListRequestPerson("eric", "F", "FINAL", "FINAL");
251        passed();
252    }
253
254
255
256    public void testActionListCancelPerson() throws Exception {
257        assertActionListRequestGroup("dev2", "Kuali Developers", "KUALI", "F", "FINAL", "FINAL");
258        passed();
259    }
260
261    public void testCampusActionListRecallAndCancel_WithPendingPersonApprove() throws Exception {
262        String user = "erin";
263        String docId = testCreateNew();
264        addAdHocRecipientsPerson(new String[]{user, "A"});
265        submit();
266        recall(true);
267        impersonateUser(user);
268        assertNotInActionList(docId);
269        passed();
270    }
271
272    public void testCampusActionListRecallToActionList_WithPendingPersonApprove() throws Exception {
273        String user = "erin";
274
275        String docId = testCreateNew();
276        addAdHocRecipientsPerson(new String[]{user, "A"});
277        submit();
278        waitForTextPresent("ENROUTE");
279        recall(false);
280        // TODO: new window vs. new tab issue
281        assertActionList(docId, "CR", "SAVED");
282
283        driver.navigate().to(WebDriverUtils.getBaseUrlString() + BOOKMARK_URL);
284        waitAndClickDocSearch();
285        selectFrameIframePortlet();
286        waitAndTypeByName("documentId",docId);
287        waitAndClickByXpath(SEARCH_XPATH);
288        waitForTextPresent("FINAL");
289        passed();
290    }
291
292    public void testCampusActionListCancel_WithPendingPersonApprove()throws Exception {
293        String docId = testCreateNew();
294        addAdHocRecipientsPerson(new String[]{"fred", "A"});
295        waitAndClickByName("methodToCall.cancel");
296        assertDocSearchNoResults(docId);
297        passed();
298    }
299
300    public void testCampusActionListSave_WithPendingPersonApprove() throws Exception {
301        String user = "erin";
302        String docId = testCreateNew();
303        addAdHocRecipientsPerson(new String[]{user, "A"});
304        saveAndReload();
305        waitForTextPresent("SAVED");
306        passed();
307    }
308
309    public void assertCampusActionListSubmit_WithPersonRequest(String user, String action, String state) throws Exception {
310        String[][] userActions = new String [][]{{user, action}};
311        String docId = testCreateNew();
312        if (!userActions[0][0].isEmpty()){
313            addAdHocRecipientsPerson(userActions);
314        }
315
316        checkForDocError();
317        waitAndClickByName("methodToCall.route");
318        waitForProgress("Submitting...");
319
320        reattemptPrimaryKey();
321
322        waitForTextPresent("Document was successfully submitted");
323
324        waitForTextPresent("ENROUTE");
325        waitAndClickByName("methodToCall.reload");
326        waitForTextPresent(state);
327        close();
328    }
329
330    public void testCampusActionListSubmit() throws Exception {
331        assertCampusActionListSubmit_WithPersonRequest("", "", "FINAL");
332        passed();
333    }
334
335    public void testCampusActionListSubmit_WithPendingPersonApprove() throws Exception {
336        assertCampusActionListSubmit_WithPersonRequest("erin", "A", "ENROUTE");
337        passed();
338    }
339
340    public void testCampusActionListSubmit_WithPendingPersonAcknowledge() throws Exception {
341        assertCampusActionListSubmit_WithPersonRequest("erin", "K", "PROCESSED");
342        passed();
343    }
344
345    public void testCampusActionListSubmit_WithPendingPersonFyi() throws Exception {
346        assertCampusActionListSubmit_WithPersonRequest("erin", "F", "FINAL");
347        passed();
348    }
349
350
351}