/*
* Copyright (c) 2010-2016 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.impl.visualizer;
import com.evolveum.midpoint.model.api.context.ModelContext;
import com.evolveum.midpoint.model.api.context.ModelProjectionContext;
import com.evolveum.midpoint.model.api.visualizer.Scene;
import com.evolveum.midpoint.model.impl.AbstractInternalModelIntegrationTest;
import com.evolveum.midpoint.prism.PrismContext;
import com.evolveum.midpoint.prism.PrismObject;
import com.evolveum.midpoint.prism.delta.ObjectDelta;
import com.evolveum.midpoint.prism.delta.builder.DeltaBuilder;
import com.evolveum.midpoint.prism.util.PrismTestUtil;
import com.evolveum.midpoint.prism.xml.XmlTypeConverter;
import com.evolveum.midpoint.schema.MidPointPrismContextFactory;
import com.evolveum.midpoint.schema.constants.MidPointConstants;
import com.evolveum.midpoint.task.api.Task;
import com.evolveum.midpoint.task.api.TaskManager;
import com.evolveum.midpoint.util.PrettyPrinter;
import com.evolveum.midpoint.util.exception.*;
import com.evolveum.midpoint.xml.ns._public.common.common_3.*;
import com.evolveum.prism.xml.ns._public.types_3.PolyStringType;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.annotation.DirtiesContext;
import org.springframework.test.context.ContextConfiguration;
import org.testng.annotations.BeforeSuite;
import org.testng.annotations.Test;
import org.xml.sax.SAXException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import static com.evolveum.midpoint.schema.constants.ObjectTypes.*;
import static com.evolveum.midpoint.schema.util.ObjectTypeUtil.createObjectRef;
import static com.evolveum.midpoint.test.IntegrationTestTools.display;
import static com.evolveum.midpoint.test.util.TestUtil.*;
import static org.apache.commons.collections.CollectionUtils.addIgnoreNull;
import static org.testng.AssertJUnit.*;
/**
* @author mederly
*
*/
@ContextConfiguration(locations = {"classpath:ctx-model-test-main.xml"})
@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_CLASS)
public class TestVisualizer extends AbstractInternalModelIntegrationTest {
@Autowired
private Visualizer visualizer;
@Autowired
private PrismContext prismContext;
@Autowired
private TaskManager taskManager;
@BeforeSuite
public void setup() throws SchemaException, SAXException, IOException {
PrettyPrinter.setDefaultNamespacePrefix(MidPointConstants.NS_MIDPOINT_PUBLIC_PREFIX);
PrismTestUtil.resetPrismContext(MidPointPrismContextFactory.FACTORY);
}
@Test
public void test100UserBasic() throws SchemaException {
final String TEST_NAME = "test100UserBasic";
Task task = createTask(TEST_NAME);
PrismObject<UserType> u = prismContext.createObject(UserType.class);
u.setOid("123");
u.asObjectable().setName(new PolyStringType("user123"));
u.asObjectable().setFullName(new PolyStringType("User User123"));
/// WHEN
displayWhen(TEST_NAME);
final Scene scene = visualizer.visualize(u, task, task.getResult());
// THEN
displayThen(TEST_NAME);
display("scene", scene);
// TODO some asserts
}
@Test
public void test110UserWithContainers() throws SchemaException {
final String TEST_NAME = "test101UserWithContainers";
Task task = createTask(TEST_NAME);
PrismObject<UserType> u = prismContext.createObject(UserType.class);
UserType ut = u.asObjectable();
u.setOid("456");
ut.setName(new PolyStringType("user456"));
ut.setFullName(new PolyStringType("User User456"));
ut.setActivation(new ActivationType(prismContext));
ut.getActivation().setAdministrativeStatus(ActivationStatusType.ENABLED);
ut.getActivation().setValidTo(XmlTypeConverter.createXMLGregorianCalendar(2020, 1, 1, 0, 0, 0));
AssignmentType ass1 = new AssignmentType(prismContext);
ass1.setActivation(new ActivationType(prismContext));
ass1.getActivation().setAdministrativeStatus(ActivationStatusType.ENABLED);
ass1.getActivation().setValidTo(XmlTypeConverter.createXMLGregorianCalendar(2019, 1, 1, 0, 0, 0));
ass1.setTargetRef(createObjectRef(ROLE_SUPERUSER_OID, ROLE));
ut.getAssignment().add(ass1);
AssignmentType ass2 = new AssignmentType(prismContext);
ass2.setTargetRef(createObjectRef("777", ROLE));
ut.getAssignment().add(ass2);
AssignmentType ass3 = new AssignmentType(prismContext);
ass3.setConstruction(new ConstructionType(prismContext));
ass3.getConstruction().setResourceRef(createObjectRef(RESOURCE_DUMMY_OID, RESOURCE));
ut.getAssignment().add(ass3);
/// WHEN
displayWhen(TEST_NAME);
final Scene scene = visualizer.visualize(u, task, task.getResult());
// THEN
displayThen(TEST_NAME);
display("scene", scene);
// TODO some asserts
}
@Test
public void test200UserDeltaBasic() throws SchemaException {
final String TEST_NAME = "test200UserDeltaBasic";
Task task = createTask(TEST_NAME);
ObjectDelta<?> delta = DeltaBuilder.deltaFor(UserType.class, prismContext)
.item(UserType.F_NAME).replace("admin")
.asObjectDelta(USER_ADMINISTRATOR_OID);
/// WHEN
displayWhen(TEST_NAME);
final Scene scene = visualizer.visualizeDelta((ObjectDelta<? extends ObjectType>) delta, task, task.getResult());
// THEN
displayThen(TEST_NAME);
display("scene", scene);
// TODO some asserts
}
@Test
public void test210UserDeltaContainers() throws SchemaException {
final String TEST_NAME = "test210UserDeltaContainers";
Task task = createTask(TEST_NAME);
AssignmentType ass1 = new AssignmentType(prismContext);
ass1.setActivation(new ActivationType(prismContext));
ass1.getActivation().setAdministrativeStatus(ActivationStatusType.ENABLED);
ass1.getActivation().setValidTo(XmlTypeConverter.createXMLGregorianCalendar(2017, 1, 1, 0, 0, 0));
ass1.setTargetRef(createObjectRef(ROLE_SUPERUSER_OID, ROLE));
ObjectDelta<?> delta = DeltaBuilder.deltaFor(UserType.class, prismContext)
.item(UserType.F_NAME).replace("admin")
.item(UserType.F_ACTIVATION, ActivationType.F_ADMINISTRATIVE_STATUS).replace(ActivationStatusType.ENABLED)
.item(UserType.F_ASSIGNMENT, 1, AssignmentType.F_TARGET_REF).replace(createObjectRef("123", ROLE).asReferenceValue())
.item(UserType.F_ASSIGNMENT, 1, AssignmentType.F_DESCRIPTION).add("suspicious")
.item(UserType.F_ASSIGNMENT).add(ass1)
.asObjectDelta(USER_ADMINISTRATOR_OID);
/// WHEN
displayWhen(TEST_NAME);
final Scene scene = visualizer.visualizeDelta((ObjectDelta<? extends ObjectType>) delta, task, task.getResult());
// THEN
displayThen(TEST_NAME);
display("scene", scene);
// TODO some asserts
}
@Test
public void test212UserDeltaContainerSimple() throws SchemaException {
final String TEST_NAME = "test212UserDeltaContainerSimple";
Task task = createTask(TEST_NAME);
ObjectDelta<?> delta = DeltaBuilder.deltaFor(UserType.class, prismContext)
.item(UserType.F_ACTIVATION, ActivationType.F_EFFECTIVE_STATUS).replace(ActivationStatusType.ENABLED)
.item(UserType.F_ACTIVATION, ActivationType.F_ENABLE_TIMESTAMP).replace(XmlTypeConverter.createXMLGregorianCalendar(new Date()))
.asObjectDelta(USER_ADMINISTRATOR_OID);
/// WHEN
displayWhen(TEST_NAME);
final List<? extends Scene> scenes = visualizer.visualizeDeltas((List) Collections.singletonList(delta), task, task.getResult());
// THEN
displayThen(TEST_NAME);
display("scenes", scenes);
// TODO some asserts
}
@Test
public void test220UserContainerReplace() throws SchemaException {
final String TEST_NAME = "test220UserContainerReplace";
Task task = createTask(TEST_NAME);
AssignmentType ass1 = new AssignmentType(prismContext);
ass1.setActivation(new ActivationType(prismContext));
ass1.getActivation().setAdministrativeStatus(ActivationStatusType.DISABLED);
ass1.getActivation().setValidFrom(XmlTypeConverter.createXMLGregorianCalendar(2010, 1, 1, 0, 0, 0));
ass1.setTargetRef(createObjectRef(ROLE_SUPERUSER_OID, ROLE));
ActivationType act1 = new ActivationType(prismContext);
act1.setAdministrativeStatus(ActivationStatusType.DISABLED);
ObjectDelta<?> delta = DeltaBuilder.deltaFor(UserType.class, prismContext)
.item(UserType.F_NAME).replace("admin")
.item(UserType.F_ACTIVATION).replace(act1)
.item(UserType.F_ASSIGNMENT).replace(ass1)
.asObjectDelta(USER_ADMINISTRATOR_OID);
/// WHEN
displayWhen(TEST_NAME);
final Scene scene = visualizer.visualizeDelta((ObjectDelta<? extends ObjectType>) delta, task, task.getResult());
// THEN
displayThen(TEST_NAME);
display("scene", scene);
// TODO some asserts
}
@Test
public void test230UserContainerDelete() throws SchemaException {
final String TEST_NAME = "test230UserContainerDelete";
Task task = createTask(TEST_NAME);
AssignmentType ass1 = new AssignmentType(prismContext);
ass1.setId(1L);
AssignmentType ass2 = new AssignmentType(prismContext);
ass2.setId(99999L);
ObjectDelta<?> delta = DeltaBuilder.deltaFor(UserType.class, prismContext)
.item(UserType.F_NAME).replace("admin")
.item(UserType.F_ASSIGNMENT).delete(ass1, ass2)
.asObjectDelta(USER_ADMINISTRATOR_OID);
/// WHEN
displayWhen(TEST_NAME);
final Scene scene = visualizer.visualizeDelta((ObjectDelta<? extends ObjectType>) delta, task, task.getResult());
// THEN
displayThen(TEST_NAME);
display("scene", scene);
// TODO some asserts
}
@Test
public void test300UserAssignmentPreview() throws Exception {
final String TEST_NAME = "test300UserAssignmentPreview";
Task task = createTask(TEST_NAME);
PrismObject<UserType> jack = getUser(USER_JACK_OID);
display("jack", jack);
AssignmentType ass1 = new AssignmentType(prismContext);
ass1.setConstruction(new ConstructionType(prismContext));
ass1.getConstruction().setResourceRef(createObjectRef(RESOURCE_DUMMY_OID, RESOURCE));
ObjectDelta<UserType> delta = (ObjectDelta<UserType>) DeltaBuilder.deltaFor(UserType.class, prismContext)
.item(UserType.F_ASSIGNMENT).add(ass1)
.asObjectDelta(USER_JACK_OID);
delta.applyDefinition(jack.getDefinition());
/// WHEN
displayWhen(TEST_NAME);
ModelContext<UserType> modelContext = modelInteractionService.previewChanges(Collections.<ObjectDelta<? extends ObjectType>>singletonList(delta), null, task, task.getResult());
List<ObjectDelta<? extends ObjectType>> primaryDeltas = new ArrayList<>();
List<ObjectDelta<? extends ObjectType>> secondaryDeltas = new ArrayList<>();
fillDeltas(modelContext, primaryDeltas, secondaryDeltas);
List<? extends Scene> primaryScenes = modelInteractionService.visualizeDeltas(primaryDeltas, task, task.getResult());
List<? extends Scene> secondaryScenes = modelInteractionService.visualizeDeltas(secondaryDeltas, task, task.getResult());
// THEN
displayThen(TEST_NAME);
display("primary scenes", primaryScenes);
display("secondary scenes", secondaryScenes);
// TODO some asserts
}
@Test
public void test305UserAssignmentAdd() throws Exception {
final String TEST_NAME = "test305UserAssignmentAdd";
Task task = createTask(TEST_NAME);
display("jack", getUser(USER_JACK_OID));
AssignmentType ass1 = new AssignmentType();
ass1.setConstruction(new ConstructionType());
ass1.getConstruction().setResourceRef(createObjectRef(RESOURCE_DUMMY_OID, RESOURCE));
ObjectDelta<UserType> delta = (ObjectDelta<UserType>) DeltaBuilder.deltaFor(UserType.class, prismContext)
.item(UserType.F_ASSIGNMENT).add(ass1)
.asObjectDelta(USER_JACK_OID);
/// WHEN
displayWhen(TEST_NAME);
final Scene scene = visualizer.visualizeDelta(delta, task, task.getResult());
modelService.executeChanges(Collections.<ObjectDelta<? extends ObjectType>>singletonList(delta), null, task, task.getResult());
// THEN
displayThen(TEST_NAME);
display("scene", scene);
display("jack with assignment", getUser(USER_JACK_OID));
// TODO some asserts
}
@Test
public void test307UserDisablePreview() throws Exception {
final String TEST_NAME = "test307UserDisablePreview";
Task task = createTask(TEST_NAME);
ObjectDelta<UserType> delta = (ObjectDelta<UserType>) DeltaBuilder.deltaFor(UserType.class, prismContext)
.item(UserType.F_ACTIVATION, ActivationType.F_ADMINISTRATIVE_STATUS).replace(ActivationStatusType.DISABLED)
.asObjectDelta(USER_JACK_OID);
/// WHEN
displayWhen(TEST_NAME);
ModelContext<UserType> modelContext = modelInteractionService.previewChanges(Collections.<ObjectDelta<? extends ObjectType>>singletonList(delta), null, task, task.getResult());
List<ObjectDelta<? extends ObjectType>> primaryDeltas = new ArrayList<>();
List<ObjectDelta<? extends ObjectType>> secondaryDeltas = new ArrayList<>();
fillDeltas(modelContext, primaryDeltas, secondaryDeltas);
List<? extends Scene> primaryScenes = modelInteractionService.visualizeDeltas(primaryDeltas, task, task.getResult());
List<? extends Scene> secondaryScenes = modelInteractionService.visualizeDeltas(secondaryDeltas, task, task.getResult());
// THEN
displayThen(TEST_NAME);
display("primary scenes", primaryScenes);
display("secondary scenes", secondaryScenes);
// TODO some asserts
}
protected void fillDeltas(ModelContext<UserType> modelContext, List<ObjectDelta<? extends ObjectType>> primaryDeltas,
List<ObjectDelta<? extends ObjectType>> secondaryDeltas) throws SchemaException {
if (modelContext != null) {
if (modelContext.getFocusContext() != null) {
addIgnoreNull(primaryDeltas, modelContext.getFocusContext().getPrimaryDelta());
addIgnoreNull(secondaryDeltas, modelContext.getFocusContext().getSecondaryDelta());
}
for (ModelProjectionContext projCtx : modelContext.getProjectionContexts()) {
addIgnoreNull(primaryDeltas, projCtx.getPrimaryDelta());
addIgnoreNull(secondaryDeltas, projCtx.getExecutableDelta());
}
}
display("primary deltas", primaryDeltas);
display("secondary deltas", secondaryDeltas);
}
private String dummyAccountOid;
@Test
public void test310UserLinkRefDelete() throws Exception {
final String TEST_NAME = "test310UserLinkRefDelete";
Task task = createTask(TEST_NAME);
UserType jack = getUser(USER_JACK_OID).asObjectable();
assertEquals("wrong # of linkrefs", 1, jack.getLinkRef().size());
dummyAccountOid = jack.getLinkRef().get(0).getOid();
ObjectDelta<UserType> delta = (ObjectDelta<UserType>) DeltaBuilder.deltaFor(UserType.class, prismContext)
.item(UserType.F_LINK_REF).delete(createObjectRef(dummyAccountOid, SHADOW).asReferenceValue())
.asObjectDelta(USER_JACK_OID);
/// WHEN
displayWhen(TEST_NAME);
final Scene scene = visualizer.visualizeDelta(delta, task, task.getResult());
// THEN
displayThen(TEST_NAME);
display("scene", scene);
// TODO some asserts
}
@Test
public void test320UserLinkRefAdd() throws Exception {
final String TEST_NAME = "test320UserLinkRefAdd";
Task task = createTask(TEST_NAME);
ObjectDelta<UserType> delta = (ObjectDelta<UserType>) DeltaBuilder.deltaFor(UserType.class, prismContext)
.item(UserType.F_LINK_REF).add(createObjectRef(dummyAccountOid, SHADOW).asReferenceValue())
.asObjectDelta(USER_JACK_OID);
/// WHEN
displayWhen(TEST_NAME);
final Scene scene = visualizer.visualizeDelta(delta, task, task.getResult());
// THEN
displayThen(TEST_NAME);
display("scene", scene);
// TODO some asserts
}
@Test
public void test330UserLinkRefReplaceNoOp() throws Exception {
final String TEST_NAME = "test330UserLinkRefReplaceNoOp";
Task task = createTask(TEST_NAME);
ObjectDelta<UserType> delta = (ObjectDelta<UserType>) DeltaBuilder.deltaFor(UserType.class, prismContext)
.item(UserType.F_LINK_REF).replace(createObjectRef(dummyAccountOid, SHADOW).asReferenceValue())
.asObjectDelta(USER_JACK_OID);
/// WHEN
displayWhen(TEST_NAME);
final Scene scene = visualizer.visualizeDelta(delta, task, task.getResult());
// THEN
displayThen(TEST_NAME);
display("scene", scene);
// TODO some asserts
}
@Test
public void test340UserLinkRefReplaceOp() throws Exception {
final String TEST_NAME = "test340UserLinkRefReplaceOp";
Task task = createTask(TEST_NAME);
ObjectDelta<UserType> delta = (ObjectDelta<UserType>) DeltaBuilder.deltaFor(UserType.class, prismContext)
.item(UserType.F_LINK_REF).replace(createObjectRef("777", SHADOW).asReferenceValue())
.asObjectDelta(USER_JACK_OID);
/// WHEN
displayWhen(TEST_NAME);
final Scene scene = visualizer.visualizeDelta(delta, task, task.getResult());
// THEN
displayThen(TEST_NAME);
display("scene", scene);
// TODO some asserts
}
}