diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/InternalsClockPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/InternalsClockPanel.java index 59cc532d345..51fac38f711 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/InternalsClockPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/InternalsClockPanel.java @@ -8,8 +8,10 @@ import javax.xml.datatype.XMLGregorianCalendar; +import com.evolveum.midpoint.web.page.admin.configuration.component.EmptyOnBlurAjaxFormUpdatingBehaviour; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.markup.html.form.Form; +import org.apache.wicket.markup.html.form.FormComponent; import org.apache.wicket.model.IModel; import org.apache.wicket.spring.injection.annot.SpringBean; @@ -47,6 +49,9 @@ protected void onInitialize() { add(form); DatePanel offset = new DatePanel(ID_OFFSET, getModel()); + for (FormComponent formComponent : offset.getFormComponents()) { + formComponent.add(new EmptyOnBlurAjaxFormUpdatingBehaviour()); + } form.add(offset); AjaxSubmitButton saveButton = new AjaxSubmitButton(ID_BUTTON_SAVE, createStringResource("PageInternals.button.changeTime")) { diff --git a/testing/schrodingertest/src/test/java/com/evolveum/midpoint/testing/schrodinger/page/InternalsConfigurationPageTest.java b/testing/schrodingertest/src/test/java/com/evolveum/midpoint/testing/schrodinger/page/InternalsConfigurationPageTest.java new file mode 100644 index 00000000000..35ed1a1be85 --- /dev/null +++ b/testing/schrodingertest/src/test/java/com/evolveum/midpoint/testing/schrodinger/page/InternalsConfigurationPageTest.java @@ -0,0 +1,61 @@ +/** + * Copyright (c) 2010-2019 Evolveum and contributors + * + * This work is dual-licensed under the Apache License 2.0 + * and European Union Public License. See LICENSE file for details. + */ +package com.evolveum.midpoint.testing.schrodinger.page; + +import com.evolveum.midpoint.schrodinger.component.configuration.ClockTab; +import com.evolveum.midpoint.schrodinger.page.configuration.InternalsConfigurationPage; +import com.evolveum.midpoint.testing.schrodinger.TestBase; +import org.testng.Assert; +import org.testng.annotations.AfterClass; +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.Test; + +/** + * @author Hiroyuki Wada + */ +public class InternalsConfigurationPageTest extends TestBase { + + private InternalsConfigurationPage configPage; + + @BeforeMethod + private void openPage() { + configPage = basicPage.internalsConfiguration(); + } + + @AfterClass + private void cleanup() { + // Reset time because TestBase#afterClass() doesn't reset the clock. + configPage = basicPage.internalsConfiguration(); + configPage.clockTab().resetTime(); + } + + @Test + public void changeTime() { + ClockTab clockTab = configPage.clockTab(); + + clockTab.changeTime("5/15/2099", "10", "30", ClockTab.AmOrPmChoice.PM); + + Assert.assertTrue(basicPage.feedback().isSuccess()); + + basicPage.aboutPage(); + clockTab = basicPage.internalsConfiguration().clockTab(); + + Assert.assertEquals(clockTab.date(), "5/15/2099"); + Assert.assertEquals(clockTab.hours(), "10"); + Assert.assertEquals(clockTab.minutes(), "30"); + Assert.assertEquals(clockTab.amOrPmChoice(), ClockTab.AmOrPmChoice.PM.name()); + } + + @Test + public void resetTime() { + ClockTab clockTab = configPage.clockTab(); + + clockTab.resetTime(); + + Assert.assertTrue(basicPage.feedback().isSuccess()); + } +} diff --git a/tools/schrodinger/src/main/java/com/evolveum/midpoint/schrodinger/component/configuration/ClockTab.java b/tools/schrodinger/src/main/java/com/evolveum/midpoint/schrodinger/component/configuration/ClockTab.java index 3f6ee9e211c..5c1858a662a 100644 --- a/tools/schrodinger/src/main/java/com/evolveum/midpoint/schrodinger/component/configuration/ClockTab.java +++ b/tools/schrodinger/src/main/java/com/evolveum/midpoint/schrodinger/component/configuration/ClockTab.java @@ -6,17 +6,83 @@ */ package com.evolveum.midpoint.schrodinger.component.configuration; +import com.codeborne.selenide.Condition; import com.codeborne.selenide.SelenideElement; +import com.evolveum.midpoint.schrodinger.MidPoint; import com.evolveum.midpoint.schrodinger.component.Component; import com.evolveum.midpoint.schrodinger.page.configuration.InternalsConfigurationPage; +import com.evolveum.midpoint.schrodinger.util.Schrodinger; + +import static com.codeborne.selenide.Selenide.$; /** * Created by Viliam Repan (lazyman). */ public class ClockTab extends Component { + public enum AmOrPmChoice { + AM, PM + } + public ClockTab(InternalsConfigurationPage parent, SelenideElement parentElement) { super(parent, parentElement); } + + public void changeTime(String date, String hours, String minutes, AmOrPmChoice amOrPmChoice) { + SelenideElement dateEle = findDate(); + dateEle.click(); + dateEle.clear(); + dateEle.setValue(date); + + SelenideElement hoursEle = findHours(); + hoursEle.doubleClick(); + hoursEle.sendKeys(hours); + + SelenideElement minutesEle = findMinutes(); + minutesEle.doubleClick(); + minutesEle.sendKeys(minutes); + + SelenideElement amOrPmChoiceEle = findAmOrPmChoice(); + amOrPmChoiceEle.click(); + amOrPmChoiceEle.selectOption(amOrPmChoice.name()); + + $(Schrodinger.byDataId("save")).waitUntil(Condition.visible, MidPoint.TIMEOUT_DEFAULT_2_S).click(); + } + + public void resetTime() { + $(Schrodinger.byDataId("reset")).waitUntil(Condition.visible, MidPoint.TIMEOUT_DEFAULT_2_S).click(); + } + + public String date() { + return findDate().getValue(); + } + + public String hours() { + return findHours().getValue(); + } + + public String minutes() { + return findMinutes().getValue(); + } + + public String amOrPmChoice() { + return findAmOrPmChoice().getSelectedText(); + } + + private SelenideElement findDate() { + return $(Schrodinger.byDataId("date")).waitUntil(Condition.visible, MidPoint.TIMEOUT_DEFAULT_2_S); + } + + private SelenideElement findHours() { + return $(Schrodinger.byDataId("hours")).waitUntil(Condition.visible, MidPoint.TIMEOUT_DEFAULT_2_S); + } + + private SelenideElement findMinutes() { + return $(Schrodinger.byDataId("minutes")).waitUntil(Condition.visible, MidPoint.TIMEOUT_DEFAULT_2_S); + } + + private SelenideElement findAmOrPmChoice() { + return $(Schrodinger.byDataId("amOrPmChoice")).waitUntil(Condition.visible, MidPoint.TIMEOUT_DEFAULT_2_S); + } } diff --git a/tools/schrodinger/src/main/java/com/evolveum/midpoint/schrodinger/page/BasicPage.java b/tools/schrodinger/src/main/java/com/evolveum/midpoint/schrodinger/page/BasicPage.java index 40cde842f1a..353a1f485c1 100644 --- a/tools/schrodinger/src/main/java/com/evolveum/midpoint/schrodinger/page/BasicPage.java +++ b/tools/schrodinger/src/main/java/com/evolveum/midpoint/schrodinger/page/BasicPage.java @@ -314,7 +314,7 @@ public RoleManagementTab roleManagement() { } public InternalsConfigurationPage internalsConfiguration() { - clickConfigurationMenu("PageAdmin.menu.top.configuration.internals", null); + clickConfigurationMenu("PageAdmin.menu.top.configuration.internals", null, 1); return new InternalsConfigurationPage(); } @@ -341,7 +341,11 @@ public String getAdministrationMenuItemIconClass(String mainMenuKey, String menu } private void clickConfigurationMenu(String mainMenuKey, String menuItemKey) { - clickMenuItem("PageAdmin.menu.top.configuration", mainMenuKey, menuItemKey); + clickConfigurationMenu(mainMenuKey, menuItemKey, 0); + } + + private void clickConfigurationMenu(String mainMenuKey, String menuItemKey, int index) { + clickMenuItem("PageAdmin.menu.top.configuration", mainMenuKey, menuItemKey, index); } public FeedbackBox feedback() { @@ -350,11 +354,19 @@ public FeedbackBox feedback() { } private void clickMenuItem(String topLevelMenuKey, String mainMenuKey, String menuItemKey) { - getMenuItemElement(topLevelMenuKey, mainMenuKey, menuItemKey).click(); + clickMenuItem(topLevelMenuKey, mainMenuKey, menuItemKey, 0); } - public SelenideElement getMenuItemElement(String topLevelMenuKey, String mainMenuKey, String menuItemKey){ - SelenideElement mainMenu = getMainMenuItemElement(topLevelMenuKey, mainMenuKey); + private void clickMenuItem(String topLevelMenuKey, String mainMenuKey, String menuItemKey, int index) { + getMenuItemElement(topLevelMenuKey, mainMenuKey, menuItemKey, index).click(); + } + + public SelenideElement getMenuItemElement(String topLevelMenuKey, String mainMenuKey, String menuItemKey) { + return getMenuItemElement(topLevelMenuKey, mainMenuKey, menuItemKey, 0); + } + + public SelenideElement getMenuItemElement(String topLevelMenuKey, String mainMenuKey, String menuItemKey, int index){ + SelenideElement mainMenu = getMainMenuItemElement(topLevelMenuKey, mainMenuKey, index); if (menuItemKey == null){ return mainMenu; } @@ -375,7 +387,11 @@ public SelenideElement getMenuItemElementByMenuLabelText(String topLevelMenuKey, return menuItem; } - private SelenideElement getMainMenuItemElement(String topLevelMenuKey, String mainMenuKey){ + private SelenideElement getMainMenuItemElement(String topLevelMenuKey, String mainMenuKey) { + return getMainMenuItemElement(topLevelMenuKey, mainMenuKey, 0); + } + + private SelenideElement getMainMenuItemElement(String topLevelMenuKey, String mainMenuKey, int index){ SelenideElement topLevelMenu = $(Schrodinger.byDataResourceKey(topLevelMenuKey)); topLevelMenu.shouldBe(Condition.visible); @@ -385,7 +401,7 @@ private SelenideElement getMainMenuItemElement(String topLevelMenuKey, String ma topLevelMenuChevron.shouldHave(Condition.cssClass("fa-chevron-down")).waitUntil(Condition.cssClass("fa-chevron-down"), MidPoint.TIMEOUT_DEFAULT_2_S); } - SelenideElement mainMenu = topLevelMenu.$(Schrodinger.byDataResourceKey(mainMenuKey)); + SelenideElement mainMenu = topLevelMenu.$(Schrodinger.byDataResourceKey(mainMenuKey), index); mainMenu.shouldBe(Condition.visible); SelenideElement mainMenuLi = mainMenu.parent().parent(); diff --git a/tools/schrodinger/src/main/java/com/evolveum/midpoint/schrodinger/page/configuration/InternalsConfigurationPage.java b/tools/schrodinger/src/main/java/com/evolveum/midpoint/schrodinger/page/configuration/InternalsConfigurationPage.java index 593bc15a997..1984de62c66 100644 --- a/tools/schrodinger/src/main/java/com/evolveum/midpoint/schrodinger/page/configuration/InternalsConfigurationPage.java +++ b/tools/schrodinger/src/main/java/com/evolveum/midpoint/schrodinger/page/configuration/InternalsConfigurationPage.java @@ -6,9 +6,15 @@ */ package com.evolveum.midpoint.schrodinger.page.configuration; +import com.codeborne.selenide.Condition; import com.codeborne.selenide.SelenideElement; +import com.evolveum.midpoint.schrodinger.MidPoint; +import com.evolveum.midpoint.schrodinger.component.common.TabPanel; import com.evolveum.midpoint.schrodinger.component.configuration.*; import com.evolveum.midpoint.schrodinger.page.BasicPage; +import com.evolveum.midpoint.schrodinger.util.Schrodinger; + +import static com.codeborne.selenide.Selenide.$; /** * Created by Viliam Repan (lazyman). @@ -16,8 +22,7 @@ public class InternalsConfigurationPage extends BasicPage { public ClockTab clockTab() { - //todo implement - SelenideElement element = null; + SelenideElement element = findTabPanel().clickTab("PageInternals.tab.clock"); return new ClockTab(this, element); } @@ -44,4 +49,10 @@ public CountersTab countersTab() { SelenideElement element = null; return new CountersTab(this, element); } + + protected TabPanel findTabPanel() { + SelenideElement tabPanelElement = $(Schrodinger.byDataId("div", "tabPanel")) + .waitUntil(Condition.appear, MidPoint.TIMEOUT_DEFAULT_2_S); + return new TabPanel<>(this, tabPanelElement); + } }