Skip to content

Commit

Permalink
tests for multiple archetypes support
Browse files Browse the repository at this point in the history
  • Loading branch information
katkav committed Aug 30, 2021
1 parent de7c49b commit 0cc035e
Show file tree
Hide file tree
Showing 17 changed files with 499 additions and 335 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
import com.evolveum.midpoint.util.exception.SchemaException;
import com.evolveum.midpoint.util.logging.Trace;
import com.evolveum.midpoint.util.logging.TraceManager;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ArchetypePolicyType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.AssignmentHolderType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.GuiObjectDetailsPageType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectReferenceType;
Expand All @@ -35,7 +36,8 @@ protected GuiObjectDetailsPageType loadDetailsPageConfiguration(PrismObject<AH>

OperationResult result = new OperationResult("mergeArchetypeConfig");
try {
return getAdminGuiConfigurationMergeManager().mergeObjectDetailsPageConfiguration(defaultPageConfig, assignmentHolder, result);
ArchetypePolicyType archetypePolicyType = getModelServiceLocator().getModelInteractionService().determineArchetypePolicy(assignmentHolder, result);
return getAdminGuiConfigurationMergeManager().mergeObjectDetailsPageConfiguration(defaultPageConfig, archetypePolicyType, result);
} catch (SchemaException | ConfigurationException e) {
LOGGER.error("Cannot merge details page configuration from archetype policy, {}", e.getMessage(), e);
return defaultPageConfig;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ public interface AdminGuiConfigurationMergeManager {

List<ContainerPanelConfigurationType> mergeContainerPanelConfigurationType(List<ContainerPanelConfigurationType> defaultPanels, List<ContainerPanelConfigurationType> configuredPanels);

<AH extends AssignmentHolderType> GuiObjectDetailsPageType mergeObjectDetailsPageConfiguration(GuiObjectDetailsPageType defaultPageConfiguration, PrismObject<AH> assignmentHolder, OperationResult result) throws SchemaException, ConfigurationException;
GuiObjectDetailsPageType mergeObjectDetailsPageConfiguration(GuiObjectDetailsPageType defaultPageConfiguration, ArchetypePolicyType archetypePolicyType, OperationResult result) throws SchemaException, ConfigurationException;

void mergeObjectDetailsPageConfiguration(GuiObjectDetailsPageType defaultPageConfiguration, GuiObjectDetailsPageType compiledPageType);

Expand Down

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -89,17 +89,6 @@ private LinkTypeDefinitionType getLinkDefinition(String linkTypeName, List<LinkT
return MiscUtil.extractSingleton(matchingDefinitions, () -> new IllegalStateException("Multiple link definitions named '" + linkTypeName + "'."));
}

// private <O extends ObjectType> ArchetypeType determineArchetype(PrismObject<O> object, OperationResult result)
// throws SchemaException, ConfigurationException {
// if (object.canRepresent(AssignmentHolderType.class)) {
// //noinspection unchecked
// PrismObject<? extends AssignmentHolderType> assignmentHolder = (PrismObject<? extends AssignmentHolderType>) object;
// return asObjectable(archetypeManager.determineArchetype(assignmentHolder, result));
// } else {
// return null;
// }
// }

private <O extends ObjectType> ArchetypePolicyType determineArchetypePolicy(PrismObject<O> object, OperationResult result) throws SchemaException, ConfigurationException {
return archetypeManager.determineArchetypePolicy(object, result);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,8 +38,6 @@
@Controller
public class AdminGuiConfigurationMergeManagerImpl implements AdminGuiConfigurationMergeManager {

@Autowired ArchetypeManager archetypeManager;

@Override
public List<ContainerPanelConfigurationType> mergeContainerPanelConfigurationType(List<ContainerPanelConfigurationType> defaultPanels, List<ContainerPanelConfigurationType> configuredPanels) {
List<ContainerPanelConfigurationType> mergedPanels = new ArrayList<>(defaultPanels);
Expand All @@ -50,11 +48,8 @@ public List<ContainerPanelConfigurationType> mergeContainerPanelConfigurationTyp
}

@Override
public <AH extends AssignmentHolderType> GuiObjectDetailsPageType mergeObjectDetailsPageConfiguration(@NotNull GuiObjectDetailsPageType defaultPageConfiguration, PrismObject<AH> assignmentHolder, OperationResult result) throws SchemaException, ConfigurationException {
public GuiObjectDetailsPageType mergeObjectDetailsPageConfiguration(@NotNull GuiObjectDetailsPageType defaultPageConfiguration, ArchetypePolicyType archetypePolicyType, OperationResult result) throws SchemaException, ConfigurationException {
GuiObjectDetailsPageType mergedPageConfiguration = defaultPageConfiguration.cloneWithoutId();

ArchetypePolicyType archetypePolicyType = archetypeManager.determineArchetypePolicy(assignmentHolder, result);

mergeObjectDetailsPageConfiguration(mergedPageConfiguration, archetypePolicyType);

return mergedPageConfiguration;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1006,9 +1006,10 @@ <F extends ObjectType> void processMembershipAndDelegatedRefs(LensContext<F> con
}
}

if (shouldBeArchetypeRefs.size() > 1) {
throw new ConfigurationException("Only single archetype supported. Attempting to add " + shouldBeArchetypeRefs.size() + ": " + shouldBeArchetypeRefs);
}
//TODO check for structural archetypes?
// if (shouldBeArchetypeRefs.size() > 1) {
// throw new ConfigurationException("Only single archetype supported. Attempting to add " + shouldBeArchetypeRefs.size() + ": " + shouldBeArchetypeRefs);
// }

setReferences(focusContext, AssignmentHolderType.F_ROLE_MEMBERSHIP_REF, shouldBeRoleRefs);
setReferences(focusContext, AssignmentHolderType.F_DELEGATED_REF, shouldBeDelegatedRefs);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,14 @@

import java.io.File;

import com.evolveum.midpoint.model.api.AdminGuiConfigurationMergeManager;
import com.evolveum.midpoint.test.asserter.GuiObjectDetailsPageAsserter;
import com.evolveum.midpoint.test.asserter.UserAsserter;
import com.evolveum.midpoint.util.exception.*;

import com.evolveum.midpoint.xml.ns._public.common.common_3.*;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.annotation.DirtiesContext;
import org.springframework.test.annotation.DirtiesContext.ClassMode;
import org.springframework.test.context.ContextConfiguration;
Expand All @@ -29,11 +36,6 @@
import com.evolveum.midpoint.schema.constants.SchemaConstants;
import com.evolveum.midpoint.schema.result.OperationResult;
import com.evolveum.midpoint.task.api.Task;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ActivationStatusType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ArchetypeType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.RoleType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowKindType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.UserType;

@ContextConfiguration(locations = {"classpath:ctx-model-intest-test-main.xml"})
@DirtiesContext(classMode = ClassMode.AFTER_CLASS)
Expand Down Expand Up @@ -92,8 +94,13 @@ public class TestArchetypes extends AbstractArchetypesTest {
protected static final File USER_TEMPLATE_CONTRACTOR_FILE = new File(TEST_DIR, "user-template-contractor.xml");
protected static final String USER_TEMPLATE_CONTRACTOR_OID = "f72193e4-78a6-11e9-a0b6-6f5ad4cfbb37";

public static final File ARCHETYPE_AUXILIARY_MANAGER_FILE = new File(TEST_DIR, "archetype-auxiliary-manager.xml");
protected static final String ARCHETYPE_AUXILIARY_MANAGER_OID = "ab061953-44e0-496b-aca4-23c6caf0eb60";

private static final String CONTRACTOR_EMPLOYEE_NUMBER = "CONTRACTOR";

@Autowired private AdminGuiConfigurationMergeManager mergeManager;

@Override
public void initSystem(Task initTask, OperationResult initResult) throws Exception {
super.initSystem(initTask, initResult);
Expand All @@ -105,6 +112,7 @@ public void initSystem(Task initTask, OperationResult initResult) throws Excepti
repoAddObjectFromFile(COLLECTION_ACTIVE_EMPLOYEES_FILE, initResult);
repoAddObjectFromFile(USER_TEMPLATE_ARCHETYPES_GLOBAL_FILE, initResult);
repoAddObjectFromFile(USER_TEMPLATE_CONTRACTOR_FILE, initResult);
repoAddObjectFromFile(ARCHETYPE_AUXILIARY_MANAGER_FILE, initResult);

addObject(SHADOW_GROUP_DUMMY_TESTERS_FILE, initTask, initResult);

Expand Down Expand Up @@ -397,7 +405,7 @@ public void test110AssignJackRoleEmployeeBase() throws Exception {
.end()
.getObject();

assertArchetypePolicy(userAfter)
assertArchetypePolicy(userAfter).display()
.displayType()
.assertLabel(ARCHETYPE_EMPLOYEE_DISPLAY_LABEL)
.assertPluralLabel(ARCHETYPE_EMPLOYEE_DISPLAY_PLURAL_LABEL);
Expand Down Expand Up @@ -497,6 +505,49 @@ public void test120AssignJackArchetypeTest() throws Exception {
.end();
}

/**
* should fail becasue we try to assign two structural archetypes which is not supported
* @throws Exception
*/
@Test
public void test121AssignJackArchetypeEmpoloyee() throws Exception {
Task task = getTestTask();
OperationResult result = task.getResult();

// WHEN
when();

try {
assignArchetype(USER_JACK_OID, ARCHETYPE_EMPLOYEE_OID, task, result);
fail("Unexpected behavior, two structural archetypes assigned without failure");
} catch (SchemaException e) {
//This is expected
}

// THEN
then();
assertFailure(result);

assertUserAfter(USER_JACK_OID)
.assignments()
.assertAssignments(1)
.assertArchetype(ARCHETYPE_TEST_OID)
.end()
.assertArchetypeRef(ARCHETYPE_TEST_OID)
.roleMembershipRefs()
.assertRoleMemberhipRefs(1)
.assertArchetype(ARCHETYPE_TEST_OID)
.end()
.singleLink()
.target()
.assertResource(RESOURCE_DUMMY_OID)
.assertKind(ShadowKindType.ACCOUNT)
.assertIntent(INTENT_TEST)
.end()
.end();
}


@Test
public void test129UnassignJackArchetypeTest() throws Exception {
Task task = getTestTask();
Expand Down Expand Up @@ -583,6 +634,71 @@ public void test132JackContractorRecompute() throws Exception {
.assertEmployeeNumber(CONTRACTOR_EMPLOYEE_NUMBER);
}

@Test
public void test133AssignJackAuxiliaryManagerArchetype() throws Exception {
Task task = getTestTask();
OperationResult result = task.getResult();

// WHEN
when();

assignArchetype(USER_JACK_OID, ARCHETYPE_AUXILIARY_MANAGER_OID, task, result);

// THEN
then();
assertSuccess(result);

UserAsserter<Void> jackAsserter = assertUserAfter(USER_JACK_OID);

jackAsserter
.assignments()
.assertAssignments(2)
.assertArchetype(ARCHETYPE_CONTRACTOR_OID)
.assertArchetype(ARCHETYPE_AUXILIARY_MANAGER_OID)
.end()
.assertArchetypeRefs(2)
.assertHasArchetype(ARCHETYPE_CONTRACTOR_OID)
.assertHasArchetype(ARCHETYPE_AUXILIARY_MANAGER_OID)
.roleMembershipRefs()
.assertRoleMemberhipRefs(2)
.end()
.assertEmployeeNumber(CONTRACTOR_EMPLOYEE_NUMBER)
.assertCostCenter("1234");

PrismObject<UserType> userJackAfter = jackAsserter.getObject();
assertArchetypePolicy(userJackAfter).display()
.displayType()
.assertLabel("Contractor")
.end()
.adminGuiConfig()
.objectDetails()
.assertType(UserType.COMPLEX_TYPE)
.panel()
.byIdentifier("main")
.visibility(UserInterfaceElementVisibilityType.HIDDEN)
.end();
}

@Test
public void test134UnassignJackArchetypeAuxiliaryManager() throws Exception {
Task task = getTestTask();
OperationResult result = task.getResult();

when();
unassignArchetype(USER_JACK_OID, ARCHETYPE_AUXILIARY_MANAGER_OID, task, result);

then();
assertSuccess(result);

assertUserAfter(USER_JACK_OID)
.assignments()
.assertAssignments(1)
.end()
.assertArchetypeRef(ARCHETYPE_CONTRACTOR_OID)
.assertRoleMemberhipRefs(1)
.end();
}

/**
* Contractor archetype has a different object template. We unassign the archetype
* now. But the employeeNumber given by the template stays. There is no reason to change it.
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
<!--
~ Copyright (c) 2021 Evolveum and contributors
~
~ This work is dual-licensed under the Apache License 2.0
~ and European Union Public License. See LICENSE file for details.
-->
<archetype oid="ab061953-44e0-496b-aca4-23c6caf0eb60"
xmlns="http://midpoint.evolveum.com/xml/ns/public/common/common-3"
xmlns:c="http://midpoint.evolveum.com/xml/ns/public/common/common-3"
xmlns:t="http://prism.evolveum.com/xml/ns/public/types-3"
xmlns:org='http://midpoint.evolveum.com/xml/ns/public/common/org-3'>
<name>Auxiliary Manager</name>
<archetypeType>auxiliary</archetypeType>
<archetypePolicy>
<adminGuiConfiguration>
<objectDetails>
<type>c:UserType</type>
<panel>
<identifier>main</identifier>
<path>.</path>
<visibility>hidden</visibility>
</panel>
</objectDetails>
</adminGuiConfiguration>
</archetypePolicy>
<inducement>
<focusMappings>
<mapping>
<expression>
<value>1234</value>
</expression>
<target>
<path>costCenter</path>
</target>
</mapping>
</focusMappings>
</inducement>
<assignment>
<assignmentRelation>
<holderType>UserType</holderType>
</assignmentRelation>
</assignment>
</archetype>
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
/*
* Copyright (c) 2020 Evolveum and contributors
*
* This work is dual-licensed under the Apache License 2.0
* and European Union Public License. See LICENSE file for details.
*/
package com.evolveum.midpoint.test.asserter;

import com.evolveum.midpoint.xml.ns._public.common.common_3.ContainerPanelConfigurationType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.UserInterfaceElementVisibilityType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.VirtualContainersSpecificationType;

import org.assertj.core.api.Assertions;

public class ContainerPanelConfigurationAsserter<RA> extends UserInterfaceFeatureAsserter<RA> {

public ContainerPanelConfigurationAsserter(ContainerPanelConfigurationType panelConfiguration, RA returnAsserter, String details) {
super(panelConfiguration, returnAsserter, details);
}

public ContainerPanelConfigurationAsserter<RA> identifier(String identifier) {
super.identifier(identifier);
return this;
}

public ContainerPanelConfigurationAsserter<RA> visibility(UserInterfaceElementVisibilityType visibility) {
super.visibility(visibility);
return this;
}

public ContainerPanelConfigurationAsserter<RA> assertDisplayOrder(int order) {
super.assertDisplayOrder(order);
return this;
}

@Override
protected String desc() {
return "virtual containers";
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
/*
* Copyright (c) 2020 Evolveum and contributors
*
* This work is dual-licensed under the Apache License 2.0
* and European Union Public License. See LICENSE file for details.
*/
package com.evolveum.midpoint.test.asserter;

import com.evolveum.midpoint.xml.ns._public.common.common_3.ContainerPanelConfigurationType;

import org.assertj.core.api.Assertions;

import java.util.List;
import java.util.function.Predicate;
import java.util.stream.Collectors;

public class ContainerPanelConfigurationFinder<RA> extends UserInterfaceFeatureFinder<ContainerPanelConfigurationAsserter<ContainerPanelConfigurationsAsserter<RA>>, ContainerPanelConfigurationType> {

private ContainerPanelConfigurationsAsserter<RA> containerPanelConfigurationsAsserter;

public ContainerPanelConfigurationFinder(ContainerPanelConfigurationsAsserter<RA> containerPanelConfigurationsAsserter) {
this.containerPanelConfigurationsAsserter = containerPanelConfigurationsAsserter;
}

@Override
public ContainerPanelConfigurationFinder<RA> identifier(String identifier) {
super.identifier(identifier);
return this;
}

@Override
public ContainerPanelConfigurationFinder<RA> displayName(String displayName) {
super.displayName(displayName);
return this;
}

@Override
public ContainerPanelConfigurationAsserter<ContainerPanelConfigurationsAsserter<RA>> find() {
return super.find();
}

@Override
protected ContainerPanelConfigurationAsserter<ContainerPanelConfigurationsAsserter<RA>> find(Predicate<ContainerPanelConfigurationType> filter) {
List<ContainerPanelConfigurationType> foundVirtualContainers = containerPanelConfigurationsAsserter.getPanels()
.stream()
.filter(filter)
.collect(Collectors.toList());
Assertions.assertThat(foundVirtualContainers).hasSize(1);
return new ContainerPanelConfigurationAsserter<>(foundVirtualContainers.iterator().next(), containerPanelConfigurationsAsserter, "from list of virtual containers " + containerPanelConfigurationsAsserter.getPanels());
}

}

0 comments on commit 0cc035e

Please sign in to comment.