From e249f067c720d76fc286a00f54e4d5a2e30c2a1e Mon Sep 17 00:00:00 2001
From: srosse <none@none>
Date: Thu, 26 Jun 2014 18:44:39 +0200
Subject: [PATCH] OO-1068: 4 selenium tests to test user preferences

---
 .../olat/portal/FunctionalSettingsTest.java   |  62 -------
 ...{ResumeTest.java => UserSettingsTest.java} | 171 +++++++++++++++++-
 .../org/olat/selenium/page/LoginPage.java     |  28 ++-
 .../selenium/page/user/UserPasswordPage.java  |  69 +++++++
 .../user/UserPreferencesPageFragment.java     |  36 +++-
 .../selenium/page/user/UserToolsPage.java     |   9 +
 6 files changed, 306 insertions(+), 69 deletions(-)
 rename src/test/java/org/olat/selenium/{ResumeTest.java => UserSettingsTest.java} (52%)
 create mode 100644 src/test/java/org/olat/selenium/page/user/UserPasswordPage.java

diff --git a/src/test/java/org/olat/portal/FunctionalSettingsTest.java b/src/test/java/org/olat/portal/FunctionalSettingsTest.java
index 273b0e5e5e0..ba715668c12 100644
--- a/src/test/java/org/olat/portal/FunctionalSettingsTest.java
+++ b/src/test/java/org/olat/portal/FunctionalSettingsTest.java
@@ -80,36 +80,6 @@ public class FunctionalSettingsTest {
 		portalColumnCount = 2;
 	}
 	
-	@Test
-	@RunAsClient
-	public void checkResetSettings(){
-		/* login for test setup */
-		Assert.assertTrue(functionalUtil.login(browser));
-		
-		/* reset settings */
-		Assert.assertTrue(functionalHomeSiteUtil.resetSettings(browser));
-	}
-	
-	@Test
-	@RunAsClient
-	public void checkLanguageSettings(){
-		/* login for test setup */
-		Assert.assertTrue(functionalUtil.login(browser));
-
-		/* set language */
-		functionalHomeSiteUtil.selectLanguage(browser, FunctionalHomeSiteUtil.GERMAN_LANGUAGE_VALUE);
-	}
-	
-	@Test
-	@RunAsClient
-	public void checkDisableResume(){
-		/* login for test setup */
-		Assert.assertTrue(functionalUtil.login(browser));
-
-		/* resume off */
-		functionalHomeSiteUtil.disableResume(browser);
-	}
-	
 	@Test
 	@RunAsClient
 	public void checkActivatePortlet(){
@@ -238,38 +208,6 @@ public class FunctionalSettingsTest {
 		}
 	}
 	
-	@Test
-	@RunAsClient
-	public void checkResetPassword() throws IOException, URISyntaxException{
-		/* create test user via REST */
-		List<UserVO> userVO = functionalVOUtil.createTestUsers(deploymentUrl, 1);
-		
-		/* login for test setup */
-		Assert.assertTrue(functionalUtil.login(browser));
-		
-		/* password test */
-		UserVO current = userVO.get(0);
-		
-		Assert.assertTrue(functionalUtil.logout(browser));
-		Assert.assertTrue(functionalUtil.login(browser, current.getLogin(), current.getPassword(), true));
-		
-		functionalUtil.openSite(browser, FunctionalUtil.OlatSite.HOME);
-		functionalHomeSiteUtil.openActionByMenuTree(browser, FunctionalHomeSiteUtil.HomeSiteAction.SETTINGS);
-		
-		String newPassword = ("passwd_" + 0 + "_" + UUID.randomUUID().toString()).substring(0, 24);
-		
-		functionalUtil.openContentTab(browser, SettingsTab.PASSWORD.ordinal());
-		
-		functionalUtil.typePassword(browser, functionalHomeSiteUtil.getOldPasswordCss(), current.getPassword());
-		functionalUtil.typePassword(browser, functionalHomeSiteUtil.getNewPasswordCss(), newPassword);
-		functionalUtil.typePassword(browser, functionalHomeSiteUtil.getConfirmPasswordCss(), newPassword);
-		
-		functionalUtil.saveForm(browser, 0);
-		
-		Assert.assertTrue(functionalUtil.logout(browser));
-		Assert.assertTrue(functionalUtil.login(browser, current.getLogin(), newPassword, true));
-	}
-	
 	
 	@Test
 	@RunAsClient
diff --git a/src/test/java/org/olat/selenium/ResumeTest.java b/src/test/java/org/olat/selenium/UserSettingsTest.java
similarity index 52%
rename from src/test/java/org/olat/selenium/ResumeTest.java
rename to src/test/java/org/olat/selenium/UserSettingsTest.java
index 7ca2adf7ef8..dd27fd5dcb8 100644
--- a/src/test/java/org/olat/selenium/ResumeTest.java
+++ b/src/test/java/org/olat/selenium/UserSettingsTest.java
@@ -22,21 +22,26 @@ package org.olat.selenium;
 import java.io.IOException;
 import java.net.URISyntaxException;
 import java.net.URL;
+import java.util.List;
+import java.util.UUID;
 
 import org.jboss.arquillian.container.test.api.Deployment;
+import org.jboss.arquillian.container.test.api.RunAsClient;
 import org.jboss.arquillian.drone.api.annotation.Drone;
 import org.jboss.arquillian.graphene.page.InitialPage;
 import org.jboss.arquillian.graphene.page.Page;
 import org.jboss.arquillian.junit.Arquillian;
 import org.jboss.arquillian.test.api.ArquillianResource;
 import org.jboss.shrinkwrap.api.spec.WebArchive;
-import org.jcodec.common.Assert;
+import org.junit.Assert;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.olat.restapi.support.vo.CourseVO;
 import org.olat.selenium.page.LoginPage;
 import org.olat.selenium.page.course.CoursePageFragment;
 import org.olat.selenium.page.user.UserPreferencesPageFragment.ResumeOption;
+import org.olat.selenium.page.user.UserPasswordPage;
+import org.olat.selenium.page.user.UserPreferencesPageFragment;
 import org.olat.selenium.page.user.UserToolsPage;
 import org.olat.test.ArquillianDeployments;
 import org.olat.test.rest.RepositoryRestClient;
@@ -53,7 +58,7 @@ import org.openqa.selenium.WebElement;
  *
  */
 @RunWith(Arquillian.class)
-public class ResumeTest {
+public class UserSettingsTest {
 	
 	@Deployment(testable = false)
 	public static WebArchive createDeployment() {
@@ -77,7 +82,7 @@ public class ResumeTest {
 	 * @throws URISyntaxException
 	 */
 	@Test
-	public void resumeCourseAutomatically(@InitialPage LoginPage loginPage)
+	public void resume_resumeCourseAutomatically(@InitialPage LoginPage loginPage)
 	throws IOException, URISyntaxException {
 		//create a random user
 		UserVO user = new UserRestClient(deploymentUrl).createRandomUser();
@@ -130,7 +135,7 @@ public class ResumeTest {
 	 * @throws URISyntaxException
 	 */
 	@Test
-	public void resumeCourseOnDemand(@InitialPage LoginPage loginPage)
+	public void resume_resumeCourseOnDemand(@InitialPage LoginPage loginPage)
 	throws IOException, URISyntaxException {
 		//create a random user
 		UserVO user = new UserRestClient(deploymentUrl).createRandomUser();
@@ -166,4 +171,162 @@ public class ResumeTest {
 		Assert.assertTrue(courseTitle.isDisplayed());
 		Assert.assertTrue(courseTitle.getText().contains(course.getTitle()));
 	}
+	
+	/**
+	 * Disable the resume function and check that the resume
+	 * popup don't stay in our way after login.
+	 * 
+	 * @param loginPage
+	 * @throws IOException
+	 * @throws URISyntaxException
+	 */
+	@Test
+	@RunAsClient
+	public void resume_disabled(@InitialPage LoginPage loginPage)
+	throws IOException, URISyntaxException {
+		UserVO user = new UserRestClient(deploymentUrl).createRandomUser();
+		loginPage
+			.loginAs(user.getLogin(), user.getPassword())
+			.resume();
+		
+		//set the preferences to resume automatically
+		userTools
+			.openUserToolsMenu()
+			.openMySettings()
+			.openPreferences()
+			.setResume(ResumeOption.none);
+	
+		//logout
+		userTools.logout();
+		
+		//login again
+		loginPage
+			.assertOnLoginPage()
+			.loginAs(user.getLogin(), user.getPassword());
+		
+		//check that we don't see the resume button
+		List<WebElement> resumeButtons = browser.findElements(LoginPage.resumeButton);
+		Assert.assertTrue(resumeButtons.isEmpty());
+		//double check that we are really logged in
+		loginPage.assertLoggedIn(user);
+	}
+	
+	/**
+	 * Switch the language to german and after logout login to english
+	 * and check every time.
+	 * 
+	 * @param loginPage
+	 * @throws IOException
+	 * @throws URISyntaxException
+	 */
+	@Test
+	@RunAsClient
+	public void language_switch(@InitialPage LoginPage loginPage)
+	throws IOException, URISyntaxException {
+		UserVO user = new UserRestClient(deploymentUrl).createRandomUser();
+		loginPage
+			.loginAs(user.getLogin(), user.getPassword())
+			.resume();
+		
+		//set the languages preferences to german
+		userTools
+			.assertOnUserTools()
+			.openUserToolsMenu()
+			.openMySettings()
+			.assertOnUserSettings()
+			.openPreferences()
+			.assertOnUserPreferences()
+			.setLanguage("de");
+		
+		userTools.logout();
+		
+		loginPage
+			.loginAs(user.getLogin(), user.getPassword())
+			.resume();
+		
+		WebElement usernameDE = browser.findElement(LoginPage.usernameFooterBy);
+		boolean de = usernameDE.getText().contains("Eingeloggt als");
+		Assert.assertTrue(de);
+		List<WebElement> deMarker = browser.findElements(By.className("o_lang_de"));
+		Assert.assertFalse(deMarker.isEmpty());
+		
+		
+		//set the languages preferences to english
+		userTools
+			.openUserToolsMenu()
+			.openMySettings()
+			.openPreferences()
+			.setLanguage("en");
+		
+		userTools.logout();
+				
+		loginPage
+			.loginAs(user.getLogin(), user.getPassword())
+			.resume();
+		
+		WebElement usernameEN = browser.findElement(LoginPage.usernameFooterBy);
+		boolean en = usernameEN.getText().contains("Logged in as");
+		Assert.assertTrue(en);
+		List<WebElement> enMarker = browser.findElements(By.className("o_lang_en"));
+		Assert.assertFalse(enMarker.isEmpty());
+	}
+	
+	/**
+	 * Change the password, log out and try to log in again
+	 * 
+	 * @param loginPage
+	 * @throws IOException
+	 * @throws URISyntaxException
+	 */
+	@Test
+	@RunAsClient
+	public void password_change(@InitialPage LoginPage loginPage)
+	throws IOException, URISyntaxException {
+		UserVO user = new UserRestClient(deploymentUrl).createRandomUser();
+		loginPage
+			.loginAs(user.getLogin(), user.getPassword())
+			.resume();
+		
+		userTools
+			.assertOnUserTools()
+			.openUserToolsMenu()
+			.openPassword();
+		
+		String newPassword = UUID.randomUUID().toString();
+		UserPasswordPage password = UserPasswordPage.getUserPasswordPage(browser);
+		password.setNewPassword(user.getPassword(), newPassword);
+		
+		userTools.logout();
+		
+		loginPage
+			.loginAs(user.getLogin(), newPassword)
+			.resume()
+			.assertLoggedIn(user);
+	}
+	
+	/**
+	 * Reset the preferences and check that a log out happens
+	 * 
+	 * @param loginPage
+	 * @throws IOException
+	 * @throws URISyntaxException
+	 */
+	@Test
+	@RunAsClient
+	public void resetPreferences(@InitialPage LoginPage loginPage)
+	throws IOException, URISyntaxException {
+		UserVO user = new UserRestClient(deploymentUrl).createRandomUser();
+		loginPage
+			.loginAs(user.getLogin(), user.getPassword())
+			.resume();
+		
+		UserPreferencesPageFragment prefs = userTools
+			.openUserToolsMenu()
+			.openMySettings()
+			.openPreferences();
+		//reset the preferences
+		prefs.resetPreferences();
+		//check the user is log out
+		loginPage.assertOnLoginPage();
+	}
 }
diff --git a/src/test/java/org/olat/selenium/page/LoginPage.java b/src/test/java/org/olat/selenium/page/LoginPage.java
index aa98db823ec..100afdf75bf 100644
--- a/src/test/java/org/olat/selenium/page/LoginPage.java
+++ b/src/test/java/org/olat/selenium/page/LoginPage.java
@@ -27,6 +27,7 @@ import org.jboss.arquillian.graphene.Graphene;
 import org.jboss.arquillian.graphene.page.Location;
 import org.jcodec.common.Assert;
 import org.olat.selenium.page.graphene.OOGraphene;
+import org.olat.user.restapi.UserVO;
 import org.openqa.selenium.By;
 import org.openqa.selenium.WebDriver;
 import org.openqa.selenium.WebElement;
@@ -59,6 +60,8 @@ public class LoginPage {
 	public static final By disclaimerButtonXPath = By.xpath("//div[contains(@class,'o_sel_disclaimer_buttons')]/button"); 
 	
 	public static final By resumeButton = By.className("o_sel_resume_yes");
+	
+	public static final By usernameFooterBy = By.id("o_username");
 
 	@FindBy(className = loginFormClassName)
 	private WebElement loginDiv;
@@ -84,19 +87,28 @@ public class LoginPage {
 		return this;
 	}
 	
+	public void assertLoggedIn(UserVO user) {
+		WebElement username = browser.findElement(usernameFooterBy);
+		Assert.assertNotNull(username);
+		Assert.assertTrue(username.isDisplayed());
+		String name = username.getText();
+		Assert.assertTrue(name.contains(user.getLastName()));
+	}
+	
 	/**
 	 * Login and accept the disclaimer if there is one.
 	 * 
 	 * @param username
 	 * @param password
 	 */
-	public void loginAs(String username, String password) {
+	public LoginPage loginAs(String username, String password) {
 		usernameInput.sendKeys(username);
 		passwordInput.sendKeys(password);
 
 		Graphene.guardHttp(loginButton).click();
 		OOGraphene.waitElement(authOrDisclaimerXPath);
 		
+		//wipe out disclaimer
 		List<WebElement> disclaimer = browser.findElements(disclaimerXPath);
 		if(disclaimer.size() > 0) {
 			//click the disclaimer
@@ -106,17 +118,29 @@ public class LoginPage {
 			Graphene.guardHttp(acknowledgeButton).click();
 			OOGraphene.waitElement(authXPath);
 		}
+		return this;
 	}
 	
 	/**
 	 * Resume the session, and assert that the resume panel has popped
 	 */
-	public void resumeWithAssert() {
+	public LoginPage resumeWithAssert() {
 		WebElement resume = browser.findElement(resumeButton);
 		Assert.assertNotNull(resume);
 		Assert.assertTrue(resume.isDisplayed());
 		
 		resume.click();
 		OOGraphene.waitBusy();
+		return this;
+	}
+	
+	public LoginPage resume() {
+		List<WebElement> resumes = browser.findElements(resumeButton);
+		if(resumes.size() > 0 && resumes.get(0).isDisplayed()) {
+			WebElement resume = resumes.get(0);
+			resume.click();
+			OOGraphene.waitBusy();
+		}
+		return this;
 	}
 }
diff --git a/src/test/java/org/olat/selenium/page/user/UserPasswordPage.java b/src/test/java/org/olat/selenium/page/user/UserPasswordPage.java
new file mode 100644
index 00000000000..6171a6c439d
--- /dev/null
+++ b/src/test/java/org/olat/selenium/page/user/UserPasswordPage.java
@@ -0,0 +1,69 @@
+/**
+ * <a href="http://www.openolat.org">
+ * OpenOLAT - Online Learning and Training</a><br>
+ * <p>
+ * Licensed under the Apache License, Version 2.0 (the "License"); <br>
+ * you may not use this file except in compliance with the License.<br>
+ * You may obtain a copy of the License at the
+ * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a>
+ * <p>
+ * Unless required by applicable law or agreed to in writing,<br>
+ * software distributed under the License is distributed on an "AS IS" BASIS, <br>
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br>
+ * See the License for the specific language governing permissions and <br>
+ * limitations under the License.
+ * <p>
+ * Initial code contributed and copyrighted by<br>
+ * frentix GmbH, http://www.frentix.com
+ * <p>
+ */
+package org.olat.selenium.page.user;
+
+import org.jboss.arquillian.drone.api.annotation.Drone;
+import org.jboss.arquillian.graphene.Graphene;
+import org.olat.selenium.page.graphene.OOGraphene;
+import org.openqa.selenium.By;
+import org.openqa.selenium.WebDriver;
+import org.openqa.selenium.WebElement;
+
+/**
+ * To drive the password change page.
+ * 
+ * Initial date: 26.06.2014<br>
+ * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
+ *
+ */
+public class UserPasswordPage {
+	
+
+	public static final By oldPasswordBy = By.className("o_sel_home_pwd_old");
+	
+	@Drone
+	private WebDriver browser;
+	
+	public static UserPasswordPage getUserPasswordPage(WebDriver browser) {
+		OOGraphene.waitElement(oldPasswordBy);
+		WebElement main = browser.findElement(By.id("o_main"));
+		return Graphene.createPageFragment(UserPasswordPage.class, main);
+	}
+	
+	public UserPasswordPage setNewPassword(String oldPassword, String newPassword) {
+		//fill the form
+		By oldPasswordBy = By.cssSelector("div.o_sel_home_pwd_old input");
+		WebElement oldPasswordEl = browser.findElement(oldPasswordBy);
+		oldPasswordEl.sendKeys(oldPassword);
+		By newPasswordBy = By.cssSelector("div.o_sel_home_pwd_new_1 input");
+		WebElement newPasswordEl = browser.findElement(newPasswordBy);
+		newPasswordEl.sendKeys(newPassword);
+		By passwordConfirmationBy = By.cssSelector("div.o_sel_home_pwd_new_2 input");
+		WebElement passwordConfirmationEl = browser.findElement(passwordConfirmationBy);
+		passwordConfirmationEl.sendKeys(newPassword);
+		//save it
+		By saveButtonBy = By.cssSelector("div.form-inline.o_sel_home_pwd_buttons button");
+		WebElement saveButton = browser.findElement(saveButtonBy);
+		saveButton.click();
+		OOGraphene.waitBusy();
+		return this;
+	}
+
+}
diff --git a/src/test/java/org/olat/selenium/page/user/UserPreferencesPageFragment.java b/src/test/java/org/olat/selenium/page/user/UserPreferencesPageFragment.java
index 9fc2f7f2b24..890063f0ec5 100644
--- a/src/test/java/org/olat/selenium/page/user/UserPreferencesPageFragment.java
+++ b/src/test/java/org/olat/selenium/page/user/UserPreferencesPageFragment.java
@@ -19,13 +19,17 @@
  */
 package org.olat.selenium.page.user;
 
+import java.util.List;
+
 import org.jboss.arquillian.drone.api.annotation.Drone;
-import org.jcodec.common.Assert;
+import org.junit.Assert;
+import org.olat.selenium.page.LoginPage;
 import org.olat.selenium.page.graphene.OOGraphene;
 import org.openqa.selenium.By;
 import org.openqa.selenium.WebDriver;
 import org.openqa.selenium.WebElement;
 import org.openqa.selenium.support.FindBy;
+import org.openqa.selenium.support.ui.Select;
 
 /**
  * The user system preferences.
@@ -42,6 +46,10 @@ public class UserPreferencesPageFragment {
 	public static final By ondemandRadio = By.xpath("//div[contains(@class,'o_sel_home_settings_resume')]//input[@type='radio' and @value='ondemand']");
 	
 	public static final By saveSystemSettingsButton = By.xpath("//div[contains(@class,'o_sel_home_settings_gui_buttons')]//button[@type='button']");
+	public static final By saveSystemPrefsButton = By.xpath("//div[contains(@class,'o_sel_home_settings_prefs_buttons')]//button[@type='button']");
+	public static final By resetPrefsButton = By.xpath("//div[contains(@class,'o_sel_home_settings_reset_sysprefs_buttons')]//button[@type='button']");
+	
+	
 	
 	@Drone
 	private WebDriver browser;
@@ -89,6 +97,32 @@ public class UserPreferencesPageFragment {
 		return this;
 	}
 	
+	public UserPreferencesPageFragment setLanguage(String language) {
+		By selectLangBy = By.cssSelector("div.o_sel_home_settings_language select");
+		WebElement selectLang = browser.findElement(selectLangBy);
+		new Select(selectLang).selectByValue(language);
+		
+		WebElement saveButton = browser.findElement(saveSystemPrefsButton);
+		saveButton.click();
+		OOGraphene.waitBusy();
+		return this;
+	}
+	
+	public UserPreferencesPageFragment resetPreferences() {
+		By checksBy = By.cssSelector("div.o_sel_home_settings_reset_sysprefs div.checkbox input");
+		List<WebElement> checks = browser.findElements(checksBy);
+		Assert.assertEquals(3, checks.size());
+		
+		for(WebElement check:checks) {
+			check.click();
+		}
+		
+		WebElement saveButton = browser.findElement(resetPrefsButton);
+		saveButton.click();
+		OOGraphene.waitElement(LoginPage.loginFormBy);
+		return this;
+	}
+	
 	public enum ResumeOption {
 		none,
 		auto,
diff --git a/src/test/java/org/olat/selenium/page/user/UserToolsPage.java b/src/test/java/org/olat/selenium/page/user/UserToolsPage.java
index aca0660badb..9f5acd92583 100644
--- a/src/test/java/org/olat/selenium/page/user/UserToolsPage.java
+++ b/src/test/java/org/olat/selenium/page/user/UserToolsPage.java
@@ -50,6 +50,7 @@ public class UserToolsPage {
 	
 	@FindBy(className = "o_sel_user_tools-mysettings")
 	private WebElement mySettingsLink;
+	
 	@FindBy(className = "o_logout")
 	private WebElement logoutLink;
 	
@@ -91,6 +92,14 @@ public class UserToolsPage {
 		return userSettings;
 	}
 	
+	public UserSettingsPage openPassword() {
+		WebElement passwordLink = browser.findElement(By.className("o_sel_user_tools-mypassword"));
+		Assert.assertTrue(passwordLink.isDisplayed());
+		passwordLink.click();
+		OOGraphene.waitBusy();
+		return userSettings;
+	}
+	
 	/**
 	 * Log out and wait until the login form appears
 	 */
-- 
GitLab