From c2d1a43810c0923a94a80ef478464e0b2cbe325c Mon Sep 17 00:00:00 2001 From: Damian Jansen Date: Thu, 5 Mar 2015 12:05:09 +1000 Subject: [PATCH] Fix language tests Significant changes to language add/remove behaviour in projects. Moves the test page behaviour to a utility class, as it is shared in project and version settings. --- .../projectsettings/ProjectLanguagesTab.java | 115 ++++++++---------- .../versionsettings/VersionLanguagesTab.java | 84 +++---------- .../java/org/zanata/util/LanguageList.java | 78 ++++++++++++ .../feature/language/AddLanguageTest.java | 15 ++- .../feature/project/EditProjectAboutTest.java | 2 +- .../project/EditProjectLanguagesTest.java | 14 +-- .../EditVersionLanguagesTest.java | 27 ++-- 7 files changed, 173 insertions(+), 162 deletions(-) create mode 100644 functional-test/src/main/java/org/zanata/util/LanguageList.java diff --git a/functional-test/src/main/java/org/zanata/page/projects/projectsettings/ProjectLanguagesTab.java b/functional-test/src/main/java/org/zanata/page/projects/projectsettings/ProjectLanguagesTab.java index 10b04d35c5..9104703516 100644 --- a/functional-test/src/main/java/org/zanata/page/projects/projectsettings/ProjectLanguagesTab.java +++ b/functional-test/src/main/java/org/zanata/page/projects/projectsettings/ProjectLanguagesTab.java @@ -20,18 +20,14 @@ */ package org.zanata.page.projects.projectsettings; -import com.google.common.base.Function; -import com.google.common.base.Preconditions; import com.google.common.base.Predicate; -import com.google.common.collect.Lists; import lombok.extern.slf4j.Slf4j; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.zanata.page.projects.ProjectBasePage; -import org.zanata.util.WebElementUtil; +import org.zanata.util.LanguageList; -import javax.annotation.Nullable; import java.util.List; /** @@ -43,8 +39,10 @@ @Slf4j public class ProjectLanguagesTab extends ProjectBasePage { - private By addNewLanguageField = By.id("languageAutocomplete-autocomplete__input"); - private By settingsLanguagesForm = By.id("settings-languages-form"); + private By activeLocales = By.id("active-locales-list"); + private By inactiveLocales = By.id("available-locales-list"); + private By disabledLocalesFilter = By.id( + "settings-languages-form:available-locales-filter-input"); public ProjectLanguagesTab(WebDriver driver) { super(driver); @@ -57,13 +55,7 @@ public ProjectLanguagesTab(WebDriver driver) { */ public List getEnabledLocaleList() { log.info("Query enabled locales"); - return Lists.transform(getEnabledLocaleListElement(), - new Function() { - @Override - public String apply(WebElement li) { - return li.getText(); - } - }); + return LanguageList.getListedLocales(waitForWebElement(activeLocales)); } public ProjectLanguagesTab expectEnabledLocaleListCount(final int count) { @@ -76,10 +68,29 @@ public boolean apply(WebDriver input) { return new ProjectLanguagesTab(getDriver()); } - private List getEnabledLocaleListElement() { - return waitForWebElement(settingsLanguagesForm) - .findElement(By.className("list--slat")) - .findElements(By.className("reveal--list-item")); + /** + * Get a list of disabled locales in this project + * + * @return String list of language/locale names + */ + public List getDisabledLocaleList() { + log.info("Query enabled locales"); + return LanguageList.getListedLocales(waitForWebElement(inactiveLocales)); + } + + public ProjectLanguagesTab expectDisabledLocaleListCount(final int count) { + waitForAMoment().until(new Predicate() { + @Override + public boolean apply(WebDriver input) { + return getDisabledLocaleList().size() == count; + } + }); + return new ProjectLanguagesTab(getDriver()); + } + + private List getDisabledLocaleListElement() { + return waitForWebElement(inactiveLocales) + .findElements(By.className("reveal")); } public ProjectLanguagesTab waitForLocaleListVisible() { @@ -87,9 +98,7 @@ public ProjectLanguagesTab waitForLocaleListVisible() { waitForAMoment().until(new Predicate() { @Override public boolean apply(WebDriver driver) { - return driver.findElement(settingsLanguagesForm) - .findElement(By.className("list--slat")) - .isDisplayed(); + return waitForWebElement(activeLocales).isDisplayed(); } }); return new ProjectLanguagesTab(getDriver()); @@ -102,46 +111,31 @@ public boolean apply(WebDriver driver) { */ public ProjectLanguagesTab enterSearchLanguage(String languageQuery) { log.info("Enter language search {}", languageQuery); - WebElementUtil.searchAutocomplete(getDriver(), "languageAutocomplete", - languageQuery); + waitForWebElement(disabledLocalesFilter).sendKeys(languageQuery); return new ProjectLanguagesTab(getDriver()); } /** * Add a language to the languages list. - * Assumes that the search string has already been entered. * - * @param localeId language to select + * @param searchLocaleId language to select * @return new language settings, anticipating the language has been added. */ - public ProjectLanguagesTab addLanguage(final String localeId) { - log.info("Click Add language on {}", localeId); - waitForAMoment().until(new Predicate() { + public ProjectLanguagesTab addLanguage(final String searchLocaleId) { + log.info("Click Enable on {}", searchLocaleId); + String message = "can not find locale - " + searchLocaleId; + waitForAMoment().withMessage(message).until(new Predicate() { @Override public boolean apply(WebDriver driver) { - List searchResults = - WebElementUtil.getSearchAutocompleteResults( - getDriver(), - "settings-languages-form", - "languageAutocomplete"); - - boolean clickedLocale = false; - for (WebElement searchResult : searchResults) { - if (searchResult.getText().contains(localeId)) { - searchResult.click(); - clickedLocale = true; - break; - } - } - return clickedLocale; + return LanguageList.toggleLanguageInList( + getDriver().findElement(inactiveLocales), + searchLocaleId); } }); - - refreshPageUntil(this, new Predicate() { @Override public boolean apply(WebDriver driver) { - return getEnabledLocaleList().contains(localeId); + return getEnabledLocaleList().contains(searchLocaleId); } }); @@ -151,29 +145,24 @@ public boolean apply(WebDriver driver) { /** * Click the removal link for a language. * - * @param localeId language to remove + * @param searchLocaleId language to remove * @return new language settings tab */ - public ProjectLanguagesTab removeLocale(final String localeId) { - log.info("Click Remove on {}", localeId); - boolean removedLocale = false; - for (WebElement localeLi : getEnabledLocaleListElement()) { - String displayedLocaleId = - localeLi.findElement(By.xpath(".//span")).getText() - .replace("[", "").replace("]", ""); - if (displayedLocaleId.equals(localeId)) { - localeLi.findElement(By.tagName("a")).click(); - removedLocale = true; - break; + public ProjectLanguagesTab removeLocale(final String searchLocaleId) { + log.info("Click Disable on {}", searchLocaleId); + String message = "can not find locale - " + searchLocaleId; + waitForAMoment().withMessage(message).until(new Predicate() { + @Override + public boolean apply(WebDriver driver) { + return LanguageList.toggleLanguageInList( + getDriver().findElement(activeLocales), + searchLocaleId); } - } - Preconditions.checkState(removedLocale, "can not remove locale: %s", - localeId); - + }); refreshPageUntil(this, new Predicate() { @Override public boolean apply(WebDriver driver) { - return !getEnabledLocaleList().contains(localeId); + return !getEnabledLocaleList().contains(searchLocaleId); } }); diff --git a/functional-test/src/main/java/org/zanata/page/projectversion/versionsettings/VersionLanguagesTab.java b/functional-test/src/main/java/org/zanata/page/projectversion/versionsettings/VersionLanguagesTab.java index 953cf75cd3..88575f23b3 100644 --- a/functional-test/src/main/java/org/zanata/page/projectversion/versionsettings/VersionLanguagesTab.java +++ b/functional-test/src/main/java/org/zanata/page/projectversion/versionsettings/VersionLanguagesTab.java @@ -21,15 +21,12 @@ package org.zanata.page.projectversion.versionsettings; import com.google.common.base.Function; -import com.google.common.base.Preconditions; import com.google.common.base.Predicate; -import com.google.common.collect.Lists; import lombok.extern.slf4j.Slf4j; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; -import org.openqa.selenium.WebElement; import org.zanata.page.projectversion.VersionBasePage; -import org.zanata.util.WebElementUtil; +import org.zanata.util.LanguageList; import java.util.List; @@ -42,26 +39,15 @@ @Slf4j public class VersionLanguagesTab extends VersionBasePage { - private By addNewLanguageField = By.id("languageAutocomplete-autocomplete__input"); private By languagesSettingForm = By.id("settings-languages-form"); + private By activeLocales = By.id("active-locales-list"); + private By inactiveLocales = By.id("available-locales-list"); + private By disabledLocalesFilter = By.id("settings-languages-form:available-locales-filter-input"); public VersionLanguagesTab(WebDriver driver) { super(driver); } - /** - * Click the inherit project settings languages checkbox - * - * @return new language settings tab - */ - public VersionLanguagesTab clickInheritCheckbox() { - log.info("Click Inherit check box"); - waitForWebElement(waitForWebElement(languagesSettingForm), - By.className("form__checkbox")) - .click(); - return new VersionLanguagesTab(getDriver()); - } - public VersionLanguagesTab waitForLocaleListVisible() { log.info("Wait for locale list visible"); waitForAMoment().until(new Function() { @@ -82,18 +68,7 @@ public Boolean apply(WebDriver driver) { */ public List getEnabledLocaleList() { log.info("Query enabled locales list"); - return Lists.transform(getEnabledLocaleListElement(), - new Function() { - @Override - public String apply(WebElement li) { - return li.getText(); - } - }); - } - - private List getEnabledLocaleListElement() { - return waitForWebElement(languagesSettingForm) - .findElements(By.xpath(".//ul/li[@class='reveal--list-item']")); + return LanguageList.getListedLocales(waitForWebElement(activeLocales)); } public VersionLanguagesTab waitForLanguagesContains(String language) { @@ -102,12 +77,6 @@ public VersionLanguagesTab waitForLanguagesContains(String language) { return new VersionLanguagesTab(getDriver()); } - public VersionLanguagesTab waitForLanguagesNotContains(String language) { - log.info("Wait for languages does not contain {}", language); - waitForLanguageEntryExpected(language, false); - return new VersionLanguagesTab(getDriver()); - } - private void waitForLanguageEntryExpected(final String language, final boolean exists) { waitForAMoment().until(new Function() { @@ -119,27 +88,21 @@ public Boolean apply(WebDriver driver) { } public VersionLanguagesTab enterSearchLanguage(String localeQuery) { - log.info("Enter search language {}", localeQuery); - WebElementUtil.searchAutocomplete(getDriver(), "languageAutocomplete", - localeQuery); + log.info("Enter language search {}", localeQuery); + waitForWebElement(disabledLocalesFilter).sendKeys(localeQuery); return new VersionLanguagesTab(getDriver()); } public VersionLanguagesTab removeLocale(final String localeId) { - log.info("Click Remove on {}", localeId); - boolean removedLocale = false; - for (WebElement localeLi : getEnabledLocaleListElement()) { - String displayedLocaleId = - localeLi.findElement(By.xpath(".//span")).getText() - .replace("[", "").replace("]", ""); - if (displayedLocaleId.equals(localeId)) { - localeLi.findElement(By.tagName("a")).click(); - removedLocale = true; - break; + log.info("Click Disable on {}", localeId); + String message = "can not find locale - " + localeId; + waitForAMoment().withMessage(message).until(new Predicate() { + @Override + public boolean apply(WebDriver driver) { + return LanguageList.toggleLanguageInList( + getDriver().findElement(activeLocales), localeId); } - } - Preconditions.checkState(removedLocale, "can not remove locale: %s", - localeId); + }); refreshPageUntil(this, new Predicate() { @Override @@ -152,24 +115,13 @@ public boolean apply(WebDriver driver) { } public VersionLanguagesTab addLocale(final String localeId) { - log.info("Click to add {}", localeId); + log.info("Click Enable on {}", localeId); String message = "can not find locale - " + localeId; waitForAMoment().withMessage(message).until(new Predicate() { @Override public boolean apply(WebDriver driver) { - List searchResults = - WebElementUtil.getSearchAutocompleteResults(driver, - "settings-languages-form", - "languageAutocomplete"); - - for (WebElement searchResult : searchResults) { - if (searchResult.getText().contains(localeId)) { - slightPause(); - searchResult.click(); - return true; - } - } - return false; + return LanguageList.toggleLanguageInList( + getDriver().findElement(inactiveLocales), localeId); } }); diff --git a/functional-test/src/main/java/org/zanata/util/LanguageList.java b/functional-test/src/main/java/org/zanata/util/LanguageList.java new file mode 100644 index 0000000000..f8b471abfb --- /dev/null +++ b/functional-test/src/main/java/org/zanata/util/LanguageList.java @@ -0,0 +1,78 @@ +/* + * Copyright 2015, 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.util; + +import com.google.common.base.Function; +import com.google.common.collect.Lists; +import org.openqa.selenium.By; +import org.openqa.selenium.WebElement; + +import java.util.List; + +/** + * Handles the behaviour of the project language lists + * + * @author Damian Jansen djansen@redhat.com + */ +public class LanguageList { + private LanguageList(){} + + private static By localeId = By.className("js-locale-id"); + private static By languageActions = By.className("button--group"); + + public static List getListedLocales(WebElement localeList) { + return Lists.transform(getListElements(localeList), + new Function() { + @Override + public String apply(WebElement li) { + return li.findElement(localeId).getText(); + } + }); + } + + public static List getListElements(WebElement localeList) { + return localeList.findElements(By.className("reveal")); + } + + public static String getLocaleID(WebElement localeListElement) { + return localeListElement.findElement(localeId).getText(); + } + + public static void toggleEnabled(WebElement localeListElement) { + localeListElement.findElement(languageActions) + .findElements(By.tagName("button")).get(0).click(); + } + + public static boolean toggleLanguageInList(WebElement localeList, String localeId) { + boolean clickedLocale = false; + List listElements = LanguageList + .getListElements(localeList); + for (WebElement localeLi : listElements) { + if (LanguageList.getLocaleID(localeLi).equals(localeId)) { + LanguageList.toggleEnabled(localeLi); + clickedLocale = true; + break; + } + } + return clickedLocale; + } +} + diff --git a/functional-test/src/test/java/org/zanata/feature/language/AddLanguageTest.java b/functional-test/src/test/java/org/zanata/feature/language/AddLanguageTest.java index 974c090bc5..86021f7dbf 100644 --- a/functional-test/src/test/java/org/zanata/feature/language/AddLanguageTest.java +++ b/functional-test/src/test/java/org/zanata/feature/language/AddLanguageTest.java @@ -34,6 +34,7 @@ import org.zanata.feature.testharness.TestPlan.DetailedTest; import org.zanata.page.administration.AddLanguagePage; import org.zanata.page.languages.LanguagesPage; +import org.zanata.page.projects.projectsettings.ProjectLanguagesTab; import org.zanata.util.AddUsersRule; import org.zanata.util.SampleProjectRule; import org.zanata.workflow.BasicWorkFlow; @@ -101,7 +102,7 @@ public void addLanguageAsEnabledByDefault() throws Exception { .getEnabledLocaleList(); assertThat(enabledLocaleList) - .contains(languageDisplayName) + .contains(language) .as("The language is enabled by default"); } @@ -135,16 +136,20 @@ public void addLanguageAsDisabledByDefault() throws Exception { .isFalse() .as("The language is disabled by default"); - List enabledLocaleList = languagesPage.goToHomePage() + ProjectLanguagesTab projectLanguagesTab = languagesPage.goToHomePage() .goToProjects() .goToProject("about fedora") .gotoSettingsTab() .gotoSettingsLanguagesTab() - .waitForLocaleListVisible() - .getEnabledLocaleList(); + .waitForLocaleListVisible(); + List enabledLocaleList = projectLanguagesTab.getEnabledLocaleList(); + List disabledLocaleList = projectLanguagesTab.getDisabledLocaleList(); assertThat(enabledLocaleList) - .doesNotContain(languageDisplayName) + .doesNotContain(language) + .as("The language is disabled by default"); + assertThat(disabledLocaleList) + .contains(language) .as("The language is disabled by default"); } diff --git a/functional-test/src/test/java/org/zanata/feature/project/EditProjectAboutTest.java b/functional-test/src/test/java/org/zanata/feature/project/EditProjectAboutTest.java index ea709d5de0..47d54c58d2 100644 --- a/functional-test/src/test/java/org/zanata/feature/project/EditProjectAboutTest.java +++ b/functional-test/src/test/java/org/zanata/feature/project/EditProjectAboutTest.java @@ -74,7 +74,7 @@ public void addAboutPageDetails() throws Exception { .enterAboutText(aboutText) .pressSave(); - projectAboutTab.expectNotification("Successfully updated"); + projectAboutTab.expectNotification("About page updated."); ProjectAboutPage projectAboutPage = projectAboutTab.gotoAboutTab(); assertThat(projectAboutPage.getAboutText()) diff --git a/functional-test/src/test/java/org/zanata/feature/project/EditProjectLanguagesTest.java b/functional-test/src/test/java/org/zanata/feature/project/EditProjectLanguagesTest.java index 27401f6e42..4f8ca267aa 100644 --- a/functional-test/src/test/java/org/zanata/feature/project/EditProjectLanguagesTest.java +++ b/functional-test/src/test/java/org/zanata/feature/project/EditProjectLanguagesTest.java @@ -74,11 +74,11 @@ public void editProjectLanguages() throws Exception { .getEnabledLocaleList(); assertThat(enabledLocaleList) - .contains("French[fr]", "Hindi[hi]", "Polish[pl]") + .contains("fr", "hi", "pl") .as("The enabled list contains three languages"); assertThat(enabledLocaleList) - .doesNotContain("English (United States)[en-US]") + .doesNotContain("en-US") .as("The enabled list does not contain " + "'English (United States)[en-US]'"); @@ -92,22 +92,20 @@ public void editProjectLanguages() throws Exception { .getEnabledLocaleList(); assertThat(enabledLocaleList) - .doesNotContain("English (United States)[en-US]") - .doesNotContain("Polish[pl]") + .doesNotContain("en-US") + .doesNotContain("pl") .as("The enabled list does not contain 'US English' or Polish"); enabledLocaleList = projectLanguagesTab .gotoSettingsTab() .gotoSettingsLanguagesTab() .enterSearchLanguage("en-US") - .addLanguage("English (United States)[en-US]") + .addLanguage("en-US") .expectEnabledLocaleListCount(3) .getEnabledLocaleList(); Assertions.assertThat(enabledLocaleList) - .contains("English (United States)[en-US]", - "French[fr]", - "Hindi[hi]") + .contains("en-US", "fr", "hi") .as("The enabled language list contains en-US, fr and hi"); } } diff --git a/functional-test/src/test/java/org/zanata/feature/projectversion/EditVersionLanguagesTest.java b/functional-test/src/test/java/org/zanata/feature/projectversion/EditVersionLanguagesTest.java index bb24938a33..0a68c74a9f 100644 --- a/functional-test/src/test/java/org/zanata/feature/projectversion/EditVersionLanguagesTest.java +++ b/functional-test/src/test/java/org/zanata/feature/projectversion/EditVersionLanguagesTest.java @@ -22,7 +22,6 @@ package org.zanata.feature.projectversion; import org.junit.Before; -import org.junit.Ignore; import org.junit.Rule; import org.junit.Test; import org.junit.experimental.categories.Category; @@ -74,37 +73,27 @@ public void changeVersionLanguages() throws Exception { .gotoVersion("overridelangtest") .gotoSettingsTab() .gotoSettingsLanguagesTab() - .clickInheritCheckbox() .waitForLocaleListVisible(); List enabledLocaleList = versionLanguagesTab .getEnabledLocaleList(); - assertThat(enabledLocaleList.isEmpty()) + assertThat(enabledLocaleList) + .contains("fr", "hi", "pl") .as("The enabled list contains no languages"); versionLanguagesTab = versionLanguagesTab .gotoSettingsTab() .gotoSettingsLanguagesTab() .enterSearchLanguage("en-US") - .addLocale("English (United States)[en-US]"); - versionLanguagesTab.expectNotification("Language \"English " + - "(United States)\" has been added to version."); - versionLanguagesTab = versionLanguagesTab - .waitForLanguagesContains("English (United States)[en-US]"); - + .addLocale("en-US"); + versionLanguagesTab.expectNotification("Language \"en-US\" has been " + + "enabled."); versionLanguagesTab = versionLanguagesTab - .enterSearchLanguage("fr") - .addLocale("French[fr]"); - versionLanguagesTab.expectNotification("Language \"French\" has " + - "been added to version."); - versionLanguagesTab = versionLanguagesTab - .waitForLanguagesContains("French[fr]"); - - enabledLocaleList = versionLanguagesTab.getEnabledLocaleList(); + .waitForLanguagesContains("en-US"); - assertThat(enabledLocaleList) - .contains("English (United States)[en-US]", "French[fr]") + assertThat(versionLanguagesTab.getEnabledLocaleList()) + .contains("en-US", "fr") .as("Two languages are available to translate"); } }