From 0f54703b2c40f4e461e0f9d49b89a8b4cbffc0e8 Mon Sep 17 00:00:00 2001 From: Hiroyuki Wada Date: Thu, 27 Feb 2020 13:12:42 +0900 Subject: [PATCH 1/9] MID-6085 fix time change error in Internals configuration page --- .../configuration/InternalsClockPanel.java | 5 ++ .../page/InternalsConfigurationPageTest.java | 61 +++++++++++++++++ .../component/configuration/ClockTab.java | 66 +++++++++++++++++++ .../midpoint/schrodinger/page/BasicPage.java | 30 +++++++-- .../InternalsConfigurationPage.java | 15 ++++- 5 files changed, 168 insertions(+), 9 deletions(-) create mode 100644 testing/schrodingertest/src/test/java/com/evolveum/midpoint/testing/schrodinger/page/InternalsConfigurationPageTest.java 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); + } } From 067b7b497492e62d0b4f83dd55305737322a6822 Mon Sep 17 00:00:00 2001 From: Hiroyuki Wada Date: Mon, 2 Mar 2020 00:59:32 +0900 Subject: [PATCH 2/9] MID-6092 Fix filtering by orgRef or tenantRef in role members tab --- .../admin/roles/MemberOperationsHelper.java | 14 +- .../evolveum/midpoint/gui/TestPageRole.java | 142 ++++++++++++++++++ .../web/AbstractGuiIntegrationTest.java | 24 +++ .../test/AbstractModelIntegrationTest.java | 4 + 4 files changed, 180 insertions(+), 4 deletions(-) create mode 100644 gui/admin-gui/src/test/java/com/evolveum/midpoint/gui/TestPageRole.java diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/roles/MemberOperationsHelper.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/roles/MemberOperationsHelper.java index 25dad9df661..89e618dfdbf 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/roles/MemberOperationsHelper.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/roles/MemberOperationsHelper.java @@ -264,19 +264,25 @@ public static ObjectQuery createDirectMemberQuery(R q0 = prismContext.queryFor(FocusType.class) .type(objectType); } - S_AtomicFilterExit q = q0.item(FocusType.F_ASSIGNMENT, AssignmentType.F_TARGET_REF) + + // Use exists filter to build a query like this: + // $a/targetRef = oid1 and $a/tenantRef = oid2 and $a/orgRef = oid3 + S_AtomicFilterExit q = q0.exists(FocusType.F_ASSIGNMENT) + .block() + .item(AssignmentType.F_TARGET_REF) .ref(createReferenceValuesList(targetObject, relations)); + if (tenant != null && tenant.getObjectType() != null) { - q = q.and().item(FocusType.F_ASSIGNMENT, AssignmentType.F_TENANT_REF).ref(ObjectTypeUtil.createObjectRef(tenant.getObjectType(), + q = q.and().item(AssignmentType.F_TENANT_REF).ref(ObjectTypeUtil.createObjectRef(tenant.getObjectType(), prismContext).asReferenceValue()); } if (project != null && project.getObjectType() != null) { - q = q.and().item(FocusType.F_ASSIGNMENT, AssignmentType.F_ORG_REF).ref(ObjectTypeUtil.createObjectRef(project.getObjectType(), + q = q.and().item(AssignmentType.F_ORG_REF).ref(ObjectTypeUtil.createObjectRef(project.getObjectType(), prismContext).asReferenceValue()); } - ObjectQuery query = q.build(); + ObjectQuery query = q.endBlock().build(); if (LOGGER.isTraceEnabled()) { LOGGER.trace("Searching members of role {} with query:\n{}", targetObject.getOid(), query.debugDump()); } diff --git a/gui/admin-gui/src/test/java/com/evolveum/midpoint/gui/TestPageRole.java b/gui/admin-gui/src/test/java/com/evolveum/midpoint/gui/TestPageRole.java new file mode 100644 index 00000000000..041226e4219 --- /dev/null +++ b/gui/admin-gui/src/test/java/com/evolveum/midpoint/gui/TestPageRole.java @@ -0,0 +1,142 @@ +/* + * Copyright (c) 2010-2018 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.gui; + +import com.evolveum.midpoint.gui.test.TestMidPointSpringApplication; +import com.evolveum.midpoint.model.api.ModelExecuteOptions; +import com.evolveum.midpoint.prism.PrismObject; +import com.evolveum.midpoint.schema.result.OperationResult; +import com.evolveum.midpoint.task.api.Task; +import com.evolveum.midpoint.util.logging.Trace; +import com.evolveum.midpoint.util.logging.TraceManager; +import com.evolveum.midpoint.web.AbstractInitializedGuiIntegrationTest; +import com.evolveum.midpoint.web.page.admin.roles.AbstractRoleMemberPanel; +import com.evolveum.midpoint.web.page.admin.roles.PageRole; +import com.evolveum.midpoint.web.util.OnePageParameterEncoder; +import com.evolveum.midpoint.xml.ns._public.common.common_3.RoleType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.SystemConfigurationType; +import org.apache.wicket.Page; +import org.apache.wicket.request.mapper.parameter.PageParameters; +import org.apache.wicket.util.tester.FormTester; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.annotation.DirtiesContext; +import org.springframework.test.annotation.DirtiesContext.ClassMode; +import org.springframework.test.context.ActiveProfiles; +import org.testng.annotations.Test; + +import static com.evolveum.midpoint.web.AdminGuiTestConstants.USER_JACK_OID; +import static com.evolveum.midpoint.web.AdminGuiTestConstants.USER_JACK_USERNAME; +import static org.testng.Assert.assertNotNull; + +/** + * @author Hiroyuki Wada + */ +@DirtiesContext(classMode = ClassMode.AFTER_CLASS) +@ActiveProfiles("test") +@SpringBootTest(classes = TestMidPointSpringApplication.class) +public class TestPageRole extends AbstractInitializedGuiIntegrationTest { + + private static final Trace LOGGER = TraceManager.getTrace(TestPageOrg.class); + + private static final String MAIN_FORM = "mainPanel:mainForm"; + private static final String PATH_FORM_NAME = "tabPanel:panel:main:values:0:value:propertiesLabel:properties:0:property:values:0:valueContainer:form:input:originValueContainer:origValueWithButton:origValue:input"; + private static final String FORM_SAVE = "save"; + + @Override + public void initSystem(Task initTask, OperationResult initResult) throws Exception { + super.initSystem(initTask, initResult); + PrismObject systemConfig = parseObject(SYSTEM_CONFIGURATION_FILE); + + LOGGER.info("adding system config page"); + addObject(systemConfig, ModelExecuteOptions.createOverwrite(), initTask, initResult); + } + + @Test + public void test001testAddNewRole() throws Exception { + renderPage(PageRole.class); + + FormTester formTester = tester.newFormTester(MAIN_FORM, false); + formTester.setValue(PATH_FORM_NAME, "newRole"); + formTester = formTester.submit(FORM_SAVE); + + Thread.sleep(5000); + + PrismObject newRole = findObjectByName(RoleType.class, "newRole"); + assertNotNull(newRole, "New role not created."); + LOGGER.info("created role: {}", newRole.debugDump()); + } + + /** + * MID-6092 + */ + @Test + public void test002testMembers() throws Exception { + // GIVEN + PrismObject role1 = createObject(RoleType.class, "Role0001"); + PrismObject role2 = createObject(RoleType.class, "Role0002"); + String role1Oid = addObject(role1); + String role2Oid = addObject(role2); + Task task = createTask("assign"); + // Assign Role0001 with orgRef P0001 + assignParametricRole(USER_JACK_OID, role1Oid, ORG_SAVE_ELAINE_OID, null, task, task.getResult()); + assignRole(USER_ADMINISTRATOR_OID, role1Oid); + // Assign Role0002 with orgRef P0001 + assignParametricRole(USER_ADMINISTRATOR_OID, role2Oid, ORG_SAVE_ELAINE_OID, null, task, task.getResult()); + + String panel = "mainPanel:mainForm:tabPanel:panel"; + String memberTable = panel + ":form:memberContainer:memberTable:mainForm:table:box:tableContainer:table"; + + // WHEN + // Open Role0001 page + renderPage(PageRole.class, role1Oid); + // Show Members tab + clickOnTab(8); + + // THEN + tester.assertComponent(panel, AbstractRoleMemberPanel.class); + tester.debugComponentTrees(":rows:.*:cells:3:cell:link:label"); + // It should show all members who are assigned Role0001 + tester.hasLabel(memberTable + ":body:rows:1:cells:3:cell:link:label", USER_ADMINISTRATOR_USERNAME); + tester.hasLabel(memberTable + ":body:rows:2:cells:3:cell:link:label", USER_JACK_USERNAME); + tester.assertNotExists(memberTable + ":body:rows:3:cells:3:cell:link:label"); + + // WHEN + // Choose P0001 in 'Org/Project' filter selection + tester.clickLink(panel + ":form:project:inputContainer:choose"); + tester.clickLink("mainPopup:content:table:mainForm:table:box:tableContainer:table:body:rows:7:cells:2:cell:link"); + executeModalWindowCloseCallback("mainPopup"); + + // THEN + // It should show only one user who is assigned Role0001 with orgRef P0001 + tester.debugComponentTrees(":rows:.*:cells:3:cell:link:label"); + tester.hasLabel(memberTable + ":body:rows:3:cells:3:cell:link:label", USER_JACK_USERNAME); + tester.assertNotExists(memberTable + ":body:rows:4:cells:3:cell:link:label"); + } + + private void clickOnTab(int order) { + tester.assertRenderedPage(PageRole.class); + String tabPath = "mainPanel:mainForm:tabPanel:tabs-container:tabs:" + order + ":link"; + tester.clickLink(tabPath); + } + + private Page renderPage(Class expectedRenderedPageClass) { + return renderPage(expectedRenderedPageClass, null); + } + + private Page renderPage(Class expectedRenderedPageClass, String oid) { + LOGGER.info("render page role"); + PageParameters params = new PageParameters(); + if (oid != null) { + params.add(OnePageParameterEncoder.PARAMETER, oid); + } + Page pageRole = tester.startPage(expectedRenderedPageClass, params); + + tester.assertRenderedPage(expectedRenderedPageClass); + + return pageRole; + } +} diff --git a/gui/admin-gui/src/test/java/com/evolveum/midpoint/web/AbstractGuiIntegrationTest.java b/gui/admin-gui/src/test/java/com/evolveum/midpoint/web/AbstractGuiIntegrationTest.java index fa5772a76b3..f11cea93bab 100644 --- a/gui/admin-gui/src/test/java/com/evolveum/midpoint/web/AbstractGuiIntegrationTest.java +++ b/gui/admin-gui/src/test/java/com/evolveum/midpoint/web/AbstractGuiIntegrationTest.java @@ -17,6 +17,11 @@ import java.util.Locale; import javax.xml.namespace.QName; +import org.apache.wicket.Component; +import org.apache.wicket.ajax.AbstractDefaultAjaxBehavior; +import org.apache.wicket.behavior.AbstractAjaxBehavior; +import org.apache.wicket.behavior.Behavior; +import org.apache.wicket.extensions.ajax.markup.html.modal.ModalWindow; import org.apache.wicket.util.tester.WicketTester; import org.jetbrains.annotations.NotNull; import org.springframework.beans.factory.annotation.Autowired; @@ -310,4 +315,23 @@ protected Task createSimpleTask(String operation) { task.setChannel(SchemaConstants.CHANNEL_GUI_USER_URI); return task; } + + /** + * Emulate closing ModalWindow component. + * @param path + */ + protected void executeModalWindowCloseCallback(String path) { + Component component = tester.getComponentFromLastRenderedPage(path); + if (!(component instanceof ModalWindow)) { + fail("path: '" + path + "' is not ModalWindow: " + component.getClass()); + } + for (Behavior behavior : ((ModalWindow)component).getBehaviors()) { + if (behavior instanceof AbstractDefaultAjaxBehavior) { + String name = behavior.getClass().getSimpleName(); + if (name.startsWith("WindowClosedBehavior")) { + tester.executeBehavior((AbstractAjaxBehavior) behavior); + } + } + } + } } diff --git a/model/model-test/src/main/java/com/evolveum/midpoint/model/test/AbstractModelIntegrationTest.java b/model/model-test/src/main/java/com/evolveum/midpoint/model/test/AbstractModelIntegrationTest.java index 6f40c32830a..c883d72cce2 100644 --- a/model/model-test/src/main/java/com/evolveum/midpoint/model/test/AbstractModelIntegrationTest.java +++ b/model/model-test/src/main/java/com/evolveum/midpoint/model/test/AbstractModelIntegrationTest.java @@ -1452,11 +1452,15 @@ protected ObjectDelta createParametricAssignmentDelta(String userOid, if (orgOid != null) { PrismReference orgRef = cval.findOrCreateReference(AssignmentType.F_ORG_REF); orgRef.getValue().setOid(orgOid); + orgRef.getValue().setTargetType(OrgType.COMPLEX_TYPE); + orgRef.getValue().setRelation(ORG_DEFAULT); } if (tenantOid != null) { PrismReference tenantRef = cval.findOrCreateReference(AssignmentType.F_TENANT_REF); tenantRef.getValue().setOid(tenantOid); + tenantRef.getValue().setTargetType(OrgType.COMPLEX_TYPE); + tenantRef.getValue().setRelation(ORG_DEFAULT); } From 46a8c068967c6a29f34e8de526b0f6b7a351a9d8 Mon Sep 17 00:00:00 2001 From: Pavol Mederly Date: Mon, 2 Mar 2020 11:20:17 +0100 Subject: [PATCH 3/9] Make lightweight ID generator more robust We tolerate clock leaping back for 10 seconds. Hopefully it's enough. --- .../LightweightIdentifierGeneratorImpl.java | 26 ++++++++++--------- 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/repo/task-quartz-impl/src/main/java/com/evolveum/midpoint/task/quartzimpl/LightweightIdentifierGeneratorImpl.java b/repo/task-quartz-impl/src/main/java/com/evolveum/midpoint/task/quartzimpl/LightweightIdentifierGeneratorImpl.java index 20fae37f7ad..9723e3cb00a 100644 --- a/repo/task-quartz-impl/src/main/java/com/evolveum/midpoint/task/quartzimpl/LightweightIdentifierGeneratorImpl.java +++ b/repo/task-quartz-impl/src/main/java/com/evolveum/midpoint/task/quartzimpl/LightweightIdentifierGeneratorImpl.java @@ -19,9 +19,11 @@ @Service public class LightweightIdentifierGeneratorImpl implements LightweightIdentifierGenerator { - long lastTimestamp; - int lastSequence; - int hostIdentifier; + private static final long BACKWARD_TIME_ALLOWANCE = 10 * 1000L; + + private long lastTimestamp; // monotonic increasing sequence + private int lastSequence; // incremented by 1, occasionally reset to 0 + private int hostIdentifier; // currently unused public LightweightIdentifierGeneratorImpl() { lastTimestamp = 0; @@ -29,22 +31,22 @@ public LightweightIdentifierGeneratorImpl() { hostIdentifier = 0; } - /* (non-Javadoc) - * @see com.evolveum.midpoint.task.api.LightweightIdentifierGenerator#generate() - */ @Override public synchronized LightweightIdentifier generate() { long timestamp = System.currentTimeMillis(); - if (timestamp == lastTimestamp) { - // Nothing to do - } else if (timestamp > lastTimestamp) { - // reset the last timestamp and sequence conunter + if (timestamp > lastTimestamp) { + // update the last timestamp and reset sequence counter lastTimestamp = timestamp; lastSequence = 0; + } else if (timestamp < lastTimestamp - BACKWARD_TIME_ALLOWANCE) { + throw new IllegalStateException("The time has moved back more than " + BACKWARD_TIME_ALLOWANCE + + " milliseconds, possible consistency violation. Current time = " + timestamp + ", last time = " + + lastTimestamp + ", difference is " + (lastTimestamp - timestamp) + "."); } else { - throw new IllegalStateException("The time has moved back, possible consistency violation"); + // Usually timestamp == lastTimestamp here. But even if the time moved back a few seconds we stay calm + // and simply keep lastTimestamp unchanged. We will probably get a few identifiers with increasing sequence + // numbers and nothing wrong will happen. } return new LightweightIdentifier(timestamp, hostIdentifier, ++lastSequence); } - } From df26e924ae88888de8cabe9c33b68429427cf2e4 Mon Sep 17 00:00:00 2001 From: kate Date: Mon, 2 Mar 2020 12:34:26 +0100 Subject: [PATCH 4/9] page title fix (MID-4984) --- .../midpoint/web/page/admin/PageAdminObjectDetails.java | 4 ++++ .../web/page/admin/resources/PageResourceWizard.java | 2 +- .../evolveum/midpoint/web/page/self/PageOrgSelfProfile.java | 6 ++++++ .../midpoint/web/page/self/PageRoleSelfProfile.java | 6 ++++++ .../midpoint/web/page/self/PageServiceSelfProfile.java | 6 ++++++ .../midpoint/web/page/self/PageUserSelfProfile.java | 6 ++++++ 6 files changed, 29 insertions(+), 1 deletion(-) diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/PageAdminObjectDetails.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/PageAdminObjectDetails.java index f5f5b26f744..7ce9022c6fd 100755 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/PageAdminObjectDetails.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/PageAdminObjectDetails.java @@ -27,6 +27,7 @@ import com.evolveum.midpoint.web.component.prism.ValueStatus; import com.evolveum.midpoint.web.component.util.SelectableBean; import com.evolveum.midpoint.web.component.util.VisibleBehaviour; +import com.evolveum.midpoint.web.page.admin.configuration.PageSystemConfiguration; import com.evolveum.midpoint.web.page.admin.server.OperationalButtonsPanel; import com.evolveum.midpoint.xml.ns._public.common.common_3.*; @@ -149,6 +150,9 @@ protected void onTimer(AjaxRequestTarget target) { @Override protected IModel createPageTitleModel() { + if (PageAdminObjectDetails.this instanceof PageSystemConfiguration){ + return super.createPageTitleModel(); + } String simpleName = getObjectSimpleName(); String lokalizedSimpleName = new StringResourceModel("ObjectType." + simpleName).setDefaultValue(simpleName).getString(); if (isAdd()) { diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/resources/PageResourceWizard.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/resources/PageResourceWizard.java index bfe400afc8e..9aeaa55a20e 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/resources/PageResourceWizard.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/resources/PageResourceWizard.java @@ -161,7 +161,7 @@ protected IModel createPageTitleModel() { @Override protected String load() { if (editedResourceOid == null) { - return PageResourceWizard.super.createPageTitleModel().getObject(); + return createStringResource("PageResourceWizard.title").getString(); } String name = WebComponentUtil.getName(modelRaw.getObject()); return createStringResource("PageResourceWizard.title.edit", name).getString(); diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/self/PageOrgSelfProfile.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/self/PageOrgSelfProfile.java index f4119684d30..0b179a5c8ea 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/self/PageOrgSelfProfile.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/self/PageOrgSelfProfile.java @@ -10,6 +10,7 @@ import com.evolveum.midpoint.xml.ns._public.common.common_3.OrgType; +import org.apache.wicket.model.IModel; import org.apache.wicket.model.Model; import org.apache.wicket.request.mapper.parameter.PageParameters; @@ -61,6 +62,11 @@ protected boolean isSelfProfile(){ return true; } + @Override + protected IModel createPageTitleModel() { + return createStringResource("PageAdmin.menu.profile"); + } + @Override protected void createBreadcrumb() { super.createBreadcrumb(); diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/self/PageRoleSelfProfile.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/self/PageRoleSelfProfile.java index 196144a632b..28cf1dfc1a2 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/self/PageRoleSelfProfile.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/self/PageRoleSelfProfile.java @@ -12,6 +12,7 @@ import com.evolveum.midpoint.xml.ns._public.common.common_3.RoleType; +import org.apache.wicket.model.IModel; import org.apache.wicket.model.Model; import org.apache.wicket.request.mapper.parameter.PageParameters; @@ -65,6 +66,11 @@ protected boolean isSelfProfile(){ return true; } + @Override + protected IModel createPageTitleModel() { + return createStringResource("PageAdmin.menu.profile"); + } + @Override protected void createBreadcrumb() { super.createBreadcrumb(); diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/self/PageServiceSelfProfile.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/self/PageServiceSelfProfile.java index 35a7511657c..9ffabf6b0cc 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/self/PageServiceSelfProfile.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/self/PageServiceSelfProfile.java @@ -10,6 +10,7 @@ import com.evolveum.midpoint.xml.ns._public.common.common_3.ServiceType; +import org.apache.wicket.model.IModel; import org.apache.wicket.model.Model; import org.apache.wicket.request.mapper.parameter.PageParameters; @@ -63,6 +64,11 @@ protected boolean isSelfProfile(){ return true; } + @Override + protected IModel createPageTitleModel() { + return createStringResource("PageAdmin.menu.profile"); + } + @Override protected void createBreadcrumb() { super.createBreadcrumb(); diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/self/PageUserSelfProfile.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/self/PageUserSelfProfile.java index 5c2a2cd9f47..616af5d3479 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/self/PageUserSelfProfile.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/self/PageUserSelfProfile.java @@ -8,6 +8,7 @@ import com.evolveum.midpoint.gui.api.GuiStyleConstants; +import org.apache.wicket.model.IModel; import org.apache.wicket.model.Model; import org.apache.wicket.request.mapper.parameter.PageParameters; @@ -65,6 +66,11 @@ protected String getObjectOidParameter() { } + @Override + protected IModel createPageTitleModel() { + return createStringResource("PageAdmin.menu.profile"); + } + @Override protected boolean isSelfProfile(){ return true; From b49b00a2af52f888eca66f9dc5033fd0b425a6eb Mon Sep 17 00:00:00 2001 From: Pavol Mederly Date: Mon, 2 Mar 2020 13:15:30 +0100 Subject: [PATCH 5/9] Order org tree roots alphabetically Originally, the order of organization tree roots was unspecified i.e. left to particular DBMS. Here we order these roots by their name. This fixes TestPageOrg.test004testCreateChild that was failing on most databases (except for H2). --- .../page/admin/orgs/AbstractOrgTabPanel.java | 10 ++++--- .../evolveum/midpoint/gui/TestPageOrg.java | 26 +++++++++---------- .../impl/query/builder/QueryBuilder.java | 12 +-------- 3 files changed, 21 insertions(+), 27 deletions(-) diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/orgs/AbstractOrgTabPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/orgs/AbstractOrgTabPanel.java index ef6a3fec189..7bfab886422 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/orgs/AbstractOrgTabPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/orgs/AbstractOrgTabPanel.java @@ -12,6 +12,8 @@ import com.evolveum.midpoint.prism.query.ObjectFilter; import com.evolveum.midpoint.web.session.OrgStructurePanelStorage; +import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType; + import org.apache.commons.lang3.ObjectUtils; import org.apache.wicket.ajax.AjaxEventBehavior; import org.apache.wicket.ajax.AjaxRequestTarget; @@ -30,7 +32,6 @@ import com.evolveum.midpoint.prism.polystring.PolyString; import com.evolveum.midpoint.prism.query.ObjectQuery; import com.evolveum.midpoint.schema.result.OperationResult; -import com.evolveum.midpoint.schema.util.ObjectQueryUtil; import com.evolveum.midpoint.task.api.Task; import com.evolveum.midpoint.util.logging.LoggingUtils; import com.evolveum.midpoint.util.logging.Trace; @@ -165,9 +166,12 @@ private List> loadOrgRoots() { List> list = new ArrayList<>(); try { - ObjectQuery query = ObjectQueryUtil.createRootOrgQuery(getPageBase().getPrismContext()); + ObjectQuery query = getPageBase().getPrismContext().queryFor(OrgType.class) + .isRoot() + .asc(OrgType.F_NAME) + .build(); ObjectFilter assignableItemsFilter = getAssignableItemsFilter(); - if (assignableItemsFilter != null){ + if (assignableItemsFilter != null) { query.addFilter(assignableItemsFilter); } list = getPageBase().getModelService().searchObjects(OrgType.class, query, null, task, result); diff --git a/gui/admin-gui/src/test/java/com/evolveum/midpoint/gui/TestPageOrg.java b/gui/admin-gui/src/test/java/com/evolveum/midpoint/gui/TestPageOrg.java index 9f2b3e004fe..127a80f33d9 100644 --- a/gui/admin-gui/src/test/java/com/evolveum/midpoint/gui/TestPageOrg.java +++ b/gui/admin-gui/src/test/java/com/evolveum/midpoint/gui/TestPageOrg.java @@ -41,10 +41,13 @@ public class TestPageOrg extends AbstractInitializedGuiIntegrationTest { private static final Trace LOGGER = TraceManager.getTrace(TestPageOrg.class); private static final String MAIN_FORM = "mainPanel:mainForm"; - private static final String FORM_INPUT_DESCRIPTION = "tabPanel:panel:basicSystemConfiguration:values:0:value:propertiesLabel:properties:1:property:values:0:valueContainer:form:input:input"; +// private static final String FORM_INPUT_DESCRIPTION = "tabPanel:panel:basicSystemConfiguration:values:0:value:propertiesLabel:properties:1:property:values:0:valueContainer:form:input:input"; private static final String PATH_FORM_NAME = "tabPanel:panel:main:values:0:value:propertiesLabel:properties:0:property:values:0:valueContainer:form:input:originValueContainer:origValueWithButton:origValue:input"; private static final String FORM_SAVE = "save"; + private static final String NEW_ORG_NAME = "A-newOrg"; // starts with "A" to be alphabetically first + private static final String NEW_ORG_CHILD_NAME = "newOrgChild"; + @Override public void initSystem(Task initTask, OperationResult initResult) throws Exception { super.initSystem(initTask, initResult); @@ -69,12 +72,12 @@ public void test003testAddNewOrg() throws Exception { renderPage(PageOrgUnit.class); FormTester formTester = tester.newFormTester(MAIN_FORM, false); - formTester.setValue(PATH_FORM_NAME, "newOrg"); - formTester = formTester.submit(FORM_SAVE); + formTester.setValue(PATH_FORM_NAME, NEW_ORG_NAME); + formTester.submit(FORM_SAVE); Thread.sleep(5000); - PrismObject newOrg = findObjectByName(OrgType.class, "newOrg"); + PrismObject newOrg = findObjectByName(OrgType.class, NEW_ORG_NAME); assertNotNull(newOrg, "New org not created."); LOGGER.info("created org: {}", newOrg.debugDump()); } @@ -86,25 +89,22 @@ public void test004testCreateChild() throws Exception { tester.assertRenderedPage(PageOrgUnit.class); FormTester formTester = tester.newFormTester(MAIN_FORM, false); - formTester.setValue(PATH_FORM_NAME, "newOrgChild"); - formTester = formTester.submit(FORM_SAVE); + formTester.setValue(PATH_FORM_NAME, NEW_ORG_CHILD_NAME); + formTester.submit(FORM_SAVE); Thread.sleep(5000); - PrismObject newOrgChild = findObjectByName(OrgType.class, "newOrgChild"); - PrismObject newOrg = findObjectByName(OrgType.class, "newOrg"); + PrismObject newOrgChild = findObjectByName(OrgType.class, NEW_ORG_CHILD_NAME); + PrismObject newOrg = findObjectByName(OrgType.class, NEW_ORG_NAME); assertNotNull(newOrgChild, "New org not created."); assertAssignedOrg(newOrgChild, newOrg.getOid()); } - private Page renderPage(Class expectedRenderedPageClass) { + private void renderPage(Class expectedRenderedPageClass) { LOGGER.info("render page system configuration"); PageParameters params = new PageParameters(); - Page pageAccount = tester.startPage(expectedRenderedPageClass, params); + tester.startPage(expectedRenderedPageClass, params); tester.assertRenderedPage(expectedRenderedPageClass); - - return pageAccount; } - } diff --git a/infra/prism-impl/src/main/java/com/evolveum/midpoint/prism/impl/query/builder/QueryBuilder.java b/infra/prism-impl/src/main/java/com/evolveum/midpoint/prism/impl/query/builder/QueryBuilder.java index 33e959bd292..13b6d841740 100644 --- a/infra/prism-impl/src/main/java/com/evolveum/midpoint/prism/impl/query/builder/QueryBuilder.java +++ b/infra/prism-impl/src/main/java/com/evolveum/midpoint/prism/impl/query/builder/QueryBuilder.java @@ -46,13 +46,12 @@ public final class QueryBuilder { final private Class queryClass; - final private ComplexTypeDefinition containerCTD; final private PrismContext prismContext; private QueryBuilder(Class queryClass, PrismContext prismContext) { this.queryClass = queryClass; this.prismContext = prismContext; - containerCTD = prismContext.getSchemaRegistry().findComplexTypeDefinitionByCompileTimeClass(queryClass); + ComplexTypeDefinition containerCTD = prismContext.getSchemaRegistry().findComplexTypeDefinitionByCompileTimeClass(queryClass); if (containerCTD == null) { throw new IllegalArgumentException("Couldn't find definition for complex type " + queryClass); } @@ -69,13 +68,4 @@ public PrismContext getPrismContext() { public static S_FilterEntryOrEmpty queryFor(Class queryClass, PrismContext prismContext) { return R_Filter.create(new QueryBuilder(queryClass, prismContext)); } - -// ItemDefinition findItemDefinition(ItemPath itemPath) throws SchemaException { -// ItemDefinition itemDefinition = containerCTD.findItemDefinition(itemPath); -// if (itemDefinition == null) { -// throw new SchemaException("Couldn't find definition for '" + itemPath + "' in " + containerCTD); -// } -// return itemDefinition; -// } - } From 40bcca2aafaa0ebbf938c800f5822a5a703d6432 Mon Sep 17 00:00:00 2001 From: Pavol Mederly Date: Mon, 2 Mar 2020 13:40:19 +0100 Subject: [PATCH 6/9] Fix TestFilterSimplifier and add it to the suite --- .../midpoint/schema/TestFilterSimplifier.java | 50 +++++++++---------- infra/schema/testng-unit.xml | 1 + 2 files changed, 26 insertions(+), 25 deletions(-) diff --git a/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestFilterSimplifier.java b/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestFilterSimplifier.java index 37ca4ab1a8e..c54aefea06b 100644 --- a/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestFilterSimplifier.java +++ b/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestFilterSimplifier.java @@ -8,6 +8,7 @@ import com.evolveum.midpoint.prism.PrismContext; import com.evolveum.midpoint.prism.query.*; +import com.evolveum.midpoint.prism.util.PrismAsserts; import com.evolveum.midpoint.prism.util.PrismTestUtil; import com.evolveum.midpoint.schema.constants.MidPointConstants; import com.evolveum.midpoint.schema.util.ObjectQueryUtil; @@ -25,7 +26,6 @@ import static org.testng.AssertJUnit.assertTrue; /** - * @author mederly * */ public class TestFilterSimplifier { @@ -37,7 +37,7 @@ public void setup() throws SchemaException, SAXException, IOException { } @Test - public void test010All() throws Exception { + public void test010All() { System.out.println("===[ test010All ]==="); // GIVEN @@ -55,7 +55,7 @@ public void test010All() throws Exception { } @Test - public void test020None() throws Exception { + public void test020None() { System.out.println("===[ test020None ]==="); // GIVEN @@ -73,7 +73,7 @@ public void test020None() throws Exception { } @Test - public void test030Undefined() throws Exception { + public void test030Undefined() { System.out.println("===[ test030Undefined ]==="); // GIVEN @@ -91,7 +91,7 @@ public void test030Undefined() throws Exception { } @Test - public void test100AndLevel1() throws Exception { + public void test100AndLevel1() { System.out.println("===[ test100AndLevel1 ]==="); // GIVEN @@ -112,7 +112,7 @@ public void test100AndLevel1() throws Exception { } @Test - public void test110AndLevel1WithoutNone() throws Exception { + public void test110AndLevel1WithoutNone() { System.out.println("===[ test110AndLevel1WithoutNone ]==="); // GIVEN @@ -132,7 +132,7 @@ public void test110AndLevel1WithoutNone() throws Exception { } @Test - public void test120AndEmpty() throws Exception { + public void test120AndEmpty() { System.out.println("===[ test120AndEmpty ]==="); // GIVEN @@ -149,7 +149,7 @@ public void test120AndEmpty() throws Exception { } @Test - public void test150OrLevel1() throws Exception { + public void test150OrLevel1() { System.out.println("===[ test150OrLevel1 ]==="); // GIVEN @@ -170,7 +170,7 @@ public void test150OrLevel1() throws Exception { } @Test - public void test160OrLevel1WithoutAll() throws Exception { + public void test160OrLevel1WithoutAll() { System.out.println("===[ test160OrLevel1WithoutAll ]==="); // GIVEN @@ -190,7 +190,7 @@ public void test160OrLevel1WithoutAll() throws Exception { } @Test - public void test170OrLevel1Undefined() throws Exception { + public void test170OrLevel1Undefined() { System.out.println("===[ test170OrLevel1Undefined ]==="); // GIVEN @@ -207,7 +207,7 @@ public void test170OrLevel1Undefined() throws Exception { } @Test - public void test180OrEmpty() throws Exception { + public void test180OrEmpty() { System.out.println("===[ test180OrEmpty ]==="); // GIVEN @@ -224,7 +224,7 @@ public void test180OrEmpty() throws Exception { } @Test - public void test200AndLevel2() throws Exception { + public void test200AndLevel2() { System.out.println("===[ test200AndLevel2 ]==="); // GIVEN @@ -252,7 +252,7 @@ public void test200AndLevel2() throws Exception { } @Test - public void test210OrLevel2() throws Exception { + public void test210OrLevel2() { System.out.println("===[ test210OrLevel2 ]==="); // GIVEN @@ -280,7 +280,7 @@ public void test210OrLevel2() throws Exception { } @Test - public void test300NotAll() throws Exception { + public void test300NotAll() { System.out.println("===[ test300NotAll ]==="); // GIVEN @@ -299,7 +299,7 @@ public void test300NotAll() throws Exception { } @Test - public void test310NotNone() throws Exception { + public void test310NotNone() { System.out.println("===[ test310NotNone ]==="); // GIVEN @@ -318,7 +318,7 @@ public void test310NotNone() throws Exception { } @Test - public void test320NotNotAll() throws Exception { + public void test320NotNotAll() { System.out.println("===[ test320NotNotAll ]==="); // GIVEN @@ -337,7 +337,7 @@ public void test320NotNotAll() throws Exception { } @Test - public void test330NotNotNone() throws Exception { + public void test330NotNotNone() { System.out.println("===[ test330NotNotNone ]==="); // GIVEN @@ -356,7 +356,7 @@ public void test330NotNotNone() throws Exception { } @Test - public void test400TypeAll() throws Exception { + public void test400TypeAll() { System.out.println("===[ test400TypeAll ]==="); // GIVEN @@ -378,7 +378,7 @@ public void test400TypeAll() throws Exception { } @Test - public void test410TypeNone() throws Exception { + public void test410TypeNone() { System.out.println("===[ test410TypeNone ]==="); // GIVEN @@ -397,7 +397,7 @@ public void test410TypeNone() throws Exception { } @Test - public void test420TypeUndefined() throws Exception { + public void test420TypeUndefined() { System.out.println("===[ test420TypeUndefined ]==="); // GIVEN @@ -419,7 +419,7 @@ public void test420TypeUndefined() throws Exception { } @Test - public void test500ExistsAll() throws Exception { + public void test500ExistsAll() { System.out.println("===[ test500ExistsAll ]==="); // GIVEN @@ -436,12 +436,12 @@ public void test500ExistsAll() throws Exception { System.out.println("Simplified filter:\n" + DebugUtil.debugDump(simplified)); assertTrue("Wrong simplified filter: " + simplified, simplified instanceof ExistsFilter); ExistsFilter existsSimplified = (ExistsFilter) simplified; - assertEquals("Wrong simplified filter path", UserType.F_ASSIGNMENT, existsSimplified.getFullPath()); + PrismAsserts.assertEquivalent("Wrong simplified filter path", UserType.F_ASSIGNMENT, existsSimplified.getFullPath()); assertTrue("Wrong simplified filter subfilter: " + existsSimplified.getFilter(), ObjectQueryUtil.isAll(existsSimplified.getFilter())); } @Test - public void test510ExistsNone() throws Exception { + public void test510ExistsNone() { System.out.println("===[ test510ExistsNone ]==="); // GIVEN @@ -460,7 +460,7 @@ public void test510ExistsNone() throws Exception { } @Test - public void test520ExistsUndefined() throws Exception { + public void test520ExistsUndefined() { System.out.println("===[ test520ExistsUndefined ]==="); // GIVEN @@ -477,7 +477,7 @@ public void test520ExistsUndefined() throws Exception { System.out.println("Simplified filter:\n" + DebugUtil.debugDump(simplified)); assertTrue("Wrong simplified filter: " + simplified, simplified instanceof ExistsFilter); ExistsFilter existsSimplified = (ExistsFilter) simplified; - assertEquals("Wrong simplified filter path", UserType.F_ASSIGNMENT, existsSimplified.getFullPath()); + PrismAsserts.assertEquivalent("Wrong simplified filter path", UserType.F_ASSIGNMENT, existsSimplified.getFullPath()); assertTrue("Wrong simplified filter subfilter: " + existsSimplified.getFilter(), ObjectQueryUtil.isAll(existsSimplified.getFilter())); } diff --git a/infra/schema/testng-unit.xml b/infra/schema/testng-unit.xml index e4983261bc9..2473cbbde2f 100644 --- a/infra/schema/testng-unit.xml +++ b/infra/schema/testng-unit.xml @@ -138,6 +138,7 @@ + From 9f3e2830c6f817edaf5294eaa02b488f717af382 Mon Sep 17 00:00:00 2001 From: lskublik Date: Mon, 2 Mar 2020 13:41:49 +0100 Subject: [PATCH 7/9] adding change time tests to suite, some small changes (MID-6085) --- .../com/evolveum/midpoint/web/component/input/DatePanel.java | 1 + .../web/page/admin/configuration/InternalsClockPanel.java | 3 --- .../schrodinger/page/InternalsConfigurationPageTest.java | 4 ++-- testing/schrodingertest/testng-integration.xml | 5 +++++ .../schrodinger/component/configuration/ClockTab.java | 3 +++ 5 files changed, 11 insertions(+), 5 deletions(-) diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/input/DatePanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/input/DatePanel.java index 095403e416d..75d9ebc7adc 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/input/DatePanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/input/DatePanel.java @@ -28,6 +28,7 @@ public DatePanel(String id, IModel model) { super(id); DateInput date = new DateInput(ID_INPUT, new XmlGregorianCalendarModel(model)); + date.setOutputMarkupId(true); add(date); } 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 51fac38f711..f16800e9121 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 @@ -49,9 +49,6 @@ 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 index 35ed1a1be85..77af0f02a89 100644 --- 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 @@ -34,7 +34,7 @@ private void cleanup() { } @Test - public void changeTime() { + public void test001changeTime() { ClockTab clockTab = configPage.clockTab(); clockTab.changeTime("5/15/2099", "10", "30", ClockTab.AmOrPmChoice.PM); @@ -51,7 +51,7 @@ public void changeTime() { } @Test - public void resetTime() { + public void test010resetTime() { ClockTab clockTab = configPage.clockTab(); clockTab.resetTime(); diff --git a/testing/schrodingertest/testng-integration.xml b/testing/schrodingertest/testng-integration.xml index e4598aa01d4..3711706773a 100644 --- a/testing/schrodingertest/testng-integration.xml +++ b/testing/schrodingertest/testng-integration.xml @@ -57,4 +57,9 @@ + + + + + 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 5c1858a662a..edf76f714ac 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 @@ -7,6 +7,7 @@ package com.evolveum.midpoint.schrodinger.component.configuration; import com.codeborne.selenide.Condition; +import com.codeborne.selenide.Selenide; import com.codeborne.selenide.SelenideElement; import com.evolveum.midpoint.schrodinger.MidPoint; import com.evolveum.midpoint.schrodinger.component.Component; @@ -36,10 +37,12 @@ public void changeTime(String date, String hours, String minutes, AmOrPmChoice a SelenideElement hoursEle = findHours(); hoursEle.doubleClick(); + hoursEle.doubleClick(); hoursEle.sendKeys(hours); SelenideElement minutesEle = findMinutes(); minutesEle.doubleClick(); + minutesEle.doubleClick(); minutesEle.sendKeys(minutes); SelenideElement amOrPmChoiceEle = findAmOrPmChoice(); From 07cc7e696aa0795acbdb4f3f337aaf966b6cb024 Mon Sep 17 00:00:00 2001 From: lskublik Date: Mon, 2 Mar 2020 14:08:11 +0100 Subject: [PATCH 8/9] adding schrodinger LoginPage tests to suite --- .../schrodinger/page/AbstractLoginPageTest.java | 12 ++++++------ .../testing/schrodinger/page/LoginPageTest.java | 4 ++-- .../LoginPageWithAuthenticationConfigTest.java | 15 +++++++++------ 3 files changed, 17 insertions(+), 14 deletions(-) diff --git a/testing/schrodingertest/src/test/java/com/evolveum/midpoint/testing/schrodinger/page/AbstractLoginPageTest.java b/testing/schrodingertest/src/test/java/com/evolveum/midpoint/testing/schrodinger/page/AbstractLoginPageTest.java index 669d5ad08ea..333bcb8bd02 100644 --- a/testing/schrodingertest/src/test/java/com/evolveum/midpoint/testing/schrodinger/page/AbstractLoginPageTest.java +++ b/testing/schrodingertest/src/test/java/com/evolveum/midpoint/testing/schrodinger/page/AbstractLoginPageTest.java @@ -43,7 +43,7 @@ public void beforeClass() throws IOException { } @Test - public void loginLockoutUser() { + public void test001loginLockoutUser() { basicPage.loggedUser().logoutIfUserIsLogin(); open("/login"); for (int i = 0; i < 4; i++) { @@ -53,13 +53,13 @@ public void loginLockoutUser() { } @Test - public void loginDisabledUser() { + public void test002loginDisabledUser() { basicPage.loggedUser().logoutIfUserIsLogin(); unsuccessfulLogin("disabled_user", "5ecr3t"); } @Test - public void loginEnabledUserWithoutAuthorizationsUser() { + public void test003loginEnabledUserWithoutAuthorizationsUser() { basicPage.loggedUser().logoutIfUserIsLogin(); unsuccessfulLogin("enabled_user_without_authorizations", "5ecr3t"); } @@ -73,7 +73,7 @@ protected void unsuccessfulLogin(String username, String password){ } @Test - public void auditingSuccessfulLogin() { + public void test010auditingSuccessfulLogin() { basicPage.loggedUser().logoutIfUserIsLogin(); FormLoginPage login = midPoint.formLogin(); login.login("administrator", "5ecr3t"); @@ -89,7 +89,7 @@ protected void auditingSuccesfulLogin(String username) { } @Test - public void auditingFailLogin() { + public void test011auditingFailLogin() { basicPage.loggedUser().logoutIfUserIsLogin(); FormLoginPage login = midPoint.formLogin(); login.login("bad_administrator", "5ecr3t"); @@ -103,7 +103,7 @@ public void auditingFailLogin() { } @Test - public void auditingSuccessfulLogout() { + public void test012auditingSuccessfulLogout() { basicPage.loggedUser().logoutIfUserIsLogin(); FormLoginPage login = midPoint.formLogin(); login.login("administrator", "5ecr3t"); diff --git a/testing/schrodingertest/src/test/java/com/evolveum/midpoint/testing/schrodinger/page/LoginPageTest.java b/testing/schrodingertest/src/test/java/com/evolveum/midpoint/testing/schrodinger/page/LoginPageTest.java index 1c0dafa4af7..e2e3917b0a5 100644 --- a/testing/schrodingertest/src/test/java/com/evolveum/midpoint/testing/schrodinger/page/LoginPageTest.java +++ b/testing/schrodingertest/src/test/java/com/evolveum/midpoint/testing/schrodinger/page/LoginPageTest.java @@ -28,7 +28,7 @@ public class LoginPageTest extends AbstractLoginPageTest { @Test - public void changeLanguageFormPage() { + public void test020changeLanguageFormPage() { basicPage.loggedUser().logoutIfUserIsLogin(); FormLoginPage login = midPoint.formLogin(); @@ -38,7 +38,7 @@ public void changeLanguageFormPage() { } @Test - public void changeLanguageSamlSelectPage() { + public void test021changeLanguageSamlSelectPage() { basicPage.loggedUser().logoutIfUserIsLogin(); SamlSelectPage login = midPoint.samlSelect(); login.goToUrl(); diff --git a/testing/schrodingertest/src/test/java/com/evolveum/midpoint/testing/schrodinger/page/LoginPageWithAuthenticationConfigTest.java b/testing/schrodingertest/src/test/java/com/evolveum/midpoint/testing/schrodinger/page/LoginPageWithAuthenticationConfigTest.java index a400fff05bd..f373e73343c 100644 --- a/testing/schrodingertest/src/test/java/com/evolveum/midpoint/testing/schrodinger/page/LoginPageWithAuthenticationConfigTest.java +++ b/testing/schrodingertest/src/test/java/com/evolveum/midpoint/testing/schrodinger/page/LoginPageWithAuthenticationConfigTest.java @@ -61,7 +61,7 @@ public void beforeClass() throws IOException { SystemPage systemPage = new SystemPage(); PrismForm infrastructureForm = systemPage.infrastructureTab().form(); infrastructureForm.showEmptyAttributes("Infrastructure"); - infrastructureForm.addAttributeValue("defaultHostname", getConfiguration().getBaseUrl()); + infrastructureForm.addAttributeValue("publicHttpUrlPattern", getConfiguration().getBaseUrl()); File notificationFile = NOTIFICATION_FILE; notificationFile.createNewFile(); NotificationsTab notificationTab = systemPage.notificationsTab(); @@ -88,7 +88,7 @@ public void failWholeAuthenticationFlow() { } @Test - public void loginAndLogoutForAdministrators() { + public void test020loginAndLogoutForAdministrators() { basicPage.loggedUser().logoutIfUserIsLogin(); open("/auth/emergency/internalLoginForm"); FormLoginPage login = midPoint.formLogin(); @@ -98,14 +98,14 @@ public void loginAndLogoutForAdministrators() { } @Test - public void negativeLoginForAdministrators() { + public void test021negativeLoginForAdministrators() { basicPage.loggedUser().logoutIfUserIsLogin(); open("/auth/emergency/internalLoginForm"); unsuccessfulLogin("user_without_superuser", "5ecr3t"); } @Test - public void changePassowordMailNonce() throws IOException, InterruptedException { + public void test030changePassowordMailNonce() throws IOException, InterruptedException { basicPage.loggedUser().logoutIfUserIsLogin(); FormLoginPage login = midPoint.formLogin(); MailNoncePage mailNonce = (MailNoncePage) login.forgotPassword(); @@ -120,7 +120,7 @@ public void changePassowordMailNonce() throws IOException, InterruptedException } @Test - public void changePassowordSecurityQuestion() { + public void test031changePassowordSecurityQuestion() { basicPage.loggedUser().logoutIfUserIsLogin(); FormLoginPage login = midPoint.formLogin(); open("/login"); @@ -137,9 +137,12 @@ public void changePassowordSecurityQuestion() { } @Test - public void selfRegistration() throws IOException, InterruptedException { + public void test040selfRegistration() throws IOException, InterruptedException { basicPage.loggedUser().logoutIfUserIsLogin(); FormLoginPage login = midPoint.formLogin(); + open("/login"); + open("/"); + TimeUnit.SECONDS.sleep(2); SelfRegistrationPage registrationPage = login.register(); registrationPage.setGivenName("Test").setFamilyName("User").setEmail("test.user@evolveum.com").setPassword("5ecr3t").submit(); TimeUnit.SECONDS.sleep(4); From 938ebd982cf977bb14900d1dfd8b704a289c8d17 Mon Sep 17 00:00:00 2001 From: lskublik Date: Mon, 2 Mar 2020 14:10:39 +0100 Subject: [PATCH 9/9] adding schrodinger LoginPage tests to suite (forgotten file) --- testing/schrodingertest/testng-integration.xml | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/testing/schrodingertest/testng-integration.xml b/testing/schrodingertest/testng-integration.xml index 3711706773a..8924df0dda8 100644 --- a/testing/schrodingertest/testng-integration.xml +++ b/testing/schrodingertest/testng-integration.xml @@ -62,4 +62,14 @@ + + + + + + + + + +