/*
* 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.assertFalse;
import static org.testng.AssertJUnit.assertNotNull;
import static org.testng.AssertJUnit.assertNull;
import static org.testng.AssertJUnit.assertTrue;
import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import javax.xml.bind.JAXBElement;
import javax.xml.datatype.XMLGregorianCalendar;
import javax.xml.namespace.QName;
import com.evolveum.icf.dummy.resource.BreakMode;
import com.evolveum.midpoint.common.refinery.RefinedResourceSchemaImpl;
import com.evolveum.midpoint.notifications.api.transports.Message;
import com.evolveum.midpoint.prism.*;
import com.evolveum.midpoint.prism.delta.PropertyDelta;
import com.evolveum.midpoint.prism.query.ObjectQuery;
import com.evolveum.midpoint.prism.query.builder.QueryBuilder;
import com.evolveum.midpoint.schema.*;
import com.evolveum.midpoint.schema.processor.*;
import com.evolveum.prism.xml.ns._public.types_3.ItemPathType;
import com.evolveum.prism.xml.ns._public.types_3.RawType;
import org.apache.commons.lang.StringUtils;
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.audit.api.AuditEventStage;
import com.evolveum.midpoint.common.StaticExpressionUtil;
import com.evolveum.midpoint.common.refinery.RefinedObjectClassDefinition;
import com.evolveum.midpoint.common.refinery.RefinedResourceSchema;
import com.evolveum.midpoint.common.refinery.ShadowDiscriminatorObjectDelta;
import com.evolveum.midpoint.model.api.ModelExecuteOptions;
import com.evolveum.midpoint.model.api.context.ModelContext;
import com.evolveum.midpoint.prism.delta.ChangeType;
import com.evolveum.midpoint.prism.delta.ObjectDelta;
import com.evolveum.midpoint.prism.delta.ReferenceDelta;
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.schema.constants.SchemaConstants;
import com.evolveum.midpoint.schema.internals.InternalMonitor;
import com.evolveum.midpoint.schema.result.OperationResult;
import com.evolveum.midpoint.schema.result.OperationResultStatus;
import com.evolveum.midpoint.schema.util.FocusTypeUtil;
import com.evolveum.midpoint.schema.util.MiscSchemaUtil;
import com.evolveum.midpoint.schema.util.ShadowUtil;
import com.evolveum.midpoint.task.api.Task;
import com.evolveum.midpoint.test.DummyResourceContoller;
import com.evolveum.midpoint.test.IntegrationTestTools;
import com.evolveum.midpoint.test.ProvisioningScriptSpec;
import com.evolveum.midpoint.test.util.TestUtil;
import com.evolveum.midpoint.util.DOMUtil;
import com.evolveum.midpoint.util.MiscUtil;
import com.evolveum.midpoint.util.exception.ObjectAlreadyExistsException;
import com.evolveum.midpoint.util.exception.ObjectNotFoundException;
import com.evolveum.midpoint.util.exception.PolicyViolationException;
import com.evolveum.midpoint.util.exception.SchemaException;
import com.evolveum.midpoint.xml.ns._public.common.common_3.AssignmentPolicyEnforcementType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.AssignmentType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ConstructionType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ExpressionType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.MappingType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectFactory;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectReferenceType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ResourceAttributeDefinitionType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ResourceType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowKindType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowType;
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 TestPersona extends AbstractInitializedModelIntegrationTest {
public static final File TEST_DIR = new File("src/test/resources/persona");
private static final String USER_JACK_GIVEN_NAME_NEW = "Jackie";
String userJackAdminPersonaOid;
@Override
public void initSystem(Task initTask, OperationResult initResult)
throws Exception {
super.initSystem(initTask, initResult);
InternalMonitor.reset();
// InternalMonitor.setTraceShadowFetchOperation(true);
// InternalMonitor.setTraceResourceSchemaOperations(true);
InternalMonitor.setTracePrismObjectClone(true);
addObject(OBJECT_TEMPLATE_PERSONA_ADMIN_FILE);
addObject(ROLE_PERSONA_ADMIN_FILE);
// Persona full name is computed by using this ordinary user template
setDefaultObjectTemplate(UserType.COMPLEX_TYPE, USER_TEMPLATE_OID, initResult);
}
@Test
public void test100AssignRolePersonaAdminToJack() throws Exception {
final String TEST_NAME = "test100AssignRolePersonaAdminToJack";
displayTestTile(TEST_NAME);
// GIVEN
Task task = createTask(TEST_NAME);
OperationResult result = task.getResult();
// WHEN
displayWhen(TEST_NAME);
assignRole(USER_JACK_OID, ROLE_PERSONA_ADMIN_OID, task, result);
// THEN
displayThen(TEST_NAME);
assertSuccess(result);
PrismObject<UserType> userAfter = getUser(USER_JACK_OID);
display("User after", userAfter);
assertUserJack(userAfter);
assertUserPassword(userAfter, USER_JACK_PASSWORD);
assertLinks(userAfter, 0);
assertPersonaLinks(userAfter, 1);
PrismObject<UserType> persona = assertLinkedPersona(userAfter, UserType.class, "admin");
display("Persona", persona);
userJackAdminPersonaOid = persona.getOid();
// Full name is computed by using ordinary user template
assertUser(persona, userJackAdminPersonaOid, toAdminPersonaUsername(USER_JACK_USERNAME), USER_JACK_FULL_NAME, USER_JACK_GIVEN_NAME, USER_JACK_FAMILY_NAME);
assertSubtype(persona, "admin");
assertUserPassword(persona, USER_JACK_PASSWORD);
assertSteadyResources();
}
@Test
public void test102RecomputeUserJack() throws Exception {
final String TEST_NAME = "test102RecomputeUserJack";
displayTestTile(TEST_NAME);
// GIVEN
Task task = createTask(TEST_NAME);
OperationResult result = task.getResult();
// WHEN
displayWhen(TEST_NAME);
recomputeUser(USER_JACK_OID, task, result);
// THEN
displayThen(TEST_NAME);
assertSuccess(result);
assertUserJack11x();
}
@Test
public void test103ReconcileUserJack() throws Exception {
final String TEST_NAME = "test103ReconcileUserJack";
displayTestTile(TEST_NAME);
// GIVEN
Task task = createTask(TEST_NAME);
OperationResult result = task.getResult();
// WHEN
displayWhen(TEST_NAME);
reconcileUser(USER_JACK_OID, task, result);
// THEN
displayThen(TEST_NAME);
assertSuccess(result);
assertUserJack11x();
}
@Test
public void test104RecomputeJackAdminPersona() throws Exception {
final String TEST_NAME = "test104RecomputeJackAdminPersona";
displayTestTile(TEST_NAME);
// GIVEN
Task task = createTask(TEST_NAME);
OperationResult result = task.getResult();
// WHEN
displayWhen(TEST_NAME);
recomputeUser(userJackAdminPersonaOid, task, result);
// THEN
displayThen(TEST_NAME);
assertSuccess(result);
assertUserJack11x();
}
@Test
public void test105ReconcileJackAdminPersona() throws Exception {
final String TEST_NAME = "test105ReconcileJackAdminPersona";
displayTestTile(TEST_NAME);
// GIVEN
Task task = createTask(TEST_NAME);
OperationResult result = task.getResult();
// WHEN
displayWhen(TEST_NAME);
reconcileUser(userJackAdminPersonaOid, task, result);
// THEN
displayThen(TEST_NAME);
assertSuccess(result);
assertUserJack11x();
}
private void assertUserJack11x() throws Exception {
PrismObject<UserType> userAfter = getUser(USER_JACK_OID);
display("User after", userAfter);
assertUserJack(userAfter);
assertUserPassword(userAfter, USER_JACK_PASSWORD);
assertLinks(userAfter, 0);
assertPersonaLinks(userAfter, 1);
PrismObject<UserType> persona = assertLinkedPersona(userAfter, UserType.class, "admin");
display("Persona", persona);
assertUser(persona, userJackAdminPersonaOid, toAdminPersonaUsername(USER_JACK_USERNAME), USER_JACK_FULL_NAME, USER_JACK_GIVEN_NAME, USER_JACK_FAMILY_NAME);
assertSubtype(persona, "admin");
assertUserPassword(persona, USER_JACK_PASSWORD);
assertSteadyResources();
}
@Test
public void test120ModifyJackGivenName() throws Exception {
final String TEST_NAME = "test120ModifyJackGivenName";
displayTestTile(TEST_NAME);
// GIVEN
Task task = createTask(TEST_NAME);
OperationResult result = task.getResult();
// WHEN
displayWhen(TEST_NAME);
modifyUserReplace(USER_JACK_OID, UserType.F_GIVEN_NAME, task, result, createPolyString(USER_JACK_GIVEN_NAME_NEW));
// THEN
displayThen(TEST_NAME);
assertSuccess(result);
PrismObject<UserType> userAfter = getUser(USER_JACK_OID);
display("User after", userAfter);
assertUser(userAfter, USER_JACK_OID, USER_JACK_USERNAME, USER_JACK_FULL_NAME, USER_JACK_GIVEN_NAME_NEW, USER_JACK_FAMILY_NAME);
assertUserPassword(userAfter, USER_JACK_PASSWORD);
assertLinks(userAfter, 0);
assertPersonaLinks(userAfter, 1);
PrismObject<UserType> persona = assertLinkedPersona(userAfter, UserType.class, "admin");
display("Persona", persona);
// Full name mapping in ordinary user template is weak, fullname is not changed
assertUser(persona, userJackAdminPersonaOid, toAdminPersonaUsername(USER_JACK_USERNAME), USER_JACK_FULL_NAME, USER_JACK_GIVEN_NAME_NEW, USER_JACK_FAMILY_NAME);
assertSubtype(persona, "admin");
assertUserPassword(persona, USER_JACK_PASSWORD);
assertSteadyResources();
}
// TODO: recompute, reconcile (both user and persona)
// TODO: change password
// TODO: assign some accouts/roles to user and persona, make sure they are independent
// TODO: independent change in the persona
@Test
public void test199UnassignRolePersonaAdminFromJack() throws Exception {
final String TEST_NAME = "test199UnassignRolePersonaAdminFromJack";
displayTestTile(TEST_NAME);
// GIVEN
Task task = createTask(TEST_NAME);
OperationResult result = task.getResult();
// WHEN
displayWhen(TEST_NAME);
unassignRole(USER_JACK_OID, ROLE_PERSONA_ADMIN_OID, task, result);
// THEN
displayThen(TEST_NAME);
assertSuccess(result);
PrismObject<UserType> userAfter = getUser(USER_JACK_OID);
display("User after", userAfter);
assertUser(userAfter, USER_JACK_OID, USER_JACK_USERNAME, USER_JACK_FULL_NAME, USER_JACK_GIVEN_NAME_NEW, USER_JACK_FAMILY_NAME);
assertUserPassword(userAfter, USER_JACK_PASSWORD);
assertLinks(userAfter, 0);
assertPersonaLinks(userAfter, 0);
assertNoObject(UserType.class, userJackAdminPersonaOid);
assertSteadyResources();
}
private String toAdminPersonaUsername(String username) {
return "a-"+username;
}
}