From 86003d82cd27f890ca45d177f2a4e97b0f9020de Mon Sep 17 00:00:00 2001 From: Radovan Semancik Date: Thu, 13 Dec 2018 13:55:54 +0100 Subject: [PATCH] Filter in compiles object views (+tests) --- .../CompiledObjectCollectionView.java | 12 +- .../impl/security/UserProfileCompiler.java | 22 ++- .../midpoint/model/intest/TestArchetypes.java | 144 +++++++++++++++--- .../model/intest/TestPreviewChanges.java | 4 +- .../collection-active-employees.xml | 33 ++++ .../archetypes/role-user-administrator.xml | 75 +++++++++ .../system-configuration-archetypes.xml | 11 ++ .../asserter/CompiledUserProfileAsserter.java | 17 ++- .../ObjectCollectionViewAsserter.java | 58 +++++++ .../asserter/ObjectCollectionViewFinder.java | 88 +++++++++++ .../ObjectCollectionViewsAsserter.java | 67 ++++++++ 11 files changed, 503 insertions(+), 28 deletions(-) create mode 100644 model/model-intest/src/test/resources/archetypes/collection-active-employees.xml create mode 100644 model/model-intest/src/test/resources/archetypes/role-user-administrator.xml create mode 100644 model/model-test/src/main/java/com/evolveum/midpoint/model/test/asserter/ObjectCollectionViewAsserter.java create mode 100644 model/model-test/src/main/java/com/evolveum/midpoint/model/test/asserter/ObjectCollectionViewFinder.java create mode 100644 model/model-test/src/main/java/com/evolveum/midpoint/model/test/asserter/ObjectCollectionViewsAsserter.java diff --git a/model/model-api/src/main/java/com/evolveum/midpoint/model/api/authentication/CompiledObjectCollectionView.java b/model/model-api/src/main/java/com/evolveum/midpoint/model/api/authentication/CompiledObjectCollectionView.java index a5a9645a871..0d45f82803c 100644 --- a/model/model-api/src/main/java/com/evolveum/midpoint/model/api/authentication/CompiledObjectCollectionView.java +++ b/model/model-api/src/main/java/com/evolveum/midpoint/model/api/authentication/CompiledObjectCollectionView.java @@ -23,6 +23,7 @@ import org.jetbrains.annotations.NotNull; +import com.evolveum.midpoint.prism.query.ObjectFilter; import com.evolveum.midpoint.util.DebugDumpable; import com.evolveum.midpoint.util.DebugUtil; import com.evolveum.midpoint.util.QNameUtil; @@ -54,6 +55,7 @@ public class CompiledObjectCollectionView implements DebugDumpable, Serializable private DistinctSearchOptionType distinct; private Boolean disableSorting; private SearchBoxConfigurationType searchBoxConfiguration; + private ObjectFilter filter; // Only used to construct "default" view definition. May be not needed later on. public CompiledObjectCollectionView() { @@ -141,6 +143,14 @@ public void setSearchBoxConfiguration(SearchBoxConfigurationType searchBoxConfig this.searchBoxConfiguration = searchBoxConfiguration; } + public ObjectFilter getFilter() { + return filter; + } + + public void setFilter(ObjectFilter filter) { + this.filter = filter; + } + public boolean match(QName expectedObjectType, String expectedViewName) { if (!QNameUtil.match(objectType, expectedObjectType)) { return false; @@ -176,7 +186,7 @@ public String debugDump(int indent) { DebugUtil.debugDumpWithLabelToStringLn(sb, "distinct", distinct, indent + 1); DebugUtil.debugDumpWithLabelLn(sb, "disableSorting", disableSorting, indent + 1); DebugUtil.debugDumpWithLabelToStringLn(sb, "searchBoxConfiguration", searchBoxConfiguration, indent + 1); - // TODO + DebugUtil.debugDumpWithLabel(sb, "filter", filter, indent + 1); return sb.toString(); } diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/security/UserProfileCompiler.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/security/UserProfileCompiler.java index ab7556bb635..7e3ab836d1d 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/security/UserProfileCompiler.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/security/UserProfileCompiler.java @@ -51,6 +51,7 @@ import com.evolveum.midpoint.prism.PrismContext; import com.evolveum.midpoint.prism.PrismObject; import com.evolveum.midpoint.prism.delta.PlusMinusZero; +import com.evolveum.midpoint.prism.query.ObjectFilter; import com.evolveum.midpoint.prism.util.ItemDeltaItem; import com.evolveum.midpoint.prism.util.ObjectDeltaObject; import com.evolveum.midpoint.repo.api.RepositoryService; @@ -76,6 +77,8 @@ import com.evolveum.midpoint.xml.ns._public.common.common_3.AbstractObjectTypeConfigurationType; import com.evolveum.midpoint.xml.ns._public.common.common_3.AdminGuiConfigurationRoleManagementType; import com.evolveum.midpoint.xml.ns._public.common.common_3.AdminGuiConfigurationType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.ArchetypeType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.AssignmentHolderType; import com.evolveum.midpoint.xml.ns._public.common.common_3.AssignmentType; import com.evolveum.midpoint.xml.ns._public.common.common_3.CollectionSpecificationType; import com.evolveum.midpoint.xml.ns._public.common.common_3.DashboardWidgetType; @@ -92,6 +95,7 @@ import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectFormsType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectPolicyConfigurationType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectReferenceType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType; import com.evolveum.midpoint.xml.ns._public.common.common_3.OtherPrivilegesLimitationType; import com.evolveum.midpoint.xml.ns._public.common.common_3.SearchBoxConfigurationType; import com.evolveum.midpoint.xml.ns._public.common.common_3.SystemConfigurationType; @@ -455,8 +459,22 @@ private void compileCollection(CompiledObjectCollectionView existingView, GuiObj if (existingView.getCollection() != null) { LOGGER.debug("Redefining collection in view {}", existingView.getViewName()); } - // TODO: resolve collection, apply filter existingView.setCollection(collection); + + // Compute and apply filter + ObjectReferenceType collectionRef = collection.getCollectionRef(); + QName collectionRefType = collectionRef.getType(); + ObjectFilter filter = null; + + // TODO: support more cases + if (QNameUtil.match(ArchetypeType.COMPLEX_TYPE, collectionRefType)) { + filter = prismContext.queryFor(AssignmentHolderType.class) + .item(AssignmentHolderType.F_ARCHETYPE_REF).ref(collectionRef.getOid()) + .buildFilter(); + } + + // TODO: resolve (read) collection if needed + existingView.setFilter(filter); } private void compileColumns(CompiledObjectCollectionView existingView, GuiObjectListViewType objectListViewType) { @@ -505,8 +523,6 @@ private void compileSearchBox(CompiledObjectCollectionView existingView, GuiObje existingView.setSearchBoxConfiguration(newSearchBoxConfig); } - - private void joinForms(ObjectFormsType objectForms, ObjectFormType newForm) { objectForms.getObjectForm().removeIf(currentForm -> isTheSameObjectForm(currentForm, newForm)); objectForms.getObjectForm().add(newForm.clone()); diff --git a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestArchetypes.java b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestArchetypes.java index 04741ff5627..c50bf1385c3 100644 --- a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestArchetypes.java +++ b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestArchetypes.java @@ -24,10 +24,15 @@ import org.springframework.test.context.ContextConfiguration; import org.testng.annotations.Test; +import com.evolveum.midpoint.model.api.authentication.CompiledUserProfile; import com.evolveum.midpoint.prism.PrismObject; +import com.evolveum.midpoint.prism.query.ObjectFilter; +import com.evolveum.midpoint.prism.query.ObjectQuery; import com.evolveum.midpoint.prism.util.PrismTestUtil; +import com.evolveum.midpoint.schema.SearchResultList; import com.evolveum.midpoint.schema.constants.SchemaConstants; import com.evolveum.midpoint.schema.result.OperationResult; +import com.evolveum.midpoint.schema.util.ObjectQueryUtil; import com.evolveum.midpoint.security.api.MidPointPrincipal; import com.evolveum.midpoint.task.api.Task; import com.evolveum.midpoint.xml.ns._public.common.common_3.ActivationStatusType; @@ -35,6 +40,7 @@ import com.evolveum.midpoint.xml.ns._public.common.common_3.AssignmentPolicyEnforcementType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType; import com.evolveum.midpoint.xml.ns._public.common.common_3.OrgType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.RichHyperlinkType; import com.evolveum.midpoint.xml.ns._public.common.common_3.RoleType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowKindType; import com.evolveum.midpoint.xml.ns._public.common.common_3.UserType; @@ -50,6 +56,7 @@ public class TestArchetypes extends AbstractInitializedModelIntegrationTest { public static final File TEST_DIR = new File("src/test/resources/archetypes"); public static final File SYSTEM_CONFIGURATION_ARCHETYPES_FILE = new File(TEST_DIR, "system-configuration-archetypes.xml"); + public static final String VIEW_ALL_EMPLOYEES_NAME = "All employees"; public static final File ARCHETYPE_EMPLOYEE_FILE = new File(TEST_DIR, "archetype-employee.xml"); protected static final String ARCHETYPE_EMPLOYEE_OID = "7135e68c-ee53-11e8-8025-170b77da3fd6"; @@ -61,13 +68,17 @@ public class TestArchetypes extends AbstractInitializedModelIntegrationTest { public static final File ROLE_EMPLOYEE_BASE_FILE = new File(TEST_DIR, "role-employee-base.xml"); protected static final String ROLE_EMPLOYEE_BASE_OID = "e869d6c4-f6ef-11e8-b51f-df3e51bba129"; + + public static final File ROLE_USER_ADMINISTRATOR_FILE = new File(TEST_DIR, "role-user-administrator.xml"); + protected static final String ROLE_USER_ADMINISTRATOR_OID = "6ae02e34-f8b0-11e8-9c40-87e142b606fe"; @Override public void initSystem(Task initTask, OperationResult initResult) throws Exception { super.initSystem(initTask, initResult); repoAddObjectFromFile(ROLE_EMPLOYEE_BASE_FILE, initResult); - repoAddObjectFromFile(ARCHETYPE_TEST_FILE, initResult); + repoAddObjectFromFile(ROLE_USER_ADMINISTRATOR_FILE, initResult); + repoAddObjectFromFile(ARCHETYPE_EMPLOYEE_FILE, initResult); addObject(SHADOW_GROUP_DUMMY_TESTERS_FILE, initTask, initResult); } @@ -78,8 +89,8 @@ protected File getSystemConfigurationFile() { } @Test - public void test050AddArchetypeEmployee() throws Exception { - final String TEST_NAME = "test050SetupJack"; + public void test050AddArchetypeTest() throws Exception { + final String TEST_NAME = "test050AddArchetypeTest"; displayTestTitle(TEST_NAME); Task task = createTask(TEST_NAME); @@ -87,14 +98,33 @@ public void test050AddArchetypeEmployee() throws Exception { // WHEN displayWhen(TEST_NAME); - addObject(ARCHETYPE_EMPLOYEE_FILE, task, result); + addObject(ARCHETYPE_TEST_FILE, task, result); // THEN displayThen(TEST_NAME); assertSuccess(result); - PrismObject archetypeEmployee = modelService.getObject(ArchetypeType.class, ARCHETYPE_EMPLOYEE_OID, null, task, result); - display("Archetype employee", archetypeEmployee); + PrismObject archetypeTest = modelService.getObject(ArchetypeType.class, ARCHETYPE_TEST_OID, null, task, result); + display("Archetype test", archetypeTest); + } + + @Test + public void test060AssignGuybrushUserAdministrator() throws Exception { + final String TEST_NAME = "test060AssignGuybrushUserAdministrator"; + displayTestTitle(TEST_NAME); + + Task task = createTask(TEST_NAME); + OperationResult result = task.getResult(); + + // WHEN + displayWhen(TEST_NAME); + assignRole(USER_GUYBRUSH_OID, ROLE_USER_ADMINISTRATOR_OID, task, result); + + // THEN + displayThen(TEST_NAME); + assertSuccess(result); + + // TODO: assert guybrush } @@ -134,11 +164,93 @@ public void test100AssignJackArchetypeEmployee() throws Exception { .assertPluralLabel(ARCHETYPE_EMPLOYEE_DISPLAY_PLURAL_LABEL); } + @Test + public void test102SearchEmployeeArchetypeRef() throws Exception { + final String TEST_NAME = "test102SearchEmployeeArchetypeRef"; + displayTestTitle(TEST_NAME); + + Task task = createTask(TEST_NAME); + OperationResult result = task.getResult(); + + ObjectQuery query = queryFor(UserType.class) + .item(UserType.F_ARCHETYPE_REF).ref(ARCHETYPE_EMPLOYEE_OID) + .build(); + + // WHEN + displayWhen(TEST_NAME); + + SearchResultList> searchResults = modelService.searchObjects(UserType.class, query, null, task, result); + + // THEN + displayThen(TEST_NAME); + assertSuccess(result); + display("Search results", searchResults); + assertEquals("Wrong number of search results", 1, searchResults.size()); + PrismObject foundUser = searchResults.get(0); + assertUser(foundUser, "found user") + .assertName(USER_JACK_USERNAME) + .assertOid(USER_JACK_OID) + .assignments() + .assertAssignments(1) + .assertArchetype(ARCHETYPE_EMPLOYEE_OID) + .end() + .assertArchetypeRef(ARCHETYPE_EMPLOYEE_OID) + .roleMembershipRefs() + .assertRoleMemberhipRefs(1) + .assertArchetype(ARCHETYPE_EMPLOYEE_OID) + .end() + .getObject(); + } + + @Test + public void test104GetGuybryshCompiledUserProfile() throws Exception { + final String TEST_NAME = "test104GetGuybryshCompiledUserProfile"; + displayTestTitle(TEST_NAME); + + // GIVEN + login(USER_GUYBRUSH_USERNAME); + + Task task = createTask(TEST_NAME); + OperationResult result = task.getResult(); + + // WHEN + CompiledUserProfile compiledUserProfile = modelInteractionService.getCompiledUserProfile(task, result); + + // THEN + assertSuccess(result); + + loginAdministrator(); + + ObjectFilter viewFilter = assertCompiledUserProfile(compiledUserProfile) + .assertAdditionalMenuLinks(0) + .assertUserDashboardLinks(0) + .assertObjectForms(0) + .assertUserDashboardWidgets(0) + .objectCollectionViews() + .single() + .assertName(VIEW_ALL_EMPLOYEES_NAME) + .assertFilter() + .getFilter(); + + ObjectQuery viewQuery = prismContext.queryFactory().createQuery(viewFilter, null); + SearchResultList> searchResults = modelService.searchObjects(UserType.class, viewQuery, null, task, result); + + display("Search results", searchResults); + assertEquals("Wrong number of search results", 1, searchResults.size()); + PrismObject foundUser = searchResults.get(0); + assertUser(foundUser, "found user") + .assertName(USER_JACK_USERNAME) + .assertOid(USER_JACK_OID); + + } + @Test public void test109UnassignJackArchetypeEmployee() throws Exception { final String TEST_NAME = "test109UnassignJackArchetypeEmployee"; displayTestTitle(TEST_NAME); + loginAdministrator(); + Task task = createTask(TEST_NAME); OperationResult result = task.getResult(); @@ -274,19 +386,17 @@ public void test129UnassignJackArchetypeTest() throws Exception { assertSuccess(result); assertUserAfter(USER_JACK_OID) - .assignments() - .assertAssignments(0) - .end() - .assertNoArchetypeRef() - .roleMembershipRefs() - .assertRoleMemberhipRefs(0) - .end() - .links() - .assertNone(); + .assignments() + .assertAssignments(0) + .end() + .assertNoArchetypeRef() + .roleMembershipRefs() + .assertRoleMemberhipRefs(0) + .end() + .links() + .assertNone(); } - // TODO: search by archetypeRef - // TODO: object template in archetype // TODO: correct application of object template for new object (not yet stored) diff --git a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestPreviewChanges.java b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestPreviewChanges.java index d6e1e15e63a..bef91443d48 100644 --- a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestPreviewChanges.java +++ b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestPreviewChanges.java @@ -411,8 +411,8 @@ private void assertAddAccount(ModelContext modelContext, boolean expec } @Test - public void test130GetAdminGuiConfig() throws Exception { - final String TEST_NAME = "test130GetAdminGuiConfig"; + public void test130GetCompiledUserProfile() throws Exception { + final String TEST_NAME = "test130GetCompiledUserProfile"; displayTestTitle(TEST_NAME); // GIVEN diff --git a/model/model-intest/src/test/resources/archetypes/collection-active-employees.xml b/model/model-intest/src/test/resources/archetypes/collection-active-employees.xml new file mode 100644 index 00000000000..3003f519e3b --- /dev/null +++ b/model/model-intest/src/test/resources/archetypes/collection-active-employees.xml @@ -0,0 +1,33 @@ + + + Active employees + UserType + + + activation/effectiveStatus + enabled + + + + + + diff --git a/model/model-intest/src/test/resources/archetypes/role-user-administrator.xml b/model/model-intest/src/test/resources/archetypes/role-user-administrator.xml new file mode 100644 index 00000000000..f9635a0ca18 --- /dev/null +++ b/model/model-intest/src/test/resources/archetypes/role-user-administrator.xml @@ -0,0 +1,75 @@ + + + + User administrator + Role for delegated administration of users. + + + self-read + + Allow to read all the properties of "self" object. I.e. every logged-in user can read + object that represent his own identity. + + http://midpoint.evolveum.com/xml/ns/public/security/authorization-model-3#read + + self + + + + + self-shadow-read + + Allow to read all the properties of all the shadows that belong to "self" object. + I.e. every logged-in user can read all his accounts. + + http://midpoint.evolveum.com/xml/ns/public/security/authorization-model-3#read + + ShadowType + + self + + + + + + assignment-target-read + + Authorization that allows to read all the object that are possible assignment targets. We want that + to display the targets in the selection windows. + Note that this authorization may be too broad for production use. Normally it should be limited to just + selected properties such as name and description. + + http://midpoint.evolveum.com/xml/ns/public/security/authorization-model-3#read + + OrgType + + + ResourceType + + + RoleType + + + ServiceType + + + + + + diff --git a/model/model-intest/src/test/resources/archetypes/system-configuration-archetypes.xml b/model/model-intest/src/test/resources/archetypes/system-configuration-archetypes.xml index 712d2184ef1..56efa0af7d9 100644 --- a/model/model-intest/src/test/resources/archetypes/system-configuration-archetypes.xml +++ b/model/model-intest/src/test/resources/archetypes/system-configuration-archetypes.xml @@ -194,5 +194,16 @@ 30 + + + + All employees + UserType + + + + + + diff --git a/model/model-test/src/main/java/com/evolveum/midpoint/model/test/asserter/CompiledUserProfileAsserter.java b/model/model-test/src/main/java/com/evolveum/midpoint/model/test/asserter/CompiledUserProfileAsserter.java index a63371b7fe6..2c0cca4073f 100644 --- a/model/model-test/src/main/java/com/evolveum/midpoint/model/test/asserter/CompiledUserProfileAsserter.java +++ b/model/model-test/src/main/java/com/evolveum/midpoint/model/test/asserter/CompiledUserProfileAsserter.java @@ -17,16 +17,13 @@ import static org.testng.AssertJUnit.assertEquals; import static org.testng.AssertJUnit.assertNotNull; +import static org.testng.AssertJUnit.assertTrue; import org.testng.AssertJUnit; -import com.evolveum.midpoint.model.api.ArchetypeInteractionSpecification; import com.evolveum.midpoint.model.api.authentication.CompiledUserProfile; import com.evolveum.midpoint.test.IntegrationTestTools; import com.evolveum.midpoint.test.asserter.AbstractAsserter; -import com.evolveum.midpoint.test.asserter.ArchetypePolicyAsserter; -import com.evolveum.midpoint.test.asserter.DisplayTypeAsserter; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ArchetypePolicyType; /** * @author semancik @@ -62,7 +59,11 @@ public CompiledUserProfileAsserter assertUserDashboardLinks(int expectedLink } public CompiledUserProfileAsserter assertObjectForms(int expectedForms) { - assertEquals("Wrong number of object forms in " + desc(), expectedForms, getCompiledUserProfile().getObjectForms().getObjectForm().size()); + if (getCompiledUserProfile().getObjectForms() == null) { + assertTrue("Wrong number of object forms in " + desc() + "; exected " + expectedForms + " but was null", expectedForms == 0); + } else { + assertEquals("Wrong number of object forms in " + desc(), expectedForms, getCompiledUserProfile().getObjectForms().getObjectForm().size()); + } return this; } @@ -83,6 +84,12 @@ public CompiledUserProfileAsserter assertObjectCollectionViews(int expectedV return this; } + public ObjectCollectionViewsAsserter> objectCollectionViews() { + ObjectCollectionViewsAsserter> asserter = new ObjectCollectionViewsAsserter<>(getCompiledUserProfile().getObjectCollectionViews(), this, desc()); + copySetupTo(asserter); + return asserter; + } + // TODO: better asserter for views public CompiledUserProfileAsserter display() { diff --git a/model/model-test/src/main/java/com/evolveum/midpoint/model/test/asserter/ObjectCollectionViewAsserter.java b/model/model-test/src/main/java/com/evolveum/midpoint/model/test/asserter/ObjectCollectionViewAsserter.java new file mode 100644 index 00000000000..56ec294f600 --- /dev/null +++ b/model/model-test/src/main/java/com/evolveum/midpoint/model/test/asserter/ObjectCollectionViewAsserter.java @@ -0,0 +1,58 @@ +/** + * Copyright (c) 2018 Evolveum + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.evolveum.midpoint.model.test.asserter; + +import static org.testng.AssertJUnit.assertEquals; +import static org.testng.AssertJUnit.assertNotNull; + +import com.evolveum.midpoint.model.api.authentication.CompiledObjectCollectionView; +import com.evolveum.midpoint.prism.query.ObjectFilter; +import com.evolveum.midpoint.test.asserter.AbstractAsserter; + +/** + * @author semancik + * + */ +public class ObjectCollectionViewAsserter extends AbstractAsserter { + + private final CompiledObjectCollectionView view; + + public ObjectCollectionViewAsserter(CompiledObjectCollectionView view, RA returnAsserter, String desc) { + super(returnAsserter, desc); + this.view = view; + } + + public ObjectCollectionViewAsserter assertName(String expected) { + assertEquals("Wrong view name in "+desc(), expected, view.getViewName()); + return this; + } + + public ObjectCollectionViewAsserter assertFilter() { + assertNotNull("Null filter in "+desc(), view.getFilter()); + return this; + } + // TODO + + public ObjectFilter getFilter() { + return view.getFilter(); + } + + @Override + protected String desc() { + return descWithDetails(view); + } + +} diff --git a/model/model-test/src/main/java/com/evolveum/midpoint/model/test/asserter/ObjectCollectionViewFinder.java b/model/model-test/src/main/java/com/evolveum/midpoint/model/test/asserter/ObjectCollectionViewFinder.java new file mode 100644 index 00000000000..0a07e7da22c --- /dev/null +++ b/model/model-test/src/main/java/com/evolveum/midpoint/model/test/asserter/ObjectCollectionViewFinder.java @@ -0,0 +1,88 @@ +/** + * Copyright (c) 2018 Evolveum + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.evolveum.midpoint.model.test.asserter; + +import static org.testng.AssertJUnit.assertEquals; + +import org.testng.AssertJUnit; + +import com.evolveum.midpoint.model.api.authentication.CompiledObjectCollectionView; +import com.evolveum.midpoint.util.exception.ObjectNotFoundException; +import com.evolveum.midpoint.util.exception.SchemaException; + +/** + * @author semancik + * + */ +public class ObjectCollectionViewFinder { + + private final ObjectCollectionViewsAsserter viewsAsserter; + private String name; + + public ObjectCollectionViewFinder(ObjectCollectionViewsAsserter viewsAsserter) { + this.viewsAsserter = viewsAsserter; + } + + public ObjectCollectionViewFinder name(String name) { + this.name = name; + return this; + } + + public ObjectCollectionViewAsserter> find() throws ObjectNotFoundException, SchemaException { + CompiledObjectCollectionView found = null; + for (CompiledObjectCollectionView view: viewsAsserter.getViews()) { + if (matches(view)) { + if (found == null) { + found = view; + } else { + fail("Found more than one link that matches search criteria"); + } + } + } + if (found == null) { + fail("Found no link that matches search criteria"); + } + return viewsAsserter.forView(found); + } + + public ObjectCollectionViewsAsserter assertCount(int expectedCount) throws ObjectNotFoundException, SchemaException { + int foundCount = 0; + for (CompiledObjectCollectionView view: viewsAsserter.getViews()) { + if (matches(view)) { + foundCount++; + } + } + assertEquals("Wrong number of links for specified criteria in "+viewsAsserter.desc(), expectedCount, foundCount); + return viewsAsserter; + } + + private boolean matches(CompiledObjectCollectionView view) throws ObjectNotFoundException, SchemaException { + + if (name != null) { + if (!name.equals(view.getViewName())) { + return false; + } + } + + // TODO: more criteria + return true; + } + + protected void fail(String message) { + AssertJUnit.fail(message); + } + +} diff --git a/model/model-test/src/main/java/com/evolveum/midpoint/model/test/asserter/ObjectCollectionViewsAsserter.java b/model/model-test/src/main/java/com/evolveum/midpoint/model/test/asserter/ObjectCollectionViewsAsserter.java new file mode 100644 index 00000000000..915e86f17c8 --- /dev/null +++ b/model/model-test/src/main/java/com/evolveum/midpoint/model/test/asserter/ObjectCollectionViewsAsserter.java @@ -0,0 +1,67 @@ +/** + * Copyright (c) 2018 Evolveum + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.evolveum.midpoint.model.test.asserter; + +import static org.testng.AssertJUnit.assertEquals; + +import java.util.List; + +import com.evolveum.midpoint.model.api.authentication.CompiledObjectCollectionView; +import com.evolveum.midpoint.test.asserter.AbstractAsserter; + +/** + * @author semancik + * + */ +public class ObjectCollectionViewsAsserter extends AbstractAsserter { + + private final List objectCollectionViews; + + public ObjectCollectionViewsAsserter(List objectCollectionViews, RA returnAsserter, String desc) { + super(returnAsserter, desc); + this.objectCollectionViews = objectCollectionViews; + } + + ObjectCollectionViewAsserter> forView(CompiledObjectCollectionView view) { + ObjectCollectionViewAsserter> asserter = new ObjectCollectionViewAsserter<>(view, this, "view in "+desc()); + copySetupTo(asserter); + return asserter; + } + + public ObjectCollectionViewFinder by() { + return new ObjectCollectionViewFinder<>(this); + } + + public List getViews() { + return objectCollectionViews; + } + + public ObjectCollectionViewsAsserter assertViews(int expected) { + assertEquals("Wrong number of views in "+desc(), expected, getViews().size()); + return this; + } + + public ObjectCollectionViewAsserter> single() { + assertViews(1); + return forView(getViews().get(0)); + } + + @Override + protected String desc() { + return "object collection views of " + getDetails(); + } + +}