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 adaf8f4b605..51f5f591986 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); }