/* * Copyright (c) 2010-2017 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.wf.impl.policy.lifecycle; import com.evolveum.midpoint.prism.PrismReferenceValue; import com.evolveum.midpoint.prism.delta.ObjectDelta; import com.evolveum.midpoint.prism.delta.builder.DeltaBuilder; import com.evolveum.midpoint.schema.constants.SchemaConstants; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.schema.util.ObjectTypeUtil; import com.evolveum.midpoint.task.api.Task; import com.evolveum.midpoint.test.util.TestUtil; import com.evolveum.midpoint.util.logging.Trace; import com.evolveum.midpoint.util.logging.TraceManager; import com.evolveum.midpoint.wf.impl.policy.AbstractWfTestPolicy; import com.evolveum.midpoint.wf.impl.policy.ExpectedTask; import com.evolveum.midpoint.wf.impl.policy.ExpectedWorkItem; import com.evolveum.midpoint.xml.ns._public.common.common_3.RoleType; import com.evolveum.midpoint.xml.ns._public.common.common_3.UserType; import com.evolveum.prism.xml.ns._public.types_3.PolyStringType; import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.annotation.DirtiesContext.ClassMode; import org.springframework.test.context.ContextConfiguration; import org.testng.annotations.Test; import java.io.File; import java.util.Collections; import static com.evolveum.midpoint.test.IntegrationTestTools.display; import static org.testng.AssertJUnit.assertEquals; import static org.testng.AssertJUnit.assertNull; /** * Testing approvals of role lifecycle: create/modify/delete role. * * Subclasses provide specializations regarding ways how rules and/or approvers are attached to roles. * * @author mederly */ @ContextConfiguration(locations = {"classpath:ctx-workflow-test-main.xml"}) @DirtiesContext(classMode = ClassMode.AFTER_CLASS) public abstract class AbstractTestLifecycle extends AbstractWfTestPolicy { protected static final Trace LOGGER = TraceManager.getTrace(AbstractTestLifecycle.class); protected static final File TEST_LIFECYCLE_RESOURCE_DIR = new File("src/test/resources/policy/lifecycle"); protected static final File USER_PIRATE_OWNER_FILE = new File(TEST_LIFECYCLE_RESOURCE_DIR, "user-pirate-owner.xml"); protected String userPirateOwnerOid; String rolePirateOid; @Override public void initSystem(Task initTask, OperationResult initResult) throws Exception { super.initSystem(initTask, initResult); userPirateOwnerOid = addAndRecomputeUser(USER_PIRATE_OWNER_FILE, initTask, initResult); } protected boolean approveObjectAdd() { return false; } @Test public void test010CreateRolePirate() throws Exception { final String TEST_NAME = "test010CreateRolePirate"; TestUtil.displayTestTile(this, TEST_NAME); login(userAdministrator); Task task = createTask(TEST_NAME); OperationResult result = task.getResult(); RoleType pirate = new RoleType(prismContext); pirate.setName(PolyStringType.fromOrig("pirate")); if (approveObjectAdd()) { createObject(TEST_NAME, pirate, false, true, userLead1Oid); rolePirateOid = searchObjectByName(RoleType.class, "pirate").getOid(); } else { repoAddObject(pirate.asPrismObject(), result); rolePirateOid = pirate.getOid(); } PrismReferenceValue pirateOwner = new PrismReferenceValue(rolePirateOid, RoleType.COMPLEX_TYPE); pirateOwner.setRelation(SchemaConstants.ORG_OWNER); executeChanges((ObjectDelta<UserType>) DeltaBuilder.deltaFor(UserType.class, prismContext) .item(UserType.F_ASSIGNMENT).add(ObjectTypeUtil.createAssignmentTo(pirateOwner, prismContext)) .asObjectDelta(userPirateOwnerOid), null, task, result); display("Pirate role", getRole(rolePirateOid)); display("Pirate owner", getUser(userPirateOwnerOid)); } @Test public void test100ModifyRolePirateDescription() throws Exception { final String TEST_NAME = "test100ModifyRolePirateDescription"; TestUtil.displayTestTile(this, TEST_NAME); login(userAdministrator); ObjectDelta<RoleType> descriptionDelta = (ObjectDelta<RoleType>) DeltaBuilder.deltaFor(RoleType.class, prismContext) .item(RoleType.F_DESCRIPTION).replace("Bloody pirate") .asObjectDelta(rolePirateOid); ObjectDelta<RoleType> delta0 = ObjectDelta.createModifyDelta(rolePirateOid, Collections.emptyList(), RoleType.class, prismContext); //noinspection UnnecessaryLocalVariable ObjectDelta<RoleType> delta1 = descriptionDelta; ExpectedTask expectedTask = new ExpectedTask(null, "Modification of pirate"); ExpectedWorkItem expectedWorkItem = new ExpectedWorkItem(userPirateOwnerOid, null, expectedTask); modifyObject(TEST_NAME, descriptionDelta, delta0, delta1, false, true, userPirateOwnerOid, Collections.singletonList(expectedTask), Collections.singletonList(expectedWorkItem), () -> {}, () -> assertNull("Description is modified", getRoleSimple(rolePirateOid).getDescription()), () -> assertEquals("Description was NOT modified", "Bloody pirate", getRoleSimple(rolePirateOid).getDescription())); } @Test public void test200DeleteRolePirate() throws Exception { final String TEST_NAME = "test200DeleteRolePirate"; TestUtil.displayTestTile(this, TEST_NAME); login(userAdministrator); ExpectedTask expectedTask = new ExpectedTask(null, "Deletion of pirate"); ExpectedWorkItem expectedWorkItem = new ExpectedWorkItem(userPirateOwnerOid, null, expectedTask); deleteObject(TEST_NAME, RoleType.class, rolePirateOid, false, true, userPirateOwnerOid, Collections.singletonList(expectedTask), Collections.singletonList(expectedWorkItem)); } @Test public void zzzMarkAsNotInitialized() { display("Setting class as not initialized"); unsetSystemInitialized(); } }