/* * 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.model.intest; import static com.evolveum.midpoint.test.IntegrationTestTools.display; import static org.testng.AssertJUnit.assertEquals; import static org.testng.AssertJUnit.assertNotNull; import static org.testng.AssertJUnit.assertNull; import java.io.File; import java.util.ArrayList; import java.util.Collection; import java.util.List; import javax.xml.datatype.XMLGregorianCalendar; import javax.xml.namespace.QName; import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.annotation.DirtiesContext.ClassMode; import org.springframework.test.context.ContextConfiguration; import org.testng.AssertJUnit; import org.testng.annotations.Test; import com.evolveum.icf.dummy.resource.DummyAccount; import com.evolveum.midpoint.model.api.ModelExecuteOptions; import com.evolveum.midpoint.model.common.expression.evaluator.GenerateExpressionEvaluator; import com.evolveum.midpoint.model.impl.trigger.RecomputeTriggerHandler; import com.evolveum.midpoint.model.intest.sync.TestImportRecon; import com.evolveum.midpoint.prism.PrismObject; import com.evolveum.midpoint.prism.PrismPropertyValue; import com.evolveum.midpoint.prism.PrismValue; import com.evolveum.midpoint.prism.delta.ChangeType; import com.evolveum.midpoint.prism.delta.ObjectDelta; import com.evolveum.midpoint.prism.delta.PropertyDelta; import com.evolveum.midpoint.prism.path.ItemPath; import com.evolveum.midpoint.prism.polystring.PolyString; import com.evolveum.midpoint.prism.util.PrismAsserts; import com.evolveum.midpoint.prism.util.PrismTestUtil; import com.evolveum.midpoint.prism.xml.XmlTypeConverter; import com.evolveum.midpoint.schema.ObjectDeltaOperation; import com.evolveum.midpoint.schema.constants.SchemaConstants; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.schema.util.MiscSchemaUtil; import com.evolveum.midpoint.task.api.Task; import com.evolveum.midpoint.test.DummyResourceContoller; import com.evolveum.midpoint.test.IntegrationTestTools; import com.evolveum.midpoint.test.util.TestUtil; import com.evolveum.midpoint.util.MiscUtil; import com.evolveum.midpoint.util.QNameUtil; import com.evolveum.midpoint.util.exception.CommunicationException; import com.evolveum.midpoint.util.exception.ConfigurationException; import com.evolveum.midpoint.util.exception.ObjectNotFoundException; import com.evolveum.midpoint.util.exception.SchemaException; import com.evolveum.midpoint.util.exception.SecurityViolationException; import com.evolveum.midpoint.xml.ns._public.common.common_3.AssignmentPolicyEnforcementType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectPolicyConfigurationType; 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.ShadowType; import com.evolveum.midpoint.xml.ns._public.common.common_3.SystemConfigurationType; import com.evolveum.midpoint.xml.ns._public.common.common_3.SystemObjectsType; import com.evolveum.midpoint.xml.ns._public.common.common_3.UserType; /** * @author semancik * */ @ContextConfiguration(locations = {"classpath:ctx-model-intest-test-main.xml"}) @DirtiesContext(classMode = ClassMode.AFTER_CLASS) public class TestUserTemplate extends AbstractInitializedModelIntegrationTest { public static final File TEST_DIR = new File("src/test/resources/object-template"); protected static final File ROLE_RASTAMAN_FILE = new File(TEST_DIR, "role-rastaman.xml"); protected static final String ROLE_RASTAMAN_OID = "81ac6b8c-225c-11e6-ab0f-87a169c85cca"; protected static final File ROLE_AUTOMATIC_FILE = new File(TEST_DIR, "role-automatic.xml"); protected static final String ROLE_AUTOMATIC_OID = "8fdb56d8-e3f3-11e6-8be9-cb9862ab7c04"; protected static final File ROLE_AUTOCRATIC_FILE = new File(TEST_DIR, "role-autocratic.xml"); protected static final String ROLE_AUTOCRATIC_OID = "4a678382-e3f4-11e6-8c3d-cfd3dba8168f"; protected static final File ROLE_AUTODIDACTIC_FILE = new File(TEST_DIR, "role-autodidactic.xml"); protected static final String ROLE_AUTODIDACTIC_OID = "a4f941dc-e3f4-11e6-8eba-9fe432784017"; protected static final File ROLE_AUTOGRAPHIC_FILE = new File(TEST_DIR, "role-autographic.xml"); protected static final String ROLE_AUTOGRAPHIC_OID = "be835a70-e3f4-11e6-82cb-9b47ebe57b11"; protected static final File USER_TEMPLATE_MAROONED_FILE = new File(TEST_DIR, "user-template-marooned.xml"); protected static final String USER_TEMPLATE_MAROONED_OID = "766215e8-5f1e-11e6-94bb-c3b21af53235"; private static final String ACCOUNT_STAN_USERNAME = "stan"; private static final String ACCOUNT_STAN_FULLNAME = "Stan the Salesman"; private static final String EMPLOYEE_TYPE_MAROONED = "marooned"; private static final int NUMBER_OF_ROLES = 20; private static String jackEmployeeNumber; @Override public void initSystem(Task initTask, OperationResult initResult) throws Exception { super.initSystem(initTask, initResult); assumeAssignmentPolicy(AssignmentPolicyEnforcementType.FULL); repoAddObjectFromFile(ROLE_RASTAMAN_FILE, initResult); repoAddObjectFromFile(ROLE_AUTOMATIC_FILE, initResult); repoAddObjectFromFile(ROLE_AUTOCRATIC_FILE, initResult); repoAddObjectFromFile(ROLE_AUTODIDACTIC_FILE, initResult); repoAddObjectFromFile(ROLE_AUTOGRAPHIC_FILE, initResult); repoAddObjectFromFile(USER_TEMPLATE_MAROONED_FILE, initResult); setDefaultObjectTemplate(UserType.COMPLEX_TYPE, USER_TEMPLATE_COMPLEX_OID, initResult); setDefaultObjectTemplate(UserType.COMPLEX_TYPE, EMPLOYEE_TYPE_MAROONED, USER_TEMPLATE_MAROONED_OID, initResult); } @Test public void test000Sanity() throws Exception { final String TEST_NAME = "test000Sanity"; TestUtil.displayTestTile(this, TEST_NAME); Task task = taskManager.createTaskInstance(TestUserTemplate.class.getName() + "." + TEST_NAME); OperationResult result = task.getResult(); // WHEN TestUtil.displayWhen(TEST_NAME); PrismObject<SystemConfigurationType> systemConfiguration = modelService.getObject(SystemConfigurationType.class, SystemObjectsType.SYSTEM_CONFIGURATION.value(), null, task, result); // THEN result.computeStatus(); TestUtil.assertSuccess(result); display("System config", systemConfiguration); assertNotNull("no system config", systemConfiguration); List<ObjectPolicyConfigurationType> defaultObjectPolicyConfiguration = systemConfiguration.asObjectable().getDefaultObjectPolicyConfiguration(); assertNotNull("No object policy", defaultObjectPolicyConfiguration); assertEquals("Wrong object policy size", 2, defaultObjectPolicyConfiguration.size()); assertObjectTemplate(defaultObjectPolicyConfiguration, UserType.COMPLEX_TYPE, null, USER_TEMPLATE_COMPLEX_OID); assertObjectTemplate(defaultObjectPolicyConfiguration, UserType.COMPLEX_TYPE, EMPLOYEE_TYPE_MAROONED, USER_TEMPLATE_MAROONED_OID); assertRoles(NUMBER_OF_ROLES); } private void assertObjectTemplate(List<ObjectPolicyConfigurationType> defaultObjectPolicyConfigurations, QName objectType, String subtype, String userTemplateOid) { for (ObjectPolicyConfigurationType objectPolicyConfiguration: defaultObjectPolicyConfigurations) { if (MiscUtil.equals(objectPolicyConfiguration.getType(), objectType) && MiscUtil.equals(objectPolicyConfiguration.getSubtype(), subtype) && MiscUtil.equals(objectPolicyConfiguration.getObjectTemplateRef().getOid(), userTemplateOid)) { return; } } AssertJUnit.fail("Object template for "+objectType+":"+subtype+"="+userTemplateOid+" not found"); } @Test public void test100ModifyUserGivenName() throws Exception { final String TEST_NAME = "test100ModifyUserGivenName"; TestUtil.displayTestTile(this, TEST_NAME); // GIVEN Task task = taskManager.createTaskInstance(TestUserTemplate.class.getName() + "." + TEST_NAME); OperationResult result = task.getResult(); Collection<ObjectDelta<? extends ObjectType>> deltas = new ArrayList<ObjectDelta<? extends ObjectType>>(); ObjectDelta<UserType> userDelta = ObjectDelta.createModificationReplaceProperty(UserType.class, USER_JACK_OID, UserType.F_GIVEN_NAME, prismContext, new PolyString("Jackie")); deltas.add(userDelta); // WHEN modelService.executeChanges(deltas, null, task, result); // THEN result.computeStatus(); TestUtil.assertSuccess(result); PrismObject<UserType> userJack = modelService.getObject(UserType.class, USER_JACK_OID, null, task, result); assertUserJack(userJack, "Jackie Sparrow", "Jackie", "Sparrow"); PrismAsserts.assertPropertyValue(userJack, UserType.F_DESCRIPTION, "Where's the rum?"); assertAssignedAccount(userJack, RESOURCE_DUMMY_BLUE_OID); assertAssignedNoRole(userJack); assertAssignments(userJack, 1); result.computeStatus(); TestUtil.assertSuccess(result); UserType userJackType = userJack.asObjectable(); assertEquals("Unexpected number of accountRefs", 1, userJackType.getLinkRef().size()); PrismAsserts.assertPropertyValue(userJack, UserType.F_ADDITIONAL_NAME, PrismTestUtil.createPolyString("Jackie")); XMLGregorianCalendar now = clock.currentTimeXMLGregorianCalendar(); XMLGregorianCalendar monthLater = XmlTypeConverter.addDuration(now, XmlTypeConverter.createDuration("P1M")); assertTrigger(userJack, RecomputeTriggerHandler.HANDLER_URI, monthLater, 100000L); // original value of 0 should be gone now, because the corresponding item in user template is marked as non-tolerant PrismAsserts.assertPropertyValue(userJack.findContainer(UserType.F_EXTENSION), PIRACY_BAD_LUCK, 123L, 456L); // timezone mapping is normal-strength. The source (locality) has not changed. // The mapping should not be activated (MID-3040) PrismAsserts.assertNoItem(userJack, UserType.F_TIMEZONE); } @Test public void test101ModifyUserEmployeeTypePirate() throws Exception { final String TEST_NAME = "test101ModifyUserEmployeeTypePirate"; TestUtil.displayTestTile(this, TEST_NAME); // GIVEN Task task = taskManager.createTaskInstance(TestUserTemplate.class.getName() + "." + TEST_NAME); OperationResult result = task.getResult(); Collection<ObjectDelta<? extends ObjectType>> deltas = new ArrayList<ObjectDelta<? extends ObjectType>>(); ObjectDelta<UserType> userDelta = ObjectDelta.createModificationReplaceProperty(UserType.class, USER_JACK_OID, UserType.F_EMPLOYEE_TYPE, prismContext, "PIRATE"); // Make sure that the user has no employeeNumber so it will be generated by userTemplate userDelta.addModificationReplaceProperty(UserType.F_EMPLOYEE_NUMBER); deltas.add(userDelta); // WHEN TestUtil.displayWhen(TEST_NAME); modelService.executeChanges(deltas, null, task, result); // THEN TestUtil.displayThen(TEST_NAME); result.computeStatus(); TestUtil.assertSuccess(result); PrismObject<UserType> userJack = modelService.getObject(UserType.class, USER_JACK_OID, null, task, result); display("User after", userJack); PrismAsserts.assertPropertyValue(userJack, UserType.F_DESCRIPTION, "Where's the rum?"); assertAssignedAccount(userJack, RESOURCE_DUMMY_BLUE_OID); assertAssignedRole(userJack, ROLE_PIRATE_OID); assertAssignments(userJack, 2); UserType userJackType = userJack.asObjectable(); assertEquals("Unexpected number of accountRefs", 2, userJackType.getLinkRef().size()); result.computeStatus(); TestUtil.assertSuccess(result); assertEquals("Wrong costCenter", "G001", userJackType.getCostCenter()); jackEmployeeNumber = userJackType.getEmployeeNumber(); assertEquals("Unexpected length of employeeNumber, maybe it was not generated?", GenerateExpressionEvaluator.DEFAULT_LENGTH, jackEmployeeNumber.length()); XMLGregorianCalendar now = clock.currentTimeXMLGregorianCalendar(); XMLGregorianCalendar monthLater = XmlTypeConverter.addDuration(now, XmlTypeConverter.createDuration("P1M")); assertTrigger(userJack, RecomputeTriggerHandler.HANDLER_URI, monthLater, 100000L); } /** * Switch employeeType from PIRATE to BUCCANEER. This makes one condition to go false and the other to go * true. For the same role assignement value. So nothing should be changed. */ @Test public void test102ModifyUserEmployeeTypeBuccaneer() throws Exception { final String TEST_NAME = "test102ModifyUserEmployeeTypeBuccaneer"; TestUtil.displayTestTile(this, TEST_NAME); // GIVEN Task task = taskManager.createTaskInstance(TestUserTemplate.class.getName() + "." + TEST_NAME); OperationResult result = task.getResult(); Collection<ObjectDelta<? extends ObjectType>> deltas = new ArrayList<ObjectDelta<? extends ObjectType>>(); ObjectDelta<UserType> userDelta = ObjectDelta.createModificationReplaceProperty(UserType.class, USER_JACK_OID, UserType.F_EMPLOYEE_TYPE, prismContext, "BUCCANEER"); deltas.add(userDelta); // WHEN modelService.executeChanges(deltas, null, task, result); // THEN result.computeStatus(); TestUtil.assertSuccess(result); PrismObject<UserType> userJack = modelService.getObject(UserType.class, USER_JACK_OID, null, task, result); display("User after", userJack); PrismAsserts.assertPropertyValue(userJack, UserType.F_DESCRIPTION, "Where's the rum?"); assertAssignedAccount(userJack, RESOURCE_DUMMY_BLUE_OID); assertAssignedRole(userJack, ROLE_PIRATE_OID); assertAssignments(userJack, 2); UserType userJackType = userJack.asObjectable(); assertEquals("Unexpected number of accountRefs", 2, userJackType.getLinkRef().size()); result.computeStatus(); TestUtil.assertSuccess(result); assertEquals("Wrong costCenter", "B666", userJackType.getCostCenter()); assertEquals("Employee number has changed", jackEmployeeNumber, userJackType.getEmployeeNumber()); } @Test public void test103ModifyUserEmployeeTypeBartender() throws Exception { final String TEST_NAME = "test103ModifyUserEmployeeTypeBartender"; TestUtil.displayTestTile(this, TEST_NAME); // GIVEN Task task = taskManager.createTaskInstance(TestUserTemplate.class.getName() + "." + TEST_NAME); OperationResult result = task.getResult(); Collection<ObjectDelta<? extends ObjectType>> deltas = new ArrayList<ObjectDelta<? extends ObjectType>>(); ObjectDelta<UserType> userDelta = ObjectDelta.createModificationReplaceProperty(UserType.class, USER_JACK_OID, UserType.F_EMPLOYEE_TYPE, prismContext, "BARTENDER"); deltas.add(userDelta); // WHEN modelService.executeChanges(deltas, null, task, result); // THEN result.computeStatus(); TestUtil.assertSuccess(result); PrismObject<UserType> userJack = modelService.getObject(UserType.class, USER_JACK_OID, null, task, result); display("User after", userJack); PrismAsserts.assertPropertyValue(userJack, UserType.F_DESCRIPTION, "Where's the rum?"); assertAssignedAccount(userJack, RESOURCE_DUMMY_BLUE_OID); assertNotAssignedRole(userJack, ROLE_PIRATE_OID); assertAssignments(userJack, 1); UserType userJackType = userJack.asObjectable(); assertEquals("Unexpected number of accountRefs", 1, userJackType.getLinkRef().size()); result.computeStatus(); TestUtil.assertSuccess(result); assertEquals("Wrong costCenter", "G001", userJackType.getCostCenter()); assertEquals("Employee number has changed", jackEmployeeNumber, userJackType.getEmployeeNumber()); } /** * Cost center has two mappings. Strong mapping should not be applied here as the condition is false. * The weak mapping should be overridden by the change we try here. */ @Test public void test104ModifyUserCostCenter() throws Exception { final String TEST_NAME = "test104ModifyUserCostCenter"; TestUtil.displayTestTile(this, TEST_NAME); // GIVEN Task task = taskManager.createTaskInstance(TestUserTemplate.class.getName() + "." + TEST_NAME); OperationResult result = task.getResult(); Collection<ObjectDelta<? extends ObjectType>> deltas = new ArrayList<ObjectDelta<? extends ObjectType>>(); ObjectDelta<UserType> userDelta = ObjectDelta.createModificationReplaceProperty(UserType.class, USER_JACK_OID, UserType.F_COST_CENTER, prismContext, "X000"); deltas.add(userDelta); // WHEN modelService.executeChanges(deltas, null, task, result); // THEN result.computeStatus(); TestUtil.assertSuccess(result); PrismObject<UserType> userJack = modelService.getObject(UserType.class, USER_JACK_OID, null, task, result); display("User after", userJack); PrismAsserts.assertPropertyValue(userJack, UserType.F_DESCRIPTION, "Where's the rum?"); assertAssignedAccount(userJack, RESOURCE_DUMMY_BLUE_OID); assertNotAssignedRole(userJack, ROLE_PIRATE_OID); assertAssignments(userJack, 1); UserType userJackType = userJack.asObjectable(); assertEquals("Unexpected number of accountRefs", 1, userJackType.getLinkRef().size()); result.computeStatus(); TestUtil.assertSuccess(result); assertEquals("Wrong costCenter", "X000", userJackType.getCostCenter()); assertEquals("Employee number has changed", jackEmployeeNumber, userJackType.getEmployeeNumber()); } @Test public void test105ModifyUserTelephoneNumber() throws Exception { final String TEST_NAME = "test105ModifyUserTelephoneNumber"; TestUtil.displayTestTile(this, TEST_NAME); // GIVEN Task task = taskManager.createTaskInstance(TestUserTemplate.class.getName() + "." + TEST_NAME); OperationResult result = task.getResult(); Collection<ObjectDelta<? extends ObjectType>> deltas = new ArrayList<ObjectDelta<? extends ObjectType>>(); ObjectDelta<UserType> userDelta = ObjectDelta.createModificationReplaceProperty(UserType.class, USER_JACK_OID, UserType.F_TELEPHONE_NUMBER, prismContext, "1234"); deltas.add(userDelta); // WHEN modelService.executeChanges(deltas, null, task, result); // THEN result.computeStatus(); TestUtil.assertSuccess(result); PrismObject<UserType> userJack = modelService.getObject(UserType.class, USER_JACK_OID, null, task, result); display("User after", userJack); PrismAsserts.assertPropertyValue(userJack, UserType.F_DESCRIPTION, "Where's the rum?"); assertAssignedAccount(userJack, RESOURCE_DUMMY_BLUE_OID); assertNotAssignedRole(userJack, ROLE_PIRATE_OID); assertAssignments(userJack, 1); UserType userJackType = userJack.asObjectable(); assertEquals("Unexpected number of accountRefs", 1, userJackType.getLinkRef().size()); result.computeStatus(); TestUtil.assertSuccess(result); assertEquals("Wrong costCenter", "X000", userJackType.getCostCenter()); assertEquals("Wrong employee number", jackEmployeeNumber, userJackType.getEmployeeNumber()); assertEquals("Wrong telephone number", "1234", userJackType.getTelephoneNumber()); assertNull("Unexpected title: " + userJackType.getTitle(), userJackType.getTitle()); } @Test public void test106ModifyUserRemoveTelephoneNumber() throws Exception { final String TEST_NAME = "test106ModifyUserRemoveTelephoneNumber"; TestUtil.displayTestTile(this, TEST_NAME); // GIVEN Task task = taskManager.createTaskInstance(TestUserTemplate.class.getName() + "." + TEST_NAME); OperationResult result = task.getResult(); Collection<ObjectDelta<? extends ObjectType>> deltas = new ArrayList<ObjectDelta<? extends ObjectType>>(); ObjectDelta<UserType> userDelta = ObjectDelta.createModificationReplaceProperty(UserType.class, USER_JACK_OID, UserType.F_TELEPHONE_NUMBER, prismContext); deltas.add(userDelta); // WHEN modelService.executeChanges(deltas, null, task, result); // THEN result.computeStatus(); TestUtil.assertSuccess(result); PrismObject<UserType> userJack = modelService.getObject(UserType.class, USER_JACK_OID, null, task, result); display("User after", userJack); PrismAsserts.assertPropertyValue(userJack, UserType.F_DESCRIPTION, "Where's the rum?"); assertAssignedAccount(userJack, RESOURCE_DUMMY_BLUE_OID); assertNotAssignedRole(userJack, ROLE_PIRATE_OID); assertAssignments(userJack, 1); UserType userJackType = userJack.asObjectable(); assertEquals("Unexpected number of accountRefs", 1, userJackType.getLinkRef().size()); result.computeStatus(); TestUtil.assertSuccess(result); assertEquals("Wrong costCenter", "X000", userJackType.getCostCenter()); assertEquals("Wrong employee number", jackEmployeeNumber, userJackType.getEmployeeNumber()); assertNull("Unexpected telephone number: " + userJackType.getTelephoneNumber(), userJackType.getTelephoneNumber()); assertEquals("Wrong Title", PrismTestUtil.createPolyStringType("Happy Pirate"), userJackType.getTitle()); } @Test public void test107ModifyUserSetTelephoneNumber() throws Exception { final String TEST_NAME = "test107ModifyUserSetTelephoneNumber"; TestUtil.displayTestTile(this, TEST_NAME); // GIVEN Task task = taskManager.createTaskInstance(TestUserTemplate.class.getName() + "." + TEST_NAME); OperationResult result = task.getResult(); // WHEN modifyUserReplace(USER_JACK_OID, UserType.F_TELEPHONE_NUMBER, task, result, "1 222 3456789"); // THEN result.computeStatus(); TestUtil.assertSuccess(result); PrismObject<UserType> userJack = modelService.getObject(UserType.class, USER_JACK_OID, null, task, result); display("User after", userJack); PrismAsserts.assertPropertyValue(userJack, UserType.F_DESCRIPTION, "Where's the rum?"); assertAssignedAccount(userJack, RESOURCE_DUMMY_BLUE_OID); assertNotAssignedRole(userJack, ROLE_PIRATE_OID); assertAssignments(userJack, 1); UserType userJackType = userJack.asObjectable(); assertEquals("Unexpected number of accountRefs", 1, userJackType.getLinkRef().size()); result.computeStatus(); TestUtil.assertSuccess(result); assertEquals("Wrong costCenter", "X000", userJackType.getCostCenter()); assertEquals("Wrong employee number", jackEmployeeNumber, userJackType.getEmployeeNumber()); assertEquals("Wrong telephone number", "1 222 3456789", userJackType.getTelephoneNumber()); assertNull("Unexpected title: " + userJackType.getTitle(), userJackType.getTitle()); } /** * Reconcile the user. Check that nothing really changes. * MID-3040 */ @Test public void test120ReconcileUser() throws Exception { final String TEST_NAME = "test121ModifyUserReplaceLocality"; TestUtil.displayTestTile(this, TEST_NAME); // GIVEN Task task = taskManager.createTaskInstance(TestUserTemplate.class.getName() + "." + TEST_NAME); OperationResult result = task.getResult(); // WHEN reconcileUser(USER_JACK_OID, task, result); // THEN result.computeStatus(); TestUtil.assertSuccess(result); PrismObject<UserType> userJack = modelService.getObject(UserType.class, USER_JACK_OID, null, task, result); display("User after", userJack); PrismAsserts.assertPropertyValue(userJack, UserType.F_DESCRIPTION, "Where's the rum?"); assertAssignedAccount(userJack, RESOURCE_DUMMY_BLUE_OID); assertNotAssignedRole(userJack, ROLE_PIRATE_OID); assertAssignments(userJack, 1); UserType userJackType = userJack.asObjectable(); assertEquals("Unexpected number of accountRefs", 1, userJackType.getLinkRef().size()); result.computeStatus(); TestUtil.assertSuccess(result); assertEquals("Wrong costCenter", "X000", userJackType.getCostCenter()); assertEquals("Wrong employee number", jackEmployeeNumber, userJackType.getEmployeeNumber()); assertEquals("Wrong telephone number", "1 222 3456789", userJackType.getTelephoneNumber()); assertNull("Unexpected title: " + userJackType.getTitle(), userJackType.getTitle()); // timezone mapping is normal-strength. This is reconciliation. // The mapping should not be activated (MID-3040) PrismAsserts.assertNoItem(userJack, UserType.F_TIMEZONE); } /** * MID-3040 */ @Test public void test121ModifyUserReplaceLocality() throws Exception { final String TEST_NAME = "test121ModifyUserReplaceLocality"; TestUtil.displayTestTile(this, TEST_NAME); // GIVEN Task task = taskManager.createTaskInstance(TestUserTemplate.class.getName() + "." + TEST_NAME); OperationResult result = task.getResult(); // WHEN modifyUserReplace(USER_JACK_OID, UserType.F_LOCALITY, task, result, PrismTestUtil.createPolyString("Tortuga")); // THEN result.computeStatus(); TestUtil.assertSuccess(result); PrismObject<UserType> userJack = modelService.getObject(UserType.class, USER_JACK_OID, null, task, result); display("User after", userJack); PrismAsserts.assertPropertyValue(userJack, UserType.F_DESCRIPTION, "Where's the rum?"); assertAssignedAccount(userJack, RESOURCE_DUMMY_BLUE_OID); assertNotAssignedRole(userJack, ROLE_PIRATE_OID); assertAssignments(userJack, 1); UserType userJackType = userJack.asObjectable(); assertEquals("Unexpected number of accountRefs", 1, userJackType.getLinkRef().size()); result.computeStatus(); TestUtil.assertSuccess(result); PrismAsserts.assertEqualsPolyString("Wrong locality", "Tortuga", userJackType.getLocality()); assertEquals("Wrong timezone", "High Seas/Tortuga", userJackType.getTimezone()); assertEquals("Wrong costCenter", "X000", userJackType.getCostCenter()); assertEquals("Wrong employee number", jackEmployeeNumber, userJackType.getEmployeeNumber()); assertEquals("Wrong telephone number", "1 222 3456789", userJackType.getTelephoneNumber()); assertNull("Unexpected title: " + userJackType.getTitle(), userJackType.getTitle()); } @Test public void test140AssignDummy() throws Exception { final String TEST_NAME = "test140AssignDummy"; TestUtil.displayTestTile(this, TEST_NAME); // GIVEN Task task = taskManager.createTaskInstance(TestUserTemplate.class.getName() + "." + TEST_NAME); OperationResult result = task.getResult(); // WHEN assignAccount(USER_JACK_OID, RESOURCE_DUMMY_OID, null, task, result); // THEN PrismObject<UserType> userJack = modelService.getObject(UserType.class, USER_JACK_OID, null, task, result); display("User after", userJack); PrismAsserts.assertPropertyValue(userJack, UserType.F_DESCRIPTION, "Where's the rum?"); assertAssignedAccount(userJack, RESOURCE_DUMMY_BLUE_OID); assertAssignedAccount(userJack, RESOURCE_DUMMY_OID); assertNotAssignedRole(userJack, ROLE_PIRATE_OID); assertAssignments(userJack, 2); UserType userJackType = userJack.asObjectable(); assertEquals("Unexpected number of accountRefs", 2, userJackType.getLinkRef().size()); result.computeStatus(); TestUtil.assertSuccess(result); assertEquals("Wrong costCenter", "X000", userJackType.getCostCenter()); assertEquals("Wrong employee number", jackEmployeeNumber, userJackType.getEmployeeNumber()); assertEquals("Wrong telephone number", "1 222 3456789", userJackType.getTelephoneNumber()); assertNull("Unexpected title: " + userJackType.getTitle(), userJackType.getTitle()); IntegrationTestTools.assertExtensionProperty(userJack, PIRACY_COLORS, "none"); } @Test public void test149UnAssignDummy() throws Exception { final String TEST_NAME = "test149UnAssignDummy"; TestUtil.displayTestTile(this, TEST_NAME); // GIVEN Task task = taskManager.createTaskInstance(TestUserTemplate.class.getName() + "." + TEST_NAME); OperationResult result = task.getResult(); // WHEN unassignAccount(USER_JACK_OID, RESOURCE_DUMMY_OID, null, task, result); // THEN PrismObject<UserType> userJack = modelService.getObject(UserType.class, USER_JACK_OID, null, task, result); display("User after", userJack); PrismAsserts.assertPropertyValue(userJack, UserType.F_DESCRIPTION, "Where's the rum?"); assertAssignedAccount(userJack, RESOURCE_DUMMY_BLUE_OID); assertNotAssignedRole(userJack, ROLE_PIRATE_OID); assertAssignments(userJack, 1); UserType userJackType = userJack.asObjectable(); assertEquals("Unexpected number of accountRefs", 1, userJackType.getLinkRef().size()); result.computeStatus(); TestUtil.assertSuccess(result); assertEquals("Wrong costCenter", "X000", userJackType.getCostCenter()); assertEquals("Wrong employee number", jackEmployeeNumber, userJackType.getEmployeeNumber()); assertEquals("Wrong telephone number", "1 222 3456789", userJackType.getTelephoneNumber()); assertNull("Unexpected title: "+userJackType.getTitle(), userJackType.getTitle()); IntegrationTestTools.assertNoExtensionProperty(userJack, PIRACY_COLORS); } @Test public void test150ModifyJackOrganizationalUnitRum() throws Exception { final String TEST_NAME = "test150ModifyJackOrganizationalUnitRum"; TestUtil.displayTestTile(this, TEST_NAME); // GIVEN Task task = taskManager.createTaskInstance(TestUserTemplate.class.getName() + "." + TEST_NAME); OperationResult result = task.getResult(); // WHEN modifyUserReplace(USER_JACK_OID, UserType.F_ORGANIZATIONAL_UNIT, task, result, PrismTestUtil.createPolyString("F0004")); // THEN PrismObject<UserType> userJack = modelService.getObject(UserType.class, USER_JACK_OID, null, task, result); display("User after", userJack); PrismAsserts.assertPropertyValue(userJack, UserType.F_DESCRIPTION, "Where's the rum?"); assertAssignedAccount(userJack, RESOURCE_DUMMY_BLUE_OID); assertNotAssignedRole(userJack, ROLE_PIRATE_OID); assertAssignedOrg(userJack, ORG_MINISTRY_OF_RUM_OID); assertHasOrg(userJack, ORG_MINISTRY_OF_RUM_OID); assertAssignments(userJack, 2); UserType userJackType = userJack.asObjectable(); assertEquals("Unexpected number of accountRefs", 1, userJackType.getLinkRef().size()); result.computeStatus(); TestUtil.assertSuccess(result); assertEquals("Wrong costCenter", "X000", userJackType.getCostCenter()); assertEquals("Wrong employee number", jackEmployeeNumber, userJackType.getEmployeeNumber()); assertEquals("Wrong telephone number", "1 222 3456789", userJackType.getTelephoneNumber()); assertNull("Unexpected title: " + userJackType.getTitle(), userJackType.getTitle()); // IntegrationTestTools.assertNoExtensionProperty(userJack, PIRACY_COLORS); } @Test public void test151ModifyJackOrganizationalUnitOffense() throws Exception { final String TEST_NAME = "test151ModifyJackOrganizationalUnitOffense"; TestUtil.displayTestTile(this, TEST_NAME); // GIVEN Task task = taskManager.createTaskInstance(TestUserTemplate.class.getName() + "." + TEST_NAME); OperationResult result = task.getResult(); // WHEN modifyUserReplace(USER_JACK_OID, UserType.F_ORGANIZATIONAL_UNIT, task, result, PrismTestUtil.createPolyString("F0003")); // THEN PrismObject<UserType> userJack = modelService.getObject(UserType.class, USER_JACK_OID, null, task, result); display("User after", userJack); PrismAsserts.assertPropertyValue(userJack, UserType.F_DESCRIPTION, "Where's the rum?"); assertAssignedAccount(userJack, RESOURCE_DUMMY_BLUE_OID); assertNotAssignedRole(userJack, ROLE_PIRATE_OID); assertAssignedOrg(userJack, ORG_MINISTRY_OF_OFFENSE_OID); assertHasOrg(userJack, ORG_MINISTRY_OF_OFFENSE_OID); assertAssignments(userJack, 2); UserType userJackType = userJack.asObjectable(); assertEquals("Unexpected number of accountRefs", 1, userJackType.getLinkRef().size()); result.computeStatus(); TestUtil.assertSuccess(result); assertEquals("Wrong costCenter", "X000", userJackType.getCostCenter()); assertEquals("Wrong employee number", jackEmployeeNumber, userJackType.getEmployeeNumber()); assertEquals("Wrong telephone number", "1 222 3456789", userJackType.getTelephoneNumber()); assertNull("Unexpected title: " + userJackType.getTitle(), userJackType.getTitle()); // IntegrationTestTools.assertNoExtensionProperty(userJack, PIRACY_COLORS); } @Test public void test152ModifyJackOrganizationalUnitAddRum() throws Exception { final String TEST_NAME = "test152ModifyJackOrganizationalUnitAddRum"; TestUtil.displayTestTile(this, TEST_NAME); // GIVEN Task task = taskManager.createTaskInstance(TestUserTemplate.class.getName() + "." + TEST_NAME); OperationResult result = task.getResult(); // WHEN modifyUserAdd(USER_JACK_OID, UserType.F_ORGANIZATIONAL_UNIT, task, result, PrismTestUtil.createPolyString("F0004")); // THEN PrismObject<UserType> userJack = modelService.getObject(UserType.class, USER_JACK_OID, null, task, result); display("User after", userJack); PrismAsserts.assertPropertyValue(userJack, UserType.F_DESCRIPTION, "Where's the rum?"); assertAssignedAccount(userJack, RESOURCE_DUMMY_BLUE_OID); assertNotAssignedRole(userJack, ROLE_PIRATE_OID); assertAssignedOrg(userJack, ORG_MINISTRY_OF_RUM_OID); assertAssignedOrg(userJack, ORG_MINISTRY_OF_OFFENSE_OID); assertHasOrg(userJack, ORG_MINISTRY_OF_RUM_OID); assertHasOrg(userJack, ORG_MINISTRY_OF_OFFENSE_OID); assertAssignments(userJack, 3); UserType userJackType = userJack.asObjectable(); assertEquals("Unexpected number of accountRefs", 1, userJackType.getLinkRef().size()); result.computeStatus(); TestUtil.assertSuccess(result); assertEquals("Wrong costCenter", "X000", userJackType.getCostCenter()); assertEquals("Wrong employee number", jackEmployeeNumber, userJackType.getEmployeeNumber()); assertEquals("Wrong telephone number", "1 222 3456789", userJackType.getTelephoneNumber()); assertNull("Unexpected title: " + userJackType.getTitle(), userJackType.getTitle()); // IntegrationTestTools.assertNoExtensionProperty(userJack, PIRACY_COLORS); } @Test public void test153ModifyJackOrganizationalUnitDeleteOffense() throws Exception { final String TEST_NAME = "test153ModifyJackOrganizationalUnitDeleteOffense"; TestUtil.displayTestTile(this, TEST_NAME); // GIVEN Task task = taskManager.createTaskInstance(TestUserTemplate.class.getName() + "." + TEST_NAME); OperationResult result = task.getResult(); // WHEN modifyUserDelete(USER_JACK_OID, UserType.F_ORGANIZATIONAL_UNIT, task, result, PrismTestUtil.createPolyString("F0003")); // THEN PrismObject<UserType> userJack = modelService.getObject(UserType.class, USER_JACK_OID, null, task, result); display("User after", userJack); PrismAsserts.assertPropertyValue(userJack, UserType.F_DESCRIPTION, "Where's the rum?"); assertAssignedAccount(userJack, RESOURCE_DUMMY_BLUE_OID); assertNotAssignedRole(userJack, ROLE_PIRATE_OID); assertAssignedOrg(userJack, ORG_MINISTRY_OF_RUM_OID); assertHasOrg(userJack, ORG_MINISTRY_OF_RUM_OID); assertAssignments(userJack, 2); UserType userJackType = userJack.asObjectable(); assertEquals("Unexpected number of accountRefs", 1, userJackType.getLinkRef().size()); result.computeStatus(); TestUtil.assertSuccess(result); assertEquals("Wrong costCenter", "X000", userJackType.getCostCenter()); assertEquals("Wrong employee number", jackEmployeeNumber, userJackType.getEmployeeNumber()); assertEquals("Wrong telephone number", "1 222 3456789", userJackType.getTelephoneNumber()); assertNull("Unexpected title: "+userJackType.getTitle(), userJackType.getTitle()); // IntegrationTestTools.assertNoExtensionProperty(userJack, PIRACY_COLORS); } /** * Creates org on demand. */ @Test public void test155ModifyJackOrganizationalUnitFD001() throws Exception { final String TEST_NAME = "test155ModifyJackOrganizationalUnitFD001"; TestUtil.displayTestTile(this, TEST_NAME); // GIVEN Task task = taskManager.createTaskInstance(TestUserTemplate.class.getName() + "." + TEST_NAME); OperationResult result = task.getResult(); // WHEN modifyUserAdd(USER_JACK_OID, UserType.F_ORGANIZATIONAL_UNIT, task, result, PrismTestUtil.createPolyString("FD001")); // THEN PrismObject<UserType> userJack = modelService.getObject(UserType.class, USER_JACK_OID, null, task, result); display("User after", userJack); PrismAsserts.assertPropertyValue(userJack, UserType.F_DESCRIPTION, "Where's the rum?"); assertAssignedAccount(userJack, RESOURCE_DUMMY_BLUE_OID); assertNotAssignedRole(userJack, ROLE_PIRATE_OID); assertAssignedOrg(userJack, ORG_MINISTRY_OF_RUM_OID); assertHasOrg(userJack, ORG_MINISTRY_OF_RUM_OID); assertOnDemandOrgAssigned("FD001", userJack); assertAssignments(userJack, 3); UserType userJackType = userJack.asObjectable(); assertEquals("Unexpected number of accountRefs", 1, userJackType.getLinkRef().size()); result.computeStatus(); TestUtil.assertSuccess(result); assertEquals("Wrong costCenter", "X000", userJackType.getCostCenter()); assertEquals("Wrong employee number", jackEmployeeNumber, userJackType.getEmployeeNumber()); assertEquals("Wrong telephone number", "1 222 3456789", userJackType.getTelephoneNumber()); assertNull("Unexpected title: "+userJackType.getTitle(), userJackType.getTitle()); // IntegrationTestTools.assertNoExtensionProperty(userJack, PIRACY_COLORS); } /** * Reconcile user Jack, see that everything is OK. */ @Test public void test156ReconcileJack() throws Exception { final String TEST_NAME = "test156ReconcileJack"; TestUtil.displayTestTile(this, TEST_NAME); // GIVEN Task task = taskManager.createTaskInstance(TestUserTemplate.class.getName() + "." + TEST_NAME); OperationResult result = task.getResult(); // WHEN reconcileUser(USER_JACK_OID, task, result); // THEN PrismObject<UserType> userJack = modelService.getObject(UserType.class, USER_JACK_OID, null, task, result); display("User after", userJack); PrismAsserts.assertPropertyValue(userJack, UserType.F_DESCRIPTION, "Where's the rum?"); assertAssignedAccount(userJack, RESOURCE_DUMMY_BLUE_OID); assertNotAssignedRole(userJack, ROLE_PIRATE_OID); assertAssignedOrg(userJack, ORG_MINISTRY_OF_RUM_OID); assertHasOrg(userJack, ORG_MINISTRY_OF_RUM_OID); assertOnDemandOrgAssigned("FD001", userJack); assertAssignments(userJack, 3); UserType userJackType = userJack.asObjectable(); assertEquals("Unexpected number of accountRefs", 1, userJackType.getLinkRef().size()); result.computeStatus(); TestUtil.assertSuccess(result); assertEquals("Wrong costCenter", "X000", userJackType.getCostCenter()); assertEquals("Wrong employee number", jackEmployeeNumber, userJackType.getEmployeeNumber()); assertEquals("Wrong telephone number", "1 222 3456789", userJackType.getTelephoneNumber()); assertNull("Unexpected title: "+userJackType.getTitle(), userJackType.getTitle()); } /** * Creates two orgs on demand. */ @Test public void test157ModifyJackOrganizationalUnitFD0023() throws Exception { final String TEST_NAME = "test157ModifyJackOrganizationalUnitFD0023"; TestUtil.displayTestTile(this, TEST_NAME); // GIVEN Task task = taskManager.createTaskInstance(TestUserTemplate.class.getName() + "." + TEST_NAME); OperationResult result = task.getResult(); // WHEN modifyUserAdd(USER_JACK_OID, UserType.F_ORGANIZATIONAL_UNIT, task, result, PrismTestUtil.createPolyString("FD002"), PrismTestUtil.createPolyString("FD003")); // THEN PrismObject<UserType> userJack = modelService.getObject(UserType.class, USER_JACK_OID, null, task, result); display("User after", userJack); PrismAsserts.assertPropertyValue(userJack, UserType.F_DESCRIPTION, "Where's the rum?"); assertAssignedAccount(userJack, RESOURCE_DUMMY_BLUE_OID); assertNotAssignedRole(userJack, ROLE_PIRATE_OID); assertAssignedOrg(userJack, ORG_MINISTRY_OF_RUM_OID); assertHasOrg(userJack, ORG_MINISTRY_OF_RUM_OID); assertOnDemandOrgAssigned("FD001", userJack); assertOnDemandOrgAssigned("FD002", userJack); assertOnDemandOrgAssigned("FD003", userJack); assertAssignments(userJack, 5); UserType userJackType = userJack.asObjectable(); assertEquals("Unexpected number of accountRefs", 1, userJackType.getLinkRef().size()); result.computeStatus(); TestUtil.assertSuccess(result); assertEquals("Wrong costCenter", "X000", userJackType.getCostCenter()); assertEquals("Wrong employee number", jackEmployeeNumber, userJackType.getEmployeeNumber()); assertEquals("Wrong telephone number", "1 222 3456789", userJackType.getTelephoneNumber()); assertNull("Unexpected title: "+userJackType.getTitle(), userJackType.getTitle()); // IntegrationTestTools.assertNoExtensionProperty(userJack, PIRACY_COLORS); } @Test public void test159ModifyJackDeleteOrganizationalUnitFD002() throws Exception { final String TEST_NAME = "test159ModifyJackDeleteOrganizationalUnitFD002"; TestUtil.displayTestTile(this, TEST_NAME); // GIVEN Task task = taskManager.createTaskInstance(TestUserTemplate.class.getName() + "." + TEST_NAME); OperationResult result = task.getResult(); // WHEN modifyUserDelete(USER_JACK_OID, UserType.F_ORGANIZATIONAL_UNIT, task, result, PrismTestUtil.createPolyString("FD002")); // THEN PrismObject<UserType> userJack = modelService.getObject(UserType.class, USER_JACK_OID, null, task, result); display("User after", userJack); PrismAsserts.assertPropertyValue(userJack, UserType.F_DESCRIPTION, "Where's the rum?"); assertAssignedAccount(userJack, RESOURCE_DUMMY_BLUE_OID); assertNotAssignedRole(userJack, ROLE_PIRATE_OID); assertAssignedOrg(userJack, ORG_MINISTRY_OF_RUM_OID); assertHasOrg(userJack, ORG_MINISTRY_OF_RUM_OID); assertOnDemandOrgAssigned("FD001", userJack); assertOnDemandOrgAssigned("FD003", userJack); assertAssignments(userJack, 4); assertOnDemandOrgExists("FD002"); UserType userJackType = userJack.asObjectable(); assertEquals("Unexpected number of accountRefs", 1, userJackType.getLinkRef().size()); result.computeStatus(); TestUtil.assertSuccess(result); assertEquals("Wrong costCenter", "X000", userJackType.getCostCenter()); assertEquals("Wrong employee number", jackEmployeeNumber, userJackType.getEmployeeNumber()); assertEquals("Wrong telephone number", "1 222 3456789", userJackType.getTelephoneNumber()); assertNull("Unexpected title: "+userJackType.getTitle(), userJackType.getTitle()); // IntegrationTestTools.assertNoExtensionProperty(userJack, PIRACY_COLORS); } @Test public void test160ModifyUserGivenNameAgain() throws Exception { TestUtil.displayTestTile(this, "test160ModifyUserGivenNameAgain"); // GIVEN Task task = taskManager.createTaskInstance(TestUserTemplate.class.getName() + ".test160ModifyUserGivenNameAgain"); OperationResult result = task.getResult(); dummyAuditService.clear(); Collection<ObjectDelta<? extends ObjectType>> deltas = new ArrayList<ObjectDelta<? extends ObjectType>>(); ObjectDelta<UserType> userDelta = ObjectDelta.createModificationReplaceProperty(UserType.class, USER_JACK_OID, UserType.F_GIVEN_NAME, prismContext, new PolyString("JACKIE")); deltas.add(userDelta); // WHEN modelService.executeChanges(deltas, null, task, result); // THEN PrismObject<UserType> userJack = modelService.getObject(UserType.class, USER_JACK_OID, null, task, result); result.computeStatus(); TestUtil.assertSuccess(result); PrismAsserts.assertPropertyValue(userJack.findContainer(UserType.F_EXTENSION), PIRACY_BAD_LUCK, 123L); display("Audit", dummyAuditService); dummyAuditService.assertRecords(2); dummyAuditService.assertSimpleRecordSanity(); dummyAuditService.assertAnyRequestDeltas(); dummyAuditService.assertExecutionDeltas(2); dummyAuditService.assertHasDelta(ChangeType.MODIFY, UserType.class); dummyAuditService.assertTarget(USER_JACK_OID); dummyAuditService.assertExecutionSuccess(); ObjectDeltaOperation<?> objectDeltaOperation = dummyAuditService.getExecutionDelta(0, ChangeType.MODIFY, UserType.class); assertEquals("unexpected number of modifications in audited delta", 4, objectDeltaOperation.getObjectDelta().getModifications().size()); // givenName + badLuck + modifyTimestamp PropertyDelta badLuckDelta = objectDeltaOperation.getObjectDelta().findPropertyDelta(new ItemPath(UserType.F_EXTENSION, PIRACY_BAD_LUCK)); assertNotNull("badLuck delta was not found", badLuckDelta); List<PrismValue> oldValues = (List<PrismValue>) badLuckDelta.getEstimatedOldValues(); assertNotNull("badLuck delta has null estimatedOldValues field", oldValues); PrismAsserts.assertEqualsCollectionUnordered("badLuck delta has wrong estimatedOldValues", oldValues, new PrismPropertyValue<Long>(123L), new PrismPropertyValue<Long>(456L)); } @Test public void test162ModifyUserGivenNameAgainPhantomChange() throws Exception { final String TEST_NAME = "test162ModifyUserGivenNameAgainPhantomChange"; TestUtil.displayTestTile(this, TEST_NAME); // GIVEN Task task = taskManager.createTaskInstance(TestUserTemplate.class.getName() + "." + TEST_NAME); OperationResult result = task.getResult(); PrismObject<UserType> userBefore = modelService.getObject(UserType.class, USER_JACK_OID, null, task, result); display("User before", userBefore); dummyAuditService.clear(); Collection<ObjectDelta<? extends ObjectType>> deltas = new ArrayList<ObjectDelta<? extends ObjectType>>(); ObjectDelta<UserType> userDelta = ObjectDelta.createModificationReplaceProperty(UserType.class, USER_JACK_OID, UserType.F_GIVEN_NAME, prismContext, new PolyString("JACKIE")); // this is a phantom change deltas.add(userDelta); // WHEN TestUtil.displayWhen(TEST_NAME); modelService.executeChanges(deltas, null, task, result); // THEN TestUtil.displayThen(TEST_NAME); result.computeStatus(); TestUtil.assertSuccess(result); PrismObject<UserType> userJack = modelService.getObject(UserType.class, USER_JACK_OID, null, task, result); display("User after", userJack); PrismAsserts.assertPropertyValue(userJack.findContainer(UserType.F_EXTENSION), PIRACY_BAD_LUCK, 123L); display("Audit", dummyAuditService); dummyAuditService.assertRecords(2); dummyAuditService.assertSimpleRecordSanity(); dummyAuditService.assertAnyRequestDeltas(); dummyAuditService.assertExecutionDeltas(1); dummyAuditService.assertHasDelta(ChangeType.MODIFY, UserType.class); dummyAuditService.assertTarget(USER_JACK_OID); dummyAuditService.assertExecutionSuccess(); ObjectDeltaOperation<?> objectDeltaOperation = dummyAuditService.getExecutionDelta(0); assertEquals("unexpected number of modifications in audited delta", 2, objectDeltaOperation.getObjectDelta().getModifications().size()); // givenName + modifyTimestamp } @Test public void test165ModifyUserGivenNameAgainAgain() throws Exception { final String TEST_NAME = "test165ModifyUserGivenNameAgainAgain"; TestUtil.displayTestTile(this, TEST_NAME); // GIVEN Task task = taskManager.createTaskInstance(TestUserTemplate.class.getName() + "." + TEST_NAME); OperationResult result = task.getResult(); PrismObject<UserType> userBefore = modelService.getObject(UserType.class, USER_JACK_OID, null, task, result); display("User before", userBefore); Collection<ObjectDelta<? extends ObjectType>> deltas = new ArrayList<ObjectDelta<? extends ObjectType>>(); ObjectDelta<UserType> userDelta = ObjectDelta.createModificationReplaceProperty(UserType.class, USER_JACK_OID, UserType.F_GIVEN_NAME, prismContext, new PolyString("jackie")); deltas.add(userDelta); // WHEN modelService.executeChanges(deltas, null, task, result); // THEN PrismObject<UserType> userJack = modelService.getObject(UserType.class, USER_JACK_OID, null, task, result); display("User after", userJack); result.computeStatus(); TestUtil.assertSuccess(result); // all the values should be gone now, because the corresponding item in user template is marked as non-tolerant PrismAsserts.assertNoItem(userJack, new ItemPath(UserType.F_EXTENSION, PIRACY_BAD_LUCK)); } private PrismObject<OrgType> assertOnDemandOrgExists(String orgName) throws SchemaException, ObjectNotFoundException, SecurityViolationException, CommunicationException, ConfigurationException { PrismObject<OrgType> org = findObjectByName(OrgType.class, orgName); assertNotNull("The org "+orgName+" is missing!", org); display("Org "+orgName, org); PrismAsserts.assertPropertyValue(org, OrgType.F_NAME, PrismTestUtil.createPolyString(orgName)); return org; } private void assertOnDemandOrgAssigned(String orgName, PrismObject<UserType> user) throws SchemaException, ObjectNotFoundException, SecurityViolationException, CommunicationException, ConfigurationException { PrismObject<OrgType> org = assertOnDemandOrgExists(orgName); PrismAsserts.assertPropertyValue(org, OrgType.F_DESCRIPTION, "Created on demand from user "+user.asObjectable().getName()); assertAssignedOrg(user, org.getOid()); assertHasOrg(user, org.getOid()); } /** * Setting employee type to THIEF is just one part of the condition to assign * the Thief role. The role should not be assigned now. */ @Test public void test170ModifyUserGuybrushEmployeeTypeThief() throws Exception { final String TEST_NAME = "test170ModifyUserGuybrushEmployeeTypeThief"; TestUtil.displayTestTile(this, TEST_NAME); // GIVEN Task task = taskManager.createTaskInstance(TestUserTemplate.class.getName() + "." + TEST_NAME); OperationResult result = task.getResult(); PrismObject<UserType> userBefore = getUser(USER_GUYBRUSH_OID); display("User before", userBefore); assertAssignedNoRole(userBefore); // WHEN TestUtil.displayWhen(TEST_NAME); modifyUserReplace(USER_GUYBRUSH_OID, UserType.F_EMPLOYEE_TYPE, task, result, "THIEF"); // THEN TestUtil.displayThen(TEST_NAME); result.computeStatus(); TestUtil.assertSuccess(result); PrismObject<UserType> userAfter = modelService.getObject(UserType.class, USER_GUYBRUSH_OID, null, task, result); display("User after", userAfter); assertAssignedNoRole(userAfter); } /** * Setting honorificPrefix satisfies the condition to assign * the Thief role. */ @Test public void test172ModifyUserGuybrushHonorificPrefix() throws Exception { final String TEST_NAME = "test172ModifyUserGuybrushHonorificPrefix"; TestUtil.displayTestTile(this, TEST_NAME); // GIVEN Task task = taskManager.createTaskInstance(TestUserTemplate.class.getName() + "." + TEST_NAME); OperationResult result = task.getResult(); PrismObject<UserType> userBefore = getUser(USER_GUYBRUSH_OID); display("User before", userBefore); assertAssignedNoRole(userBefore); // WHEN TestUtil.displayWhen(TEST_NAME); modifyUserReplace(USER_GUYBRUSH_OID, UserType.F_HONORIFIC_PREFIX, task, result, PrismTestUtil.createPolyString("Thf.")); // THEN TestUtil.displayThen(TEST_NAME); result.computeStatus(); TestUtil.assertSuccess(result); PrismObject<UserType> userAfter = modelService.getObject(UserType.class, USER_GUYBRUSH_OID, null, task, result); display("User after", userAfter); assertAssignedRole(userAfter, ROLE_THIEF_OID); } /** * Removing honorificPrefix should make the condition false again, which should cause * that Thief role is unassigned. */ @Test public void test174ModifyUserGuybrushHonorificPrefixNone() throws Exception { final String TEST_NAME = "test174ModifyUserGuybrushHonorificPrefixNone"; TestUtil.displayTestTile(this, TEST_NAME); // GIVEN Task task = taskManager.createTaskInstance(TestUserTemplate.class.getName() + "." + TEST_NAME); OperationResult result = task.getResult(); PrismObject<UserType> userBefore = getUser(USER_GUYBRUSH_OID); display("User before", userBefore); assertAssignedRole(userBefore, ROLE_THIEF_OID); // WHEN TestUtil.displayWhen(TEST_NAME); modifyUserReplace(USER_GUYBRUSH_OID, UserType.F_HONORIFIC_PREFIX, task, result); // THEN TestUtil.displayThen(TEST_NAME); result.computeStatus(); TestUtil.assertSuccess(result); PrismObject<UserType> userAfter = modelService.getObject(UserType.class, USER_GUYBRUSH_OID, null, task, result); display("User after", userAfter); assertAssignedNoRole(userAfter); } /** * Setting employee type to marooned. This should cause switch to different user template. */ @Test public void test180ModifyUserGuybrushEmployeeTypeMarooned() throws Exception { final String TEST_NAME = "test180ModifyUserGuybrushEmployeeTypeMarooned"; TestUtil.displayTestTile(this, TEST_NAME); // GIVEN Task task = taskManager.createTaskInstance(TestUserTemplate.class.getName() + "." + TEST_NAME); OperationResult result = task.getResult(); PrismObject<UserType> userBefore = getUser(USER_GUYBRUSH_OID); display("User before", userBefore); assertAssignedNoRole(userBefore); // WHEN TestUtil.displayWhen(TEST_NAME); modifyUserReplace(USER_GUYBRUSH_OID, UserType.F_EMPLOYEE_TYPE, task, result, EMPLOYEE_TYPE_MAROONED); // THEN TestUtil.displayThen(TEST_NAME); result.computeStatus(); TestUtil.assertSuccess(result); PrismObject<UserType> userAfter = modelService.getObject(UserType.class, USER_GUYBRUSH_OID, null, task, result); display("User after", userAfter); assertEquals("Wrong costCenter", "NOCOST", userAfter.asObjectable().getCostCenter()); assertAssignedNoRole(userAfter); } @Test public void test189ModifyUserGuybrushEmployeeTypeNone() throws Exception { final String TEST_NAME = "test189ModifyUserGuybrushEmployeeTypeNone"; TestUtil.displayTestTile(this, TEST_NAME); // GIVEN Task task = taskManager.createTaskInstance(TestUserTemplate.class.getName() + "." + TEST_NAME); OperationResult result = task.getResult(); PrismObject<UserType> userBefore = getUser(USER_GUYBRUSH_OID); display("User before", userBefore); assertAssignedNoRole(userBefore); // WHEN TestUtil.displayWhen(TEST_NAME); modifyUserReplace(USER_GUYBRUSH_OID, UserType.F_EMPLOYEE_TYPE, task, result); // THEN TestUtil.displayThen(TEST_NAME); result.computeStatus(); TestUtil.assertSuccess(result); PrismObject<UserType> userAfter = modelService.getObject(UserType.class, USER_GUYBRUSH_OID, null, task, result); display("User after", userAfter); assertEquals("Wrong costCenter", "NOCOST", userAfter.asObjectable().getCostCenter()); assertAssignedNoRole(userAfter); } /** * Assignment mapping with domain. Control: nothing should happen. * MID-3692 */ @Test public void test190ModifyUserGuybrushOrganizationWhateveric() throws Exception { final String TEST_NAME = "test190ModifyUserGuybrushOrganizationWhateveric"; TestUtil.displayTestTile(this, TEST_NAME); // GIVEN Task task = taskManager.createTaskInstance(TestUserTemplate.class.getName() + "." + TEST_NAME); OperationResult result = task.getResult(); PrismObject<UserType> userBefore = getUser(USER_GUYBRUSH_OID); display("User before", userBefore); assertAssignedNoRole(userBefore); assertAssignments(userBefore, 1); // WHEN TestUtil.displayWhen(TEST_NAME); modifyUserReplace(USER_GUYBRUSH_OID, UserType.F_ORGANIZATION, task, result, createPolyString("Whateveric")); // THEN TestUtil.displayThen(TEST_NAME); result.computeStatus(); TestUtil.assertSuccess(result); PrismObject<UserType> userAfter = modelService.getObject(UserType.class, USER_GUYBRUSH_OID, null, task, result); display("User after", userAfter); PrismAsserts.assertPropertyValue(userAfter, UserType.F_ORGANIZATION, createPolyString("Whateveric")); assertAssignedNoRole(userAfter); assertAssignments(userAfter, 1); } /** * MID-3692 */ @Test public void test191ModifyUserGuybrushOrganizationAutomatic() throws Exception { final String TEST_NAME = "test191ModifyUserGuybrushOrganizationAutomatic"; TestUtil.displayTestTile(this, TEST_NAME); // GIVEN Task task = taskManager.createTaskInstance(TestUserTemplate.class.getName() + "." + TEST_NAME); OperationResult result = task.getResult(); PrismObject<UserType> userBefore = getUser(USER_GUYBRUSH_OID); display("User before", userBefore); assertAssignedNoRole(userBefore); // WHEN TestUtil.displayWhen(TEST_NAME); modifyUserAdd(USER_GUYBRUSH_OID, UserType.F_ORGANIZATION, task, result, createPolyString("AUTO-matic")); // THEN TestUtil.displayThen(TEST_NAME); result.computeStatus(); TestUtil.assertSuccess(result); PrismObject<UserType> userAfter = modelService.getObject(UserType.class, USER_GUYBRUSH_OID, null, task, result); display("User after", userAfter); PrismAsserts.assertPropertyValue(userAfter, UserType.F_ORGANIZATION, createPolyString("Whateveric"), createPolyString("AUTO-matic")); assertAssignedRole(userAfter, ROLE_AUTOMATIC_OID); assertAssignments(userAfter, 2); assertRoles(NUMBER_OF_ROLES); } /** * MID-3692 */ @Test public void test192ModifyUserGuybrushOrganizationAddMixed() throws Exception { final String TEST_NAME = "test192ModifyUserGuybrushOrganizationAddMixed"; TestUtil.displayTestTile(this, TEST_NAME); // GIVEN Task task = taskManager.createTaskInstance(TestUserTemplate.class.getName() + "." + TEST_NAME); OperationResult result = task.getResult(); PrismObject<UserType> userBefore = getUser(USER_GUYBRUSH_OID); display("User before", userBefore); assertAssignments(userBefore, 2); // WHEN TestUtil.displayWhen(TEST_NAME); modifyUserAdd(USER_GUYBRUSH_OID, UserType.F_ORGANIZATION, task, result, createPolyString("DEMO-cratic"), createPolyString("AUTO-cratic"), createPolyString("plutocratic"), createPolyString("AUTO-didactic") ); // THEN TestUtil.displayThen(TEST_NAME); result.computeStatus(); TestUtil.assertSuccess(result); PrismObject<UserType> userAfter = modelService.getObject(UserType.class, USER_GUYBRUSH_OID, null, task, result); display("User after", userAfter); PrismAsserts.assertPropertyValue(userAfter, UserType.F_ORGANIZATION, createPolyString("Whateveric"), createPolyString("AUTO-matic"), createPolyString("DEMO-cratic"), createPolyString("AUTO-cratic"), createPolyString("plutocratic"), createPolyString("AUTO-didactic") ); assertAssignedRole(userAfter, ROLE_AUTOMATIC_OID); assertAssignedRole(userAfter, ROLE_AUTOCRATIC_OID); assertAssignedRole(userAfter, ROLE_AUTODIDACTIC_OID); assertAssignments(userAfter, 4); // Make sure nothing was created on demand assertRoles(NUMBER_OF_ROLES); } /** * MID-3692 */ @Test public void test193ModifyUserGuybrushOrganizationAddOutOfDomain() throws Exception { final String TEST_NAME = "test193ModifyUserGuybrushOrganizationAddOutOfDomain"; TestUtil.displayTestTile(this, TEST_NAME); // GIVEN Task task = taskManager.createTaskInstance(TestUserTemplate.class.getName() + "." + TEST_NAME); OperationResult result = task.getResult(); PrismObject<UserType> userBefore = getUser(USER_GUYBRUSH_OID); display("User before", userBefore); assertAssignments(userBefore, 4); // WHEN TestUtil.displayWhen(TEST_NAME); modifyUserAdd(USER_GUYBRUSH_OID, UserType.F_ORGANIZATION, task, result, createPolyString("meritocratic"), createPolyString("piratocratic") ); // THEN TestUtil.displayThen(TEST_NAME); result.computeStatus(); TestUtil.assertSuccess(result); PrismObject<UserType> userAfter = modelService.getObject(UserType.class, USER_GUYBRUSH_OID, null, task, result); display("User after", userAfter); PrismAsserts.assertPropertyValue(userAfter, UserType.F_ORGANIZATION, createPolyString("Whateveric"), createPolyString("AUTO-matic"), createPolyString("DEMO-cratic"), createPolyString("AUTO-cratic"), createPolyString("plutocratic"), createPolyString("AUTO-didactic"), createPolyString("meritocratic"), createPolyString("piratocratic") ); assertAssignedRole(userAfter, ROLE_AUTOMATIC_OID); assertAssignedRole(userAfter, ROLE_AUTOCRATIC_OID); assertAssignedRole(userAfter, ROLE_AUTODIDACTIC_OID); assertAssignments(userAfter, 4); // Make sure nothing was created on demand assertRoles(NUMBER_OF_ROLES); } /** * MID-3692 */ @Test public void test194ModifyUserGuybrushOrganizationDeleteMixed() throws Exception { final String TEST_NAME = "test194ModifyUserGuybrushOrganizationDeleteMixed"; TestUtil.displayTestTile(this, TEST_NAME); // GIVEN Task task = taskManager.createTaskInstance(TestUserTemplate.class.getName() + "." + TEST_NAME); OperationResult result = task.getResult(); PrismObject<UserType> userBefore = getUser(USER_GUYBRUSH_OID); display("User before", userBefore); assertAssignments(userBefore, 4); // WHEN TestUtil.displayWhen(TEST_NAME); modifyUserDelete(USER_GUYBRUSH_OID, UserType.F_ORGANIZATION, task, result, createPolyString("AUTO-matic"), createPolyString("plutocratic"), createPolyString("meritocratic"), createPolyString("AUTO-didactic") ); // THEN TestUtil.displayThen(TEST_NAME); result.computeStatus(); TestUtil.assertSuccess(result); PrismObject<UserType> userAfter = modelService.getObject(UserType.class, USER_GUYBRUSH_OID, null, task, result); display("User after", userAfter); PrismAsserts.assertPropertyValue(userAfter, UserType.F_ORGANIZATION, createPolyString("Whateveric"), createPolyString("DEMO-cratic"), createPolyString("AUTO-cratic"), createPolyString("piratocratic") ); assertAssignedRole(userAfter, ROLE_AUTOCRATIC_OID); assertAssignments(userAfter, 2); // Make sure nothing was created on demand assertRoles(NUMBER_OF_ROLES); } /** * MID-3692 */ @Test public void test195ModifyUserGuybrushOrganizationDeleteOutOfDomain() throws Exception { final String TEST_NAME = "test195ModifyUserGuybrushOrganizationDeleteOutOfDomain"; TestUtil.displayTestTile(this, TEST_NAME); // GIVEN Task task = taskManager.createTaskInstance(TestUserTemplate.class.getName() + "." + TEST_NAME); OperationResult result = task.getResult(); PrismObject<UserType> userBefore = getUser(USER_GUYBRUSH_OID); display("User before", userBefore); assertAssignments(userBefore, 2); // WHEN TestUtil.displayWhen(TEST_NAME); modifyUserDelete(USER_GUYBRUSH_OID, UserType.F_ORGANIZATION, task, result, createPolyString("piratocratic"), createPolyString("DEMO-cratic") ); // THEN TestUtil.displayThen(TEST_NAME); result.computeStatus(); TestUtil.assertSuccess(result); PrismObject<UserType> userAfter = modelService.getObject(UserType.class, USER_GUYBRUSH_OID, null, task, result); display("User after", userAfter); PrismAsserts.assertPropertyValue(userAfter, UserType.F_ORGANIZATION, createPolyString("Whateveric"), createPolyString("AUTO-cratic") ); assertAssignedRole(userAfter, ROLE_AUTOCRATIC_OID); assertAssignments(userAfter, 2); // Make sure nothing was created on demand assertRoles(NUMBER_OF_ROLES); } /** * Make sure that the manually assigned roles will not mess with the mapping. * MID-3692 */ @Test public void test196GuybrushAssignCaptain() throws Exception { final String TEST_NAME = "test196GuybrushAssignCaptain"; TestUtil.displayTestTile(this, TEST_NAME); // GIVEN Task task = taskManager.createTaskInstance(TestUserTemplate.class.getName() + "." + TEST_NAME); OperationResult result = task.getResult(); PrismObject<UserType> userBefore = getUser(USER_GUYBRUSH_OID); display("User before", userBefore); assertAssignments(userBefore, 2); // WHEN TestUtil.displayWhen(TEST_NAME); assignRole(USER_GUYBRUSH_OID, ROLE_CAPTAIN_OID, task, result); // THEN TestUtil.displayThen(TEST_NAME); result.computeStatus(); TestUtil.assertSuccess(result); PrismObject<UserType> userAfter = modelService.getObject(UserType.class, USER_GUYBRUSH_OID, null, task, result); display("User after", userAfter); PrismAsserts.assertPropertyValue(userAfter, UserType.F_ORGANIZATION, createPolyString("Whateveric"), createPolyString("AUTO-cratic") ); assertAssignedRole(userAfter, ROLE_AUTOCRATIC_OID); assertAssignedRole(userAfter, ROLE_CAPTAIN_OID); assertAssignments(userAfter, 3); // Make sure nothing was created on demand assertRoles(NUMBER_OF_ROLES); } /** * Make sure that a role automatically assigned by a different mapping will not mess with this mapping. * MID-3692 */ @Test public void test197ModifyGuybrushEmployeeTypePirate() throws Exception { final String TEST_NAME = "test197ModifyGuybrushEmployeeTypePirate"; TestUtil.displayTestTile(this, TEST_NAME); // GIVEN Task task = taskManager.createTaskInstance(TestUserTemplate.class.getName() + "." + TEST_NAME); OperationResult result = task.getResult(); // WHEN TestUtil.displayWhen(TEST_NAME); modifyUserReplace(USER_GUYBRUSH_OID, UserType.F_EMPLOYEE_TYPE, task, result, "PIRATE"); // THEN TestUtil.displayThen(TEST_NAME); result.computeStatus(); TestUtil.assertSuccess(result); PrismObject<UserType> userAfter = modelService.getObject(UserType.class, USER_GUYBRUSH_OID, null, task, result); display("User after", userAfter); PrismAsserts.assertPropertyValue(userAfter, UserType.F_ORGANIZATION, createPolyString("Whateveric"), createPolyString("AUTO-cratic") ); assertAssignedRole(userAfter, ROLE_AUTOCRATIC_OID); assertAssignedRole(userAfter, ROLE_CAPTAIN_OID); assertAssignedRole(userAfter, ROLE_PIRATE_OID); assertAssignments(userAfter, 4); // Make sure nothing was created on demand assertRoles(NUMBER_OF_ROLES); } /** * Make sure that changes in this mapping will not influence other assigned roles. * MID-3692 */ @Test public void test198AModifyUserGuybrushOrganizationAddInDomain() throws Exception { final String TEST_NAME = "test198AModifyUserGuybrushOrganizationAddInDomain"; TestUtil.displayTestTile(this, TEST_NAME); // GIVEN Task task = taskManager.createTaskInstance(TestUserTemplate.class.getName() + "." + TEST_NAME); OperationResult result = task.getResult(); PrismObject<UserType> userBefore = getUser(USER_GUYBRUSH_OID); display("User before", userBefore); assertAssignments(userBefore, 4); // WHEN TestUtil.displayWhen(TEST_NAME); modifyUserAdd(USER_GUYBRUSH_OID, UserType.F_ORGANIZATION, task, result, createPolyString("AUTO-graphic"), createPolyString("AUTO-matic") ); // THEN TestUtil.displayThen(TEST_NAME); result.computeStatus(); TestUtil.assertSuccess(result); PrismObject<UserType> userAfter = modelService.getObject(UserType.class, USER_GUYBRUSH_OID, null, task, result); display("User after", userAfter); PrismAsserts.assertPropertyValue(userAfter, UserType.F_ORGANIZATION, createPolyString("Whateveric"), createPolyString("AUTO-cratic"), createPolyString("AUTO-graphic"), createPolyString("AUTO-matic") ); assertAssignedRole(userAfter, ROLE_AUTOMATIC_OID); assertAssignedRole(userAfter, ROLE_AUTOCRATIC_OID); assertAssignedRole(userAfter, ROLE_AUTOGRAPHIC_OID); assertAssignedRole(userAfter, ROLE_CAPTAIN_OID); assertAssignedRole(userAfter, ROLE_PIRATE_OID); assertAssignments(userAfter, 6); // Make sure nothing was created on demand assertRoles(NUMBER_OF_ROLES); } /** * Make sure that changes in this mapping will not influence other assigned roles. * MID-3692 */ @Test public void test198BModifyUserGuybrushOrganizationDeleteMixed() throws Exception { final String TEST_NAME = "test198BModifyUserGuybrushOrganizationDeleteMixed"; TestUtil.displayTestTile(this, TEST_NAME); // GIVEN Task task = taskManager.createTaskInstance(TestUserTemplate.class.getName() + "." + TEST_NAME); OperationResult result = task.getResult(); PrismObject<UserType> userBefore = getUser(USER_GUYBRUSH_OID); display("User before", userBefore); assertAssignments(userBefore, 6); // WHEN TestUtil.displayWhen(TEST_NAME); modifyUserDelete(USER_GUYBRUSH_OID, UserType.F_ORGANIZATION, task, result, createPolyString("AUTO-cratic"), createPolyString("Whateveric") ); // THEN TestUtil.displayThen(TEST_NAME); result.computeStatus(); TestUtil.assertSuccess(result); PrismObject<UserType> userAfter = modelService.getObject(UserType.class, USER_GUYBRUSH_OID, null, task, result); display("User after", userAfter); PrismAsserts.assertPropertyValue(userAfter, UserType.F_ORGANIZATION, createPolyString("AUTO-graphic"), createPolyString("AUTO-matic") ); assertAssignedRole(userAfter, ROLE_AUTOMATIC_OID); assertAssignedRole(userAfter, ROLE_AUTOGRAPHIC_OID); assertAssignedRole(userAfter, ROLE_CAPTAIN_OID); assertAssignedRole(userAfter, ROLE_PIRATE_OID); assertAssignments(userAfter, 5); // Make sure nothing was created on demand assertRoles(NUMBER_OF_ROLES); } /** * MID-3692 */ @Test public void test199AGuyBrushModifyEmployeeTypeWannabe() throws Exception { final String TEST_NAME = "test199AGuyBrushModifyEmployeeTypeWannabe"; TestUtil.displayTestTile(this, TEST_NAME); // GIVEN Task task = taskManager.createTaskInstance(TestUserTemplate.class.getName() + "." + TEST_NAME); OperationResult result = task.getResult(); PrismObject<UserType> userBefore = getUser(USER_GUYBRUSH_OID); display("User before", userBefore); assertAssignments(userBefore, 5); // WHEN TestUtil.displayWhen(TEST_NAME); modifyUserReplace(USER_GUYBRUSH_OID, UserType.F_EMPLOYEE_TYPE, task, result, "wannabe"); // THEN TestUtil.displayThen(TEST_NAME); result.computeStatus(); TestUtil.assertSuccess(result); PrismObject<UserType> userAfter = modelService.getObject(UserType.class, USER_GUYBRUSH_OID, null, task, result); display("User after", userAfter); PrismAsserts.assertPropertyValue(userAfter, UserType.F_ORGANIZATION, createPolyString("AUTO-graphic"), createPolyString("AUTO-matic") ); assertAssignedRole(userAfter, ROLE_AUTOMATIC_OID); assertAssignedRole(userAfter, ROLE_AUTOGRAPHIC_OID); assertAssignedRole(userAfter, ROLE_CAPTAIN_OID); assertAssignments(userAfter, 4); // Make sure nothing was created on demand assertRoles(NUMBER_OF_ROLES); } /** * MID-3692 */ @Test public void test199BGuyBrushUnassignCaptain() throws Exception { final String TEST_NAME = "test199BGuyBrushUnassignCaptain"; TestUtil.displayTestTile(this, TEST_NAME); // GIVEN Task task = taskManager.createTaskInstance(TestUserTemplate.class.getName() + "." + TEST_NAME); OperationResult result = task.getResult(); PrismObject<UserType> userBefore = getUser(USER_GUYBRUSH_OID); display("User before", userBefore); assertAssignments(userBefore, 4); // WHEN TestUtil.displayWhen(TEST_NAME); unassignRole(USER_GUYBRUSH_OID, ROLE_CAPTAIN_OID, task, result); // THEN TestUtil.displayThen(TEST_NAME); result.computeStatus(); TestUtil.assertSuccess(result); PrismObject<UserType> userAfter = modelService.getObject(UserType.class, USER_GUYBRUSH_OID, null, task, result); display("User after", userAfter); PrismAsserts.assertPropertyValue(userAfter, UserType.F_ORGANIZATION, createPolyString("AUTO-graphic"), createPolyString("AUTO-matic") ); assertAssignedRole(userAfter, ROLE_AUTOMATIC_OID); assertAssignedRole(userAfter, ROLE_AUTOGRAPHIC_OID); assertAssignments(userAfter, 3); // Make sure nothing was created on demand assertRoles(NUMBER_OF_ROLES); } /** * MID-3692, MID-3700 */ @Test public void test199CModifyUserGuybrushOrganizationCleanup() throws Exception { final String TEST_NAME = "test199CModifyUserGuybrushOrganizationCleanup"; TestUtil.displayTestTile(this, TEST_NAME); // GIVEN Task task = taskManager.createTaskInstance(TestUserTemplate.class.getName() + "." + TEST_NAME); OperationResult result = task.getResult(); PrismObject<UserType> userBefore = getUser(USER_GUYBRUSH_OID); display("User before", userBefore); // WHEN TestUtil.displayWhen(TEST_NAME); modifyUserReplace(USER_GUYBRUSH_OID, UserType.F_ORGANIZATION, task, result); // THEN TestUtil.displayThen(TEST_NAME); result.computeStatus(); TestUtil.assertSuccess(result); PrismObject<UserType> userAfter = modelService.getObject(UserType.class, USER_GUYBRUSH_OID, null, task, result); display("User after", userAfter); PrismAsserts.assertNoItem(userAfter, UserType.F_ORGANIZATION); assertAssignedNoRole(userAfter); assertRoles(NUMBER_OF_ROLES); } @Test public void test200AddUserRapp() throws Exception { final String TEST_NAME = "test200AddUserRapp"; TestUtil.displayTestTile(this, TEST_NAME); // GIVEN Task task = taskManager.createTaskInstance(TestUserTemplate.class.getName() + "." + TEST_NAME); OperationResult result = task.getResult(); PrismObject<UserType> user = PrismTestUtil.parseObject(USER_RAPP_FILE); Collection<ObjectDelta<? extends ObjectType>> deltas = new ArrayList<ObjectDelta<? extends ObjectType>>(); ObjectDelta<UserType> userDelta = ObjectDelta.createAddDelta(user); deltas.add(userDelta); // WHEN modelService.executeChanges(deltas, null, task, result); // THEN PrismObject<UserType> userAfter = modelService.getObject(UserType.class, USER_RAPP_OID, null, task, result); assertUser(userAfter, USER_RAPP_OID, "rapp", "Rapp Scallion", "Rapp", "Scallion"); PrismAsserts.assertNoItem(userAfter, UserType.F_DESCRIPTION); assertAssignedAccount(userAfter, RESOURCE_DUMMY_BLUE_OID); assertAssignedNoRole(userAfter); assertAssignments(userAfter, 1); UserType userAfterType = userAfter.asObjectable(); assertLinks(userAfter, 1); result.computeStatus(); TestUtil.assertSuccess(result); assertEquals("Unexpected value of employeeNumber, maybe it was generated and should not be?", "D3ADB33F", userAfterType.getEmployeeNumber()); assertEquals("Wrong costCenter", "G001", userAfterType.getCostCenter()); } @Test public void test201AddUserLargo() throws Exception { TestUtil.displayTestTile(this, "test201AddUserLargo"); // GIVEN Task task = taskManager.createTaskInstance(TestUserTemplate.class.getName() + ".test201AddUserLargo"); // This simulates IMPORT to trigger the channel-limited mapping task.setChannel(QNameUtil.qNameToUri(SchemaConstants.CHANGE_CHANNEL_IMPORT)); OperationResult result = task.getResult(); PrismObject<UserType> user = PrismTestUtil.parseObject(USER_LARGO_FILE); Collection<ObjectDelta<? extends ObjectType>> deltas = new ArrayList<ObjectDelta<? extends ObjectType>>(); ObjectDelta<UserType> userDelta = ObjectDelta.createAddDelta(user); deltas.add(userDelta); // WHEN modelService.executeChanges(deltas, null, task, result); // THEN PrismObject<UserType> userAfter = modelService.getObject(UserType.class, USER_LARGO_OID, null, task, result); display("Largo after", userAfter); assertUser(userAfter, USER_LARGO_OID, "largo", "Largo LaGrande", "Largo", "LaGrande"); // locality is null; the description comes from inbound mapping on dummy resource // PrismAsserts.assertPropertyValue(userAfter, UserType.F_DESCRIPTION, "Came from null"); // TODO TEMPORARILY allowing value of "Imported user", because the inbound mapping is not applied because of // the "locality" attribute is null (Skipping inbound for {...}location in Discr(RSD(account (default) // @10000000-0000-0000-0000-000000000004)): Not a full shadow and account a priori delta exists, but // doesn't have change for processed property. // // Either we fix this or recommend setting volatility=unpredictable for such situations. PrismAsserts.assertPropertyValue(userAfter, UserType.F_DESCRIPTION, "Imported user"); assertAssignedAccount(userAfter, RESOURCE_DUMMY_BLUE_OID); assertAssignedRole(userAfter, ROLE_PIRATE_OID); assertAssignments(userAfter, 2); UserType userAfterType = userAfter.asObjectable(); assertEquals("Unexpected number of accountRefs", 2, userAfterType.getLinkRef().size()); result.computeStatus(); TestUtil.assertSuccess(result); assertEquals("Unexpected length of employeeNumber, maybe it was not generated?", GenerateExpressionEvaluator.DEFAULT_LENGTH, userAfterType.getEmployeeNumber().length()); } @Test public void test202AddUserMonkey() throws Exception { TestUtil.displayTestTile(this, "test202AddUserMonkey"); // GIVEN Task task = taskManager.createTaskInstance(TestUserTemplate.class.getName() + ".test202AddUserMonkey"); OperationResult result = task.getResult(); PrismObject<UserType> user = PrismTestUtil.parseObject(new File(USER_THREE_HEADED_MONKEY_FILENAME)); Collection<ObjectDelta<? extends ObjectType>> deltas = new ArrayList<ObjectDelta<? extends ObjectType>>(); ObjectDelta<UserType> userDelta = ObjectDelta.createAddDelta(user); deltas.add(userDelta); // WHEN modelService.executeChanges(deltas, null, task, result); // THEN PrismObject<UserType> userAfter = modelService.getObject(UserType.class, USER_THREE_HEADED_MONKEY_OID, null, task, result); display("User after", userAfter); // assertUser(userAfter, USER_THREE_HEADED_MONKEY_OID, "monkey", " Monkey", null, "Monkey"); assertUser(userAfter, USER_THREE_HEADED_MONKEY_OID, "monkey", "Three-Headed Monkey", null, "Monkey"); PrismAsserts.assertNoItem(userAfter, UserType.F_DESCRIPTION); assertAssignedAccount(userAfter, RESOURCE_DUMMY_BLUE_OID); assertAssignedNoRole(userAfter); assertAssignments(userAfter, 1); UserType userAfterType = userAfter.asObjectable(); assertEquals("Unexpected number of accountRefs", 1, userAfterType.getLinkRef().size()); result.computeStatus(); TestUtil.assertSuccess(result); assertEquals("Unexpected length of employeeNumber, maybe it was not generated?", GenerateExpressionEvaluator.DEFAULT_LENGTH, userAfterType.getEmployeeNumber().length()); } /** * MID-3186 */ @Test public void test204AddUserHerman() throws Exception { final String TEST_NAME = "test204AddUserHerman"; TestUtil.displayTestTile(this, TEST_NAME); // GIVEN Task task = taskManager.createTaskInstance(TestUserTemplate.class.getName() + "." + TEST_NAME); OperationResult result = task.getResult(); PrismObject<UserType> user = PrismTestUtil.parseObject(USER_HERMAN_FILE); Collection<ObjectDelta<? extends ObjectType>> deltas = new ArrayList<ObjectDelta<? extends ObjectType>>(); ObjectDelta<UserType> userDelta = ObjectDelta.createAddDelta(user); deltas.add(userDelta); // WHEN modelService.executeChanges(deltas, null, task, result); // THEN PrismObject<UserType> userAfter = modelService.getObject(UserType.class, USER_HERMAN_OID, null, task, result); assertUser(userAfter, USER_HERMAN_OID, USER_HERMAN_USERNAME, USER_HERMAN_FULL_NAME, "Herman", "Toothrot"); PrismAsserts.assertNoItem(userAfter, UserType.F_DESCRIPTION); PrismAsserts.assertPropertyValue(userAfter, UserType.F_TIMEZONE, "High Seas/Monkey Island"); assertAssignedAccount(userAfter, RESOURCE_DUMMY_BLUE_OID); assertAssignedNoRole(userAfter); assertAssignments(userAfter, 1); UserType userAfterType = userAfter.asObjectable(); assertLinks(userAfter, 1); result.computeStatus(); TestUtil.assertSuccess(result); assertEquals("Wrong costCenter", "G001", userAfterType.getCostCenter()); } @Test public void test220AssignRoleSailorToUserRapp() throws Exception { final String TEST_NAME = "test220AssignRoleSailorToUserRapp"; TestUtil.displayTestTile(this, TEST_NAME); // GIVEN Task task = taskManager.createTaskInstance(TestUserTemplate.class.getName() + "." + TEST_NAME); OperationResult result = task.getResult(); // WHEN assignRole(USER_RAPP_OID, ROLE_SAILOR_OID, task, result); // THEN PrismObject<UserType> userAfter = modelService.getObject(UserType.class, USER_RAPP_OID, null, task, result); assertUser(userAfter, USER_RAPP_OID, "rapp", "Rapp Scallion", "Rapp", "Scallion"); PrismAsserts.assertNoItem(userAfter, UserType.F_DESCRIPTION); assertAssignedAccount(userAfter, RESOURCE_DUMMY_BLUE_OID); assertAssignedRole(userAfter, ROLE_SAILOR_OID); assertAssignments(userAfter, 2); UserType userAfterType = userAfter.asObjectable(); assertLinks(userAfter, 2); result.computeStatus(); TestUtil.assertSuccess(result); assertEquals("Unexpected value of employeeNumber", "D3ADB33F", userAfterType.getEmployeeNumber()); assertEquals("Wrong costCenter", "CC-TITANIC", userAfterType.getCostCenter()); } /** * MID-3028 */ @Test public void test229UnassignRoleSailorFromUserRapp() throws Exception { final String TEST_NAME = "test220AssignRoleSailorToUserRapp"; TestUtil.displayTestTile(this, TEST_NAME); // GIVEN Task task = taskManager.createTaskInstance(TestUserTemplate.class.getName() + "." + TEST_NAME); OperationResult result = task.getResult(); // WHEN unassignRole(USER_RAPP_OID, ROLE_SAILOR_OID, task, result); // THEN PrismObject<UserType> userAfter = modelService.getObject(UserType.class, USER_RAPP_OID, null, task, result); assertUser(userAfter, USER_RAPP_OID, "rapp", "Rapp Scallion", "Rapp", "Scallion"); PrismAsserts.assertNoItem(userAfter, UserType.F_DESCRIPTION); assertAssignedAccount(userAfter, RESOURCE_DUMMY_BLUE_OID); assertAssignedNoRole(userAfter); assertAssignments(userAfter, 1); UserType userAfterType = userAfter.asObjectable(); assertLinks(userAfter, 1); result.computeStatus(); TestUtil.assertSuccess(result); assertEquals("Unexpected value of employeeNumber", "D3ADB33F", userAfterType.getEmployeeNumber()); assertEquals("Wrong costCenter", "G001", userAfterType.getCostCenter()); } /** * Role Captains has focus mapping for the same costCenter as is given * by the user template. */ @Test public void test230AssignRoleCaptainToUserRapp() throws Exception { final String TEST_NAME = "test230AssignRoleCaptainToUserRapp"; TestUtil.displayTestTile(this, TEST_NAME); // GIVEN Task task = taskManager.createTaskInstance(TestUserTemplate.class.getName() + "." + TEST_NAME); OperationResult result = task.getResult(); // WHEN assignRole(USER_RAPP_OID, ROLE_CAPTAIN_OID, task, result); // THEN PrismObject<UserType> userAfter = modelService.getObject(UserType.class, USER_RAPP_OID, null, task, result); assertUser(userAfter, USER_RAPP_OID, "rapp", "Rapp Scallion", "Rapp", "Scallion"); assertAssignedAccount(userAfter, RESOURCE_DUMMY_BLUE_OID); assertAssignedRole(userAfter, ROLE_CAPTAIN_OID); assertAssignments(userAfter, 2); UserType userAfterType = userAfter.asObjectable(); assertLinks(userAfter, 1); result.computeStatus(); TestUtil.assertSuccess(result); assertEquals("Unexpected value of employeeNumber", "D3ADB33F", userAfterType.getEmployeeNumber()); assertEquals("Wrong costCenter", "G001", userAfterType.getCostCenter()); } /** * Object template mapping for cost center is weak, role mapping is normal. * Direct modification should override both. */ @Test public void test232ModifyUserRappCostCenter() throws Exception { final String TEST_NAME = "test232ModifyUserRappCostCenter"; TestUtil.displayTestTile(this, TEST_NAME); // GIVEN Task task = taskManager.createTaskInstance(TestUserTemplate.class.getName() + "." + TEST_NAME); OperationResult result = task.getResult(); // WHEN modifyUserReplace(USER_RAPP_OID, UserType.F_COST_CENTER, task, result, "CC-RAPP"); // THEN PrismObject<UserType> userAfter = modelService.getObject(UserType.class, USER_RAPP_OID, null, task, result); assertUser(userAfter, USER_RAPP_OID, "rapp", "Rapp Scallion", "Rapp", "Scallion"); assertAssignedAccount(userAfter, RESOURCE_DUMMY_BLUE_OID); assertAssignedRole(userAfter, ROLE_CAPTAIN_OID); assertAssignments(userAfter, 2); UserType userAfterType = userAfter.asObjectable(); assertLinks(userAfter, 1); result.computeStatus(); TestUtil.assertSuccess(result); assertEquals("Unexpected value of employeeNumber", "D3ADB33F", userAfterType.getEmployeeNumber()); assertEquals("Wrong costCenter", "CC-RAPP", userAfterType.getCostCenter()); } /** * Role Captains has focus mapping for the same costCenter as is given * by the user template. * MID-3028 */ @Test public void test239UnassignRoleCaptainFromUserRapp() throws Exception { final String TEST_NAME = "test239UnassignRoleCaptainFromUserRapp"; TestUtil.displayTestTile(this, TEST_NAME); // GIVEN Task task = taskManager.createTaskInstance(TestUserTemplate.class.getName() + "." + TEST_NAME); OperationResult result = task.getResult(); // WHEN unassignRole(USER_RAPP_OID, ROLE_CAPTAIN_OID, task, result); // THEN PrismObject<UserType> userAfter = modelService.getObject(UserType.class, USER_RAPP_OID, null, task, result); display("User after", userAfter); assertUser(userAfter, USER_RAPP_OID, "rapp", "Rapp Scallion", "Rapp", "Scallion"); assertAssignedAccount(userAfter, RESOURCE_DUMMY_BLUE_OID); assertAssignedNoRole(userAfter); assertAssignments(userAfter, 1); UserType userAfterType = userAfter.asObjectable(); assertLinks(userAfter, 1); result.computeStatus(); TestUtil.assertSuccess(result); assertEquals("Unexpected value of employeeNumber", "D3ADB33F", userAfterType.getEmployeeNumber()); assertEquals("Wrong costCenter", "CC-RAPP", userAfterType.getCostCenter()); } @Test public void test240ModifyUserRappLocalityScabb() throws Exception { final String TEST_NAME = "test240ModifyUserRappLocalityScabb"; TestUtil.displayTestTile(this, TEST_NAME); // GIVEN Task task = taskManager.createTaskInstance(TestUserTemplate.class.getName() + "." + TEST_NAME); OperationResult result = task.getResult(); PrismObject<UserType> userBefore = modelService.getObject(UserType.class, USER_RAPP_OID, null, task, result); display("User before", userBefore); assertEquals("Wrong timezone", "High Seas/null", userBefore.asObjectable().getTimezone()); assertEquals("Wrong locale", null, userBefore.asObjectable().getLocale()); // WHEN modifyUserReplace(USER_RAPP_OID, UserType.F_LOCALITY, task, result, PrismTestUtil.createPolyString("Scabb Island")); // THEN result.computeStatus(); TestUtil.assertSuccess(result); PrismObject<UserType> userAfter = modelService.getObject(UserType.class, USER_RAPP_OID, null, task, result); display("User after", userAfter); assertAssignedAccount(userAfter, RESOURCE_DUMMY_BLUE_OID); assertAssignedNoRole(userAfter); assertAssignments(userAfter, 1); UserType userAfterType = userAfter.asObjectable(); assertLinks(userAfter, 1); assertEquals("Wrong timezone", "High Seas/Scabb Island", userAfterType.getTimezone()); assertEquals("Wrong locale", "SC", userAfterType.getLocale()); assertEquals("Unexpected value of employeeNumber", "D3ADB33F", userAfterType.getEmployeeNumber()); assertEquals("Wrong costCenter", "CC-RAPP", userAfterType.getCostCenter()); } /** * Role Rastaman has focus mapping for the same timezone as is given * by the user template. This mapping is normal strength. Even though * it is evaluated after the template the mapping, role assignment is an * explicit delta and the mapping should be applied. * MID-3040 */ @Test public void test242AssignRoleRastamanToUserRapp() throws Exception { final String TEST_NAME = "test242AssignRoleRastamanToUserRapp"; TestUtil.displayTestTile(this, TEST_NAME); // GIVEN Task task = taskManager.createTaskInstance(TestUserTemplate.class.getName() + "." + TEST_NAME); OperationResult result = task.getResult(); // WHEN assignRole(USER_RAPP_OID, ROLE_RASTAMAN_OID, task, result); // THEN result.computeStatus(); TestUtil.assertSuccess(result); PrismObject<UserType> userAfter = modelService.getObject(UserType.class, USER_RAPP_OID, null, task, result); assertUser(userAfter, USER_RAPP_OID, "rapp", "Rapp Scallion", "Rapp", "Scallion"); assertAssignedAccount(userAfter, RESOURCE_DUMMY_BLUE_OID); assertAssignedRole(userAfter, ROLE_RASTAMAN_OID); assertAssignments(userAfter, 2); UserType userAfterType = userAfter.asObjectable(); assertLinks(userAfter, 1); assertEquals("Wrong timezone", "Caribbean/Whatever", userAfterType.getTimezone()); assertEquals("Wrong locale", "WE", userAfterType.getLocale()); assertEquals("Unexpected value of employeeNumber", "D3ADB33F", userAfterType.getEmployeeNumber()); assertEquals("Wrong costCenter", "CC-RAPP", userAfterType.getCostCenter()); } /** * Role Rastaman has focus mapping for the same timezone as is given * by the user template. This mapping is normal strength. It is evaluated * after the template the mapping, so it should not be applied because * there is already a-priori delta from the template. * MID-3040 */ @Test public void test244ModifyUserRappLocalityCoffin() throws Exception { final String TEST_NAME = "test244ModifyUserRappLocalityCoffin"; TestUtil.displayTestTile(this, TEST_NAME); // GIVEN Task task = taskManager.createTaskInstance(TestUserTemplate.class.getName() + "." + TEST_NAME); OperationResult result = task.getResult(); PrismObject<UserType> userBefore = modelService.getObject(UserType.class, USER_RAPP_OID, null, task, result); display("User before", userBefore); // WHEN modifyUserReplace(USER_RAPP_OID, UserType.F_LOCALITY, task, result, PrismTestUtil.createPolyString("Coffin")); // THEN result.computeStatus(); TestUtil.assertSuccess(result); PrismObject<UserType> userAfter = modelService.getObject(UserType.class, USER_RAPP_OID, null, task, result); display("User after", userAfter); assertAssignedAccount(userAfter, RESOURCE_DUMMY_BLUE_OID); assertAssignedRole(userAfter, ROLE_RASTAMAN_OID); assertAssignments(userAfter, 2); UserType userAfterType = userAfter.asObjectable(); assertLinks(userAfter, 1); assertEquals("Wrong timezone", "High Seas/Coffin", userAfterType.getTimezone()); assertEquals("Wrong locale", "WE", userAfterType.getLocale()); assertEquals("Unexpected value of employeeNumber", "D3ADB33F", userAfterType.getEmployeeNumber()); assertEquals("Wrong costCenter", "CC-RAPP", userAfterType.getCostCenter()); } /** * Similar to test244, but also use reconcile option. * MID-3040 */ @Test public void test245ModifyUserRappLocalityUnderReconcile() throws Exception { final String TEST_NAME = "test245ModifyUserRappLocalityUnderReconcile"; TestUtil.displayTestTile(this, TEST_NAME); // GIVEN Task task = taskManager.createTaskInstance(TestUserTemplate.class.getName() + "." + TEST_NAME); OperationResult result = task.getResult(); PrismObject<UserType> userBefore = modelService.getObject(UserType.class, USER_RAPP_OID, null, task, result); display("User before", userBefore); ObjectDelta<UserType> objectDelta = createModifyUserReplaceDelta(USER_RAPP_OID, new ItemPath(UserType.F_LOCALITY), PrismTestUtil.createPolyString("Six feet under")); Collection<ObjectDelta<? extends ObjectType>> deltas = MiscSchemaUtil.createCollection(objectDelta); ModelExecuteOptions options = ModelExecuteOptions.createReconcile(); // WHEN modelService.executeChanges(deltas, options, task, result); // THEN result.computeStatus(); TestUtil.assertSuccess(result); PrismObject<UserType> userAfter = modelService.getObject(UserType.class, USER_RAPP_OID, null, task, result); display("User after", userAfter); assertAssignedAccount(userAfter, RESOURCE_DUMMY_BLUE_OID); assertAssignedRole(userAfter, ROLE_RASTAMAN_OID); assertAssignments(userAfter, 2); UserType userAfterType = userAfter.asObjectable(); assertLinks(userAfter, 1); assertEquals("Wrong timezone", "High Seas/Six feet under", userAfterType.getTimezone()); assertEquals("Wrong locale", "WE", userAfterType.getLocale()); assertEquals("Unexpected value of employeeNumber", "D3ADB33F", userAfterType.getEmployeeNumber()); assertEquals("Wrong costCenter", "CC-RAPP", userAfterType.getCostCenter()); } /** * Changing timezone. timezone is a target of (normal) object template mapping and * (normal) role mapping. But as this is primary delta none of the mappings should * be applied. * MID-3040 */ @Test public void test246ModifyUserRappTimezoneMonkey() throws Exception { final String TEST_NAME = "test246ModifyUserRappTimezoneMonkey"; TestUtil.displayTestTile(this, TEST_NAME); // GIVEN Task task = taskManager.createTaskInstance(TestUserTemplate.class.getName() + "." + TEST_NAME); OperationResult result = task.getResult(); PrismObject<UserType> userBefore = modelService.getObject(UserType.class, USER_RAPP_OID, null, task, result); display("User before", userBefore); // WHEN modifyUserReplace(USER_RAPP_OID, UserType.F_TIMEZONE, task, result, "Monkey Island"); // THEN result.computeStatus(); TestUtil.assertSuccess(result); PrismObject<UserType> userAfter = modelService.getObject(UserType.class, USER_RAPP_OID, null, task, result); display("User after", userAfter); assertAssignedAccount(userAfter, RESOURCE_DUMMY_BLUE_OID); assertAssignedRole(userAfter, ROLE_RASTAMAN_OID); assertAssignments(userAfter, 2); UserType userAfterType = userAfter.asObjectable(); assertLinks(userAfter, 1); assertEquals("Wrong timezone", "Monkey Island", userAfterType.getTimezone()); assertEquals("Wrong locale", "WE", userAfterType.getLocale()); assertEquals("Unexpected value of employeeNumber", "D3ADB33F", userAfterType.getEmployeeNumber()); assertEquals("Wrong costCenter", "CC-RAPP", userAfterType.getCostCenter()); } /** * Changing locale. Locale is a target of (weak) object template mapping and * (normal) role mapping. But as this is primary delta none of the mappings should * be applied. * MID-3040 */ @Test public void test247ModifyUserRappLocaleMI() throws Exception { final String TEST_NAME = "test247ModifyUserRappLocaleMI"; TestUtil.displayTestTile(this, TEST_NAME); // GIVEN Task task = taskManager.createTaskInstance(TestUserTemplate.class.getName() + "." + TEST_NAME); OperationResult result = task.getResult(); PrismObject<UserType> userBefore = modelService.getObject(UserType.class, USER_RAPP_OID, null, task, result); display("User before", userBefore); // WHEN modifyUserReplace(USER_RAPP_OID, UserType.F_LOCALE, task, result, "MI"); // THEN result.computeStatus(); TestUtil.assertSuccess(result); PrismObject<UserType> userAfter = modelService.getObject(UserType.class, USER_RAPP_OID, null, task, result); display("User after", userAfter); assertAssignedAccount(userAfter, RESOURCE_DUMMY_BLUE_OID); assertAssignedRole(userAfter, ROLE_RASTAMAN_OID); assertAssignments(userAfter, 2); UserType userAfterType = userAfter.asObjectable(); assertLinks(userAfter, 1); // The normal mapping from the rastaman role was applied at this point // This is sourceless mapping and there is no a-priori delta assertEquals("Wrong timezone", "Caribbean/Whatever", userAfterType.getTimezone()); assertEquals("Wrong locale", "MI", userAfterType.getLocale()); assertEquals("Unexpected value of employeeNumber", "D3ADB33F", userAfterType.getEmployeeNumber()); assertEquals("Wrong costCenter", "CC-RAPP", userAfterType.getCostCenter()); } @Test public void test249UnassignRoleRastamanFromUserRapp() throws Exception { final String TEST_NAME = "test249UnassignRoleRastamanFromUserRapp"; TestUtil.displayTestTile(this, TEST_NAME); // GIVEN Task task = taskManager.createTaskInstance(TestUserTemplate.class.getName() + "." + TEST_NAME); OperationResult result = task.getResult(); // WHEN unassignRole(USER_RAPP_OID, ROLE_RASTAMAN_OID, task, result); // THEN result.computeStatus(); TestUtil.assertSuccess(result); PrismObject<UserType> userAfter = modelService.getObject(UserType.class, USER_RAPP_OID, null, task, result); assertUser(userAfter, USER_RAPP_OID, "rapp", "Rapp Scallion", "Rapp", "Scallion"); PrismAsserts.assertNoItem(userAfter, UserType.F_DESCRIPTION); assertAssignedAccount(userAfter, RESOURCE_DUMMY_BLUE_OID); assertAssignedNoRole(userAfter); assertAssignments(userAfter, 1); UserType userAfterType = userAfter.asObjectable(); assertLinks(userAfter, 1); // Role is unassigned. The mapping was authoritative, so it removed the value assertEquals("Wrong timezone", null, userAfterType.getTimezone()); assertEquals("Wrong locale", "MI", userAfterType.getLocale()); assertEquals("Unexpected value of employeeNumber", "D3ADB33F", userAfterType.getEmployeeNumber()); assertEquals("Wrong costCenter", "CC-RAPP", userAfterType.getCostCenter()); } /** * MID-3186 */ @Test public void test300ImportStanFromEmeraldResource() throws Exception { final String TEST_NAME = "test300ImportStanFromEmeraldResource"; TestUtil.displayTestTile(this, TEST_NAME); // GIVEN Task task = createTask(TestImportRecon.class.getName() + "." + TEST_NAME); OperationResult result = task.getResult(); assumeAssignmentPolicy(AssignmentPolicyEnforcementType.NONE); DummyAccount dummyAccountBefore = new DummyAccount(ACCOUNT_STAN_USERNAME); dummyAccountBefore.replaceAttributeValue(DummyResourceContoller.DUMMY_ACCOUNT_ATTRIBUTE_FULLNAME_NAME, ACCOUNT_STAN_FULLNAME); dummyAccountBefore.replaceAttributeValue(DummyResourceContoller.DUMMY_ACCOUNT_ATTRIBUTE_LOCATION_NAME, "Melee Island"); dummyResourceEmerald.addAccount(dummyAccountBefore); PrismObject<ShadowType> shadowBefore = findAccountByUsername(ACCOUNT_STAN_USERNAME, resourceDummyEmerald); display("Shadow before", shadowBefore); // WHEN TestUtil.displayWhen(TEST_NAME); modelService.importFromResource(shadowBefore.getOid(), task, result); // THEN TestUtil.displayThen(TEST_NAME); result.computeStatus(); display(result); TestUtil.assertSuccess(result); PrismObject<UserType> userAfter = findUserByUsername(ACCOUNT_STAN_USERNAME); display("User after", userAfter); assertNotNull("No stan user", userAfter); PrismAsserts.assertPropertyValue(userAfter, UserType.F_FULL_NAME, PrismTestUtil.createPolyString(ACCOUNT_STAN_FULLNAME)); PrismAsserts.assertPropertyValue(userAfter, UserType.F_LOCALITY, PrismTestUtil.createPolyString("Melee Island")); PrismAsserts.assertPropertyValue(userAfter, UserType.F_TIMEZONE, "High Seas/Melee Island"); } /** * Modify stan accoutn and reimport from the emerald resource. Make sure that * the normal mapping for locality in the object template is properly activated (as there is * an delta from inbound mapping in the emerald resource). * MID-3186 */ @Test public void test302ModifyStanAccountAndReimport() throws Exception { final String TEST_NAME = "test302ModifyStanAccountAndReimport"; TestUtil.displayTestTile(this, TEST_NAME); // GIVEN Task task = createTask(TestImportRecon.class.getName() + "." + TEST_NAME); OperationResult result = task.getResult(); assumeAssignmentPolicy(AssignmentPolicyEnforcementType.NONE); DummyAccount dummyAccountBefore = dummyResourceEmerald.getAccountByUsername(ACCOUNT_STAN_USERNAME); dummyAccountBefore.replaceAttributeValue(DummyResourceContoller.DUMMY_ACCOUNT_ATTRIBUTE_LOCATION_NAME, "Booty Island"); PrismObject<ShadowType> shadowBefore = findAccountByUsername(ACCOUNT_STAN_USERNAME, resourceDummyEmerald); display("Shadow before", shadowBefore); // WHEN TestUtil.displayWhen(TEST_NAME); modelService.importFromResource(shadowBefore.getOid(), task, result); // THEN TestUtil.displayThen(TEST_NAME); result.computeStatus(); display(result); TestUtil.assertSuccess(result); PrismObject<UserType> userAfter = findUserByUsername(ACCOUNT_STAN_USERNAME); display("User after", userAfter); assertNotNull("No stan user", userAfter); PrismAsserts.assertPropertyValue(userAfter, UserType.F_FULL_NAME, PrismTestUtil.createPolyString(ACCOUNT_STAN_FULLNAME)); PrismAsserts.assertPropertyValue(userAfter, UserType.F_LOCALITY, PrismTestUtil.createPolyString("Booty Island")); PrismAsserts.assertPropertyValue(userAfter, UserType.F_TIMEZONE, "High Seas/Booty Island"); } /** * Move the time to the future. See if the time-based mapping in user template is properly recomputed. */ @Test public void test800Kaboom() throws Exception { final String TEST_NAME = "test800Kaboom"; TestUtil.displayTestTile(this, TEST_NAME); // GIVEN Task task = taskManager.createTaskInstance(TestUserTemplate.class.getName() + "." + TEST_NAME); OperationResult result = task.getResult(); assumeAssignmentPolicy(AssignmentPolicyEnforcementType.RELATIVE); importObjectFromFile(TASK_TRIGGER_SCANNER_FILE); waitForTaskStart(TASK_TRIGGER_SCANNER_OID, false); XMLGregorianCalendar now = clock.currentTimeXMLGregorianCalendar(); now.add(XmlTypeConverter.createDuration("P1M1D")); clock.override(now); // WHEN waitForTaskNextRunAssertSuccess(TASK_TRIGGER_SCANNER_OID, true); // THEN PrismObject<UserType> userJack = modelService.getObject(UserType.class, USER_JACK_OID, null, task, result); PrismAsserts.assertPropertyValue(userJack, UserType.F_ADDITIONAL_NAME, PrismTestUtil.createPolyString("Kaboom!")); assertNoTrigger(userJack); } @Test public void test900DeleteUser() throws Exception { final String TEST_NAME = "test900DeleteUser"; TestUtil.displayTestTile(this, TEST_NAME); // GIVEN Task task = taskManager.createTaskInstance(TestUserTemplate.class.getName() + "." + TEST_NAME); OperationResult result = task.getResult(); assumeAssignmentPolicy(AssignmentPolicyEnforcementType.RELATIVE); Collection<ObjectDelta<? extends ObjectType>> deltas = new ArrayList<ObjectDelta<? extends ObjectType>>(); ObjectDelta<UserType> userDelta = ObjectDelta.createDeleteDelta(UserType.class, USER_JACK_OID, prismContext); deltas.add(userDelta); // WHEN modelService.executeChanges(deltas, null, task, result); // THEN try { PrismObject<UserType> userJack = modelService.getObject(UserType.class, USER_JACK_OID, null, task, result); display("User after", userJack); assert false : "User was not deleted: "+userJack; } catch (ObjectNotFoundException e) { // This is expected } // TODO: check on resource result.computeStatus(); TestUtil.assertFailure(result); } @Test public void test950CreateUserJackWithoutTemplate() throws Exception { final String TEST_NAME = "test950CreateUserJackWithoutTemplate"; TestUtil.displayTestTile(this, TEST_NAME); // GIVEN setDefaultUserTemplate(null); Task task = taskManager.createTaskInstance(TestUserTemplate.class.getName() + "." + TEST_NAME); OperationResult result = task.getResult(); assumeAssignmentPolicy(AssignmentPolicyEnforcementType.RELATIVE); // WHEN addObject(USER_JACK_FILE, task, result); // THEN result.computeStatus(); TestUtil.assertSuccess(result); PrismObject<UserType> userJack = modelService.getObject(UserType.class, USER_JACK_OID, null, task, result); display("User after", userJack); PrismAsserts.assertPropertyValue(userJack, UserType.F_DESCRIPTION, "Where's the rum?"); assertAssignments(userJack, 0); UserType userJackType = userJack.asObjectable(); assertEquals("Unexpected number of accountRefs", 0, userJackType.getLinkRef().size()); PrismAsserts.assertNoItem(userJack, UserType.F_ORGANIZATIONAL_UNIT); } /** * Would creates org on demand if the template would be active. But it is not. */ @Test public void test952ModifyJackOrganizationalUnitFD004() throws Exception { final String TEST_NAME = "test952ModifyJackOrganizationalUnitFD004"; TestUtil.displayTestTile(this, TEST_NAME); // GIVEN Task task = taskManager.createTaskInstance(TestUserTemplate.class.getName() + "." + TEST_NAME); OperationResult result = task.getResult(); // WHEN modifyUserAdd(USER_JACK_OID, UserType.F_ORGANIZATIONAL_UNIT, task, result, PrismTestUtil.createPolyString("FD004")); // THEN PrismObject<UserType> userJack = modelService.getObject(UserType.class, USER_JACK_OID, null, task, result); display("User after", userJack); PrismAsserts.assertPropertyValue(userJack, UserType.F_DESCRIPTION, "Where's the rum?"); PrismAsserts.assertPropertyValue(userJack, UserType.F_ORGANIZATIONAL_UNIT, PrismTestUtil.createPolyString("FD004")); assertAssignments(userJack, 0); UserType userJackType = userJack.asObjectable(); assertEquals("Unexpected number of accountRefs", 0, userJackType.getLinkRef().size()); PrismObject<OrgType> org = findObjectByName(OrgType.class, "FD004"); assertNull("Found org "+org+" but not expecting it", org); } /** * Set the template. Reconcile the user that should have org created on demand (but does not). * The org should be created. */ @Test public void test960ReconcileUserJackWithTemplate() throws Exception { final String TEST_NAME = "test960ModifyUserJackWithTemplate"; TestUtil.displayTestTile(this, TEST_NAME); // GIVEN setDefaultUserTemplate(USER_TEMPLATE_COMPLEX_OID); Task task = taskManager.createTaskInstance(TestUserTemplate.class.getName() + "." + TEST_NAME); OperationResult result = task.getResult(); assumeAssignmentPolicy(AssignmentPolicyEnforcementType.RELATIVE); // WHEN reconcileUser(USER_JACK_OID, task, result); // THEN result.computeStatus(); TestUtil.assertSuccess(result); PrismObject<UserType> userJack = modelService.getObject(UserType.class, USER_JACK_OID, null, task, result); display("User after", userJack); PrismAsserts.assertPropertyValue(userJack, UserType.F_DESCRIPTION, "Where's the rum?"); assertAssignedAccount(userJack, RESOURCE_DUMMY_BLUE_OID); assertOnDemandOrgAssigned("FD004", userJack); assertAssignments(userJack, 2); assertLinks(userJack, 1); } }