/* * (C) Copyright 2014 Nuxeo SA (http://nuxeo.com/) and others. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * * Contributors: * <a href="mailto:grenard@nuxeo.com">Guillaume</a> */ package org.nuxeo.ftest.cap; import java.io.IOException; import java.util.List; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.nuxeo.functionaltests.AbstractTest; import org.nuxeo.functionaltests.Locator; import org.nuxeo.functionaltests.RestHelper; import org.nuxeo.functionaltests.pages.DocumentBasePage; import org.nuxeo.functionaltests.pages.DocumentBasePage.UserNotConnectedException; import org.openqa.selenium.Alert; import org.openqa.selenium.By; import org.openqa.selenium.NoAlertPresentException; import org.openqa.selenium.NoSuchElementException; import org.openqa.selenium.StaleElementReferenceException; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import com.google.common.base.Function; import static org.nuxeo.ftest.cap.TestConstants.TEST_FILE_TITLE; import static org.nuxeo.ftest.cap.TestConstants.TEST_FILE_URL; import static org.nuxeo.ftest.cap.TestConstants.TEST_WORKSPACE_PATH; import static org.nuxeo.ftest.cap.TestConstants.TEST_WORKSPACE_TITLE; import static org.nuxeo.functionaltests.Constants.FILE_TYPE; import static org.nuxeo.functionaltests.Constants.WORKSPACES_PATH; import static org.nuxeo.functionaltests.Constants.WORKSPACE_TYPE; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; /** * @since 5.9.3 */ public class ITRichfileUploadTest extends AbstractTest { private static final Log log = LogFactory.getLog(ITRichfileUploadTest.class); protected static final String FILES_TAB_XPATH = "//a[contains(@id,'nxw_TAB_FILES_EDIT')]/span"; private static final String NX_UPLOADED_FILES_XPATH = "//div[@class='simpleBox']"; protected static final String RF_CLEAN_ALL_ID_XPATH = "//div[@id='document_files_edit:upload']//span[@class='rf-fu-btn-cnt-clr']"; protected static final String RF_FILE_UPLOAD_INPUT_XPATH = "//div[@id='document_files_edit:upload']//input[@class='rf-fu-inp']"; protected static final String RF_UPLOADED_FILE_ITEMS_XPATH = "//div[@class='rf-fu-lst']//a[@class='rf-fu-itm-lnk']"; protected static final String STORE_UPLOAD_FILE_INPUT_VALUE_XPATH = "//input[@value='Store Uploaded Files']"; @Before public void before() { RestHelper.createDocument(WORKSPACES_PATH, WORKSPACE_TYPE, TEST_WORKSPACE_TITLE, null); RestHelper.createDocument(TEST_WORKSPACE_PATH, FILE_TYPE, TEST_FILE_TITLE, null); } @After public void after() throws UserNotConnectedException { RestHelper.cleanup(); } @Test public void testRichFileUpload() throws IOException, UserNotConnectedException { login(); open(TEST_FILE_URL); // Go to Files tab asPage(DocumentBasePage.class).clickOnDocumentTabLink(driver.findElement(By.xpath(FILES_TAB_XPATH))); // check that clear all is not visible assertFalse(Locator.findElement(By.xpath(RF_CLEAN_ALL_ID_XPATH)).isDisplayed()); // select a file final String mockFile1 = getTmpFileToUploadPath("dummy", "test", "txt"); Locator.findElement(By.xpath(RF_FILE_UPLOAD_INPUT_XPATH)).sendKeys(mockFile1); // check that submit button appears Locator.waitUntilElementPresent(By.xpath(STORE_UPLOAD_FILE_INPUT_VALUE_XPATH)); // check that clear all is visible assertTrue(Locator.findElement(By.xpath(RF_CLEAN_ALL_ID_XPATH)).isDisplayed()); // check that there is one item with the clear link List<WebElement> clearLinks = driver.findElements(By.xpath(RF_UPLOADED_FILE_ITEMS_XPATH)); assertEquals(1, clearLinks.size()); // we click the clear link clearLinks.get(0).click(); // check the submit button disappears Locator.waitUntilElementNotPresent(By.xpath(STORE_UPLOAD_FILE_INPUT_VALUE_XPATH)); // check there is not item clearLinks = driver.findElements(By.xpath(RF_UPLOADED_FILE_ITEMS_XPATH)); assertEquals(0, clearLinks.size()); // check that clear all is not visible assertFalse(driver.findElement(By.xpath(RF_CLEAN_ALL_ID_XPATH)).isDisplayed()); // do it again but with two files and use clear all final String mockFile2 = getTmpFileToUploadPath("dummy", "test", "txt"); final String mockFile3 = getTmpFileToUploadPath("dummy", "test", "txt"); Locator.findElement(By.xpath(RF_FILE_UPLOAD_INPUT_XPATH)).sendKeys(mockFile2); Locator.waitUntilElementPresent(By.xpath(STORE_UPLOAD_FILE_INPUT_VALUE_XPATH)); Locator.findElementWithTimeout(By.xpath(RF_FILE_UPLOAD_INPUT_XPATH)).sendKeys(mockFile3); // check we have 2 items clearLinks = driver.findElements(By.xpath(RF_UPLOADED_FILE_ITEMS_XPATH)); assertEquals(2, clearLinks.size()); // clear all driver.findElement(By.xpath(RF_CLEAN_ALL_ID_XPATH)).click(); // check submit disappears Locator.waitUntilElementNotPresent(By.xpath(STORE_UPLOAD_FILE_INPUT_VALUE_XPATH)); // check we have 0 items Locator.waitUntilGivenFunction(new Function<WebDriver, Boolean>() { @Override public Boolean apply(WebDriver driver) { return driver.findElements(By.xpath(RF_UPLOADED_FILE_ITEMS_XPATH)).size() == 0; } }); // check that clear all is not visible assertFalse(driver.findElement(By.xpath(RF_CLEAN_ALL_ID_XPATH)).isDisplayed()); // upload 2 and submit final String mockFile4 = getTmpFileToUploadPath("dummy", "test", "txt"); final String mockFile5 = getTmpFileToUploadPath("dummy", "test", "txt"); Locator.findElementWithTimeout(By.xpath(RF_FILE_UPLOAD_INPUT_XPATH)).sendKeys(mockFile4); Locator.waitUntilElementPresent(By.xpath(STORE_UPLOAD_FILE_INPUT_VALUE_XPATH)); Locator.findElementWithTimeout(By.xpath(RF_FILE_UPLOAD_INPUT_XPATH)).sendKeys(mockFile5); Function<WebDriver, Boolean> function = new Function<WebDriver, Boolean>() { @Override public Boolean apply(WebDriver driver) { try { driver.findElement(By.xpath(STORE_UPLOAD_FILE_INPUT_VALUE_XPATH)).click(); return false; } catch (NoSuchElementException e) { return true; } } }; Locator.waitUntilGivenFunctionIgnoring(function, StaleElementReferenceException.class); // check we have 2 uploaded files List<WebElement> uploadedFiles = driver.findElements(By.xpath(NX_UPLOADED_FILES_XPATH)); assertEquals(2, uploadedFiles.size()); // remove the first one removeFirstUploadedItem(); // check we have 1 uploaded file Locator.waitUntilGivenFunction(new Function<WebDriver, Boolean>() { @Override public Boolean apply(WebDriver driver) { return driver.findElements(By.xpath(NX_UPLOADED_FILES_XPATH)).size() == 1; } }); // reselect file and check Clear All and individual clear are still // rerendered correctly final String mockFile6 = getTmpFileToUploadPath("dummy", "test", "txt"); Locator.findElement(By.xpath(RF_FILE_UPLOAD_INPUT_XPATH)).sendKeys(mockFile6); // check that submit button appears Locator.waitUntilElementPresent(By.xpath(STORE_UPLOAD_FILE_INPUT_VALUE_XPATH)); // check that clear all is visible assertTrue(driver.findElement(By.xpath(RF_CLEAN_ALL_ID_XPATH)).isDisplayed()); // check that there is one item with the clear link clearLinks = driver.findElements(By.xpath(RF_UPLOADED_FILE_ITEMS_XPATH)); assertEquals(1, clearLinks.size()); // clear all Locator.findElementWithTimeoutAndClick(By.xpath(RF_CLEAN_ALL_ID_XPATH)); // check submit disappears Locator.waitUntilElementNotPresent(By.xpath(RF_UPLOADED_FILE_ITEMS_XPATH)); // check we have 0 items clearLinks = driver.findElements(By.xpath(RF_UPLOADED_FILE_ITEMS_XPATH)); assertEquals(0, clearLinks.size()); // remove remaining item removeFirstUploadedItem(); // wait for message to be present for ajax request to be finished before logout Locator.waitForTextPresent(By.id("ambiance-notification"), "File modified"); // logout removed to avoid random exception on server (probably an unfinished ajax request) } protected void removeFirstUploadedItem() { Locator.waitUntilGivenFunctionIgnoring(new Function<WebDriver, Boolean>() { @Override public Boolean apply(WebDriver driver) { try { driver.switchTo().alert().dismiss(); log.warn("Modal dialog present"); } catch (NoAlertPresentException e) { // Expected } List<WebElement> uploadedFiles = driver.findElements(By.xpath(NX_UPLOADED_FILES_XPATH)); Locator.waitUntilEnabledAndClick(uploadedFiles.get(0).findElements(By.tagName("a")).get(0)); Alert confirmRemove = driver.switchTo().alert(); confirmRemove.accept(); return true; } }, StaleElementReferenceException.class); } }