diff --git a/functional-test/pom.xml b/functional-test/pom.xml
index 5f6fe3cabb..e47721c910 100644
--- a/functional-test/pom.xml
+++ b/functional-test/pom.xml
@@ -12,7 +12,7 @@
functional-test
- 2.26.0
+ 2.39.0
false
@@ -62,6 +62,7 @@
**/AggregateTestSuite.java
${project.build.directory}/zanataindex
+ 2552
@@ -128,6 +129,18 @@
slf4j-api
+
+ org.subethamail
+ subethasmtp-wiser
+ 1.2
+ test
+
+
+ javax.mail
+ mail
+ test
+
+
org.hamcrest
hamcrest-core
diff --git a/functional-test/src/main/java/org/zanata/page/BasePage.java b/functional-test/src/main/java/org/zanata/page/BasePage.java
index 4dd281d0a8..1002ba85ce 100644
--- a/functional-test/src/main/java/org/zanata/page/BasePage.java
+++ b/functional-test/src/main/java/org/zanata/page/BasePage.java
@@ -35,6 +35,7 @@
import org.zanata.page.administration.AdministrationPage;
import org.zanata.page.groups.VersionGroupsPage;
import org.zanata.page.projects.ProjectsPage;
+import org.zanata.page.utility.HelpPage;
import org.zanata.page.utility.HomePage;
import org.zanata.util.WebElementUtil;
import com.google.common.base.Optional;
@@ -185,4 +186,9 @@ public void clickLinkAfterAnimation(By locator) {
executor.executeScript("arguments[0].click();", getDriver()
.findElement(locator));
}
+
+ public HelpPage goToHelp() {
+ getDriver().findElement(By.id("help_link")).click();
+ return new HelpPage(getDriver());
+ }
}
diff --git a/functional-test/src/main/java/org/zanata/page/utility/ContactAdminFormPage.java b/functional-test/src/main/java/org/zanata/page/utility/ContactAdminFormPage.java
new file mode 100644
index 0000000000..bf99b9818e
--- /dev/null
+++ b/functional-test/src/main/java/org/zanata/page/utility/ContactAdminFormPage.java
@@ -0,0 +1,43 @@
+package org.zanata.page.utility;
+
+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;
+
+/**
+ * @author Patrick Huang pahuang@redhat.com
+ */
+public class ContactAdminFormPage extends BasePage {
+ @FindBy(id = "contactAdminForm:subjectField:subject")
+ private WebElement subjectField;
+
+ @FindBy(id = "contactAdminForm:messageField:message")
+ private WebElement messageField;
+
+ @FindBy(id = "contactAdminForm:send")
+ private WebElement sendButton;
+
+ public ContactAdminFormPage(WebDriver driver) {
+ super(driver);
+ }
+
+ public ContactAdminFormPage inputSubject(String subject) {
+ subjectField.clear();
+ subjectField.sendKeys(subject);
+ return new ContactAdminFormPage(getDriver());
+ }
+
+ public ContactAdminFormPage inputMessage(String message) {
+ WebElementUtil
+ .setRichTextEditorContent(getDriver(), messageField, message);
+ return new ContactAdminFormPage(getDriver());
+ }
+
+ public HelpPage send() {
+ sendButton.click();
+ return new HelpPage(getDriver());
+ }
+}
diff --git a/functional-test/src/main/java/org/zanata/page/utility/HelpPage.java b/functional-test/src/main/java/org/zanata/page/utility/HelpPage.java
new file mode 100644
index 0000000000..b88c3ba688
--- /dev/null
+++ b/functional-test/src/main/java/org/zanata/page/utility/HelpPage.java
@@ -0,0 +1,24 @@
+package org.zanata.page.utility;
+
+import org.openqa.selenium.WebDriver;
+import org.openqa.selenium.WebElement;
+import org.openqa.selenium.support.FindBy;
+import org.zanata.page.BasePage;
+
+/**
+ * @author Patrick Huang
+ * pahuang@redhat.com
+ */
+public class HelpPage extends BasePage {
+ @FindBy(linkText = "Contact Admin")
+ private WebElement contactAdminLink;
+
+ public HelpPage(WebDriver driver) {
+ super(driver);
+ }
+
+ public ContactAdminFormPage clickContactAdmin() {
+ contactAdminLink.click();
+ return new ContactAdminFormPage(getDriver());
+ }
+}
diff --git a/functional-test/src/main/java/org/zanata/util/WebElementUtil.java b/functional-test/src/main/java/org/zanata/util/WebElementUtil.java
index 375142511f..ddaf6e0f2d 100644
--- a/functional-test/src/main/java/org/zanata/util/WebElementUtil.java
+++ b/functional-test/src/main/java/org/zanata/util/WebElementUtil.java
@@ -225,6 +225,24 @@ public List apply(@Nullable WebDriver input) {
});
}
+ /**
+ * This method is used to set JSF rich text editor (KCEditor) content.
+ * @param driver web driver
+ * @param richEditorWrapperField the wrapper div of the editor
+ * @param content content wants to set
+ */
+ public static void setRichTextEditorContent(WebDriver driver,
+ WebElement richEditorWrapperField,
+ String content) {
+ // This is how we can change JSF rich text editor content.
+ WebElement richTextEditorFrame =
+ richEditorWrapperField.findElement(By.tagName("iframe"));
+ driver.switchTo().frame(richTextEditorFrame);
+ ((JavascriptExecutor) driver)
+ .executeScript("document.body.innerHTML='" + content + "'");
+ driver.switchTo().defaultContent();
+ }
+
private static class WebElementToInnerHTMLFunction implements
Function {
private final WebDriver driver;
diff --git a/functional-test/src/test/java/org/zanata/feature/misc/ContactAdminTest.java b/functional-test/src/test/java/org/zanata/feature/misc/ContactAdminTest.java
new file mode 100644
index 0000000000..34f3541c6e
--- /dev/null
+++ b/functional-test/src/test/java/org/zanata/feature/misc/ContactAdminTest.java
@@ -0,0 +1,77 @@
+package org.zanata.feature.misc;
+
+import javax.mail.internet.MimeMultipart;
+
+import org.hamcrest.Matchers;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.experimental.categories.Category;
+import org.subethamail.wiser.Wiser;
+import org.subethamail.wiser.WiserMessage;
+import org.zanata.feature.DetailedTest;
+import org.zanata.page.utility.ContactAdminFormPage;
+import org.zanata.page.utility.DashboardPage;
+import org.zanata.page.utility.HelpPage;
+import org.zanata.util.AddUsersRule;
+import org.zanata.util.PropertiesHolder;
+import org.zanata.workflow.LoginWorkFlow;
+import com.google.common.base.Throwables;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+
+/**
+ * @author Patrick Huang pahuang@redhat.com
+ */
+@Category(DetailedTest.class)
+public class ContactAdminTest {
+ @Rule
+ public AddUsersRule addUsersRule = new AddUsersRule();
+ private Wiser wiser = new Wiser();
+
+ @Before
+ public void setUp() {
+ String port = PropertiesHolder.getProperty("smtp.port");
+ wiser.setPort(Integer.parseInt(port));
+ wiser.start();
+ }
+
+ @After
+ public void cleanUp() {
+ wiser.stop();
+ }
+
+ @Test
+ public void testContactAdmin() {
+ DashboardPage dashboard =
+ new LoginWorkFlow().signIn("translator", "translator");
+ ContactAdminFormPage contactAdminFormPage =
+ dashboard.goToHelp().clickContactAdmin();
+
+ HelpPage helpPage =
+ contactAdminFormPage.inputSubject("hello admin")
+ .inputMessage("I love Zanata").send();
+
+ assertThat(
+ helpPage.getNotificationMessage(),
+ Matchers.equalTo("Your message has been sent to the administrator"));
+ assertThat(wiser.getMessages(), Matchers.hasSize(1));
+ WiserMessage wiserMessage = wiser.getMessages().get(0);
+ assertThat(wiserMessage.getEnvelopeReceiver(),
+ Matchers.equalTo("admin@example.com"));
+
+ String content = getEmailContent(wiserMessage);
+ assertThat(content, Matchers.containsString("I love Zanata"));
+ }
+
+ private static String getEmailContent(WiserMessage wiserMessage) {
+ try {
+ return ((MimeMultipart) wiserMessage.getMimeMessage().getContent())
+ .getBodyPart(0).getContent().toString();
+ } catch (Exception e) {
+ throw Throwables.propagate(e);
+ }
+ }
+}
diff --git a/functional-test/src/test/resources/conf/standalone.xml b/functional-test/src/test/resources/conf/standalone.xml
index 2d629a9ca1..f11eafce05 100644
--- a/functional-test/src/test/resources/conf/standalone.xml
+++ b/functional-test/src/test/resources/conf/standalone.xml
@@ -242,6 +242,7 @@
+
#{messages['jsf.ContactAdmin']}
-
+
#{messages['jsf.ContactAdmin']}