diff --git a/src/main/java/org/olat/admin/sysinfo/InfoMessageControllerSingleVM.java b/src/main/java/org/olat/admin/sysinfo/InfoMessageControllerSingleVM.java index 238b5876d3e5d7a25df5afc08d4e7611138fe299..811962c2184d0052527cfbe40dad4eea079ad449 100644 --- a/src/main/java/org/olat/admin/sysinfo/InfoMessageControllerSingleVM.java +++ b/src/main/java/org/olat/admin/sysinfo/InfoMessageControllerSingleVM.java @@ -85,7 +85,9 @@ public class InfoMessageControllerSingleVM extends BasicController { infomsgEditButton = LinkFactory.createButton("infomsgEdit", infoMsgView, this); infomsgClearButton = LinkFactory.createButton("infomsgClear", infoMsgView, this); maintenancemsgEditButton = LinkFactory.createButton("maintenancemsgEdit", infoMsgView, this); + maintenancemsgEditButton.setElementCssClass("o_sel_maintenance_msg_edit"); maintenancemsgClearButton = LinkFactory.createButton("maintenancemsgClear", infoMsgView, this); + maintenancemsgClearButton.setElementCssClass("o_sel_maintenance_msg_clear"); //login String infoMsg = mrg.getInfoMessage(); diff --git a/src/main/java/org/olat/admin/sysinfo/_content/infomsg.html b/src/main/java/org/olat/admin/sysinfo/_content/infomsg.html index 0de98e957b222276fe079ee9e22d3ae40f3a5177..4d123600e3153b09ccc9c159db283c33a45a9f55 100644 --- a/src/main/java/org/olat/admin/sysinfo/_content/infomsg.html +++ b/src/main/java/org/olat/admin/sysinfo/_content/infomsg.html @@ -1,10 +1,7 @@ -<div class="o_block_large"> - <fieldset> - <legend>Admin.</legend> - <p><i>Message Admin-Token: $!admintoken</i></p> - </fieldset> -</div> - +<fieldset> + <legend>Admin.</legend> + <p><i>Message Admin-Token: $!admintoken</i></p> +</fieldset> <div class="o_block_large"> <fieldset> <legend>$r.translate("infomsg.title")</legend> diff --git a/src/main/java/org/olat/admin/sysinfo/_content/infomsgEdit.html b/src/main/java/org/olat/admin/sysinfo/_content/infomsgEdit.html index d644c4838a9446126d63efe4e21798ce5d3499f6..3045d2f03a0f693467ae8fecf1a2db19e38797b9 100644 --- a/src/main/java/org/olat/admin/sysinfo/_content/infomsgEdit.html +++ b/src/main/java/org/olat/admin/sysinfo/_content/infomsgEdit.html @@ -1,12 +1,13 @@ +<fieldset class="o_sel_maintenance_msg_form"> #if ($infoEdit) - <h3>$r.translate("infomsgEdit")</h3> + <legend>$r.translate("infomsgEdit")</legend> #if ($cluster) $r.render("infoMsgFormCluster") #else $r.render("infoMsgForm") #end #else - <h3>$r.translate("maintenancemsgEdit")</h3> + <legend>$r.translate("maintenancemsgEdit")</legend> #if ($cluster) $r.render("maintenanceMsgFormCluster") #else @@ -14,6 +15,7 @@ #end #end -<h3>$r.translate("staticFolder")</h3> +<h4>$r.translate("staticFolder")</h4> <div class="o_copy_code o_nowrap">$extlink</div> -$r.render("staticFolder") \ No newline at end of file +$r.render("staticFolder") +</fieldset> \ No newline at end of file diff --git a/src/test/java/org/olat/selenium/LoginTest.java b/src/test/java/org/olat/selenium/LoginTest.java index d9b27882fe993c6868ee7cc17019566652e31e7b..1e23e2073a5e6086bcb0655ba54e542b88cd0b62 100644 --- a/src/test/java/org/olat/selenium/LoginTest.java +++ b/src/test/java/org/olat/selenium/LoginTest.java @@ -22,6 +22,7 @@ package org.olat.selenium; import java.io.IOException; import java.net.URISyntaxException; import java.net.URL; +import java.util.UUID; import org.jboss.arquillian.container.test.api.Deployment; import org.jboss.arquillian.container.test.api.RunAsClient; @@ -33,6 +34,10 @@ import org.jboss.shrinkwrap.api.spec.WebArchive; import org.junit.Test; import org.junit.runner.RunWith; import org.olat.selenium.page.LoginPage; +import org.olat.selenium.page.NavigationPage; +import org.olat.selenium.page.Participant; +import org.olat.selenium.page.Student; +import org.olat.selenium.page.core.AdministrationMessagesPage; import org.olat.test.ArquillianDeployments; import org.olat.test.rest.UserRestClient; import org.olat.user.restapi.UserVO; @@ -103,4 +108,61 @@ public class LoginTest { //login loginPage.loginAs(user.getLogin(), user.getPassword()); } + + /** + * An administrator set a maintenance message. A first user + * logs in before and wait until the message appears. A second + * user load the login page, check that the message is visible, + * logs in and check that the message is visible too. + * + * + * @param loginPage + * @param reiBrowser + * @param kanuBrowser + * @throws IOException + * @throws URISyntaxException + */ + @Test + @RunAsClient + public void maintenanceMessage(@InitialPage LoginPage loginPage, + @Drone @Participant WebDriver reiBrowser, + @Drone @Student WebDriver kanuBrowser) + throws IOException, URISyntaxException { + UserVO rei = new UserRestClient(deploymentUrl).createRandomUser("Rei"); + UserVO kanu = new UserRestClient(deploymentUrl).createRandomUser("Kanu"); + + //a first user log in + LoginPage kanuLogin = LoginPage.getLoginPage(kanuBrowser, deploymentUrl) + .loginAs(kanu) + .resume(); + + // administrator come in, and set a maintenance message + loginPage + .assertOnLoginPage() + .loginAs("administrator", "openolat"); + + String message = "Hello - " + UUID.randomUUID(); + AdministrationMessagesPage messagesPage = new NavigationPage(browser) + .openAdministration() + .selectInfoMessages() + .newMaintenanceMessage(message); + + //A new user see the login page + LoginPage.getLoginPage(reiBrowser, deploymentUrl) + .waitOnMaintenanceMessage(message) + .loginAs(rei) + .resume() + .assertOnMaintenanceMessage(message); + + kanuLogin + .waitOnMaintenanceMessage(message); + + //administrator remove the message + messagesPage + .clearMaintenanceMessage(); + + //we wait it disappears + kanuLogin + .waitOnMaintenanceMessageCleared(); + } } diff --git a/src/test/java/org/olat/selenium/page/LoginPage.java b/src/test/java/org/olat/selenium/page/LoginPage.java index fa61508fba1364f6eb093c01c0a129953ad87851..57941387ce8257d9994a770f03188b772ac49760 100644 --- a/src/test/java/org/olat/selenium/page/LoginPage.java +++ b/src/test/java/org/olat/selenium/page/LoginPage.java @@ -56,6 +56,8 @@ public class LoginPage { public static final By resumeButton = By.className("o_sel_resume_yes"); public static final By usernameFooterBy = By.id("o_username"); + public static final By maintenanceMessageBy = By.cssSelector("#o_msg_sticky p"); + @Drone private WebDriver browser; @@ -87,6 +89,23 @@ public class LoginPage { Assert.assertTrue(name.contains(lastName)); } + public LoginPage assertOnMaintenanceMessage(String text) { + WebElement messageEl = browser.findElement(maintenanceMessageBy); + String message = messageEl.getText(); + Assert.assertTrue(message.contains(text)); + return this; + } + + public LoginPage waitOnMaintenanceMessage(String text) { + OOGraphene.waitElement(maintenanceMessageBy, 10, browser); + return assertOnMaintenanceMessage(text); + } + + public LoginPage waitOnMaintenanceMessageCleared() { + OOGraphene.waitElementDisappears(maintenanceMessageBy, 10, browser); + return this; + } + /** * Login and accept the disclaimer if there is one. * diff --git a/src/test/java/org/olat/selenium/page/core/AdministrationMessagesPage.java b/src/test/java/org/olat/selenium/page/core/AdministrationMessagesPage.java new file mode 100644 index 0000000000000000000000000000000000000000..64b34df7ed73d59be0a0cda5ae7684da98567cac --- /dev/null +++ b/src/test/java/org/olat/selenium/page/core/AdministrationMessagesPage.java @@ -0,0 +1,61 @@ +/** + * <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.core; + +import org.olat.selenium.page.graphene.OOGraphene; +import org.openqa.selenium.By; +import org.openqa.selenium.WebDriver; + +/** + * + * Initial date: 22.07.2015<br> + * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com + * + */ +public class AdministrationMessagesPage { + + private final WebDriver browser; + + public AdministrationMessagesPage(WebDriver browser) { + this.browser = browser; + } + + public AdministrationMessagesPage newMaintenanceMessage(String text) { + By newMessageButtonBy = By.cssSelector("a.o_sel_maintenance_msg_edit"); + browser.findElement(newMessageButtonBy).click(); + OOGraphene.waitBusy(browser); + + OOGraphene.tinymce(text, browser); + + By saveBy = By.cssSelector(".o_sel_maintenance_msg_form button.btn-primary"); + browser.findElement(saveBy).click(); + OOGraphene.waitBusy(browser); + OOGraphene.waitAndCloseBlueMessageWindow(browser); + return this; + } + + public AdministrationMessagesPage clearMaintenanceMessage() { + By clearBy = By.cssSelector("a.o_sel_maintenance_msg_clear"); + browser.findElement(clearBy).click(); + OOGraphene.waitBusy(browser); + return this; + } + +} diff --git a/src/test/java/org/olat/selenium/page/core/AdministrationPage.java b/src/test/java/org/olat/selenium/page/core/AdministrationPage.java index 91ab42dde4e35f46c9f77a545b497bf516ccc73c..e93ded84fdd8dcf2c2b1f6226956fa8e80cedc2e 100644 --- a/src/test/java/org/olat/selenium/page/core/AdministrationPage.java +++ b/src/test/java/org/olat/selenium/page/core/AdministrationPage.java @@ -21,7 +21,6 @@ package org.olat.selenium.page.core; import java.util.List; -import org.jboss.arquillian.drone.api.annotation.Drone; import org.junit.Assert; import org.olat.selenium.page.graphene.OOGraphene; import org.openqa.selenium.By; @@ -36,25 +35,32 @@ import org.openqa.selenium.WebElement; * */ public class AdministrationPage { - - //private static final By - - @Drone - private WebDriver browser; - - public AdministrationPage() { - // - } + + private final WebDriver browser; public AdministrationPage(WebDriver browser) { this.browser = browser; } - public AdministrationPage clearCache(String cacheName) { - //system tree node - WebElement systemLink = browser.findElement(By.xpath("//div[contains(@class,'o_tree')]//a[contains(@href,'systemParent/')]")); - systemLink.click(); + public AdministrationMessagesPage selectInfoMessages() { + this.selectSystemInfo(); + + By messagesBy = By.cssSelector(".o_sel_sysinfo span.o_tree_level_label_leaf>a"); + browser.findElement(messagesBy).click(); OOGraphene.waitBusy(browser); + return new AdministrationMessagesPage(browser); + } + + public AdministrationPage selectSystemInfo() { + By systemLinkby = By.xpath("//div[contains(@class,'o_tree')]//a[contains(@href,'systemParent/')]"); + browser.findElement(systemLinkby).click(); + OOGraphene.waitBusy(browser); + return this; + } + + public AdministrationPage clearCache(String cacheName) { + selectSystemInfo(); + //cache tree node WebElement cacheLink = browser.findElement(By.cssSelector(".o_sel_caches span.o_tree_level_label_leaf>a")); cacheLink.click(); diff --git a/src/test/java/org/olat/selenium/page/graphene/OOGraphene.java b/src/test/java/org/olat/selenium/page/graphene/OOGraphene.java index 2a1d2814bb34b4e52a2cbfa6c2360b59d3a68597..39d1fdfb1ab749c9c35f7e11a704b5190d9efca1 100644 --- a/src/test/java/org/olat/selenium/page/graphene/OOGraphene.java +++ b/src/test/java/org/olat/selenium/page/graphene/OOGraphene.java @@ -59,6 +59,11 @@ public class OOGraphene { .pollingEvery(poolingDuration, TimeUnit.MILLISECONDS).until().element(element).is().visible(); } + public static void waitElementDisappears(By element, int timeoutInSeconds, WebDriver browser) { + Graphene.waitModel(browser).withTimeout(timeoutInSeconds, TimeUnit.SECONDS) + .pollingEvery(poolingDuration, TimeUnit.MILLISECONDS).until().element(element).is().not().present(); + } + public static void waitElement(WebElement element, WebDriver browser) { Graphene.waitModel(browser).pollingEvery(poolingDuration, TimeUnit.MILLISECONDS).until().element(element).is().visible(); }