Skip to content

Commit

Permalink
Add a test for changing "const" config properties
Browse files Browse the repository at this point in the history
This is test of the application of modifications of "const" based
connector configuration properties.

Related to MID-7918.
  • Loading branch information
mederly committed Apr 29, 2024
1 parent 6c8ddc2 commit e0ed3c5
Show file tree
Hide file tree
Showing 2 changed files with 143 additions and 13 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -9,35 +9,40 @@
import static org.assertj.core.api.Assertions.assertThat;
import static org.testng.AssertJUnit.assertEquals;

import static com.evolveum.midpoint.schema.GetOperationOptions.createRawCollection;

import java.io.File;
import java.util.List;
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.annotations.Test;

import com.evolveum.midpoint.model.api.ModelExecuteOptions;
import com.evolveum.midpoint.model.intest.AbstractConfiguredModelIntegrationTest;
import com.evolveum.midpoint.prism.*;
import com.evolveum.midpoint.prism.delta.ContainerDelta;
import com.evolveum.midpoint.prism.delta.ItemDelta;
import com.evolveum.midpoint.prism.delta.ObjectDelta;
import com.evolveum.midpoint.prism.delta.PropertyDelta;
import com.evolveum.midpoint.prism.path.ItemName;
import com.evolveum.midpoint.prism.path.ItemPath;
import com.evolveum.midpoint.prism.xnode.ListXNode;
import com.evolveum.midpoint.prism.xnode.MapXNode;
import com.evolveum.midpoint.prism.xnode.PrimitiveXNode;
import com.evolveum.midpoint.schema.constants.SchemaConstants;
import com.evolveum.midpoint.util.exception.*;

import com.evolveum.midpoint.xml.ns._public.common.common_3.ConnectorConfigurationType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ConnectorInstanceSpecificationType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectReferenceType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ResourceType;

import org.springframework.test.annotation.DirtiesContext;
import org.springframework.test.annotation.DirtiesContext.ClassMode;
import org.springframework.test.context.ContextConfiguration;
import org.testng.annotations.Test;

import com.evolveum.midpoint.model.intest.AbstractConfiguredModelIntegrationTest;
import com.evolveum.midpoint.schema.result.OperationResult;
import com.evolveum.midpoint.task.api.Task;
import com.evolveum.midpoint.test.DummyResourceContoller;
import com.evolveum.midpoint.test.DummyTestResource;
import com.evolveum.midpoint.test.util.TestUtil;
import com.evolveum.midpoint.util.exception.CommonException;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ConnectorConfigurationType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ConnectorInstanceSpecificationType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectReferenceType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ResourceType;

/**
* Test resources that have several connectors.
Expand All @@ -60,6 +65,14 @@ public class TestMultiConnectorResources extends AbstractConfiguredModelIntegrat
private static final String CONF_USELESS_OPALINE = "USEless-opaline";
private static final String CONF_USELESS_SCRIPT = "USEless-script";

private static final DummyTestResource RESOURCE_DUMMY_EXPRESSIONS = new DummyTestResource(
TEST_DIR, "resource-dummy-expressions.xml", "085ef1f0-ddcc-4086-a757-71b7fdb56a82", "expression");

private static final ItemPath USELESS_STRING_PATH = ItemPath.create(
ResourceType.F_CONNECTOR_CONFIGURATION,
SchemaConstants.ICF_CONFIGURATION_PROPERTIES,
new ItemName("uselessString")); // the property itself has two different namespaces (we don't care)

private static final String SCRIPT_RUNNER_NS = "http://midpoint.evolveum.com/xml/ns/public/connector/icf-1/bundle/com.evolveum.icf.dummy/com.evolveum.icf.dummy.connector.DummyConnectorScriptRunner";
private static final ItemName SCRIPT_RUNNER_INSTANCE_ID = new ItemName(SCRIPT_RUNNER_NS, "instanceId");

Expand Down Expand Up @@ -363,6 +376,63 @@ public void test240ReplaceAdditionalConnectorContainer() throws CommonException
assertPropertyAfter("opaline-script-240", task, result);
}

/** Test of const-based configuration property can be changed. MID-7918. */
@Test
public void test300ModifyConstConfigurationProperty() throws Exception {
var task = getTestTask();
var result = task.getResult();

given("resource object");
importObject(RESOURCE_DUMMY_EXPRESSIONS, task, result);
var objectBefore = repositoryService.getObject(
ResourceType.class,
RESOURCE_DUMMY_EXPRESSIONS.oid,
createRawCollection(),
result);
var xmlBefore = prismContext.xmlSerializer().serialize(objectBefore);
displayValue("XML before", xmlBefore);

when("const configuration properties are modified");
var xmlEdited = xmlBefore
.replace("<const>useless</const>", "<const>drink</const>")
.replace("<const>blabla</const>", "<const>baseDn</const>");
var objectEdited = prismContext.parserFor(xmlEdited).xml().<ResourceType>parse();
var delta = objectBefore.diff(objectEdited);
displayDumpable("delta", delta);

executeChanges(delta, ModelExecuteOptions.create().raw(true), task, result);

then("the change is saved");
var objectAfter = repositoryService.getObject(
ResourceType.class,
RESOURCE_DUMMY_EXPRESSIONS.oid,
createRawCollection(),
result);
displayValue("Object after", prismContext.xmlSerializer().serialize(objectAfter));

var main = getConstExpressionValue(objectAfter.findProperty(USELESS_STRING_PATH));
assertThat(main).as("config property in main connector").isEqualTo("drink");

var additional = getConstExpressionValue(
objectAfter.findProperty(
ResourceType.F_ADDITIONAL_CONNECTOR.append(
objectAfter.asObjectable().getAdditionalConnector().get(0).getId(),
USELESS_STRING_PATH)));
assertThat(additional).as("config property in additional connector").isEqualTo("baseDn");
}

private String getConstExpressionValue(PrismProperty<?> property) {
// Quite hacking. We simply want to dig out the const value from the XNode tree. The details can differ
// e.g. between native and generic repository.
var exprNode = ((MapXNode) property.getValue().getRawElement()).get(new QName("expression"));
var constNode = ((MapXNode) exprNode).get(new QName("const"));
if (constNode instanceof ListXNode list) {
constNode = list.get(0);
}
//noinspection unchecked
return ((PrimitiveXNode<String>) constNode).getStringValue();
}

private void assertPropertyAfter(String expected, Task task, OperationResult result) throws CommonException {
PrismObject<ResourceType> resourceAfter =
repositoryService.getObject(ResourceType.class, RESOURCE_DUMMY_OPALINE_OID, null, result);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
~ Copyright (c) 2010-2019 Evolveum and contributors
~
~ This work is dual-licensed under the Apache License 2.0
~ and European Union Public License. See LICENSE file for details.
-->

<resource oid="085ef1f0-ddcc-4086-a757-71b7fdb56a82"
xmlns="http://midpoint.evolveum.com/xml/ns/public/common/common-3"
xmlns:q="http://prism.evolveum.com/xml/ns/public/query-3"
xmlns:icfc="http://midpoint.evolveum.com/xml/ns/public/connector/icf-1/connector-schema-3">
<name>resource-dummy-expressions</name>
<documentation>Resource that has expressions in the configuration</documentation>
<connectorRef type="ConnectorType">
<filter>
<q:and>
<q:equal>
<q:path>connectorType</q:path>
<q:value>com.evolveum.icf.dummy.connector.DummyConnectorPure</q:value>
</q:equal>
<q:equal>
<q:path>connectorVersion</q:path>
<q:value>2.0</q:value>
</q:equal>
</q:and>
</filter>
</connectorRef>
<connectorConfiguration xmlns:icfi="http://midpoint.evolveum.com/xml/ns/public/connector/icf-1/bundle/com.evolveum.icf.dummy/com.evolveum.icf.dummy.connector.DummyConnectorPure">
<icfc:configurationProperties>
<icfi:instanceId>expressions</icfi:instanceId>
<icfi:uselessString>
<expression>
<const>useless</const>
</expression>
</icfi:uselessString>
</icfc:configurationProperties>
</connectorConfiguration>
<additionalConnector>
<name>scriptRunner</name>
<connectorRef type="ConnectorType">
<filter>
<q:equal>
<q:path>connectorType</q:path>
<q:value>com.evolveum.icf.dummy.connector.DummyConnectorScriptRunner</q:value>
</q:equal>
</filter>
</connectorRef>
<connectorConfiguration xmlns:icfi="http://midpoint.evolveum.com/xml/ns/public/connector/icf-1/bundle/com.evolveum.icf.dummy/com.evolveum.icf.dummy.connector.DummyConnectorScriptRunner">
<icfc:configurationProperties>
<icfi:instanceId>expressions-script</icfi:instanceId>
<icfi:uselessString>
<expression>
<const>blabla</const>
</expression>
</icfi:uselessString>
</icfc:configurationProperties>
</connectorConfiguration>
</additionalConnector>
</resource>

0 comments on commit e0ed3c5

Please sign in to comment.