From fba85bde74a272d6c9379a5efa16af20f3d50959 Mon Sep 17 00:00:00 2001 From: Damian Jansen Date: Wed, 29 Jan 2014 15:18:05 +1000 Subject: [PATCH] Basic translation tests for the File type project Tests OpenOffice, InDesign, html and plain text for upload, parse and translation. --- functional-test/pom.xml | 11 ++ .../java/org/zanata/page/AbstractPage.java | 4 + .../zanata/page/utility/DashboardPage.java | 6 + .../org/zanata/page/webtrans/EditorPage.java | 114 ++++++++++++- .../org/zanata/util/TestFileGenerator.java | 12 +- .../feature/editor/EditorTestSuite.java | 36 ++++ .../feature/editor/TranslateHTMLTest.java | 141 ++++++++++++++++ .../feature/editor/TranslateIdmlTest.java | 133 +++++++++++++++ .../feature/editor/TranslateOdsTest.java | 155 ++++++++++++++++++ .../editor/TranslateOpenOfficeTest.java | 145 ++++++++++++++++ .../feature/editor/TranslateTextTest.java | 131 +++++++++++++++ .../src/test/resources/test-idml.idml | Bin 0 -> 34913 bytes .../src/test/resources/test-odg.odg | Bin 0 -> 9024 bytes .../src/test/resources/test-odp.odp | Bin 0 -> 10522 bytes .../src/test/resources/test-ods.ods | Bin 0 -> 7792 bytes .../src/test/resources/test-odt.odt | Bin 0 -> 8772 bytes 16 files changed, 880 insertions(+), 8 deletions(-) create mode 100644 functional-test/src/test/java/org/zanata/feature/editor/EditorTestSuite.java create mode 100644 functional-test/src/test/java/org/zanata/feature/editor/TranslateHTMLTest.java create mode 100644 functional-test/src/test/java/org/zanata/feature/editor/TranslateIdmlTest.java create mode 100644 functional-test/src/test/java/org/zanata/feature/editor/TranslateOdsTest.java create mode 100644 functional-test/src/test/java/org/zanata/feature/editor/TranslateOpenOfficeTest.java create mode 100644 functional-test/src/test/java/org/zanata/feature/editor/TranslateTextTest.java create mode 100644 functional-test/src/test/resources/test-idml.idml create mode 100644 functional-test/src/test/resources/test-odg.odg create mode 100644 functional-test/src/test/resources/test-odp.odp create mode 100644 functional-test/src/test/resources/test-ods.ods create mode 100644 functional-test/src/test/resources/test-odt.odt diff --git a/functional-test/pom.xml b/functional-test/pom.xml index 5d8ac9d21c..e6d52a16fd 100644 --- a/functional-test/pom.xml +++ b/functional-test/pom.xml @@ -545,6 +545,17 @@ **/*.xml + + src/test/resources + false + + **/*.odt + **/*.odg + **/*.ods + **/*.odp + **/*.idml + + src/test/resources/zanata-user-config true diff --git a/functional-test/src/main/java/org/zanata/page/AbstractPage.java b/functional-test/src/main/java/org/zanata/page/AbstractPage.java index cc06774efc..3489d1476d 100644 --- a/functional-test/src/main/java/org/zanata/page/AbstractPage.java +++ b/functional-test/src/main/java/org/zanata/page/AbstractPage.java @@ -49,6 +49,10 @@ public class AbstractPage { private final WebDriver driver; private final FluentWait ajaxWaitForTenSec; + public void reload() { + getDriver().navigate().refresh(); + } + public void deleteCookiesAndRefresh() { getDriver().manage().deleteAllCookies(); Set cookies = getDriver().manage().getCookies(); diff --git a/functional-test/src/main/java/org/zanata/page/utility/DashboardPage.java b/functional-test/src/main/java/org/zanata/page/utility/DashboardPage.java index e9dca052d0..1801ccc4a9 100644 --- a/functional-test/src/main/java/org/zanata/page/utility/DashboardPage.java +++ b/functional-test/src/main/java/org/zanata/page/utility/DashboardPage.java @@ -29,6 +29,7 @@ import org.openqa.selenium.support.FindBy; import org.openqa.selenium.support.ui.ExpectedConditions; import org.zanata.page.BasePage; +import org.zanata.page.projects.CreateProjectPage; import org.zanata.util.WebElementUtil; public class DashboardPage extends BasePage { @@ -83,4 +84,9 @@ public void clickMoreActivity() { public WebElement getMoreActivityElement() { return getDriver().findElement(By.id("moreActivity")); } + + public CreateProjectPage clickCreateYourOwn() { + getDriver().findElement(By.linkText("create your own")).click(); + return new CreateProjectPage(getDriver()); + } } diff --git a/functional-test/src/main/java/org/zanata/page/webtrans/EditorPage.java b/functional-test/src/main/java/org/zanata/page/webtrans/EditorPage.java index dbee1e5d53..7ca1184a1f 100644 --- a/functional-test/src/main/java/org/zanata/page/webtrans/EditorPage.java +++ b/functional-test/src/main/java/org/zanata/page/webtrans/EditorPage.java @@ -1,18 +1,38 @@ +/* + * Copyright 2014, Red Hat, Inc. and individual contributors as indicated by the + * @author tags. See the copyright.txt file in the distribution for a full + * listing of individual contributors. + * + * This is free software; you can redistribute it and/or modify it under the + * terms of the GNU Lesser General Public License as published by the Free + * Software Foundation; either version 2.1 of the License, or (at your option) + * any later version. + * + * This software 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. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this software; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA, or see the FSF + * site: http://www.fsf.org. + */ package org.zanata.page.webtrans; -import java.util.Collections; -import java.util.List; - +import com.google.common.base.Function; +import com.google.common.base.Joiner; +import com.google.common.base.Predicate; +import lombok.extern.slf4j.Slf4j; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.support.FindBy; import org.zanata.page.BasePage; import org.zanata.util.WebElementUtil; -import com.google.common.base.Function; -import com.google.common.base.Joiner; -import com.google.common.base.Predicate; -import lombok.extern.slf4j.Slf4j; + +import java.util.Collections; +import java.util.List; /** * @author Patrick Huang () { + @Override + public Boolean apply(WebDriver input) { + // code mirror will turn text into list of
.
+                return input.findElement(By.className("gwt-TabLayoutPanelContentContainer")).isDisplayed();
+            }
+        });
+
+    }
+
+    public String getBasicTranslationTargetAtRowIndex(final int rowIndex) {
+        return getContentAtRowIndex(rowIndex, TARGET_ID_FMT, SINGULAR);
+    }
+
+    /**
+     * Get content from a target using the non-CodeMirror configuration
+     * @param rowIndex
+     * @return row target content
+     */
+    private String getContentAtRowIndex(final long rowIndex,
+                                        final String idFormat,
+                                        final int pluralIndex) {
+        return waitForTenSec().until(new Function() {
+            @Override
+            public String apply(WebDriver input) {
+                return input.findElement(By.id(String.format(idFormat, rowIndex, pluralIndex))).getAttribute("value");
+            }
+        });
+    }
+
+    /**
+     * Translate a target using the non-CodeMirror field
+     * @param rowIndex
+     * @param text
+     * @return updated EditorPage
+     */
+    public EditorPage translateTargetAtRowIndex(final int rowIndex, String text) {
+        setTargetContent(rowIndex, text, TARGET_ID_FMT, SINGULAR);
+        return new EditorPage(getDriver());
+    }
+
+    private void setTargetContent(final long rowIndex, final String text,
+            final String idFormat, final int pluralIndex) {
+        WebElement we = waitForTenSec().until(new Function() {
+            @Override
+            public WebElement apply(WebDriver input) {
+                return input.findElement(
+                        By.id(String.format(idFormat, rowIndex, pluralIndex)));
+            }
+        });
+        we.click();
+        we.sendKeys(text);
+    }
+
+    /**
+     * Press the Approve button for the currently selected translation row
+     * @return new Editor page object
+     */
+    public EditorPage approveSelectedTranslation() {
+        WebElement approve = waitForTenSec().until(new Function() {
+            @Override
+            public WebElement apply(WebDriver input) {
+                return input.findElement(By.className("selected"))
+                        .findElement(By.className("icon-install"));
+            }
+        });
+        approve.click();
+        return new EditorPage(getDriver());
+    }
 }
diff --git a/functional-test/src/main/java/org/zanata/util/TestFileGenerator.java b/functional-test/src/main/java/org/zanata/util/TestFileGenerator.java
index 3f611eacbe..12c879319a 100644
--- a/functional-test/src/main/java/org/zanata/util/TestFileGenerator.java
+++ b/functional-test/src/main/java/org/zanata/util/TestFileGenerator.java
@@ -24,6 +24,7 @@
 
 import java.io.*;
 import java.nio.charset.Charset;
+import java.util.zip.*;
 
 /**
  * Create and manipulate basic text files for testing.
@@ -87,7 +88,8 @@ private void setTestFileContent(File testFile, String testContent) {
             OutputStreamWriter outputStreamWriter = new OutputStreamWriter(
                     new FileOutputStream(testFile),
                     Charset.forName("UTF-8").newEncoder());
-            outputStreamWriter.write(testContent);
+            outputStreamWriter.write(testContent
+                    .replaceAll("\n", System.getProperty("line.separator")));
             outputStreamWriter.flush();
             outputStreamWriter.close();
         } catch (IOException ioException) {
@@ -154,4 +156,12 @@ public String getFirstFileNameInDirectory(String directory) {
                     + " but none found.");
         }
     }
+
+    public File openTestFile(String filename) {
+        String relativePath = "functional-test/target/test-classes/"
+                .concat(filename);
+        File testFile = new File(relativePath);
+        assert testFile.exists();
+        return testFile;
+    }
 }
diff --git a/functional-test/src/test/java/org/zanata/feature/editor/EditorTestSuite.java b/functional-test/src/test/java/org/zanata/feature/editor/EditorTestSuite.java
new file mode 100644
index 0000000000..86699be61b
--- /dev/null
+++ b/functional-test/src/test/java/org/zanata/feature/editor/EditorTestSuite.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright 2014, Red Hat, Inc. and individual contributors as indicated by the
+ * @author tags. See the copyright.txt file in the distribution for a full
+ * listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it under the
+ * terms of the GNU Lesser General Public License as published by the Free
+ * Software Foundation; either version 2.1 of the License, or (at your option)
+ * any later version.
+ *
+ * This software 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.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this software; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA, or see the FSF
+ * site: http://www.fsf.org.
+ */
+package org.zanata.feature.editor;
+
+import org.junit.runner.RunWith;
+import org.junit.runners.Suite;
+
+/**
+ * @author Damian Jansen
+ * djansen@redhat.com
+ */
+@RunWith(Suite.class)
+@Suite.SuiteClasses({ TranslateHTMLTest.class, TranslateOdsTest.class,
+        TranslateOpenOfficeTest.class, TranslateIdmlTest.class,
+        TranslateTextTest.class })
+
+public class EditorTestSuite {
+}
diff --git a/functional-test/src/test/java/org/zanata/feature/editor/TranslateHTMLTest.java b/functional-test/src/test/java/org/zanata/feature/editor/TranslateHTMLTest.java
new file mode 100644
index 0000000000..ae04e879d6
--- /dev/null
+++ b/functional-test/src/test/java/org/zanata/feature/editor/TranslateHTMLTest.java
@@ -0,0 +1,141 @@
+/*
+ * Copyright 2014, Red Hat, Inc. and individual contributors as indicated by the
+ * @author tags. See the copyright.txt file in the distribution for a full
+ * listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it under the
+ * terms of the GNU Lesser General Public License as published by the Free
+ * Software Foundation; either version 2.1 of the License, or (at your option)
+ * any later version.
+ *
+ * This software 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.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this software; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA, or see the FSF
+ * site: http://www.fsf.org.
+ */
+package org.zanata.feature.editor;
+
+import org.hamcrest.Matchers;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.experimental.categories.Category;
+import org.junit.experimental.theories.DataPoint;
+import org.junit.experimental.theories.Theories;
+import org.junit.experimental.theories.Theory;
+import org.junit.runner.RunWith;
+import org.zanata.feature.DetailedTest;
+import org.zanata.page.projects.ProjectVersionPage;
+import org.zanata.page.webtrans.EditorPage;
+import org.zanata.util.CleanDocumentStorageRule;
+import org.zanata.util.SampleProjectRule;
+import org.zanata.util.TestFileGenerator;
+import org.zanata.workflow.BasicWorkFlow;
+import org.zanata.workflow.LoginWorkFlow;
+import org.zanata.workflow.ProjectWorkFlow;
+
+import java.io.File;
+import java.util.HashMap;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.zanata.util.FunctionalTestHelper.assumeFalse;
+
+/**
+ * @author Damian Jansen
+ * djansen@redhat.com
+ */
+@RunWith(Theories.class)
+@Category(DetailedTest.class)
+public class TranslateHTMLTest {
+
+    @Rule
+    public SampleProjectRule sampleProjectRule = new SampleProjectRule();
+
+    @Rule
+    public CleanDocumentStorageRule documentStorageRule =
+            new CleanDocumentStorageRule();
+
+    private TestFileGenerator testFileGenerator = new TestFileGenerator();
+
+    @DataPoint
+    public static String TEST_htm = "htm";
+    @DataPoint
+    public static String TEST_html = "html";
+
+    @Before
+    public void before() {
+        new BasicWorkFlow().goToHome().deleteCookiesAndRefresh();
+        assumeFalse("", new File(CleanDocumentStorageRule
+                .getDocumentStoragePath()
+                .concat(File.separator).concat("documents")
+                .concat(File.separator)).exists());
+        new LoginWorkFlow().signIn("admin", "admin");
+    }
+
+    @Theory
+    public void translateBasicHTMLFile(String extension) {
+        File testfile = testFileGenerator
+                .generateTestFileWithContent("basichtml", "." + extension,
+                        "Line One

Line Two

"+ + "Line Three"); + + HashMap projectSettings = ProjectWorkFlow.projectDefaults(); + projectSettings.put("Project ID", extension + "-project"); + projectSettings.put("Name", extension + "-project"); + projectSettings.put("Project Type", "File"); + + EditorPage editorPage = new ProjectWorkFlow() + .createNewProject(projectSettings).clickCreateVersionLink() + .inputVersionId(extension).saveVersion() + .goToSourceDocuments().pressUploadFileButton() + .enterFilePath(testfile.getAbsolutePath()).submitUpload() + .clickBreadcrumb(extension, ProjectVersionPage.class) + .translate("fr").clickDocumentLink("", testfile.getName()); + + editorPage.setSyntaxHighlighting(false); + + assertThat("Item 1 shows Line One", + editorPage.getTranslationSourceAtRowIndex(0), + Matchers.equalTo("Line One")); + assertThat("Item 2 shows Line Two", + editorPage.getTranslationSourceAtRowIndex(1), + Matchers.equalTo("Line Two")); + assertThat("Item 3 shows Line Three", + editorPage.getTranslationSourceAtRowIndex(2), + Matchers.equalTo("Line Three")); + + editorPage = editorPage.translateTargetAtRowIndex(0, "Une Ligne") + .approveSelectedTranslation(); + editorPage = editorPage.translateTargetAtRowIndex(1, "Deux Ligne") + .approveSelectedTranslation(); + editorPage = editorPage.translateTargetAtRowIndex(2, "Ligne Trois") + .approveSelectedTranslation(); + + assertThat("Item 1 shows a translation of Line One", + editorPage.getBasicTranslationTargetAtRowIndex(0), + Matchers.equalTo("Une Ligne")); + assertThat("Item 1 shows a translation of Line One", + editorPage.getBasicTranslationTargetAtRowIndex(1), + Matchers.equalTo("Deux Ligne")); + assertThat("Item 1 shows a translation of Line One", + editorPage.getBasicTranslationTargetAtRowIndex(2), + Matchers.equalTo("Ligne Trois")); + + // Close and reopen the editor to test save, switches to CodeMirror + editorPage.reload(); + + assertThat("Item 1 shows a translation of Line One", + editorPage.getTranslationTargetAtRowIndex(0), + Matchers.equalTo("Une Ligne")); + assertThat("Item 1 shows a translation of Line One", + editorPage.getTranslationTargetAtRowIndex(1), + Matchers.equalTo("Deux Ligne")); + assertThat("Item 1 shows a translation of Line One", + editorPage.getTranslationTargetAtRowIndex(2), + Matchers.equalTo("Ligne Trois")); + } +} diff --git a/functional-test/src/test/java/org/zanata/feature/editor/TranslateIdmlTest.java b/functional-test/src/test/java/org/zanata/feature/editor/TranslateIdmlTest.java new file mode 100644 index 0000000000..9ade3cb60c --- /dev/null +++ b/functional-test/src/test/java/org/zanata/feature/editor/TranslateIdmlTest.java @@ -0,0 +1,133 @@ +/* + * Copyright 2014, Red Hat, Inc. and individual contributors as indicated by the + * @author tags. See the copyright.txt file in the distribution for a full + * listing of individual contributors. + * + * This is free software; you can redistribute it and/or modify it under the + * terms of the GNU Lesser General Public License as published by the Free + * Software Foundation; either version 2.1 of the License, or (at your option) + * any later version. + * + * This software 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. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this software; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA, or see the FSF + * site: http://www.fsf.org. + */ +package org.zanata.feature.editor; + +import org.hamcrest.Matchers; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.experimental.categories.Category; +import org.zanata.feature.DetailedTest; +import org.zanata.page.projects.ProjectSourceDocumentsPage; +import org.zanata.page.projects.ProjectVersionPage; +import org.zanata.page.webtrans.EditorPage; +import org.zanata.util.CleanDocumentStorageRule; +import org.zanata.util.SampleProjectRule; +import org.zanata.util.TestFileGenerator; +import org.zanata.workflow.BasicWorkFlow; +import org.zanata.workflow.LoginWorkFlow; +import org.zanata.workflow.ProjectWorkFlow; + +import java.io.File; +import java.util.HashMap; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.zanata.util.FunctionalTestHelper.assumeFalse; + +/** + * @author Damian Jansen + * djansen@redhat.com + */ +@Category(DetailedTest.class) +public class TranslateIdmlTest { + + @Rule + public SampleProjectRule sampleProjectRule = new SampleProjectRule(); + + @Rule + public CleanDocumentStorageRule documentStorageRule = + new CleanDocumentStorageRule(); + + private TestFileGenerator testFileGenerator = new TestFileGenerator(); + + @Before + public void before() { + new BasicWorkFlow().goToHome().deleteCookiesAndRefresh(); + assumeFalse("", new File(CleanDocumentStorageRule + .getDocumentStoragePath() + .concat(File.separator).concat("documents") + .concat(File.separator)).exists()); + new LoginWorkFlow().signIn("admin", "admin"); + } + + @Test + public void translateBasicIdmlFile() { + File testfile = testFileGenerator.openTestFile("test-idml.idml"); + + HashMap projectSettings = ProjectWorkFlow.projectDefaults(); + projectSettings.put("Project ID", "idml-project"); + projectSettings.put("Name", "idml-project"); + projectSettings.put("Project Type", "File"); + + ProjectSourceDocumentsPage projectSourceDocumentsPage = new + ProjectWorkFlow() + .createNewProject(projectSettings).clickCreateVersionLink() + .inputVersionId("idml").saveVersion() + .goToSourceDocuments().pressUploadFileButton() + .enterFilePath(testfile.getAbsolutePath()).submitUpload(); + + EditorPage editorPage = projectSourceDocumentsPage + .clickBreadcrumb("idml", ProjectVersionPage.class) + .translate("fr").clickDocumentLink("", testfile.getName()); + + editorPage.setSyntaxHighlighting(false); + + assertThat("Item 1 shows Line One", + editorPage.getTranslationSourceAtRowIndex(0), + Matchers.equalTo("Line One")); + assertThat("Item 2 shows Line Two", + editorPage.getTranslationSourceAtRowIndex(1), + Matchers.equalTo("Line Two")); + assertThat("Item 3 shows Line Three", + editorPage.getTranslationSourceAtRowIndex(2), + Matchers.equalTo("Line Three")); + + editorPage = editorPage.translateTargetAtRowIndex(0, "Une Ligne") + .approveSelectedTranslation(); + editorPage = editorPage.translateTargetAtRowIndex(1, "Deux Ligne") + .approveSelectedTranslation(); + editorPage = editorPage.translateTargetAtRowIndex(2, "Ligne Trois") + .approveSelectedTranslation(); + + assertThat("Item 1 shows a translation of Line One", + editorPage.getBasicTranslationTargetAtRowIndex(0), + Matchers.equalTo("Une Ligne")); + assertThat("Item 1 shows a translation of Line One", + editorPage.getBasicTranslationTargetAtRowIndex(1), + Matchers.equalTo("Deux Ligne")); + assertThat("Item 1 shows a translation of Line One", + editorPage.getBasicTranslationTargetAtRowIndex(2), + Matchers.equalTo("Ligne Trois")); + + // Close and reopen the editor to test save, switches to CodeMirror + editorPage.reload(); + + assertThat("Item 1 shows a translation of Line One", + editorPage.getTranslationTargetAtRowIndex(0), + Matchers.equalTo("Une Ligne")); + assertThat("Item 1 shows a translation of Line One", + editorPage.getTranslationTargetAtRowIndex(1), + Matchers.equalTo("Deux Ligne")); + assertThat("Item 1 shows a translation of Line One", + editorPage.getTranslationTargetAtRowIndex(2), + Matchers.equalTo("Ligne Trois")); + } +} diff --git a/functional-test/src/test/java/org/zanata/feature/editor/TranslateOdsTest.java b/functional-test/src/test/java/org/zanata/feature/editor/TranslateOdsTest.java new file mode 100644 index 0000000000..7149d9ac64 --- /dev/null +++ b/functional-test/src/test/java/org/zanata/feature/editor/TranslateOdsTest.java @@ -0,0 +1,155 @@ +/* + * Copyright 2014, Red Hat, Inc. and individual contributors as indicated by the + * @author tags. See the copyright.txt file in the distribution for a full + * listing of individual contributors. + * + * This is free software; you can redistribute it and/or modify it under the + * terms of the GNU Lesser General Public License as published by the Free + * Software Foundation; either version 2.1 of the License, or (at your option) + * any later version. + * + * This software 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. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this software; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA, or see the FSF + * site: http://www.fsf.org. + */ +package org.zanata.feature.editor; + +import org.hamcrest.Matchers; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.experimental.categories.Category; +import org.zanata.feature.DetailedTest; +import org.zanata.page.projects.ProjectSourceDocumentsPage; +import org.zanata.page.projects.ProjectVersionPage; +import org.zanata.page.webtrans.EditorPage; +import org.zanata.util.CleanDocumentStorageRule; +import org.zanata.util.SampleProjectRule; +import org.zanata.util.TestFileGenerator; +import org.zanata.workflow.BasicWorkFlow; +import org.zanata.workflow.LoginWorkFlow; +import org.zanata.workflow.ProjectWorkFlow; + +import java.io.File; +import java.util.HashMap; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.zanata.util.FunctionalTestHelper.assumeFalse; + +/** + * @author Damian Jansen + * djansen@redhat.com + */ +@Category(DetailedTest.class) +public class TranslateOdsTest { + + @Rule + public SampleProjectRule sampleProjectRule = new SampleProjectRule(); + + @Rule + public CleanDocumentStorageRule documentStorageRule = + new CleanDocumentStorageRule(); + + private TestFileGenerator testFileGenerator = new TestFileGenerator(); + + @Before + public void before() { + new BasicWorkFlow().goToHome().deleteCookiesAndRefresh(); + assumeFalse("", new File(CleanDocumentStorageRule + .getDocumentStoragePath() + .concat(File.separator).concat("documents") + .concat(File.separator)).exists()); + new LoginWorkFlow().signIn("admin", "admin"); + } + + @Test + public void translateBasicOdsFile() { + File testfile = testFileGenerator.openTestFile("test-ods.ods"); + + HashMap projectSettings = ProjectWorkFlow.projectDefaults(); + projectSettings.put("Project ID", "ods-project"); + projectSettings.put("Name", "ods-project"); + projectSettings.put("Project Type", "File"); + + ProjectSourceDocumentsPage projectSourceDocumentsPage = new + ProjectWorkFlow() + .createNewProject(projectSettings).clickCreateVersionLink() + .inputVersionId("ods").saveVersion() + .goToSourceDocuments().pressUploadFileButton() + .enterFilePath(testfile.getAbsolutePath()).submitUpload(); + + EditorPage editorPage = projectSourceDocumentsPage + .clickBreadcrumb("ods", ProjectVersionPage.class) + .translate("fr").clickDocumentLink("", testfile.getName()); + + editorPage.setSyntaxHighlighting(false); + + assertThat("Item 1 shows TestODS (the sheet name)", + editorPage.getTranslationSourceAtRowIndex(0), + Matchers.equalTo("TestODS")); + assertThat("Item 2 shows First (the page name)", + editorPage.getTranslationSourceAtRowIndex(1), + Matchers.equalTo("First")); + assertThat("Item 3 shows Line One", + editorPage.getTranslationSourceAtRowIndex(2), + Matchers.equalTo("Line One")); + assertThat("Item 4 shows Line Two", + editorPage.getTranslationSourceAtRowIndex(3), + Matchers.equalTo("Line Two")); + assertThat("Item 5 shows Line Three", + editorPage.getTranslationSourceAtRowIndex(4), + Matchers.equalTo("Line Three")); + + editorPage = editorPage.translateTargetAtRowIndex(0, "TestODS") + .approveSelectedTranslation(); + editorPage = editorPage.translateTargetAtRowIndex(1, "Début") + .approveSelectedTranslation(); + editorPage = editorPage.translateTargetAtRowIndex(2, "Une Ligne") + .approveSelectedTranslation(); + editorPage = editorPage.translateTargetAtRowIndex(3, "Deux Ligne") + .approveSelectedTranslation(); + editorPage = editorPage.translateTargetAtRowIndex(4, "Ligne Trois") + .approveSelectedTranslation(); + + assertThat("Item 1 shows a translation of the sheet name", + editorPage.getBasicTranslationTargetAtRowIndex(0), + Matchers.equalTo("TestODS")); + assertThat("Item 1 shows a translation of page name", + editorPage.getBasicTranslationTargetAtRowIndex(1), + Matchers.equalTo("Début")); + assertThat("Item 1 shows a translation of Line One", + editorPage.getBasicTranslationTargetAtRowIndex(2), + Matchers.equalTo("Une Ligne")); + assertThat("Item 1 shows a translation of Line One", + editorPage.getBasicTranslationTargetAtRowIndex(3), + Matchers.equalTo("Deux Ligne")); + assertThat("Item 1 shows a translation of Line One", + editorPage.getBasicTranslationTargetAtRowIndex(4), + Matchers.equalTo("Ligne Trois")); + + // Close and reopen the editor to test save, switches to CodeMirror + editorPage.reload(); + + assertThat("Item 1 shows a translation of the sheet name", + editorPage.getTranslationTargetAtRowIndex(0), + Matchers.equalTo("TestODS")); + assertThat("Item 1 shows a translation of page name", + editorPage.getTranslationTargetAtRowIndex(1), + Matchers.equalTo("Début")); + assertThat("Item 1 shows a translation of Line One", + editorPage.getTranslationTargetAtRowIndex(2), + Matchers.equalTo("Une Ligne")); + assertThat("Item 1 shows a translation of Line One", + editorPage.getTranslationTargetAtRowIndex(3), + Matchers.equalTo("Deux Ligne")); + assertThat("Item 1 shows a translation of Line One", + editorPage.getTranslationTargetAtRowIndex(4), + Matchers.equalTo("Ligne Trois")); + } +} diff --git a/functional-test/src/test/java/org/zanata/feature/editor/TranslateOpenOfficeTest.java b/functional-test/src/test/java/org/zanata/feature/editor/TranslateOpenOfficeTest.java new file mode 100644 index 0000000000..e1e15d5ef8 --- /dev/null +++ b/functional-test/src/test/java/org/zanata/feature/editor/TranslateOpenOfficeTest.java @@ -0,0 +1,145 @@ +/* + * Copyright 2014, Red Hat, Inc. and individual contributors as indicated by the + * @author tags. See the copyright.txt file in the distribution for a full + * listing of individual contributors. + * + * This is free software; you can redistribute it and/or modify it under the + * terms of the GNU Lesser General Public License as published by the Free + * Software Foundation; either version 2.1 of the License, or (at your option) + * any later version. + * + * This software 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. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this software; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA, or see the FSF + * site: http://www.fsf.org. + */ +package org.zanata.feature.editor; + +import org.hamcrest.Matchers; +import org.junit.Before; +import org.junit.Rule; +import org.junit.experimental.categories.Category; +import org.junit.experimental.theories.DataPoint; +import org.junit.experimental.theories.Theories; +import org.junit.experimental.theories.Theory; +import org.junit.runner.RunWith; +import org.zanata.feature.DetailedTest; +import org.zanata.page.projects.ProjectSourceDocumentsPage; +import org.zanata.page.projects.ProjectVersionPage; +import org.zanata.page.webtrans.EditorPage; +import org.zanata.util.CleanDocumentStorageRule; +import org.zanata.util.SampleProjectRule; +import org.zanata.util.TestFileGenerator; +import org.zanata.workflow.BasicWorkFlow; +import org.zanata.workflow.LoginWorkFlow; +import org.zanata.workflow.ProjectWorkFlow; + +import java.io.File; +import java.util.HashMap; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.zanata.util.FunctionalTestHelper.assumeFalse; + +/** + * @author Damian Jansen + * djansen@redhat.com + */ +@RunWith(Theories.class) +@Category(DetailedTest.class) +public class TranslateOpenOfficeTest { + + @Rule + public SampleProjectRule sampleProjectRule = new SampleProjectRule(); + + @Rule + public CleanDocumentStorageRule documentStorageRule = + new CleanDocumentStorageRule(); + + private TestFileGenerator testFileGenerator = new TestFileGenerator(); + + @DataPoint + public static String TEST_ODT = "odt"; + @DataPoint + public static String TEST_ODG = "odg"; + @DataPoint + public static String TEST_ODP = "odp"; + + @Before + public void before() { + new BasicWorkFlow().goToHome().deleteCookiesAndRefresh(); + assumeFalse("", new File(CleanDocumentStorageRule + .getDocumentStoragePath() + .concat(File.separator).concat("documents") + .concat(File.separator)).exists()); + new LoginWorkFlow().signIn("admin", "admin"); + } + + @Theory + public void translateBasicOpenOfficeFile(String extension) { + File testfile = testFileGenerator.openTestFile( + "test-" + extension + "." + extension); + + HashMap projectSettings = ProjectWorkFlow.projectDefaults(); + projectSettings.put("Project ID", extension + "-project"); + projectSettings.put("Name", extension + "-project"); + projectSettings.put("Project Type", "File"); + + ProjectSourceDocumentsPage projectSourceDocumentsPage = new + ProjectWorkFlow() + .createNewProject(projectSettings).clickCreateVersionLink() + .inputVersionId(extension).saveVersion() + .goToSourceDocuments().pressUploadFileButton() + .enterFilePath(testfile.getAbsolutePath()).submitUpload(); + + EditorPage editorPage = projectSourceDocumentsPage + .clickBreadcrumb(extension, ProjectVersionPage.class) + .translate("fr").clickDocumentLink("", testfile.getName()); + + editorPage.setSyntaxHighlighting(false); + + assertThat("Item 1 shows Line One", + editorPage.getTranslationSourceAtRowIndex(0), + Matchers.equalTo("Line One")); + assertThat("Item 2 shows Line Two", + editorPage.getTranslationSourceAtRowIndex(1), + Matchers.equalTo("Line Two")); + assertThat("Item 3 shows Line Three", + editorPage.getTranslationSourceAtRowIndex(2), + Matchers.equalTo("Line Three")); + + editorPage = editorPage.translateTargetAtRowIndex(0, "Une Ligne") + .approveSelectedTranslation(); + editorPage = editorPage.translateTargetAtRowIndex(1, "Deux Ligne") + .approveSelectedTranslation(); + editorPage = editorPage.translateTargetAtRowIndex(2, "Ligne Trois") + .approveSelectedTranslation(); + + assertThat("Item 1 shows a translation of Line One", + editorPage.getBasicTranslationTargetAtRowIndex(0), + Matchers.equalTo("Une Ligne")); + assertThat("Item 1 shows a translation of Line One", + editorPage.getBasicTranslationTargetAtRowIndex(1), + Matchers.equalTo("Deux Ligne")); + assertThat("Item 1 shows a translation of Line One", + editorPage.getBasicTranslationTargetAtRowIndex(2), + Matchers.equalTo("Ligne Trois")); + + // Close and reopen the editor to test save, switches to CodeMirror + editorPage.reload(); + + assertThat("Item 1 shows a translation of Line One", + editorPage.getTranslationTargetAtRowIndex(0), + Matchers.equalTo("Une Ligne")); + assertThat("Item 1 shows a translation of Line One", + editorPage.getTranslationTargetAtRowIndex(1), + Matchers.equalTo("Deux Ligne")); + assertThat("Item 1 shows a translation of Line One", + editorPage.getTranslationTargetAtRowIndex(2), + Matchers.equalTo("Ligne Trois")); + } +} diff --git a/functional-test/src/test/java/org/zanata/feature/editor/TranslateTextTest.java b/functional-test/src/test/java/org/zanata/feature/editor/TranslateTextTest.java new file mode 100644 index 0000000000..11c64c48d4 --- /dev/null +++ b/functional-test/src/test/java/org/zanata/feature/editor/TranslateTextTest.java @@ -0,0 +1,131 @@ +/* + * Copyright 2014, Red Hat, Inc. and individual contributors as indicated by the + * @author tags. See the copyright.txt file in the distribution for a full + * listing of individual contributors. + * + * This is free software; you can redistribute it and/or modify it under the + * terms of the GNU Lesser General Public License as published by the Free + * Software Foundation; either version 2.1 of the License, or (at your option) + * any later version. + * + * This software 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. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this software; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA, or see the FSF + * site: http://www.fsf.org. + */ +package org.zanata.feature.editor; + +import org.hamcrest.Matchers; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.experimental.categories.Category; +import org.zanata.feature.DetailedTest; +import org.zanata.page.projects.ProjectVersionPage; +import org.zanata.page.webtrans.EditorPage; +import org.zanata.util.CleanDocumentStorageRule; +import org.zanata.util.SampleProjectRule; +import org.zanata.util.TestFileGenerator; +import org.zanata.workflow.BasicWorkFlow; +import org.zanata.workflow.LoginWorkFlow; +import org.zanata.workflow.ProjectWorkFlow; + +import java.io.File; +import java.util.HashMap; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.zanata.util.FunctionalTestHelper.assumeFalse; + +/** + * @author Damian Jansen + * djansen@redhat.com + */ +@Category(DetailedTest.class) +public class TranslateTextTest { + + @Rule + public SampleProjectRule sampleProjectRule = new SampleProjectRule(); + + @Rule + public CleanDocumentStorageRule documentStorageRule = + new CleanDocumentStorageRule(); + + private TestFileGenerator testFileGenerator = new TestFileGenerator(); + + @Before + public void before() { + new BasicWorkFlow().goToHome().deleteCookiesAndRefresh(); + assumeFalse("", new File(CleanDocumentStorageRule + .getDocumentStoragePath() + .concat(File.separator).concat("documents") + .concat(File.separator)).exists()); + new LoginWorkFlow().signIn("admin", "admin"); + } + + @Test + public void translateBasicTextFile() { + File testfile = testFileGenerator + .generateTestFileWithContent("basictext", ".txt", + "Line One\nLine Two\nLine Three"); + + HashMap projectSettings = ProjectWorkFlow.projectDefaults(); + projectSettings.put("Project ID", "text-project"); + projectSettings.put("Name", "text-project"); + projectSettings.put("Project Type", "File"); + + EditorPage editorPage = new ProjectWorkFlow() + .createNewProject(projectSettings).clickCreateVersionLink() + .inputVersionId("text").saveVersion() + .goToSourceDocuments().pressUploadFileButton() + .enterFilePath(testfile.getAbsolutePath()).submitUpload() + .clickBreadcrumb("text", ProjectVersionPage.class) + .translate("fr").clickDocumentLink("", testfile.getName()); + + editorPage.setSyntaxHighlighting(false); + + assertThat("Item 1 shows Line One", + editorPage.getTranslationSourceAtRowIndex(0), + Matchers.equalTo("Line One")); + assertThat("Item 2 shows Line Two", + editorPage.getTranslationSourceAtRowIndex(1), + Matchers.equalTo("Line Two")); + assertThat("Item 3 shows Line Three", + editorPage.getTranslationSourceAtRowIndex(2), + Matchers.equalTo("Line Three")); + + editorPage = editorPage.translateTargetAtRowIndex(0, "Une Ligne") + .approveSelectedTranslation(); + editorPage = editorPage.translateTargetAtRowIndex(1, "Deux Ligne") + .approveSelectedTranslation(); + editorPage = editorPage.translateTargetAtRowIndex(2, "Ligne Trois") + .approveSelectedTranslation(); + + assertThat("Item 1 shows a translation of Line One", + editorPage.getBasicTranslationTargetAtRowIndex(0), + Matchers.equalTo("Une Ligne")); + assertThat("Item 1 shows a translation of Line One", + editorPage.getBasicTranslationTargetAtRowIndex(1), + Matchers.equalTo("Deux Ligne")); + assertThat("Item 1 shows a translation of Line One", + editorPage.getBasicTranslationTargetAtRowIndex(2), + Matchers.equalTo("Ligne Trois")); + + // Close and reopen the editor to test save, switches to CodeMirror + editorPage.reload(); + + assertThat("Item 1 shows a translation of Line One", + editorPage.getTranslationTargetAtRowIndex(0), + Matchers.equalTo("Une Ligne")); + assertThat("Item 1 shows a translation of Line One", + editorPage.getTranslationTargetAtRowIndex(1), + Matchers.equalTo("Deux Ligne")); + assertThat("Item 1 shows a translation of Line One", + editorPage.getTranslationTargetAtRowIndex(2), + Matchers.equalTo("Ligne Trois")); + } +} diff --git a/functional-test/src/test/resources/test-idml.idml b/functional-test/src/test/resources/test-idml.idml new file mode 100644 index 0000000000000000000000000000000000000000..ccd7b1548eda67f9d6d37d63e82ec87b7acd3f97 GIT binary patch literal 34913 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 literal 0 HcmV?d00001 diff --git a/functional-test/src/test/resources/test-odg.odg b/functional-test/src/test/resources/test-odg.odg new file mode 100644 index 0000000000000000000000000000000000000000..2c079932a3635e50419ef089994ac6ec24674ed2 GIT binary patch literal 9024 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 DoB2do literal 0 HcmV?d00001 diff --git a/functional-test/src/test/resources/test-odp.odp b/functional-test/src/test/resources/test-odp.odp new file mode 100644 index 0000000000000000000000000000000000000000..ad86325e3a37dd463eaabd36029dbaef0c0322e9 GIT binary patch literal 10522 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 literal 0 HcmV?d00001 diff --git a/functional-test/src/test/resources/test-ods.ods b/functional-test/src/test/resources/test-ods.ods new file mode 100644 index 0000000000000000000000000000000000000000..b268205e90832f7618ecafda9efa06f196699468 GIT binary patch literal 7792 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 literal 0 HcmV?d00001 diff --git a/functional-test/src/test/resources/test-odt.odt b/functional-test/src/test/resources/test-odt.odt new file mode 100644 index 0000000000000000000000000000000000000000..ba7e10ec42f91db4a9b1c67303ce848f727ef743 GIT binary patch literal 8772 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