From 12ea662f2a91a0f1ac6ac3820451aa849514d0d0 Mon Sep 17 00:00:00 2001 From: Patrick Huang Date: Wed, 26 Nov 2014 14:58:56 +1000 Subject: [PATCH] rhbz1120457 - change test to test email notification --- .../ManageLanguageTeamMemberPage.java | 38 ++++++++++--- .../language/JoinLanguageTeamTest.java | 19 ++++++- .../java/org/zanata/util/HasEmailRule.java | 53 +++++++++++++++++++ 3 files changed, 102 insertions(+), 8 deletions(-) diff --git a/functional-test/src/main/java/org/zanata/page/administration/ManageLanguageTeamMemberPage.java b/functional-test/src/main/java/org/zanata/page/administration/ManageLanguageTeamMemberPage.java index ecb115c50b..b02ee81983 100644 --- a/functional-test/src/main/java/org/zanata/page/administration/ManageLanguageTeamMemberPage.java +++ b/functional-test/src/main/java/org/zanata/page/administration/ManageLanguageTeamMemberPage.java @@ -22,6 +22,8 @@ import com.google.common.base.Function; import com.google.common.base.Predicate; +import com.google.common.collect.Lists; +import com.google.common.collect.Sets; import lombok.extern.slf4j.Slf4j; import org.openqa.selenium.By; import org.openqa.selenium.NoSuchElementException; @@ -31,8 +33,11 @@ import org.zanata.util.TableRow; import org.zanata.util.WebElementUtil; +import java.io.Serializable; import java.util.Collections; +import java.util.HashSet; import java.util.List; +import java.util.Set; /** * @author Patrick Huang permissionToAdd = Sets.newHashSet(permissions); + permissionToAdd.add(TeamPermission.Translator); + + for (TeamPermission permission : permissionToAdd) { + log.info("Set checked as {}", permission.name()); + Checkbox.of(tryGetFirstRowInSearchPersonResult(personName) + .getCells() + .get(permission.columnIndex) + .findElement(By.tagName("input"))) + .check(); + } log.info("Click Add Selected"); waitForWebElement(addSelectedButton).click(); log.info("Click Close"); @@ -163,4 +177,14 @@ public boolean apply(WebDriver driver) { } }); } + + public static enum TeamPermission { + Translator(IS_TRANSLATOR_COLUMN), Reviewer(IS_REVIEWER_COLUMN), Coordinator(IS_COORDINATOR_COLUMN); + private final int columnIndex; + + TeamPermission(int columnIndex) { + this.columnIndex = columnIndex; + } + + } } diff --git a/functional-test/src/test/java/org/zanata/feature/language/JoinLanguageTeamTest.java b/functional-test/src/test/java/org/zanata/feature/language/JoinLanguageTeamTest.java index b049bb559f..850a9728ec 100644 --- a/functional-test/src/test/java/org/zanata/feature/language/JoinLanguageTeamTest.java +++ b/functional-test/src/test/java/org/zanata/feature/language/JoinLanguageTeamTest.java @@ -20,17 +20,22 @@ */ package org.zanata.feature.language; +import java.util.concurrent.TimeUnit; + import org.junit.Rule; import org.junit.Test; import org.junit.experimental.categories.Category; +import org.subethamail.wiser.WiserMessage; import org.zanata.feature.Feature; import org.zanata.feature.testharness.ZanataTestCase; import org.zanata.feature.testharness.TestPlan.DetailedTest; import org.zanata.page.administration.ManageLanguageTeamMemberPage; +import org.zanata.util.HasEmailRule; import org.zanata.util.SampleProjectRule; import org.zanata.workflow.LoginWorkFlow; import static org.assertj.core.api.Assertions.assertThat; +import static org.zanata.util.HasEmailRule.getEmailContent; /** * @author Damian Jansen @@ -42,6 +47,9 @@ public class JoinLanguageTeamTest extends ZanataTestCase { @Rule public SampleProjectRule sampleProjectRule = new SampleProjectRule(); + @Rule + public HasEmailRule hasEmailRule = new HasEmailRule(); + @Feature(summary = "The administrator can add a member to a language team", tcmsTestPlanIds = 5316, tcmsTestCaseIds = 181703) @Test(timeout = ZanataTestCase.MAX_SHORT_TEST_DURATION) @@ -52,10 +60,19 @@ public void translatorJoinsLanguageTeam() throws Exception { .goToManageLanguagePage() .manageTeamMembersFor("pl") .clickAddTeamMember() - .searchPersonAndAddToTeam("translator"); + .searchPersonAndAddToTeam("translator", + ManageLanguageTeamMemberPage.TeamPermission.Translator, + ManageLanguageTeamMemberPage.TeamPermission.Reviewer); assertThat(manageTeamMemberPage.getMemberUsernames()) .contains("translator") .as("Translator is a listed member of the pl team"); + assertThat(hasEmailRule.emailsArrivedWithinTimeout(1, 5, + TimeUnit.SECONDS)) + .isTrue(); + WiserMessage emailMessage = hasEmailRule.getMessages().get(0); + assertThat(getEmailContent(emailMessage)) + .contains( + "Administrator(admin@example.com) has changed your permission"); } } diff --git a/functional-test/src/test/java/org/zanata/util/HasEmailRule.java b/functional-test/src/test/java/org/zanata/util/HasEmailRule.java index 39f584d9f2..02041efea2 100644 --- a/functional-test/src/test/java/org/zanata/util/HasEmailRule.java +++ b/functional-test/src/test/java/org/zanata/util/HasEmailRule.java @@ -21,6 +21,9 @@ package org.zanata.util; import java.util.List; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.Executors; +import java.util.concurrent.TimeUnit; import javax.mail.internet.MimeMultipart; @@ -30,11 +33,14 @@ import org.subethamail.wiser.Wiser; import org.subethamail.wiser.WiserMessage; import com.google.common.base.Throwables; +import com.google.common.util.concurrent.Uninterruptibles; +import lombok.extern.slf4j.Slf4j; /** * @author Patrick Huang * pahuang@redhat.com */ +@Slf4j public class HasEmailRule implements TestRule { private final Wiser wiser = new Wiser(); @@ -63,6 +69,53 @@ public List getMessages() { return wiser.getMessages(); } + /** + * Email may arrive a little bit late therefore this method can be used to + * poll and wait until timeout. + * + * @param expectedEmailNum + * expected arriving email numbers + * @param timeoutDuration + * timeout duration + * @param timeoutUnit + * timeout time unit + * @return true if the expected number of emails has arrived or false if it + * fails within the timeout period + */ + public boolean emailsArrivedWithinTimeout(final int expectedEmailNum, + final long timeoutDuration, final TimeUnit timeoutUnit) { + final CountDownLatch countDownLatch = new CountDownLatch(1); + + // poll every half second + final int sleepFor = 500; + final TimeUnit sleepUnit = TimeUnit.MILLISECONDS; + final long sleepTime = sleepUnit.convert(sleepFor, sleepUnit); + final long timeoutTime = sleepUnit.convert(timeoutDuration, timeoutUnit); + Runnable runnable = new Runnable() { + + @Override + public void run() { + long slept = 0; + while (wiser.getMessages().size() < expectedEmailNum + && slept < timeoutTime) { + + log.debug("current arrived email:{}", wiser.getMessages() + .size()); + Uninterruptibles.sleepUninterruptibly(sleepFor, sleepUnit); + slept += sleepTime; + } + countDownLatch.countDown(); + } + }; + Executors.newFixedThreadPool(1).submit(runnable); + try { + return countDownLatch.await(timeoutDuration, timeoutUnit); + } catch (InterruptedException e) { + log.warn("interrupted", e); + return wiser.getMessages().size() == expectedEmailNum; + } + } + public static String getEmailContent(WiserMessage wiserMessage) { try { return ((MimeMultipart) wiserMessage.getMimeMessage().getContent())