/*
* (C) Copyright 2013 Nuxeo SA (http://nuxeo.com/) and contributors.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the GNU Lesser General Public License
* (LGPL) version 2.1 which accompanies this distribution, and is available at
* http://www.gnu.org/licenses/lgpl.html
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* Contributors:
* Mariana Cedica
*/
package org.nuxeo.ftest.cap;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.nuxeo.ecm.core.test.FakeSmtpMailServerFeature;
import org.nuxeo.functionaltests.AbstractTest;
import org.nuxeo.functionaltests.pages.DocumentBasePage;
import org.nuxeo.functionaltests.pages.FileDocumentBasePage;
import org.nuxeo.functionaltests.pages.UserHomePage;
import org.nuxeo.functionaltests.pages.WorkflowHomePage;
import org.nuxeo.functionaltests.pages.admincenter.usermanagement.UsersGroupsBasePage;
import org.nuxeo.functionaltests.pages.admincenter.usermanagement.UsersTabSubPage;
import org.nuxeo.functionaltests.pages.tabs.SummaryTabSubPage;
import org.nuxeo.functionaltests.pages.tabs.WorkflowTabSubPage;
import org.nuxeo.runtime.test.runner.Features;
import org.nuxeo.runtime.test.runner.FeaturesRunner;
import org.openqa.selenium.By;
import org.openqa.selenium.WebElement;
/**
* @since 5.7
*/
@RunWith(FeaturesRunner.class)
@Features({ FakeSmtpMailServerFeature.class })
public class ITDefaultWorkflowTest extends AbstractTest {
private static final String USER_LINNET = "linnet_workflow";
private static final String USER_BREE = "bree_workflow";
private static final String USER_JSMITH = "jsmith_workflow";
private static final String USER_JDOE = "jdoe_workflow";
@Override
protected DocumentBasePage initRepository(DocumentBasePage currentPage)
throws Exception {
// Create test Workspace
DocumentBasePage workspacePage = super.initRepository(currentPage);
// Create test File
FileDocumentBasePage filePage = createFile(workspacePage, "Test file",
"Test File description", false, null, null, null);
return filePage;
}
protected void createTestUser(String username, String pswd)
throws Exception {
UsersGroupsBasePage page;
UsersTabSubPage usersTab = login().getAdminCenter().getUsersGroupsHomePage().getUsersTab();
usersTab = usersTab.searchUser(username);
if (!usersTab.isUserFound(username)) {
page = usersTab.getUserCreatePage().createUser(username, username,
"lastname1", "company1", "email1", pswd, "members");
usersTab = page.getUsersTab(true);
}
// search user
usersTab = usersTab.searchUser(username);
assertTrue(usersTab.isUserFound(username));
logout();
}
protected void deleteTestUser(String username) throws Exception {
UsersGroupsBasePage page = login().getAdminCenter().getUsersGroupsHomePage();
UsersTabSubPage usersTab = page.getUsersTab();
usersTab = usersTab.searchUser(username);
usersTab = usersTab.viewUser(username).deleteUser();
usersTab = usersTab.searchUser(username);
assertFalse(usersTab.isUserFound(username));
logout();
}
@Test
public void testDefaultSerialWorkflow() throws Exception {
createTestUser(USER_JDOE, USER_JDOE);
// create a file doc
DocumentBasePage defaultDomainPage = login();
DocumentBasePage filePage = initRepository(defaultDomainPage);
// start the default serial workflow and choose jdoe_workflow as
// reviewer
filePage = startDefaultSerialWorkflow(filePage, USER_JDOE);
logout();
filePage = login(USER_JDOE, USER_JDOE);
UserHomePage homePage = filePage.getUserHome();
// check that jdoe_workflow has an open task on his tasks dashboard
WorkflowHomePage workflowHomePage = homePage.getWorkflowHomePage();
assertTrue(workflowHomePage.taskExistsOnTasksDashboard("Validate the document"));
workflowHomePage.processFirstTask();
SummaryTabSubPage summaryTabPage = workflowHomePage.redirectToTask("Test file");
// check that the open task is displayed on the summary page
assertTrue(summaryTabPage.workflowAlreadyStarted());
assertTrue(summaryTabPage.openTaskForCurrentUser());
// switch to workflow tab and validate task
WorkflowTabSubPage workflowTab = summaryTabPage.getWorkflow();
WebElement taskLayoutDiv = workflowTab.getTaskLayoutNode();
// get value for Participants on the review that were set on the
// previous step
// the value is stored in a global workflow variable
String participantsOnTheReview = taskLayoutDiv.findElement(
By.className("user")).getText();
assertEquals("jdoe_workflow lastname1", participantsOnTheReview);
workflowTab.endTask("Validate");
summaryTabPage = workflowTab.getSummaryTab();
homePage = filePage.getUserHome();
// check that jdoe_workflow doesn't have the task on his workflow tasks
// dashboard
workflowHomePage = homePage.getWorkflowHomePage();
assertTrue(workflowHomePage.isTasksDashboardEmpty());
// cleanup file doc and user
logout();
login();
cleanRepository(filePage);
logout();
deleteTestUser(USER_JDOE);
}
@Test
public void testDefaultParallelWorkflow() throws Exception {
createTestUser(USER_JDOE, USER_JDOE);
createTestUser(USER_JSMITH, USER_JSMITH);
// create a file doc
DocumentBasePage defaultDomainPage = login();
DocumentBasePage filePage = initRepository(defaultDomainPage);
// start the default parallel workflow and choose jdoe_workflow and
// jsmith_workflow as
// reviewers
filePage = startDefaultParallelWorkflow(filePage);
logout();
filePage = login(USER_JDOE, USER_JDOE);
UserHomePage homePage = filePage.getUserHome();
// check that jdoe_workflow has an open task on his tasks dashboard
WorkflowHomePage workflowHomePage = homePage.getWorkflowHomePage();
assertTrue(workflowHomePage.taskExistsOnTasksDashboard("Give your opinion"));
workflowHomePage.processFirstTask();
SummaryTabSubPage summaryTabPage = workflowHomePage.redirectToTask("Test file");
// check that the open task is displayed on the summary page
assertTrue(summaryTabPage.workflowAlreadyStarted());
assertTrue(summaryTabPage.parallelOpenTaskForCurrentUser());
// switch to workflow tab and validate task
WorkflowTabSubPage workflowTab = summaryTabPage.getWorkflow();
workflowTab.endTask("Approve");
// check that jsmith_workflow has an open task on his dashboard
filePage = login(USER_JSMITH, USER_JSMITH);
homePage = filePage.getUserHome();
workflowHomePage = homePage.getWorkflowHomePage();
assertTrue(workflowHomePage.taskExistsOnTasksDashboard("Give your opinion"));
workflowHomePage.processFirstTask();
summaryTabPage = workflowHomePage.redirectToTask("Test file");
// check that the open task is displayed on the summary page
assertTrue(summaryTabPage.workflowAlreadyStarted());
assertTrue(summaryTabPage.parallelOpenTaskForCurrentUser());
// switch to workflow tab and validate task
workflowTab = summaryTabPage.getWorkflow();
workflowTab.endTask("Reject");
// login with Administrator. the workflow initiator to check the final
// task
filePage = login();
homePage = filePage.getUserHome();
workflowHomePage = homePage.getWorkflowHomePage();
assertTrue(workflowHomePage.taskExistsOnTasksDashboard("Consolidate the review"));
workflowHomePage.processFirstTask();
summaryTabPage = workflowHomePage.redirectToTask("Test file");
assertTrue(summaryTabPage.workflowAlreadyStarted());
// switch to workflow tab and validate task
workflowTab = summaryTabPage.getWorkflow();
workflowTab.endTask("Approve");
// check that the workflow was ended but jdoe_workflow doesn't have the
// right to
// start another workflow
summaryTabPage = workflowTab.getSummaryTab();
assertEquals("Approved", summaryTabPage.getCurrentLifeCycleState());
homePage = filePage.getUserHome();
// check that Administrator doesn't have the task on his workflow tasks
// dashboard
workflowHomePage = homePage.getWorkflowHomePage();
assertTrue(workflowHomePage.isTasksDashboardEmpty());
// cleanup file doc and user
logout();
login();
cleanRepository(filePage);
logout();
deleteTestUser(USER_JDOE);
deleteTestUser(USER_JSMITH);
}
@Test
public void testTaskReassignmentAndDelegation() throws Exception {
createTestUser(USER_JDOE, USER_JDOE);
createTestUser(USER_BREE, USER_BREE);
createTestUser(USER_JSMITH, USER_JSMITH);
createTestUser(USER_LINNET, USER_LINNET);
// create a file doc
DocumentBasePage defaultDomainPage = login();
DocumentBasePage filePage = initRepository(defaultDomainPage);
// start the default parallel workflow and choose jdoe_workflow and
// jsmith_workflow as
// reviewers
filePage = startDefaultParallelWorkflow(filePage);
logout();
filePage = login(USER_JDOE, USER_JDOE);
UserHomePage homePage = filePage.getUserHome();
// check that jdoe_workflow has an open task on his tasks dashboard
WorkflowHomePage workflowHomePage = homePage.getWorkflowHomePage();
assertTrue(workflowHomePage.taskExistsOnTasksDashboard("Give your opinion"));
workflowHomePage.processFirstTask();
// reassign task to bree_workflow
workflowHomePage.reassignTask("Give your opinion", USER_BREE);
// check that jdoe_workflow has no longer the task
assertTrue(workflowHomePage.isTasksDashboardEmpty());
// login with bree_workflow to process this task
filePage = login(USER_BREE, USER_BREE);
homePage = filePage.getUserHome();
workflowHomePage = homePage.getWorkflowHomePage();
assertTrue(workflowHomePage.taskExistsOnTasksDashboard("Give your opinion"));
workflowHomePage.processFirstTask();
SummaryTabSubPage summaryTabPage = workflowHomePage.redirectToTask("Test file");
// check that the open task is displayed on the summary page
assertTrue(summaryTabPage.workflowAlreadyStarted());
assertTrue(summaryTabPage.parallelOpenTaskForCurrentUser());
WorkflowTabSubPage workflowTab = summaryTabPage.getWorkflow();
workflowTab.endTask("Approve", "Approve comment");
// check that jsmith_workflow has an open task on his dashboard
filePage = login(USER_JSMITH, USER_JSMITH);
homePage = filePage.getUserHome();
workflowHomePage = homePage.getWorkflowHomePage();
assertTrue(workflowHomePage.taskExistsOnTasksDashboard("Give your opinion"));
workflowHomePage.processFirstTask();
// delegate his task to linnet_workflow
workflowHomePage.delegateTask("Give your opinion", USER_LINNET);
// test that jsmith_workflow can still see the task
assertTrue(workflowHomePage.taskExistsOnTasksDashboard("Give your opinion"));
// login with linnet_workflow to process the task
filePage = login(USER_LINNET, USER_LINNET);
homePage = filePage.getUserHome();
workflowHomePage = homePage.getWorkflowHomePage();
assertTrue(workflowHomePage.taskExistsOnTasksDashboard("Give your opinion"));
workflowHomePage.processFirstTask();
summaryTabPage = workflowHomePage.redirectToTask("Test file");
// check that the open task is displayed on the summary page
assertTrue(summaryTabPage.workflowAlreadyStarted());
assertTrue(summaryTabPage.parallelOpenTaskForCurrentUser());
// switch to workflow tab and validate task
workflowTab = summaryTabPage.getWorkflow();
workflowTab.endTask("Reject", "Reject comment");
// login with Administrator. the workflow initiator to check the final
// task
filePage = login();
homePage = filePage.getUserHome();
workflowHomePage = homePage.getWorkflowHomePage();
assertTrue(workflowHomePage.taskExistsOnTasksDashboard("Consolidate the review"));
workflowHomePage.processFirstTask();
summaryTabPage = workflowHomePage.redirectToTask("Test file");
assertTrue(summaryTabPage.workflowAlreadyStarted());
// check the consultation wrap-up
workflowTab = summaryTabPage.getWorkflow();
WebElement taskLayoutDiv = workflowTab.getTaskLayoutNode();
String parallelConsultationWrapUp = taskLayoutDiv.findElement(
By.xpath("//span[contains(@id, 'nxw_review_result')]")).getText();
assertTrue(parallelConsultationWrapUp.contains("bree_workflow lastname1 bree_workflow OK Approve comment"));
assertTrue(parallelConsultationWrapUp.contains("linnet_workflow lastname1 linnet_workflow KO Reject comment"));
// end the last task
workflowTab.endTask("Approve");
summaryTabPage = workflowTab.getSummaryTab();
assertEquals("Approved", summaryTabPage.getCurrentLifeCycleState());
homePage = filePage.getUserHome();
// check that Administrator doesn't have the task on his workflow tasks
// dashboard
workflowHomePage = homePage.getWorkflowHomePage();
assertTrue(workflowHomePage.isTasksDashboardEmpty());
// cleanup file doc and user
logout();
login();
cleanRepository(filePage);
logout();
deleteTestUser(USER_JDOE);
deleteTestUser(USER_JSMITH);
deleteTestUser(USER_BREE);
deleteTestUser(USER_LINNET);
}
protected DocumentBasePage startDefaultSerialWorkflow(
DocumentBasePage filePage, final String username) {
// start workflow
SummaryTabSubPage summaryTabPage = filePage.getSummaryTab();
summaryTabPage.startDefaultWorkflow();
assertTrue(summaryTabPage.workflowTasksForm.getText().contains(
"Please select some participants for the review"));
// click on the workflow tab
WorkflowTabSubPage workflowTab = filePage.getWorkflow();
workflowTab.showGraphView();
workflowTab.closeGraphView();
workflowTab.addWorkflowReviewer(username);
workflowTab.startWorkflow();
summaryTabPage = filePage.getSummaryTab();
assertTrue(summaryTabPage.workflowAlreadyStarted());
return filePage;
}
protected DocumentBasePage startDefaultParallelWorkflow(
DocumentBasePage filePage) {
// start workflow
SummaryTabSubPage summaryTabPage = filePage.getSummaryTab();
summaryTabPage.startDefaultParallelWorkflow();
assertTrue(summaryTabPage.workflowTasksForm.getText().contains(
"Please select some participants for the review"));
// click on the workflow tab
WorkflowTabSubPage workflowTab = filePage.getWorkflow();
workflowTab.showGraphView();
workflowTab.closeGraphView();
workflowTab.addParallelWorkflowReviewer(USER_JDOE);
workflowTab.addParallelWorkflowReviewer(USER_JSMITH);
workflowTab.addParallelWorkflowEndDate();
workflowTab.startWorkflow();
summaryTabPage = filePage.getSummaryTab();
assertTrue(summaryTabPage.workflowAlreadyStarted());
return filePage;
}
}