package net.thucydides.core.webdriver.integration;
import net.thucydides.core.pages.PageObject;
import net.thucydides.core.pages.Pages;
import net.thucydides.core.pages.components.FileToUpload;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.htmlunit.HtmlUnitDriver;
import org.openqa.selenium.support.FindBy;
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.URISyntaxException;
import java.nio.file.Files;
import java.nio.file.Path;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.*;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
public class WhenUploadingFiles {
public static class UploadPage extends PageObject {
@FindBy(name = "upload")
public WebElement uploadField;
public UploadPage(WebDriver driver) {
super(driver);
}
public void uploadFile(String filename) {
upload(filename).to(uploadField);
}
public void uploadFileData(String data) throws IOException {
uploadData(data).to(uploadField);
}
public void uploadFileData(byte[] data) throws IOException {
uploadData(data).to(uploadField);
}
}
private static WebDriver driver;
private static Pages pageFactory;
@BeforeClass
public static void open_local_static_site() {
driver = new HtmlUnitDriver();
pageFactory = new Pages(driver);
openStaticTestSite(driver);
}
@AfterClass
public static void closeBrowser() {
driver.quit();
}
private static void openStaticTestSite(WebDriver driver) {
File baseDir = new File(System.getProperty("user.dir"));
File testSite = new File(baseDir,"src/test/resources/static-site/index.html");
driver.get("file://" + testSite.getAbsolutePath());
}
@Test
public void should_upload_a_file_from_the_resources_directory() {
UploadPage uploadPage = pageFactory.get(UploadPage.class);
uploadPage.uploadFile("uploads/readme.txt");
assertThat(uploadPage.uploadField.getAttribute("value"), containsString("readme.txt"));
}
@Test
public void should_upload_a_file_from_the_classpath() {
UploadPage uploadPage = pageFactory.get(UploadPage.class);
uploadPage.uploadFile("/report-resources/css/core.css");
assertThat(uploadPage.uploadField.getAttribute("value"), containsString("core.css"));
}
@Test
public void should_upload_a_file_data_in_string_form() throws IOException, URISyntaxException {
UploadPage uploadPage = pageFactory.get(UploadPage.class);
uploadPage.uploadFileData("data data data");
assertThat(uploadPage.uploadField.getAttribute("value"), not(isEmptyString()));
}
@Test
public void should_upload_a_byte_array() throws IOException {
UploadPage uploadPage = pageFactory.get(UploadPage.class);
uploadPage.uploadFileData("data data data".getBytes());
assertThat(uploadPage.uploadField.getAttribute("value"), not(isEmptyString()));
}
@Test
public void should_leave_a_unix_java_path_alone_when_running_on_unix() {
String unixPath = "/home/myuser/target/test-classes/documentUpload/somefile.pdf";
if (!runningOnWindows()) {
WebElement field = mock(WebElement.class);
FileToUpload fileToUpload = new FileToUpload(unixPath);
fileToUpload.to(field);
verify(field).sendKeys(unixPath);
}
}
@Test
public void should_leave_a_windows_java_path_alone_when_running_on_windows() {
String windowsPath = "C:\\Users\\Joe Blogs\\Documents\\somefile.pdf";
if (runningOnWindows()) {
WebElement field = mock(WebElement.class);
FileToUpload fileToUpload = new FileToUpload(windowsPath);
fileToUpload.to(field);
verify(field).sendKeys(windowsPath);
}
}
private boolean runningOnWindows() {
return System.getProperty("os.name").contains("Windows");
}
@Test
public void should_recognize_a_simple_windows_path() {
assertThat(FileToUpload.isAFullWindowsPath("C:\\Projects\\somefile.pdf"), is(true));
}
@Test
public void should_recognize_a_unix_path() {
assertThat(FileToUpload.isAFullWindowsPath("/home/john/somefile.pdf"), is(false));
}
@Test
public void should_recognize_a_complex_unix_path() {
assertThat(FileToUpload.isAFullWindowsPath("/home/myuser/target/test-classes/documentUpload/somefile.pdf"), is(false));
}
@Test
public void should_upload_a_relative_path_from_the_current_working_directory() throws IOException {
Path tempPath = Files.createTempDirectory("temp");
File targetDirectory = tempPath.toFile();
File uploadedFile = new File(targetDirectory, "upload.txt");
writeTextToFile(uploadedFile);
UploadPage uploadPage = pageFactory.get(UploadPage.class);
uploadPage.uploadFile("target/upload.txt");
assertThat(uploadPage.uploadField.getAttribute("value"), containsString("upload.txt"));
}
private void writeTextToFile(File uploadedFile) throws IOException {
PrintWriter out = new PrintWriter(uploadedFile);
out.close();
}
}