/*
* 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.scripting;
import com.evolveum.midpoint.common.LoggingConfigurationManager;
import com.evolveum.midpoint.model.impl.scripting.Data;
import com.evolveum.midpoint.model.impl.scripting.ExecutionContext;
import com.evolveum.midpoint.model.impl.scripting.ScriptingExpressionEvaluator;
import com.evolveum.midpoint.model.intest.AbstractInitializedModelIntegrationTest;
import com.evolveum.midpoint.notifications.api.transports.Message;
import com.evolveum.midpoint.prism.*;
import com.evolveum.midpoint.schema.internals.InternalMonitor;
import com.evolveum.midpoint.schema.result.OperationResult;
import com.evolveum.midpoint.schema.util.ObjectQueryUtil;
import com.evolveum.midpoint.task.api.Task;
import com.evolveum.midpoint.test.IntegrationTestTools;
import com.evolveum.midpoint.test.util.LogfileTestTailer;
import com.evolveum.midpoint.test.util.TestUtil;
import com.evolveum.midpoint.util.exception.SchemaException;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ResourceType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.UserType;
import com.evolveum.midpoint.xml.ns._public.model.scripting_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;
import org.testng.annotations.Test;
import org.testng.collections.Sets;
import java.io.File;
import java.io.IOException;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import static org.testng.AssertJUnit.assertEquals;
import static org.testng.AssertJUnit.assertTrue;
/**
* @author mederly
*
*/
@ContextConfiguration(locations = {"classpath:ctx-model-intest-test-main.xml"})
@DirtiesContext(classMode = ClassMode.AFTER_CLASS)
public class TestScriptingBasic extends AbstractInitializedModelIntegrationTest {
public static final File TEST_DIR = new File("src/test/resources/scripting");
private static final String DOT_CLASS = TestScriptingBasic.class.getName() + ".";
private static final File LOG_FILE = new File(TEST_DIR, "log.xml");
private static final File SEARCH_FOR_USERS_FILE = new File(TEST_DIR, "search-for-users.xml");
private static final File SEARCH_FOR_SHADOWS_FILE = new File(TEST_DIR, "search-for-shadows.xml");
private static final File SEARCH_FOR_SHADOWS_NOFETCH_FILE = new File(TEST_DIR, "search-for-shadows-nofetch.xml");
private static final File SEARCH_FOR_RESOURCES_FILE = new File(TEST_DIR, "search-for-resources.xml");
private static final File SEARCH_FOR_ROLES_FILE = new File(TEST_DIR, "search-for-roles.xml");
private static final File SEARCH_FOR_USERS_ACCOUNTS_FILE = new File(TEST_DIR, "search-for-users-accounts.xml");
private static final File SEARCH_FOR_USERS_ACCOUNTS_NOFETCH_FILE = new File(TEST_DIR, "search-for-users-accounts-nofetch.xml");
private static final File DISABLE_JACK_FILE = new File(TEST_DIR, "disable-jack.xml");
private static final File ENABLE_JACK_FILE = new File(TEST_DIR, "enable-jack.xml");
private static final File DELETE_AND_ADD_JACK_FILE = new File(TEST_DIR, "delete-and-add-jack.xml");
private static final File MODIFY_JACK_FILE = new File(TEST_DIR, "modify-jack.xml");
private static final File MODIFY_JACK_BACK_FILE = new File(TEST_DIR, "modify-jack-back.xml");
private static final File RECOMPUTE_JACK_FILE = new File(TEST_DIR, "recompute-jack.xml");;
private static final File ASSIGN_TO_JACK_FILE = new File(TEST_DIR, "assign-to-jack.xml");
private static final File ASSIGN_TO_JACK_2_FILE = new File(TEST_DIR, "assign-to-jack-2.xml");
private static final File PURGE_DUMMY_BLACK_SCHEMA_FILE = new File(TEST_DIR, "purge-dummy-black-schema.xml");
private static final File TEST_DUMMY_RESOURCE_FILE = new File(TEST_DIR, "test-dummy-resource.xml");
private static final File NOTIFICATION_ABOUT_JACK_FILE = new File(TEST_DIR, "notification-about-jack.xml");
private static final File NOTIFICATION_ABOUT_JACK_TYPE2_FILE = new File(TEST_DIR, "notification-about-jack-type2.xml");
private static final File SCRIPTING_USERS_FILE = new File(TEST_DIR, "scripting-users.xml");
@Autowired
private ScriptingExpressionEvaluator scriptingExpressionEvaluator;
@Override
public void initSystem(Task initTask, OperationResult initResult)
throws Exception {
super.initSystem(initTask, initResult);
InternalMonitor.reset();
// InternalMonitor.setTraceShadowFetchOperation(true);
// InternalMonitor.setTraceResourceSchemaOperations(true);
}
@Test
public void test100EmptySequence() throws Exception {
final String TEST_NAME = "test100EmptySequence";
TestUtil.displayTestTile(this, TEST_NAME);
// GIVEN
OperationResult result = new OperationResult(DOT_CLASS + TEST_NAME);
ExpressionSequenceType sequence = new ExpressionSequenceType();
ObjectFactory of = new ObjectFactory();
// WHEN
ExecutionContext output = scriptingExpressionEvaluator.evaluateExpression(sequence, result);
// THEN
assertNoOutputData(output);
result.computeStatus();
TestUtil.assertSuccess(result);
}
@Test
public void test110EmptyPipeline() throws Exception {
final String TEST_NAME = "test110EmptyPipeline";
TestUtil.displayTestTile(this, TEST_NAME);
// GIVEN
OperationResult result = new OperationResult(DOT_CLASS + TEST_NAME);
ExpressionPipelineType pipeline = new ExpressionPipelineType();
ObjectFactory of = new ObjectFactory();
// WHEN
ExecutionContext output = scriptingExpressionEvaluator.evaluateExpression(pipeline, result);
// THEN
assertNoOutputData(output);
result.computeStatus();
TestUtil.assertSuccess(result);
}
@Test
public void test120Log() throws Exception {
final String TEST_NAME = "test120Log";
TestUtil.displayTestTile(this, TEST_NAME);
// GIVEN
OperationResult result = new OperationResult(DOT_CLASS + TEST_NAME);
PrismProperty<ScriptingExpressionType> logAction = parseAnyData(LOG_FILE);
LogfileTestTailer tailer = new LogfileTestTailer(LoggingConfigurationManager.AUDIT_LOGGER_NAME);
tailer.tail();
tailer.setExpecteMessage("Custom message:");
// WHEN
ExecutionContext output = scriptingExpressionEvaluator.evaluateExpression(logAction.getAnyValue().getValue(), result);
// THEN
assertNoOutputData(output);
result.computeStatus();
TestUtil.assertSuccess(result);
tailer.tail();
tailer.assertExpectedMessage();
}
private PrismProperty parseAnyData(File file) throws IOException, SchemaException {
return (PrismProperty) prismContext.parserFor(file).parseItem();
}
@Test
public void test200SearchUser() throws Exception {
final String TEST_NAME = "test200SearchUser";
TestUtil.displayTestTile(this, TEST_NAME);
// GIVEN
OperationResult result = new OperationResult(DOT_CLASS + TEST_NAME);
PrismProperty<SearchExpressionType> expression = parseAnyData(SEARCH_FOR_USERS_FILE);
// WHEN
Data output = scriptingExpressionEvaluator.evaluateExpression(expression.getAnyValue().getValue(), result).getFinalOutput();
// THEN
IntegrationTestTools.display("output", output.getData());
result.computeStatus();
TestUtil.assertSuccess(result);
assertEquals(2, output.getData().size());
//assertEquals("administrator", ((PrismObject<UserType>) output.getData().get(0)).asObjectable().getName().getOrig());
}
@Test
public void test205SearchForResources() throws Exception {
final String TEST_NAME = "test205SearchForResources";
TestUtil.displayTestTile(this, TEST_NAME);
// GIVEN
OperationResult result = new OperationResult(DOT_CLASS + TEST_NAME);
PrismProperty<SearchExpressionType> expression = parseAnyData(SEARCH_FOR_RESOURCES_FILE);
// WHEN
Data output = scriptingExpressionEvaluator.evaluateExpression(expression.getAnyValue().getValue(), result).getFinalOutput();
// THEN
IntegrationTestTools.display("output", output.getData());
result.computeStatus();
TestUtil.assertSuccess(result);
assertEquals(13, output.getData().size());
}
@Test
public void test206SearchForRoles() throws Exception {
final String TEST_NAME = "test206SearchForRoles";
TestUtil.displayTestTile(this, TEST_NAME);
// GIVEN
OperationResult result = new OperationResult(DOT_CLASS + TEST_NAME);
PrismProperty<SearchExpressionType> expression = parseAnyData(SEARCH_FOR_ROLES_FILE);
// WHEN
Data output = scriptingExpressionEvaluator.evaluateExpression(expression.getAnyValue().getValue(), result).getFinalOutput();
// THEN
IntegrationTestTools.display("output", output.getData());
result.computeStatus();
TestUtil.assertSuccess(result);
//assertEquals(9, output.getData().size());
}
@Test
public void test210SearchForShadows() throws Exception {
final String TEST_NAME = "test210SearchForShadows";
TestUtil.displayTestTile(this, TEST_NAME);
// GIVEN
OperationResult result = new OperationResult(DOT_CLASS + TEST_NAME);
PrismProperty<SearchExpressionType> expression = parseAnyData(SEARCH_FOR_SHADOWS_FILE);
// WHEN
Data output = scriptingExpressionEvaluator.evaluateExpression(expression.getAnyValue().getValue(), result).getFinalOutput();
// THEN
IntegrationTestTools.display("output", output.getData());
result.computeStatus();
TestUtil.assertSuccess(result);
assertEquals(5, output.getData().size());
assertAttributesFetched(output.getData());
}
@Test
public void test215SearchForShadowsNoFetch() throws Exception {
final String TEST_NAME = "test215SearchForShadowsNoFetch";
TestUtil.displayTestTile(this, TEST_NAME);
// GIVEN
OperationResult result = new OperationResult(DOT_CLASS + TEST_NAME);
PrismProperty<SearchExpressionType> expression = parseAnyData(SEARCH_FOR_SHADOWS_NOFETCH_FILE);
// WHEN
Data output = scriptingExpressionEvaluator.evaluateExpression(expression.getAnyValue().getValue(), result).getFinalOutput();
// THEN
IntegrationTestTools.display("output", output.getData());
result.computeStatus();
TestUtil.assertSuccess(result);
assertEquals(5, output.getData().size());
assertAttributesNotFetched(output.getData());
}
@Test
public void test220SearchForUsersAccounts() throws Exception {
final String TEST_NAME = "test220SearchForUsersAccounts";
TestUtil.displayTestTile(this, TEST_NAME);
// GIVEN
OperationResult result = new OperationResult(DOT_CLASS + TEST_NAME);
PrismProperty<SearchExpressionType> expression = parseAnyData(SEARCH_FOR_USERS_ACCOUNTS_FILE);
// WHEN
Data output = scriptingExpressionEvaluator.evaluateExpression(expression.getAnyValue().getValue(), result).getFinalOutput();
// THEN
IntegrationTestTools.display("output", output.getData());
result.computeStatus();
TestUtil.assertSuccess(result);
assertEquals(4, output.getData().size());
assertAttributesFetched(output.getData());
}
@Test
public void test225SearchForUsersAccountsNoFetch() throws Exception {
final String TEST_NAME = "test225SearchForUsersAccountsNoFetch";
TestUtil.displayTestTile(this, TEST_NAME);
// GIVEN
OperationResult result = new OperationResult(DOT_CLASS + TEST_NAME);
PrismProperty<SearchExpressionType> expression = parseAnyData(SEARCH_FOR_USERS_ACCOUNTS_NOFETCH_FILE);
// WHEN
Data output = scriptingExpressionEvaluator.evaluateExpression(expression.getAnyValue().getValue(), result).getFinalOutput();
// THEN
IntegrationTestTools.display("output", output.getData());
result.computeStatus();
TestUtil.assertSuccess(result);
assertEquals(4, output.getData().size());
assertAttributesNotFetched(output.getData());
}
@Test
public void test300DisableJack() throws Exception {
final String TEST_NAME = "test300DisableJack";
TestUtil.displayTestTile(this, TEST_NAME);
// GIVEN
OperationResult result = new OperationResult(DOT_CLASS + TEST_NAME);
PrismProperty<ScriptingExpressionType> expression = parseAnyData(DISABLE_JACK_FILE);
// WHEN
ExecutionContext output = scriptingExpressionEvaluator.evaluateExpression(expression.getAnyValue().getValue(), result);
// THEN
assertNoOutputData(output);
IntegrationTestTools.display("stdout", output.getConsoleOutput());
assertEquals("Disabled user:c0c010c0-d34d-b33f-f00d-111111111111(jack)\n", output.getConsoleOutput());
result.computeStatus();
TestUtil.assertSuccess(result);
assertAdministrativeStatusDisabled(searchObjectByName(UserType.class, "jack"));
}
@Test
public void test310EnableJack() throws Exception {
final String TEST_NAME = "test310EnableJack";
TestUtil.displayTestTile(this, TEST_NAME);
// GIVEN
OperationResult result = new OperationResult(DOT_CLASS + TEST_NAME);
PrismProperty<ScriptingExpressionType> expression = parseAnyData(ENABLE_JACK_FILE);
// WHEN
ExecutionContext output = scriptingExpressionEvaluator.evaluateExpression(expression.getAnyValue().getValue(), result);
// THEN
assertNoOutputData(output);
IntegrationTestTools.display("stdout", output.getConsoleOutput());
result.computeStatus();
TestUtil.assertSuccess(result);
assertEquals("Enabled user:c0c010c0-d34d-b33f-f00d-111111111111(jack)\n", output.getConsoleOutput());
assertAdministrativeStatusEnabled(searchObjectByName(UserType.class, "jack"));
}
@Test
public void test320DeleteAndAddJack() throws Exception {
final String TEST_NAME = "test320DeleteAndAddJack";
TestUtil.displayTestTile(this, TEST_NAME);
// GIVEN
OperationResult result = new OperationResult(DOT_CLASS + TEST_NAME);
PrismProperty<ScriptingExpressionType> expression = parseAnyData(DELETE_AND_ADD_JACK_FILE);
// WHEN
ExecutionContext output = scriptingExpressionEvaluator.evaluateExpression(expression.getAnyValue().getValue(), result);
// THEN
assertNoOutputData(output);
IntegrationTestTools.display("stdout", output.getConsoleOutput());
result.computeStatus();
TestUtil.assertSuccess(result);
assertEquals("Deleted user:c0c010c0-d34d-b33f-f00d-111111111111(jack)\nAdded user:c0c010c0-d34d-b33f-f00d-111111111111(jack)\n", output.getConsoleOutput());
assertAdministrativeStatusEnabled(searchObjectByName(UserType.class, "jack"));
}
@Test
public void test330ModifyJack() throws Exception {
final String TEST_NAME = "test330ModifyJack";
TestUtil.displayTestTile(this, TEST_NAME);
// GIVEN
OperationResult result = new OperationResult(DOT_CLASS + TEST_NAME);
PrismProperty<ScriptingExpressionType> expression = parseAnyData(MODIFY_JACK_FILE);
// WHEN
ExecutionContext output = scriptingExpressionEvaluator.evaluateExpression(expression.getAnyValue().getValue(), result);
// THEN
assertNoOutputData(output);
IntegrationTestTools.display("stdout", output.getConsoleOutput());
IntegrationTestTools.display(result);
result.computeStatus();
TestUtil.assertSuccess(result);
assertEquals("Modified user:c0c010c0-d34d-b33f-f00d-111111111111(jack)\n", output.getConsoleOutput());
assertEquals("Nowhere", searchObjectByName(UserType.class, "jack").asObjectable().getLocality().getOrig());
}
@Test
public void test340ModifyJackBack() throws Exception {
final String TEST_NAME = "test340ModifyJackBack";
TestUtil.displayTestTile(this, TEST_NAME);
// GIVEN
OperationResult result = new OperationResult(DOT_CLASS + TEST_NAME);
PrismProperty<ScriptingExpressionType> expression = parseAnyData(MODIFY_JACK_BACK_FILE);
// WHEN
ExecutionContext output = scriptingExpressionEvaluator.evaluateExpression(expression.getAnyValue().getValue(), result);
// THEN
assertNoOutputData(output);
IntegrationTestTools.display("stdout", output.getConsoleOutput());
IntegrationTestTools.display(result);
result.computeStatus();
TestUtil.assertSuccess(result);
assertEquals("Modified user:c0c010c0-d34d-b33f-f00d-111111111111(jack)\n", output.getConsoleOutput());
assertEquals("Caribbean", searchObjectByName(UserType.class, "jack").asObjectable().getLocality().getOrig());
}
@Test
public void test350RecomputeJack() throws Exception {
final String TEST_NAME = "test350RecomputeJack";
TestUtil.displayTestTile(this, TEST_NAME);
// GIVEN
OperationResult result = new OperationResult(DOT_CLASS + TEST_NAME);
PrismProperty<ScriptingExpressionType> expression = parseAnyData(RECOMPUTE_JACK_FILE);
// WHEN
ExecutionContext output = scriptingExpressionEvaluator.evaluateExpression(expression.getAnyValue().getValue(), result);
// THEN
assertNoOutputData(output);
IntegrationTestTools.display("stdout", output.getConsoleOutput());
IntegrationTestTools.display(result);
result.computeStatus();
TestUtil.assertSuccess(result);
assertEquals("Recomputed user:c0c010c0-d34d-b33f-f00d-111111111111(jack)\n", output.getConsoleOutput());
}
@Test
public void test360AssignToJack() throws Exception {
final String TEST_NAME = "test360AssignToJack";
TestUtil.displayTestTile(this, TEST_NAME);
// GIVEN
OperationResult result = new OperationResult(DOT_CLASS + TEST_NAME);
PrismProperty<ScriptingExpressionType> expression = parseAnyData(ASSIGN_TO_JACK_FILE);
// WHEN
ExecutionContext output = scriptingExpressionEvaluator.evaluateExpression(expression.getAnyValue().getValue(), result);
// THEN
assertNoOutputData(output);
IntegrationTestTools.display("stdout", output.getConsoleOutput());
IntegrationTestTools.display(result);
result.computeStatus();
TestUtil.assertSuccess(result);
//assertEquals("Recomputed user:c0c010c0-d34d-b33f-f00d-111111111111(jack)\n", output.getConsoleOutput());
PrismObject<UserType> jack = getUser(USER_JACK_OID);
IntegrationTestTools.display("jack after assignments creation", jack);
assertAssignedAccount(jack, "10000000-0000-0000-0000-000000000104");
assertAssignedRole(jack, "12345678-d34d-b33f-f00d-55555555cccc");
}
@Test
public void test370AssignToJackInBackground() throws Exception {
final String TEST_NAME = "test370AssignToJackInBackground";
TestUtil.displayTestTile(this, TEST_NAME);
// GIVEN
OperationResult result = new OperationResult(DOT_CLASS + TEST_NAME);
PrismProperty<ScriptingExpressionType> expression = parseAnyData(ASSIGN_TO_JACK_2_FILE);
// WHEN
Task task = taskManager.createTaskInstance();
task.setOwner(getUser(USER_ADMINISTRATOR_OID));
scriptingExpressionEvaluator.evaluateExpressionInBackground(expression.getAnyValue().getValue(), task, result);
waitForTaskFinish(task.getOid(), false);
task.refresh(result);
// THEN
IntegrationTestTools.display(task.getResult());
TestUtil.assertSuccess(task.getResult());
PrismObject<UserType> jack = getUser(USER_JACK_OID);
IntegrationTestTools.display("jack after assignment creation", jack);
assertAssignedRole(jack, "12345678-d34d-b33f-f00d-555555556677");
}
@Deprecated
@Test
public void test380DisableJackInBackgroundSimple() throws Exception {
final String TEST_NAME = "test380DisableJackInBackgroundSimple";
TestUtil.displayTestTile(this, TEST_NAME);
// GIVEN
OperationResult result = new OperationResult(DOT_CLASS + TEST_NAME);
// WHEN
Task task = taskManager.createTaskInstance();
task.setOwner(getUser(USER_ADMINISTRATOR_OID));
scriptingExpressionEvaluator.evaluateExpressionInBackground(UserType.COMPLEX_TYPE,
ObjectQueryUtil.createOrigNameQuery("jack", prismContext).getFilter(),
"disable", task, result);
waitForTaskFinish(task.getOid(), false);
task.refresh(result);
// THEN
IntegrationTestTools.display(task.getResult());
TestUtil.assertSuccess(task.getResult());
PrismObject<UserType> jack = getUser(USER_JACK_OID);
IntegrationTestTools.display("jack after disable script", jack);
assertAdministrativeStatusDisabled(jack);
}
@Test
public void test400PurgeSchema() throws Exception {
final String TEST_NAME = "test400PurgeSchema";
TestUtil.displayTestTile(this, TEST_NAME);
// GIVEN
OperationResult result = new OperationResult(DOT_CLASS + TEST_NAME);
Task task = taskManager.createTaskInstance();
PrismProperty<ScriptingExpressionType> expression = parseAnyData(PURGE_DUMMY_BLACK_SCHEMA_FILE);
// ResourceType dummy = modelService.getObject(ResourceType.class, RESOURCE_DUMMY_BLACK_OID, null, task, result).asObjectable();
// IntegrationTestTools.display("dummy resource before purge schema", dummy.asPrismObject());
// IntegrationTestTools.display("elements: " + dummy.getSchema().getDefinition().getAny().get(0).getElementsByTagName("*").getLength());
// IntegrationTestTools.display("schema as XML: " + DOMUtil.printDom(dummy.getSchema().getDefinition().getAny().get(0)));
// WHEN
ExecutionContext output = scriptingExpressionEvaluator.evaluateExpression(expression.getAnyValue().getValue(), result);
// THEN
IntegrationTestTools.display("output", output.getFinalOutput());
IntegrationTestTools.display("stdout", output.getConsoleOutput());
IntegrationTestTools.display(result);
result.computeStatus();
TestUtil.assertSuccess(result);
assertEquals(1, output.getFinalOutput().getData().size());
// dummy = repositoryService.getObject(ResourceType.class, RESOURCE_DUMMY_BLACK_OID, null, result).asObjectable();
// IntegrationTestTools.display("dummy resource from repo", dummy.asPrismObject());
// IntegrationTestTools.display("elements: " + dummy.getSchema().getDefinition().getAny().get(0).getElementsByTagName("*").getLength());
// IntegrationTestTools.display("schema as XML: " + DOMUtil.printDom(dummy.getSchema().getDefinition().getAny().get(0)));
//AssertJUnit.assertNull("Schema is still present", dummy.getSchema());
// actually, schema gets downloaded just after purging it
assertEquals("Purged schema information from resource:10000000-0000-0000-0000-000000000305(Dummy Resource Black)\n", output.getConsoleOutput());
}
@Test
public void test410TestResource() throws Exception {
final String TEST_NAME = "test410TestResource";
TestUtil.displayTestTile(this, TEST_NAME);
// GIVEN
OperationResult result = new OperationResult(DOT_CLASS + TEST_NAME);
PrismProperty<ScriptingExpressionType> expression = parseAnyData(TEST_DUMMY_RESOURCE_FILE);
// WHEN
ExecutionContext output = scriptingExpressionEvaluator.evaluateExpression(expression.getAnyValue().getValue(), result);
// THEN
IntegrationTestTools.display("output", output.getFinalOutput());
IntegrationTestTools.display("stdout", output.getConsoleOutput());
ResourceType dummy = modelService.getObject(ResourceType.class, RESOURCE_DUMMY_OID, null, taskManager.createTaskInstance(), result).asObjectable();
IntegrationTestTools.display("dummy resource after test connection", dummy.asPrismObject());
IntegrationTestTools.display(result);
result.computeStatus();
TestUtil.assertSuccess(result);
assertEquals(1, output.getFinalOutput().getData().size());
assertEquals("Tested resource:10000000-0000-0000-0000-000000000004(Dummy Resource): SUCCESS\n", output.getConsoleOutput());
}
@Test
public void test420NotificationAboutJack() throws Exception {
final String TEST_NAME = "test420NotificationAboutJack";
TestUtil.displayTestTile(this, TEST_NAME);
// GIVEN
OperationResult result = new OperationResult(DOT_CLASS + TEST_NAME);
PrismProperty<ScriptingExpressionType> expression = parseAnyData(NOTIFICATION_ABOUT_JACK_FILE);
prepareNotifications();
// WHEN
ExecutionContext output = scriptingExpressionEvaluator.evaluateExpression(expression.getAnyValue().getValue(), result);
// THEN
IntegrationTestTools.display("output", output.getFinalOutput());
IntegrationTestTools.display("stdout", output.getConsoleOutput());
result.computeStatus();
TestUtil.assertSuccess(result);
assertEquals(0, output.getFinalOutput().getData().size());
assertEquals("Produced 1 event(s)\n", output.getConsoleOutput());
IntegrationTestTools.display("Dummy transport", dummyTransport);
checkDummyTransportMessages("Custom", 1);
Message m = dummyTransport.getMessages("dummy:Custom").get(0);
assertEquals("Wrong message body", "jack/" + USER_JACK_OID, m.getBody());
assertEquals("Wrong message subject", "Ad hoc notification", m.getSubject());
}
@Test
public void test430NotificationAboutJackType2() throws Exception {
final String TEST_NAME = "test430NotificationAboutJackType2";
TestUtil.displayTestTile(this, TEST_NAME);
// GIVEN
OperationResult result = new OperationResult(DOT_CLASS + TEST_NAME);
PrismProperty<ScriptingExpressionType> expression = parseAnyData(NOTIFICATION_ABOUT_JACK_TYPE2_FILE);
prepareNotifications();
// WHEN
ExecutionContext output = scriptingExpressionEvaluator.evaluateExpression(expression.getAnyValue().getValue(), result);
// THEN
IntegrationTestTools.display("output", output.getFinalOutput());
IntegrationTestTools.display("stdout", output.getConsoleOutput());
result.computeStatus();
TestUtil.assertSuccess(result);
assertEquals(0, output.getFinalOutput().getData().size());
assertEquals("Produced 1 event(s)\n", output.getConsoleOutput());
IntegrationTestTools.display("Dummy transport", dummyTransport);
checkDummyTransportMessages("Custom", 1);
Message m = dummyTransport.getMessages("dummy:Custom").get(0);
assertEquals("Wrong message body", "1", m.getBody());
assertEquals("Wrong message subject", "Ad hoc notification 2", m.getSubject());
checkDummyTransportMessages("CustomType2", 1);
m = dummyTransport.getMessages("dummy:CustomType2").get(0);
assertEquals("Wrong message body", "[POV:user:c0c010c0-d34d-b33f-f00d-111111111111(jack)]", m.getBody());
assertEquals("Wrong message subject", "Failure notification of type 2", m.getSubject());
}
@Test
public void test500ScriptingUsers() throws Exception {
final String TEST_NAME = "test500ScriptingUsers";
TestUtil.displayTestTile(this, TEST_NAME);
// GIVEN
OperationResult result = new OperationResult(DOT_CLASS + TEST_NAME);
PrismProperty<ScriptingExpressionType> expression = parseAnyData(SCRIPTING_USERS_FILE);
// WHEN
ExecutionContext output = scriptingExpressionEvaluator.evaluateExpression(expression.getAnyValue().getValue(), result);
// THEN
TestUtil.assertSuccess(result);
Data data = output.getFinalOutput();
assertEquals("Unexpected # of items in output", 5, data.getData().size());
Set<String> realOids = new HashSet<>();
for (PrismValue value : data.getData()) {
PrismObject<UserType> user = ((PrismObjectValue<UserType>) value).asPrismObject();
assertEquals("Description not set", "Test", user.asObjectable().getDescription());
realOids.add(user.getOid());
}
assertEquals("Unexpected OIDs in output",
Sets.newHashSet(Arrays.asList(USER_ADMINISTRATOR_OID, USER_JACK_OID, USER_BARBOSSA_OID, USER_GUYBRUSH_OID, USER_ELAINE_OID)),
realOids);
IntegrationTestTools.display("stdout", output.getConsoleOutput());
IntegrationTestTools.display(result);
result.computeStatus();
}
private void assertNoOutputData(ExecutionContext output) {
assertTrue("Script returned unexpected data", output.getFinalOutput() == null || output.getFinalOutput().getData().isEmpty());
}
// the following tests are a bit crude but for now it should be OK
private void assertAttributesNotFetched(List<PrismValue> data) {
for (PrismValue value : data) {
if (((PrismObjectValue<ShadowType>) value).asObjectable().getAttributes().getAny().size() > 2) {
throw new AssertionError("There are some unexpected attributes present in " + value.debugDump());
}
}
}
private void assertAttributesFetched(List<PrismValue> data) {
for (PrismValue value : data) {
if (((PrismObjectValue<ShadowType>) value).asObjectable().getAttributes().getAny().size() <= 2) {
throw new AssertionError("There are no attributes present in " + value.debugDump());
}
}
}
}