package com.evolveum.midpoint.testing.story;
/*
* Copyright (c) 2013 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.
*/
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 java.io.File;
import java.util.Collection;
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.icf.dummy.resource.DummyObjectClass;
import com.evolveum.icf.dummy.resource.DummyResource;
import com.evolveum.midpoint.prism.PrismObject;
import com.evolveum.midpoint.prism.delta.ChangeType;
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.ItemPath;
import com.evolveum.midpoint.prism.polystring.PolyString;
import com.evolveum.midpoint.prism.util.PrismAsserts;
import com.evolveum.midpoint.schema.constants.MidPointConstants;
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.util.MidPointTestConstants;
import com.evolveum.midpoint.test.util.TestUtil;
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;
/**
* @author Radovan Semancik
*
*/
@ContextConfiguration(locations = {"classpath:ctx-story-test-main.xml"})
@DirtiesContext(classMode = ClassMode.AFTER_CLASS)
public class TestTrafo extends AbstractStoryTest {
public static final File TEST_DIR = new File(MidPointTestConstants.TEST_RESOURCES_DIR, "trafo");
public static final String NS_TRAFO_EXT = "http://midpoint.evolveum.com/xml/ns/story/trafo/ext";
private static final File TRAFO_SCHEMA_EXTENSION_FILE = new File(TEST_DIR, "extension.xsd");
private static final QName TRAFO_EXTENSION_HOMEDIR_QNAME = new QName(NS_TRAFO_EXT, "homedir");
private static final QName TRAFO_EXTENSION_UID_QNAME = new QName(NS_TRAFO_EXT, "uid");
private static final ItemPath TRAFO_EXTENSION_HOMEDIR_PATH = new ItemPath(UserType.F_EXTENSION, TRAFO_EXTENSION_HOMEDIR_QNAME);
private static final String TRAFO_MAIL_DOMAIN = "trafo.xx";
protected static final File USER_ANGELICA_FILE = new File(TEST_DIR, "user-angelica.xml");
protected static final String USER_ANGELICA_OID = "c0c010c0-d34d-b33f-f00d-11111111aaaa";
protected static final String USER_ANGELICA_USERNAME = "angelica";
protected static final File USER_SMITH111_FILE = new File(TEST_DIR, "user-smith-111.xml");
protected static final String USER_SMITH111_OID = "c0c010c0-d34d-b33f-f00d-555555551111";
protected static final String USER_SMITH111_USERNAME = "smith111";
protected static final File USER_SMITH222_FILE = new File(TEST_DIR, "user-smith-222.xml");
protected static final String USER_SMITH222_OID = "c0c010c0-d34d-b33f-f00d-555555552222";
protected static final String USER_SMITH222_USERNAME = "smith222";
protected static final String ACCOUNT_JACK_AD_DN = "CN=Sparrow Jack,OU=People,O=Trafo";
protected static final String ACCOUNT_JACK_AD_SAM_NAME = "jsparrow";
protected static final String ACCOUNT_JACK_MAIL_USERNAME = "Jack Sparrow/TRAFO/XX";
private static final String ACCOUNT_ANGELICA_AD_DN = "CN=Sparrow Jack2,OU=People,O=Trafo";
protected static final String ACCOUNT_ANGELICA_AD_SAM_NAME = "jsparrow2";
protected static final String ACCOUNT_ANGELICA_MAIL_USERNAME = "Jack Sparrow2/TRAFO/XX";
private static final String ACCOUNT_SMITH111_AD_DN = "CN=Smith John,OU=People,O=Trafo";
private static final Object ACCOUNT_SMITH111_AD_SAM_NAME = USER_SMITH111_USERNAME;
private static final String ACCOUNT_SMITH111_AD_DN_AFTER_RENAME = "CN=Smither John,OU=People,O=Trafo";
private static final String ACCOUNT_SMITH111_MAIL_USERNAME = "John Smith/111/TRAFO/XX";
private static final String ACCOUNT_SMITH111_MAIL_USERNAME_AFTER_RENAME = "John Smither/111/TRAFO/XX";
private static final String ACCOUNT_SMITH222_AD_DN = "CN=Smith John2,OU=People,O=Trafo";
private static final Object ACCOUNT_SMITH222_AD_SAM_NAME = USER_SMITH222_USERNAME;
private static final String ACCOUNT_SMITH222_AD_DN_AFTER_RENAME = "CN=Smither John2,OU=People,O=Trafo";
private static final String ACCOUNT_SMITH222_MAIL_USERNAME = "John Smith/222/TRAFO/XX";
private static final String ACCOUNT_SMITH222_MAIL_USERNAME_AFTER_RENAME = "John Smither/222/TRAFO/XX";
protected static final File ROLE_EMPLOYEE_FILE = new File(TEST_DIR, "role-employee.xml");
protected static final String ROLE_EMPLOYEE_OID = "6de5ff6a-5b61-11e3-adc5-001e8c717e5b";
protected static final File RESOURCE_DUMMY_AD_FILE = new File(TEST_DIR, "resource-dummy-ad.xml");
protected static final String RESOURCE_DUMMY_AD_ID = "AD";
protected static final String RESOURCE_DUMMY_AD_OID = "14400000-0000-0000-0000-000000000003";
protected static final String RESOURCE_DUMMY_AD_NAMESPACE = MidPointConstants.NS_RI;
protected static final File RESOURCE_DUMMY_MAIL_FILE = new File(TEST_DIR, "resource-dummy-mail.xml");
protected static final String RESOURCE_DUMMY_MAIL_ID = "mail";
protected static final String RESOURCE_DUMMY_MAIL_OID = "14400000-0000-0000-0000-000000000001";
protected static final String RESOURCE_DUMMY_MAIL_NAMESPACE = MidPointConstants.NS_RI;
private static final String DUMMY_ACCOUNT_ATTRIBUTE_MAIL_FIRST_NAME_NAME = "FirstName";
private static final String DUMMY_ACCOUNT_ATTRIBUTE_MAIL_LAST_NAME_NAME = "LastName";
private static final String DUMMY_ACCOUNT_ATTRIBUTE_MAIL_SHORT_NAME_NAME = "ShortName";
private static final String DUMMY_ACCOUNT_ATTRIBUTE_MAIL_ID_FILE_NAME = "idFile";
private static final String DUMMY_ACCOUNT_ATTRIBUTE_MAIL_MAIL_TEMPLATE_NAME_NAME = "MailTemplateName";
private static final String DUMMY_ACCOUNT_ATTRIBUTE_MAIL_MAIL_FILE_NAME_NAME = "MailFile";
private static final String DUMMY_ACCOUNT_ATTRIBUTE_MAIL_MAIL_SYSTEM_NAME = "MailSystem";
private static final String DUMMY_ACCOUNT_ATTRIBUTE_MAIL_MAIL_DOMAIN_NAME = "MailDomain";
private static final String DUMMY_ACCOUNT_ATTRIBUTE_MAIL_MAIL_SERVER_NAME = "MailServer";
private static final String DUMMY_ACCOUNT_ATTRIBUTE_MAIL_INTERNET_ADDRESS_NAME = "InternetAddress";
protected static DummyResource dummyResourceAd;
protected static DummyResourceContoller dummyResourceCtlAd;
protected ResourceType resourceDummyAdType;
protected PrismObject<ResourceType> resourceDummyAd;
protected static DummyResource dummyResourceMail;
protected static DummyResourceContoller dummyResourceCtlMail;
protected ResourceType resourceDummyMailType;
protected PrismObject<ResourceType> resourceDummyMail;
private String jackAdIcfUid;
private String jackMailIcfUid;
private String angelicaAdIcfUid;
private String smith111MailIcfUid;
private String angelicaMailIcfUid;
private String smith111AdIcfUid;
private String smith222AdIcfUid;
private String smith222MailIcfUid;
@Override
public void initSystem(Task initTask, OperationResult initResult) throws Exception {
super.initSystem(initTask, initResult);
// Roles
repoAddObjectFromFile(ROLE_EMPLOYEE_FILE, initResult);
// Resources
dummyResourceCtlAd = DummyResourceContoller.create(RESOURCE_DUMMY_AD_ID, resourceDummyAd);
dummyResourceCtlAd.extendSchemaAd();
dummyResourceAd = dummyResourceCtlAd.getDummyResource();
resourceDummyAd = importAndGetObjectFromFile(ResourceType.class, RESOURCE_DUMMY_AD_FILE, RESOURCE_DUMMY_AD_OID, initTask, initResult);
resourceDummyAdType = resourceDummyAd.asObjectable();
dummyResourceCtlAd.setResource(resourceDummyAd);
dummyResourceCtlMail = DummyResourceContoller.create(RESOURCE_DUMMY_MAIL_ID, resourceDummyMail);
dummyResourceCtlMail.populateWithDefaultSchema();
DummyObjectClass dummyAdAccountObjectClass = dummyResourceCtlMail.getDummyResource().getAccountObjectClass();
dummyResourceCtlMail.addAttrDef(dummyAdAccountObjectClass, DUMMY_ACCOUNT_ATTRIBUTE_MAIL_FIRST_NAME_NAME, String.class, false, false);
dummyResourceCtlMail.addAttrDef(dummyAdAccountObjectClass, DUMMY_ACCOUNT_ATTRIBUTE_MAIL_LAST_NAME_NAME, String.class, false, false);
dummyResourceCtlMail.addAttrDef(dummyAdAccountObjectClass, DUMMY_ACCOUNT_ATTRIBUTE_MAIL_SHORT_NAME_NAME, String.class, false, true);
dummyResourceCtlMail.addAttrDef(dummyAdAccountObjectClass, DUMMY_ACCOUNT_ATTRIBUTE_MAIL_ID_FILE_NAME, String.class, false, false);
dummyResourceCtlMail.addAttrDef(dummyAdAccountObjectClass, DUMMY_ACCOUNT_ATTRIBUTE_MAIL_MAIL_TEMPLATE_NAME_NAME, String.class, false, false);
dummyResourceCtlMail.addAttrDef(dummyAdAccountObjectClass, DUMMY_ACCOUNT_ATTRIBUTE_MAIL_MAIL_FILE_NAME_NAME, String.class, false, false);
dummyResourceCtlMail.addAttrDef(dummyAdAccountObjectClass, DUMMY_ACCOUNT_ATTRIBUTE_MAIL_MAIL_SYSTEM_NAME, String.class, false, false);
dummyResourceCtlMail.addAttrDef(dummyAdAccountObjectClass, DUMMY_ACCOUNT_ATTRIBUTE_MAIL_MAIL_DOMAIN_NAME, String.class, false, false);
dummyResourceCtlMail.addAttrDef(dummyAdAccountObjectClass, DUMMY_ACCOUNT_ATTRIBUTE_MAIL_MAIL_SERVER_NAME, String.class, false, false);
dummyResourceCtlMail.addAttrDef(dummyAdAccountObjectClass, DUMMY_ACCOUNT_ATTRIBUTE_MAIL_INTERNET_ADDRESS_NAME, String.class, false, false);
dummyResourceMail = dummyResourceCtlMail.getDummyResource();
resourceDummyMail = importAndGetObjectFromFile(ResourceType.class, RESOURCE_DUMMY_MAIL_FILE, RESOURCE_DUMMY_MAIL_OID, initTask, initResult);
resourceDummyMailType = resourceDummyMail.asObjectable();
dummyResourceCtlMail.setResource(resourceDummyMail);
}
@Test
public void test000Sanity() throws Exception {
final String TEST_NAME = "test000Sanity";
TestUtil.displayTestTile(this, TEST_NAME);
Task task = taskManager.createTaskInstance(TestTrafo.class.getName() + "." + TEST_NAME);
OperationResult testResultAd = modelService.testResource(RESOURCE_DUMMY_AD_OID, task);
TestUtil.assertSuccess(testResultAd);
OperationResult testResultMail = modelService.testResource(RESOURCE_DUMMY_MAIL_OID, task);
TestUtil.assertSuccess(testResultMail);
waitForTaskStart(TASK_TRIGGER_SCANNER_OID, true);
waitForTaskStart(TASK_VALIDITY_SCANNER_OID, true);
}
@Test
public void test100JackAssignAccountAd() throws Exception {
final String TEST_NAME = "test100JackAssignAccountAd";
TestUtil.displayTestTile(this, TEST_NAME);
// GIVEN
Task task = taskManager.createTaskInstance(TestTrafo.class.getName() + "." + TEST_NAME);
OperationResult result = task.getResult();
dummyAuditService.clear();
// WHEN
TestUtil.displayWhen(TEST_NAME);
assignAccount(USER_JACK_OID, RESOURCE_DUMMY_AD_OID, null, task, result);
// THEN
TestUtil.displayThen(TEST_NAME);
result.computeStatus();
TestUtil.assertSuccess(result);
PrismObject<UserType> userJack = getUser(USER_JACK_OID);
display("User after change execution", userJack);
assertUserJack(userJack);
String accountOid = getSingleLinkRef(userJack).getOid();
// Check shadow
PrismObject<ShadowType> accountShadow = repositoryService.getObject(ShadowType.class, accountOid, null, result);
assertAccountShadowRepo(accountShadow, accountOid, ACCOUNT_JACK_AD_DN, resourceDummyAdType, caseIgnoreMatchingRule);
// Check account
PrismObject<ShadowType> accountModel = modelService.getObject(ShadowType.class, accountOid, null, task, result);
display("AD shadow", accountModel);
assertAccountShadowModel(accountModel, accountOid, ACCOUNT_JACK_AD_DN, resourceDummyAdType, caseIgnoreMatchingRule);
assertAdministrativeStatusEnabled(accountModel);
jackAdIcfUid = getIcfUid(accountModel);
// Check account in dummy resource
assertDummyAccountById(RESOURCE_DUMMY_AD_ID, jackAdIcfUid);
assertDummyAccount(RESOURCE_DUMMY_AD_ID, ACCOUNT_JACK_AD_DN);
assertDummyAccountActivation(RESOURCE_DUMMY_AD_ID, ACCOUNT_JACK_AD_DN, true);
assertDummyAccountAttribute(RESOURCE_DUMMY_AD_ID, ACCOUNT_JACK_AD_DN,
DummyResourceContoller.DUMMY_ACCOUNT_ATTRIBUTE_AD_SAM_ACCOUNT_NAME_NAME, ACCOUNT_JACK_AD_SAM_NAME);
assertDummyAccountAttribute(RESOURCE_DUMMY_AD_ID, ACCOUNT_JACK_AD_DN,
DummyResourceContoller.DUMMY_ACCOUNT_ATTRIBUTE_AD_USER_PRINCIPAL_NAME_NAME, ACCOUNT_JACK_AD_SAM_NAME + "@" + TRAFO_MAIL_DOMAIN);
assertDummyAccountAttribute(RESOURCE_DUMMY_AD_ID, ACCOUNT_JACK_AD_DN,
DummyResourceContoller.DUMMY_ACCOUNT_ATTRIBUTE_AD_GIVEN_NAME_NAME, "Jack");
assertDummyAccountAttribute(RESOURCE_DUMMY_AD_ID, ACCOUNT_JACK_AD_DN,
DummyResourceContoller.DUMMY_ACCOUNT_ATTRIBUTE_AD_SN_NAME, "Sparrow");
assertDummyAccountNoAttribute(RESOURCE_DUMMY_AD_ID, ACCOUNT_JACK_AD_DN, DummyResourceContoller.DUMMY_ACCOUNT_ATTRIBUTE_AD_MAIL_NAME);
assertDummyAccountAttribute(RESOURCE_DUMMY_AD_ID, ACCOUNT_JACK_AD_DN,
DummyResourceContoller.DUMMY_ACCOUNT_ATTRIBUTE_AD_TELEPHONE_NUMBER_NAME, "555-1234");
// Check audit
display("Audit", dummyAuditService);
dummyAuditService.assertRecords(2);
dummyAuditService.assertSimpleRecordSanity();
dummyAuditService.assertAnyRequestDeltas();
dummyAuditService.assertExecutionDeltas(3);
dummyAuditService.assertHasDelta(ChangeType.MODIFY, UserType.class);
dummyAuditService.assertHasDelta(ChangeType.ADD, ShadowType.class);
dummyAuditService.assertExecutionSuccess();
}
/**
* Account stays. Should be disabled.
*/
@Test
public void test105JackUnAssignAccountAd() throws Exception {
final String TEST_NAME = "test105JackUnAssignAccountAd";
TestUtil.displayTestTile(this, TEST_NAME);
// GIVEN
Task task = taskManager.createTaskInstance(TestTrafo.class.getName() + "." + TEST_NAME);
OperationResult result = task.getResult();
dummyAuditService.clear();
// WHEN
TestUtil.displayWhen(TEST_NAME);
unassignAccount(USER_JACK_OID, RESOURCE_DUMMY_AD_OID, null, task, result);
// THEN
TestUtil.displayThen(TEST_NAME);
result.computeStatus();
TestUtil.assertSuccess(result);
PrismObject<UserType> userJack = getUser(USER_JACK_OID);
display("User after change execution", userJack);
assertUserJack(userJack);
String accountOid = getSingleLinkRef(userJack).getOid();
// Check shadow
PrismObject<ShadowType> accountShadow = repositoryService.getObject(ShadowType.class, accountOid, null, result);
assertAccountShadowRepo(accountShadow, accountOid, ACCOUNT_JACK_AD_DN, resourceDummyAdType, caseIgnoreMatchingRule);
// Check account
PrismObject<ShadowType> accountModel = modelService.getObject(ShadowType.class, accountOid, null, task, result);
display("AD shadow", accountModel);
assertAccountShadowModel(accountModel, accountOid, ACCOUNT_JACK_AD_DN, resourceDummyAdType, caseIgnoreMatchingRule);
assertAdministrativeStatusDisabled(accountModel);
assertEquals("Jack AD ICF UID has changed", jackAdIcfUid, getIcfUid(accountModel));
// Check account in dummy resource
assertDummyAccountById(RESOURCE_DUMMY_AD_ID, jackAdIcfUid);
assertDummyAccount(RESOURCE_DUMMY_AD_ID, ACCOUNT_JACK_AD_DN);
assertDummyAccountActivation(RESOURCE_DUMMY_AD_ID, ACCOUNT_JACK_AD_DN, false);
assertDummyAccountAttribute(RESOURCE_DUMMY_AD_ID, ACCOUNT_JACK_AD_DN,
DummyResourceContoller.DUMMY_ACCOUNT_ATTRIBUTE_AD_SAM_ACCOUNT_NAME_NAME, ACCOUNT_JACK_AD_SAM_NAME);
assertDummyAccountAttribute(RESOURCE_DUMMY_AD_ID, ACCOUNT_JACK_AD_DN,
DummyResourceContoller.DUMMY_ACCOUNT_ATTRIBUTE_AD_USER_PRINCIPAL_NAME_NAME, ACCOUNT_JACK_AD_SAM_NAME + "@" + TRAFO_MAIL_DOMAIN);
assertDummyAccountAttribute(RESOURCE_DUMMY_AD_ID, ACCOUNT_JACK_AD_DN,
DummyResourceContoller.DUMMY_ACCOUNT_ATTRIBUTE_AD_GIVEN_NAME_NAME, "Jack");
assertDummyAccountAttribute(RESOURCE_DUMMY_AD_ID, ACCOUNT_JACK_AD_DN,
DummyResourceContoller.DUMMY_ACCOUNT_ATTRIBUTE_AD_SN_NAME, "Sparrow");
assertDummyAccountNoAttribute(RESOURCE_DUMMY_AD_ID, ACCOUNT_JACK_AD_DN, DummyResourceContoller.DUMMY_ACCOUNT_ATTRIBUTE_AD_MAIL_NAME);
assertDummyAccountAttribute(RESOURCE_DUMMY_AD_ID, ACCOUNT_JACK_AD_DN,
DummyResourceContoller.DUMMY_ACCOUNT_ATTRIBUTE_AD_TELEPHONE_NUMBER_NAME, "555-1234");
// Check audit
display("Audit", dummyAuditService);
dummyAuditService.assertRecords(2);
dummyAuditService.assertSimpleRecordSanity();
dummyAuditService.assertAnyRequestDeltas();
dummyAuditService.assertExecutionDeltas(2);
dummyAuditService.assertHasDelta(ChangeType.MODIFY, UserType.class);
dummyAuditService.assertHasDelta(ChangeType.MODIFY, ShadowType.class);
dummyAuditService.assertExecutionSuccess();
}
/**
* "Wait" a bit and the account should be gone.
*/
@Test
public void test109JackAccountAdGone() throws Exception {
final String TEST_NAME = "test109JackAccountAdGone";
TestUtil.displayTestTile(this, TEST_NAME);
// GIVEN
Task task = taskManager.createTaskInstance(TestTrafo.class.getName() + "." + TEST_NAME);
OperationResult result = task.getResult();
dummyAuditService.clear();
// WHEN
TestUtil.displayWhen(TEST_NAME);
clock.overrideDuration("P2D");
waitForTaskNextRunAssertSuccess(TASK_TRIGGER_SCANNER_OID, true);
// THEN
TestUtil.displayThen(TEST_NAME);
result.computeStatus();
TestUtil.assertSuccess(result);
PrismObject<UserType> userJack = getUser(USER_JACK_OID);
display("User after change execution", userJack);
assertUserJack(userJack);
assertLinks(userJack, 0);
// Check account in dummy resource
assertNoDummyAccountById(RESOURCE_DUMMY_AD_ID, jackAdIcfUid);
assertNoDummyAccount(RESOURCE_DUMMY_AD_ID, ACCOUNT_JACK_AD_DN);
// Check audit
display("Audit", dummyAuditService);
dummyAuditService.assertRecords(2);
dummyAuditService.assertSimpleRecordSanity();
dummyAuditService.assertExecutionDeltas(2);
dummyAuditService.assertHasDelta(ChangeType.MODIFY, UserType.class);
dummyAuditService.assertHasDelta(ChangeType.DELETE, ShadowType.class);
dummyAuditService.assertExecutionSuccess();
}
@Test
public void test120AJackssignAccountMail() throws Exception {
final String TEST_NAME = "test120JackAssignAccountMail";
TestUtil.displayTestTile(this, TEST_NAME);
// GIVEN
Task task = taskManager.createTaskInstance(TestTrafo.class.getName() + "." + TEST_NAME);
OperationResult result = task.getResult();
dummyAuditService.clear();
// WHEN
TestUtil.displayWhen(TEST_NAME);
assignAccount(USER_JACK_OID, RESOURCE_DUMMY_MAIL_OID, null, task, result);
// THEN
TestUtil.displayThen(TEST_NAME);
result.computeStatus();
TestUtil.assertSuccess(result);
PrismObject<UserType> userJack = getUser(USER_JACK_OID);
display("User after change execution", userJack);
assertUserJack(userJack);
String accountOid = getSingleLinkRef(userJack).getOid();
// Check shadow
PrismObject<ShadowType> accountShadow = repositoryService.getObject(ShadowType.class, accountOid, null, result);
assertAccountShadowRepo(accountShadow, accountOid, ACCOUNT_JACK_MAIL_USERNAME, resourceDummyMailType, caseIgnoreMatchingRule);
// Check account
PrismObject<ShadowType> accountModel = modelService.getObject(ShadowType.class, accountOid, null, task, result);
display("Mail shadow", accountModel);
assertAccountShadowModel(accountModel, accountOid, ACCOUNT_JACK_MAIL_USERNAME, resourceDummyMailType, caseIgnoreMatchingRule);
assertAdministrativeStatusEnabled(accountModel);
jackMailIcfUid = getIcfUid(accountModel);
// Check account in dummy resource
assertDummyAccountById(RESOURCE_DUMMY_MAIL_ID, jackMailIcfUid);
assertDummyAccount(RESOURCE_DUMMY_MAIL_ID, ACCOUNT_JACK_MAIL_USERNAME);
assertDummyAccountActivation(RESOURCE_DUMMY_MAIL_ID, ACCOUNT_JACK_MAIL_USERNAME, true);
assertDummyAccountAttribute(RESOURCE_DUMMY_MAIL_ID, ACCOUNT_JACK_MAIL_USERNAME,
DUMMY_ACCOUNT_ATTRIBUTE_MAIL_INTERNET_ADDRESS_NAME, "Jack.Sparrow@" + TRAFO_MAIL_DOMAIN);
assertDummyAccountAttribute(RESOURCE_DUMMY_MAIL_ID, ACCOUNT_JACK_MAIL_USERNAME,
DUMMY_ACCOUNT_ATTRIBUTE_MAIL_FIRST_NAME_NAME, "Jack");
assertDummyAccountAttribute(RESOURCE_DUMMY_MAIL_ID, ACCOUNT_JACK_MAIL_USERNAME,
DUMMY_ACCOUNT_ATTRIBUTE_MAIL_LAST_NAME_NAME, "Sparrow");
assertDummyAccountAttribute(RESOURCE_DUMMY_MAIL_ID, ACCOUNT_JACK_MAIL_USERNAME,
DUMMY_ACCOUNT_ATTRIBUTE_MAIL_ID_FILE_NAME, "c:\\install\\test-id-folder\\jsparrow.id");
assertDummyAccountAttribute(RESOURCE_DUMMY_MAIL_ID, ACCOUNT_JACK_MAIL_USERNAME,
DUMMY_ACCOUNT_ATTRIBUTE_MAIL_SHORT_NAME_NAME, USER_JACK_USERNAME);
assertDummyAccountAttribute(RESOURCE_DUMMY_MAIL_ID, ACCOUNT_JACK_MAIL_USERNAME,
DUMMY_ACCOUNT_ATTRIBUTE_MAIL_MAIL_FILE_NAME_NAME, "mail\\"+USER_JACK_USERNAME);
assertDummyAccountAttribute(RESOURCE_DUMMY_MAIL_ID, ACCOUNT_JACK_MAIL_USERNAME,
DUMMY_ACCOUNT_ATTRIBUTE_MAIL_MAIL_DOMAIN_NAME, "TRAFO");
// Set by inbound mappings
PrismAsserts.assertPropertyValue(userJack, UserType.F_EMAIL_ADDRESS, "Jack.Sparrow@" + TRAFO_MAIL_DOMAIN);
PrismAsserts.assertPropertyValue(userJack,
new ItemPath(UserType.F_EXTENSION, TRAFO_EXTENSION_HOMEDIR_QNAME), "c:\\install\\test-id-folder");
// Check audit
display("Audit", dummyAuditService);
dummyAuditService.assertRecords(3);
dummyAuditService.assertSimpleRecordSanity();
dummyAuditService.assertAnyRequestDeltas();
dummyAuditService.assertExecutionDeltas(0,3);
dummyAuditService.assertHasDelta(0,ChangeType.MODIFY, UserType.class);
dummyAuditService.assertHasDelta(0,ChangeType.ADD, ShadowType.class);
dummyAuditService.assertHasDelta(0,ChangeType.MODIFY, UserType.class);
// Inbound
dummyAuditService.assertExecutionDeltas(1,1);
dummyAuditService.assertHasDelta(1,ChangeType.MODIFY, UserType.class);
dummyAuditService.assertExecutionSuccess();
}
@Test
public void test125JackUnAssignAccountMail() throws Exception {
final String TEST_NAME = "test125JackUnAssignAccountMail";
TestUtil.displayTestTile(this, TEST_NAME);
// GIVEN
Task task = taskManager.createTaskInstance(TestTrafo.class.getName() + "." + TEST_NAME);
OperationResult result = task.getResult();
dummyAuditService.clear();
// WHEN
TestUtil.displayWhen(TEST_NAME);
unassignAccount(USER_JACK_OID, RESOURCE_DUMMY_MAIL_OID, null, task, result);
// THEN
TestUtil.displayThen(TEST_NAME);
result.computeStatus();
TestUtil.assertSuccess(result);
PrismObject<UserType> userJack = getUser(USER_JACK_OID);
display("User after change execution", userJack);
assertUserJack(userJack);
String accountOid = getSingleLinkRef(userJack).getOid();
// Check shadow
PrismObject<ShadowType> accountShadow = repositoryService.getObject(ShadowType.class, accountOid, null, result);
assertAccountShadowRepo(accountShadow, accountOid, ACCOUNT_JACK_MAIL_USERNAME, resourceDummyMailType, caseIgnoreMatchingRule);
// Check account
PrismObject<ShadowType> accountModel = modelService.getObject(ShadowType.class, accountOid, null, task, result);
display("Mail shadow", accountModel);
assertAccountShadowModel(accountModel, accountOid, ACCOUNT_JACK_MAIL_USERNAME, resourceDummyMailType, caseIgnoreMatchingRule);
assertAdministrativeStatusDisabled(accountModel);
assertEquals("Jack Mail ICF UID has changed", jackMailIcfUid, getIcfUid(accountModel));
// Check account in dummy resource
assertDummyAccountById(RESOURCE_DUMMY_MAIL_ID, jackMailIcfUid);
assertDummyAccount(RESOURCE_DUMMY_MAIL_ID, ACCOUNT_JACK_MAIL_USERNAME);
assertDummyAccountActivation(RESOURCE_DUMMY_MAIL_ID, ACCOUNT_JACK_MAIL_USERNAME, false);
assertDummyAccountAttribute(RESOURCE_DUMMY_MAIL_ID, ACCOUNT_JACK_MAIL_USERNAME,
DUMMY_ACCOUNT_ATTRIBUTE_MAIL_INTERNET_ADDRESS_NAME, "Jack.Sparrow@" + TRAFO_MAIL_DOMAIN);
assertDummyAccountAttribute(RESOURCE_DUMMY_MAIL_ID, ACCOUNT_JACK_MAIL_USERNAME,
DUMMY_ACCOUNT_ATTRIBUTE_MAIL_FIRST_NAME_NAME, "Jack");
assertDummyAccountAttribute(RESOURCE_DUMMY_MAIL_ID, ACCOUNT_JACK_MAIL_USERNAME,
DUMMY_ACCOUNT_ATTRIBUTE_MAIL_LAST_NAME_NAME, "Sparrow");
assertDummyAccountAttribute(RESOURCE_DUMMY_MAIL_ID, ACCOUNT_JACK_MAIL_USERNAME,
DUMMY_ACCOUNT_ATTRIBUTE_MAIL_ID_FILE_NAME, "c:\\install\\test-id-folder\\jsparrow.id");
assertDummyAccountAttribute(RESOURCE_DUMMY_MAIL_ID, ACCOUNT_JACK_MAIL_USERNAME,
DUMMY_ACCOUNT_ATTRIBUTE_MAIL_SHORT_NAME_NAME, USER_JACK_USERNAME);
assertDummyAccountAttribute(RESOURCE_DUMMY_MAIL_ID, ACCOUNT_JACK_MAIL_USERNAME,
DUMMY_ACCOUNT_ATTRIBUTE_MAIL_MAIL_FILE_NAME_NAME, "mail\\"+USER_JACK_USERNAME);
assertDummyAccountAttribute(RESOURCE_DUMMY_MAIL_ID, ACCOUNT_JACK_MAIL_USERNAME,
DUMMY_ACCOUNT_ATTRIBUTE_MAIL_MAIL_DOMAIN_NAME, "TRAFO");
// Set by inbound mappings
PrismAsserts.assertPropertyValue(userJack, UserType.F_EMAIL_ADDRESS, "Jack.Sparrow@" + TRAFO_MAIL_DOMAIN);
PrismAsserts.assertPropertyValue(userJack,
new ItemPath(UserType.F_EXTENSION, TRAFO_EXTENSION_HOMEDIR_QNAME), "c:\\install\\test-id-folder");
// Check audit
display("Audit", dummyAuditService);
dummyAuditService.assertRecords(2);
dummyAuditService.assertSimpleRecordSanity();
dummyAuditService.assertAnyRequestDeltas();
dummyAuditService.assertExecutionDeltas(2);
dummyAuditService.assertHasDelta(0,ChangeType.MODIFY, UserType.class);
dummyAuditService.assertHasDelta(0,ChangeType.MODIFY, ShadowType.class);
dummyAuditService.assertExecutionSuccess();
}
/**
* "Wait" a bit and the account should be gone.
*/
@Test
public void test129JackAccountMailGone() throws Exception {
final String TEST_NAME = "test129JackAccountMailGone";
TestUtil.displayTestTile(this, TEST_NAME);
// GIVEN
Task task = taskManager.createTaskInstance(TestTrafo.class.getName() + "." + TEST_NAME);
OperationResult result = task.getResult();
dummyAuditService.clear();
// WHEN
TestUtil.displayWhen(TEST_NAME);
clock.overrideDuration("P2D");
waitForTaskNextRunAssertSuccess(TASK_TRIGGER_SCANNER_OID, true);
// THEN
TestUtil.displayThen(TEST_NAME);
result.computeStatus();
TestUtil.assertSuccess(result);
PrismObject<UserType> userJack = getUser(USER_JACK_OID);
display("User after change execution", userJack);
assertUserJack(userJack);
assertLinks(userJack, 0);
// Check account in dummy resource
assertNoDummyAccountById(RESOURCE_DUMMY_MAIL_ID, jackMailIcfUid);
assertNoDummyAccount(RESOURCE_DUMMY_MAIL_ID, ACCOUNT_JACK_MAIL_USERNAME);
// Set by inbound mappings, this should stay
PrismAsserts.assertPropertyValue(userJack, UserType.F_EMAIL_ADDRESS, "Jack.Sparrow@" + TRAFO_MAIL_DOMAIN);
PrismAsserts.assertPropertyValue(userJack, TRAFO_EXTENSION_HOMEDIR_PATH, "c:\\install\\test-id-folder");
// Check audit
display("Audit", dummyAuditService);
dummyAuditService.assertRecords(2);
dummyAuditService.assertSimpleRecordSanity();
dummyAuditService.assertExecutionDeltas(2);
dummyAuditService.assertHasDelta(ChangeType.MODIFY, UserType.class);
dummyAuditService.assertHasDelta(ChangeType.DELETE, ShadowType.class);
dummyAuditService.assertExecutionSuccess();
// Clean up the data set by inbound. These could ruin next tests
modifyUserReplace(USER_JACK_OID, UserType.F_EMAIL_ADDRESS, task, result);
modifyUserReplace(USER_JACK_OID, TRAFO_EXTENSION_HOMEDIR_PATH, task, result);
userJack = getUser(USER_JACK_OID);
display("Clean jack", userJack);
}
@Test
public void test150JackAssignRoleEmployee() throws Exception {
final String TEST_NAME = "test150JackAssignRoleEmployee";
TestUtil.displayTestTile(this, TEST_NAME);
// GIVEN
Task task = taskManager.createTaskInstance(TestTrafo.class.getName() + "." + TEST_NAME);
OperationResult result = task.getResult();
dummyAuditService.clear();
// WHEN
TestUtil.displayWhen(TEST_NAME);
assignRole(USER_JACK_OID, ROLE_EMPLOYEE_OID, task, result);
// THEN
TestUtil.displayThen(TEST_NAME);
result.computeStatus();
TestUtil.assertSuccess(result);
PrismObject<UserType> userJack = getUser(USER_JACK_OID);
display("User after change execution", userJack);
assertUserJack(userJack);
assertLinks(userJack, 2);
String accountAdOid = getLinkRefOid(userJack, RESOURCE_DUMMY_AD_OID);
String accountMailOid = getLinkRefOid(userJack, RESOURCE_DUMMY_MAIL_OID);
// AD ACCOUNT
// Check shadow
PrismObject<ShadowType> accountAdShadow = repositoryService.getObject(ShadowType.class, accountAdOid, null, result);
assertAccountShadowRepo(accountAdShadow, accountAdOid, ACCOUNT_JACK_AD_DN, resourceDummyAdType, caseIgnoreMatchingRule);
// Check account
PrismObject<ShadowType> accountAdModel = modelService.getObject(ShadowType.class, accountAdOid, null, task, result);
display("AD shadow", accountAdModel);
assertAccountShadowModel(accountAdModel, accountAdOid, ACCOUNT_JACK_AD_DN, resourceDummyAdType, caseIgnoreMatchingRule);
assertAdministrativeStatusEnabled(accountAdModel);
jackAdIcfUid = getIcfUid(accountAdModel);
// Check account in dummy resource
assertDummyAccountById(RESOURCE_DUMMY_AD_ID, jackAdIcfUid);
assertDummyAccount(RESOURCE_DUMMY_AD_ID, ACCOUNT_JACK_AD_DN);
assertDummyAccountActivation(RESOURCE_DUMMY_AD_ID, ACCOUNT_JACK_AD_DN, true);
assertDummyAccountAttribute(RESOURCE_DUMMY_AD_ID, ACCOUNT_JACK_AD_DN,
DummyResourceContoller.DUMMY_ACCOUNT_ATTRIBUTE_AD_SAM_ACCOUNT_NAME_NAME, ACCOUNT_JACK_AD_SAM_NAME);
assertDummyAccountAttribute(RESOURCE_DUMMY_AD_ID, ACCOUNT_JACK_AD_DN,
DummyResourceContoller.DUMMY_ACCOUNT_ATTRIBUTE_AD_USER_PRINCIPAL_NAME_NAME, ACCOUNT_JACK_AD_SAM_NAME + "@" + TRAFO_MAIL_DOMAIN);
assertDummyAccountAttribute(RESOURCE_DUMMY_AD_ID, ACCOUNT_JACK_AD_DN,
DummyResourceContoller.DUMMY_ACCOUNT_ATTRIBUTE_AD_GIVEN_NAME_NAME, "Jack");
assertDummyAccountAttribute(RESOURCE_DUMMY_AD_ID, ACCOUNT_JACK_AD_DN,
DummyResourceContoller.DUMMY_ACCOUNT_ATTRIBUTE_AD_SN_NAME, "Sparrow");
assertDummyAccountAttribute(RESOURCE_DUMMY_AD_ID, ACCOUNT_JACK_AD_DN,
DummyResourceContoller.DUMMY_ACCOUNT_ATTRIBUTE_AD_MAIL_NAME, "Jack.Sparrow@" + TRAFO_MAIL_DOMAIN);
assertDummyAccountAttribute(RESOURCE_DUMMY_AD_ID, ACCOUNT_JACK_AD_DN,
DummyResourceContoller.DUMMY_ACCOUNT_ATTRIBUTE_AD_TELEPHONE_NUMBER_NAME, "555-1234");
// MAIL ACCOUNT
// Check shadow
PrismObject<ShadowType> accountMailShadow = repositoryService.getObject(ShadowType.class, accountMailOid, null, result);
assertAccountShadowRepo(accountMailShadow, accountMailOid, ACCOUNT_JACK_MAIL_USERNAME, resourceDummyMailType, caseIgnoreMatchingRule);
// Check account
PrismObject<ShadowType> accountMailModel = modelService.getObject(ShadowType.class, accountMailOid, null, task, result);
display("Mail shadow", accountMailModel);
assertAccountShadowModel(accountMailModel, accountMailOid, ACCOUNT_JACK_MAIL_USERNAME, resourceDummyMailType, caseIgnoreMatchingRule);
assertAdministrativeStatusEnabled(accountMailModel);
jackMailIcfUid = getIcfUid(accountMailModel);
// Check account in dummy resource
assertDummyAccountById(RESOURCE_DUMMY_MAIL_ID, jackMailIcfUid);
assertDummyAccount(RESOURCE_DUMMY_MAIL_ID, ACCOUNT_JACK_MAIL_USERNAME);
assertDummyAccountActivation(RESOURCE_DUMMY_MAIL_ID, ACCOUNT_JACK_MAIL_USERNAME, true);
assertDummyAccountAttribute(RESOURCE_DUMMY_MAIL_ID, ACCOUNT_JACK_MAIL_USERNAME,
DUMMY_ACCOUNT_ATTRIBUTE_MAIL_INTERNET_ADDRESS_NAME, "Jack.Sparrow@" + TRAFO_MAIL_DOMAIN);
assertDummyAccountAttribute(RESOURCE_DUMMY_MAIL_ID, ACCOUNT_JACK_MAIL_USERNAME,
DUMMY_ACCOUNT_ATTRIBUTE_MAIL_FIRST_NAME_NAME, "Jack");
assertDummyAccountAttribute(RESOURCE_DUMMY_MAIL_ID, ACCOUNT_JACK_MAIL_USERNAME,
DUMMY_ACCOUNT_ATTRIBUTE_MAIL_LAST_NAME_NAME, "Sparrow");
assertDummyAccountAttribute(RESOURCE_DUMMY_MAIL_ID, ACCOUNT_JACK_MAIL_USERNAME,
DUMMY_ACCOUNT_ATTRIBUTE_MAIL_ID_FILE_NAME, "c:\\install\\test-id-folder\\jsparrow.id");
assertDummyAccountAttribute(RESOURCE_DUMMY_MAIL_ID, ACCOUNT_JACK_MAIL_USERNAME,
DUMMY_ACCOUNT_ATTRIBUTE_MAIL_SHORT_NAME_NAME, USER_JACK_USERNAME);
assertDummyAccountAttribute(RESOURCE_DUMMY_MAIL_ID, ACCOUNT_JACK_MAIL_USERNAME,
DUMMY_ACCOUNT_ATTRIBUTE_MAIL_MAIL_FILE_NAME_NAME, "mail\\"+USER_JACK_USERNAME);
assertDummyAccountAttribute(RESOURCE_DUMMY_MAIL_ID, ACCOUNT_JACK_MAIL_USERNAME,
DUMMY_ACCOUNT_ATTRIBUTE_MAIL_MAIL_DOMAIN_NAME, "TRAFO");
// Set by inbound mappings
PrismAsserts.assertPropertyValue(userJack, UserType.F_EMAIL_ADDRESS, "Jack.Sparrow@" + TRAFO_MAIL_DOMAIN);
PrismAsserts.assertPropertyValue(userJack,
new ItemPath(UserType.F_EXTENSION, TRAFO_EXTENSION_HOMEDIR_QNAME), "c:\\install\\test-id-folder");
// Check audit
display("Audit", dummyAuditService);
dummyAuditService.assertRecords(4);
dummyAuditService.assertSimpleRecordSanity();
dummyAuditService.assertAnyRequestDeltas();
dummyAuditService.assertExecutionDeltas(0,3);
dummyAuditService.assertHasDelta(0,ChangeType.MODIFY, UserType.class); // primary, link (2 deltas)
dummyAuditService.assertHasDelta(0,ChangeType.ADD, ShadowType.class); // AD account
dummyAuditService.assertExecutionDeltas(1,2);
dummyAuditService.assertHasDelta(1,ChangeType.MODIFY, UserType.class); // link
dummyAuditService.assertHasDelta(1,ChangeType.ADD, ShadowType.class); // Mail account
dummyAuditService.assertExecutionDeltas(2,2);
dummyAuditService.assertHasDelta(2,ChangeType.MODIFY, UserType.class); // inbound
dummyAuditService.assertHasDelta(2,ChangeType.MODIFY, ShadowType.class); // AD account
dummyAuditService.assertExecutionSuccess();
}
/**
* Angelica pretends to be Jack Sparrow. She has the same first and last name. There is a naming conflict.
* The IDs and mail addresses should be correctly suffixed.
*/
@Test
public void test160AngelicaAdd() throws Exception {
final String TEST_NAME = "test160AngelicaAdd";
TestUtil.displayTestTile(this, TEST_NAME);
// GIVEN
Task task = taskManager.createTaskInstance(TestTrafo.class.getName() + "." + TEST_NAME);
OperationResult result = task.getResult();
dummyAuditService.clear();
// WHEN
TestUtil.displayWhen(TEST_NAME);
addObject(USER_ANGELICA_FILE);
// THEN
TestUtil.displayThen(TEST_NAME);
result.computeStatus();
TestUtil.assertSuccess(result);
PrismObject<UserType> userAngelica = getUser(USER_ANGELICA_OID);
display("User angelica after change execution", userAngelica);
assertUser(userAngelica, USER_ANGELICA_OID, USER_ANGELICA_USERNAME, "Jack Sparrow", "Jack", "Sparrow");
assertLinks(userAngelica, 2);
String accountAdOid = getLinkRefOid(userAngelica, RESOURCE_DUMMY_AD_OID);
String accountMailOid = getLinkRefOid(userAngelica, RESOURCE_DUMMY_MAIL_OID);
// AD ACCOUNT
// Check shadow
PrismObject<ShadowType> accountAdShadow = repositoryService.getObject(ShadowType.class, accountAdOid, null, result);
assertAccountShadowRepo(accountAdShadow, accountAdOid, ACCOUNT_ANGELICA_AD_DN, resourceDummyAdType, caseIgnoreMatchingRule);
// Check account
PrismObject<ShadowType> accountAdModel = modelService.getObject(ShadowType.class, accountAdOid, null, task, result);
display("AD shadow", accountAdModel);
assertAccountShadowModel(accountAdModel, accountAdOid, ACCOUNT_ANGELICA_AD_DN, resourceDummyAdType, caseIgnoreMatchingRule);
assertAdministrativeStatusEnabled(accountAdModel);
angelicaAdIcfUid = getIcfUid(accountAdModel);
// Check account in dummy resource
assertDummyAccountById(RESOURCE_DUMMY_AD_ID, angelicaAdIcfUid);
assertDummyAccount(RESOURCE_DUMMY_AD_ID, ACCOUNT_ANGELICA_AD_DN);
assertDummyAccountActivation(RESOURCE_DUMMY_AD_ID, ACCOUNT_ANGELICA_AD_DN, true);
assertDummyAccountAttribute(RESOURCE_DUMMY_AD_ID, ACCOUNT_ANGELICA_AD_DN,
DummyResourceContoller.DUMMY_ACCOUNT_ATTRIBUTE_AD_SAM_ACCOUNT_NAME_NAME, ACCOUNT_ANGELICA_AD_SAM_NAME);
assertDummyAccountAttribute(RESOURCE_DUMMY_AD_ID, ACCOUNT_ANGELICA_AD_DN,
DummyResourceContoller.DUMMY_ACCOUNT_ATTRIBUTE_AD_USER_PRINCIPAL_NAME_NAME, ACCOUNT_ANGELICA_AD_SAM_NAME + "@" + TRAFO_MAIL_DOMAIN);
assertDummyAccountAttribute(RESOURCE_DUMMY_AD_ID, ACCOUNT_ANGELICA_AD_DN,
DummyResourceContoller.DUMMY_ACCOUNT_ATTRIBUTE_AD_GIVEN_NAME_NAME, "Jack");
assertDummyAccountAttribute(RESOURCE_DUMMY_AD_ID, ACCOUNT_ANGELICA_AD_DN,
DummyResourceContoller.DUMMY_ACCOUNT_ATTRIBUTE_AD_SN_NAME, "Sparrow");
assertDummyAccountAttribute(RESOURCE_DUMMY_AD_ID, ACCOUNT_ANGELICA_AD_DN,
DummyResourceContoller.DUMMY_ACCOUNT_ATTRIBUTE_AD_MAIL_NAME, "Jack.Sparrow2@" + TRAFO_MAIL_DOMAIN);
assertDummyAccountNoAttribute(RESOURCE_DUMMY_AD_ID, ACCOUNT_ANGELICA_AD_DN,
DummyResourceContoller.DUMMY_ACCOUNT_ATTRIBUTE_AD_TELEPHONE_NUMBER_NAME);
// MAIL ACCOUNT
// Check shadow
PrismObject<ShadowType> accountMailShadow = repositoryService.getObject(ShadowType.class, accountMailOid, null, result);
assertAccountShadowRepo(accountMailShadow, accountMailOid, ACCOUNT_ANGELICA_MAIL_USERNAME, resourceDummyMailType, caseIgnoreMatchingRule);
// Check account
PrismObject<ShadowType> accountMailModel = modelService.getObject(ShadowType.class, accountMailOid, null, task, result);
display("Mail shadow", accountMailModel);
assertAccountShadowModel(accountMailModel, accountMailOid, ACCOUNT_ANGELICA_MAIL_USERNAME, resourceDummyMailType, caseIgnoreMatchingRule);
assertAdministrativeStatusEnabled(accountMailModel);
angelicaMailIcfUid = getIcfUid(accountMailModel);
// Check account in dummy resource
assertDummyAccountById(RESOURCE_DUMMY_MAIL_ID, angelicaMailIcfUid);
assertDummyAccount(RESOURCE_DUMMY_MAIL_ID, ACCOUNT_ANGELICA_MAIL_USERNAME);
assertDummyAccountActivation(RESOURCE_DUMMY_MAIL_ID, ACCOUNT_ANGELICA_MAIL_USERNAME, true);
assertDummyAccountAttribute(RESOURCE_DUMMY_MAIL_ID, ACCOUNT_ANGELICA_MAIL_USERNAME,
DUMMY_ACCOUNT_ATTRIBUTE_MAIL_INTERNET_ADDRESS_NAME, "Jack.Sparrow2@" + TRAFO_MAIL_DOMAIN);
assertDummyAccountAttribute(RESOURCE_DUMMY_MAIL_ID, ACCOUNT_ANGELICA_MAIL_USERNAME,
DUMMY_ACCOUNT_ATTRIBUTE_MAIL_FIRST_NAME_NAME, "Jack");
assertDummyAccountAttribute(RESOURCE_DUMMY_MAIL_ID, ACCOUNT_ANGELICA_MAIL_USERNAME,
DUMMY_ACCOUNT_ATTRIBUTE_MAIL_LAST_NAME_NAME, "Sparrow2");
assertDummyAccountAttribute(RESOURCE_DUMMY_MAIL_ID, ACCOUNT_ANGELICA_MAIL_USERNAME,
DUMMY_ACCOUNT_ATTRIBUTE_MAIL_ID_FILE_NAME, "c:\\install\\test-id-folder\\jsparrow2.id");
assertDummyAccountAttribute(RESOURCE_DUMMY_MAIL_ID, ACCOUNT_ANGELICA_MAIL_USERNAME,
DUMMY_ACCOUNT_ATTRIBUTE_MAIL_SHORT_NAME_NAME, USER_ANGELICA_USERNAME + "2");
assertDummyAccountAttribute(RESOURCE_DUMMY_MAIL_ID, ACCOUNT_ANGELICA_MAIL_USERNAME,
DUMMY_ACCOUNT_ATTRIBUTE_MAIL_MAIL_FILE_NAME_NAME, "mail\\"+USER_ANGELICA_USERNAME+ "2");
assertDummyAccountAttribute(RESOURCE_DUMMY_MAIL_ID, ACCOUNT_ANGELICA_MAIL_USERNAME,
DUMMY_ACCOUNT_ATTRIBUTE_MAIL_MAIL_DOMAIN_NAME, "TRAFO");
// Set by inbound mappings
PrismAsserts.assertPropertyValue(userAngelica, UserType.F_EMAIL_ADDRESS, "Jack.Sparrow2@" + TRAFO_MAIL_DOMAIN);
PrismAsserts.assertPropertyValue(userAngelica,
new ItemPath(UserType.F_EXTENSION, TRAFO_EXTENSION_HOMEDIR_QNAME), "c:\\install\\test-id-folder");
// Check audit
display("Audit", dummyAuditService);
dummyAuditService.assertRecords(4);
dummyAuditService.assertSimpleRecordSanity();
dummyAuditService.assertAnyRequestDeltas();
dummyAuditService.assertExecutionDeltas(0, 3);
dummyAuditService.assertHasDelta(0, ChangeType.ADD, UserType.class); // primary
dummyAuditService.assertHasDelta(0,ChangeType.MODIFY, UserType.class); // link
dummyAuditService.assertHasDelta(0,ChangeType.ADD, ShadowType.class); // AD account
dummyAuditService.assertExecutionDeltas(1, 2);
dummyAuditService.assertHasDelta(1, ChangeType.MODIFY, UserType.class); // link
dummyAuditService.assertHasDelta(1,ChangeType.ADD, ShadowType.class); // Mail account
dummyAuditService.assertExecutionDeltas(2, 2);
dummyAuditService.assertHasDelta(2, ChangeType.MODIFY, UserType.class); // link
dummyAuditService.assertHasDelta(2,ChangeType.MODIFY, ShadowType.class); // AD account
dummyAuditService.assertExecutionSuccess();
}
/**
* Attempt to add two employees that are boh "John Smith". This is the first user. Everything shouyld do as normal.
* Note: this is a different case than jack-angelica. Jack and Angelica are "externists". Smithes are employees (type "T")
*/
@Test
public void test200Smith111Add() throws Exception {
final String TEST_NAME = "test200Smith111Add";
TestUtil.displayTestTile(this, TEST_NAME);
// GIVEN
Task task = taskManager.createTaskInstance(TestTrafo.class.getName() + "." + TEST_NAME);
OperationResult result = task.getResult();
dummyAuditService.clear();
// WHEN
TestUtil.displayWhen(TEST_NAME);
addObject(USER_SMITH111_FILE);
// THEN
TestUtil.displayThen(TEST_NAME);
result.computeStatus();
TestUtil.assertSuccess(result);
PrismObject<UserType> userSmith = getUser(USER_SMITH111_OID);
display("User smith111 after change execution", userSmith);
assertUser(userSmith, USER_SMITH111_OID, USER_SMITH111_USERNAME, "John Smith", "John", "Smith");
assertLinks(userSmith, 2);
String accountAdOid = getLinkRefOid(userSmith, RESOURCE_DUMMY_AD_OID);
String accountMailOid = getLinkRefOid(userSmith, RESOURCE_DUMMY_MAIL_OID);
// AD ACCOUNT
// Check shadow
PrismObject<ShadowType> accountAdShadow = repositoryService.getObject(ShadowType.class, accountAdOid, null, result);
assertAccountShadowRepo(accountAdShadow, accountAdOid, ACCOUNT_SMITH111_AD_DN, resourceDummyAdType, caseIgnoreMatchingRule);
// Check account
PrismObject<ShadowType> accountAdModel = modelService.getObject(ShadowType.class, accountAdOid, null, task, result);
display("AD shadow", accountAdModel);
assertAccountShadowModel(accountAdModel, accountAdOid, ACCOUNT_SMITH111_AD_DN, resourceDummyAdType, caseIgnoreMatchingRule);
assertAdministrativeStatusEnabled(accountAdModel);
smith111AdIcfUid = getIcfUid(accountAdModel);
// Check account in dummy resource
assertDummyAccountById(RESOURCE_DUMMY_AD_ID, smith111AdIcfUid);
assertDummyAccount(RESOURCE_DUMMY_AD_ID, ACCOUNT_SMITH111_AD_DN);
assertDummyAccountActivation(RESOURCE_DUMMY_AD_ID, ACCOUNT_SMITH111_AD_DN, true);
assertDummyAccountAttribute(RESOURCE_DUMMY_AD_ID, ACCOUNT_SMITH111_AD_DN,
DummyResourceContoller.DUMMY_ACCOUNT_ATTRIBUTE_AD_SAM_ACCOUNT_NAME_NAME, ACCOUNT_SMITH111_AD_SAM_NAME);
assertDummyAccountAttribute(RESOURCE_DUMMY_AD_ID, ACCOUNT_SMITH111_AD_DN,
DummyResourceContoller.DUMMY_ACCOUNT_ATTRIBUTE_AD_USER_PRINCIPAL_NAME_NAME, ACCOUNT_SMITH111_AD_SAM_NAME + "@" + TRAFO_MAIL_DOMAIN);
assertDummyAccountAttribute(RESOURCE_DUMMY_AD_ID, ACCOUNT_SMITH111_AD_DN,
DummyResourceContoller.DUMMY_ACCOUNT_ATTRIBUTE_AD_GIVEN_NAME_NAME, "John");
assertDummyAccountAttribute(RESOURCE_DUMMY_AD_ID, ACCOUNT_SMITH111_AD_DN,
DummyResourceContoller.DUMMY_ACCOUNT_ATTRIBUTE_AD_SN_NAME, "Smith");
assertDummyAccountAttribute(RESOURCE_DUMMY_AD_ID, ACCOUNT_SMITH111_AD_DN,
DummyResourceContoller.DUMMY_ACCOUNT_ATTRIBUTE_AD_MAIL_NAME, "John.Smith@" + TRAFO_MAIL_DOMAIN);
assertDummyAccountNoAttribute(RESOURCE_DUMMY_AD_ID, ACCOUNT_SMITH111_AD_DN,
DummyResourceContoller.DUMMY_ACCOUNT_ATTRIBUTE_AD_TELEPHONE_NUMBER_NAME);
assertDummyAccountAttribute(RESOURCE_DUMMY_AD_ID, ACCOUNT_SMITH111_AD_DN,
DummyResourceContoller.DUMMY_ACCOUNT_ATTRIBUTE_AD_USER_SHARED_FOLDER_OTHER_NAME, "\\\\medusa\\User\\Smith_smith111");
// MAIL ACCOUNT
// Check shadow
PrismObject<ShadowType> accountMailShadow = repositoryService.getObject(ShadowType.class, accountMailOid, null, result);
assertAccountShadowRepo(accountMailShadow, accountMailOid, ACCOUNT_SMITH111_MAIL_USERNAME, resourceDummyMailType, caseIgnoreMatchingRule);
// Check account
PrismObject<ShadowType> accountMailModel = modelService.getObject(ShadowType.class, accountMailOid, null, task, result);
display("Mail shadow", accountMailModel);
assertAccountShadowModel(accountMailModel, accountMailOid, ACCOUNT_SMITH111_MAIL_USERNAME, resourceDummyMailType, caseIgnoreMatchingRule);
assertAdministrativeStatusEnabled(accountMailModel);
smith111MailIcfUid = getIcfUid(accountMailModel);
// Check account in dummy resource
assertDummyAccountById(RESOURCE_DUMMY_MAIL_ID, smith111MailIcfUid);
assertDummyAccount(RESOURCE_DUMMY_MAIL_ID, ACCOUNT_SMITH111_MAIL_USERNAME);
assertDummyAccountActivation(RESOURCE_DUMMY_MAIL_ID, ACCOUNT_SMITH111_MAIL_USERNAME, true);
assertDummyAccountAttribute(RESOURCE_DUMMY_MAIL_ID, ACCOUNT_SMITH111_MAIL_USERNAME,
DUMMY_ACCOUNT_ATTRIBUTE_MAIL_INTERNET_ADDRESS_NAME, "John.Smith@" + TRAFO_MAIL_DOMAIN);
assertDummyAccountAttribute(RESOURCE_DUMMY_MAIL_ID, ACCOUNT_SMITH111_MAIL_USERNAME,
DUMMY_ACCOUNT_ATTRIBUTE_MAIL_FIRST_NAME_NAME, "John");
assertDummyAccountAttribute(RESOURCE_DUMMY_MAIL_ID, ACCOUNT_SMITH111_MAIL_USERNAME,
DUMMY_ACCOUNT_ATTRIBUTE_MAIL_LAST_NAME_NAME, "Smith");
assertDummyAccountAttribute(RESOURCE_DUMMY_MAIL_ID, ACCOUNT_SMITH111_MAIL_USERNAME,
DUMMY_ACCOUNT_ATTRIBUTE_MAIL_ID_FILE_NAME, "c:\\install\\test-id-folder\\jsmith.id");
assertDummyAccountAttribute(RESOURCE_DUMMY_MAIL_ID, ACCOUNT_SMITH111_MAIL_USERNAME,
DUMMY_ACCOUNT_ATTRIBUTE_MAIL_SHORT_NAME_NAME, "PS111", "jsmith");
assertDummyAccountAttribute(RESOURCE_DUMMY_MAIL_ID, ACCOUNT_SMITH111_MAIL_USERNAME,
DUMMY_ACCOUNT_ATTRIBUTE_MAIL_MAIL_FILE_NAME_NAME, "mail\\js111");
assertDummyAccountAttribute(RESOURCE_DUMMY_MAIL_ID, ACCOUNT_SMITH111_MAIL_USERNAME,
DUMMY_ACCOUNT_ATTRIBUTE_MAIL_MAIL_DOMAIN_NAME, "TRAFO");
// Set by inbound mappings
PrismAsserts.assertPropertyValue(userSmith, UserType.F_EMAIL_ADDRESS, "John.Smith@" + TRAFO_MAIL_DOMAIN);
PrismAsserts.assertPropertyValue(userSmith,
new ItemPath(UserType.F_EXTENSION, TRAFO_EXTENSION_HOMEDIR_QNAME), "\\\\medusa\\User\\Smith_smith111");
// Check audit
display("Audit", dummyAuditService);
dummyAuditService.assertRecords(5);
dummyAuditService.assertSimpleRecordSanity();
dummyAuditService.assertAnyRequestDeltas();
dummyAuditService.assertExecutionDeltas(0,3);
dummyAuditService.assertHasDelta(0,ChangeType.ADD, UserType.class); // primary
dummyAuditService.assertHasDelta(0,ChangeType.MODIFY, UserType.class); // link
dummyAuditService.assertHasDelta(0,ChangeType.ADD, ShadowType.class); // AD account
dummyAuditService.assertExecutionDeltas(1,3);
dummyAuditService.assertHasDelta(1,ChangeType.MODIFY, UserType.class); // link, inbound (2 deltas)
dummyAuditService.assertHasDelta(1,ChangeType.ADD, ShadowType.class); // Mail account
dummyAuditService.assertExecutionDeltas(2,2);
dummyAuditService.assertHasDelta(2,ChangeType.MODIFY, UserType.class); // inbound
dummyAuditService.assertHasDelta(2,ChangeType.MODIFY, ShadowType.class); // AD account
dummyAuditService.assertExecutionDeltas(3,1);
dummyAuditService.assertHasDelta(3,ChangeType.MODIFY, UserType.class); // inbound - SHOULD THIS BE HERE?? FIXME
dummyAuditService.assertExecutionSuccess();
}
/**
* Attempt to add two employees that are boh "John Smith". This is the second user. There should be a naming conflict.
* Note: this is a different case than jack-angelica. Jack and Angelica are "externists". Smithes are employees (type "T")
*/
@Test
public void test210Smith222Add() throws Exception {
final String TEST_NAME = "test210Smith222Add";
TestUtil.displayTestTile(this, TEST_NAME);
// GIVEN
Task task = taskManager.createTaskInstance(TestTrafo.class.getName() + "." + TEST_NAME);
OperationResult result = task.getResult();
dummyAuditService.clear();
// WHEN
TestUtil.displayWhen(TEST_NAME);
addObject(USER_SMITH222_FILE);
// THEN
TestUtil.displayThen(TEST_NAME);
result.computeStatus();
TestUtil.assertSuccess(result);
PrismObject<UserType> userSmith = getUser(USER_SMITH222_OID);
display("User smith222 after change execution", userSmith);
assertUser(userSmith, USER_SMITH222_OID, USER_SMITH222_USERNAME, "John Smith", "John", "Smith");
assertLinks(userSmith, 2);
String accountAdOid = getLinkRefOid(userSmith, RESOURCE_DUMMY_AD_OID);
String accountMailOid = getLinkRefOid(userSmith, RESOURCE_DUMMY_MAIL_OID);
// AD ACCOUNT
// Check shadow
PrismObject<ShadowType> accountAdShadow = repositoryService.getObject(ShadowType.class, accountAdOid, null, result);
assertAccountShadowRepo(accountAdShadow, accountAdOid, ACCOUNT_SMITH222_AD_DN, resourceDummyAdType, caseIgnoreMatchingRule);
// Check account
PrismObject<ShadowType> accountAdModel = modelService.getObject(ShadowType.class, accountAdOid, null, task, result);
display("AD shadow", accountAdModel);
assertAccountShadowModel(accountAdModel, accountAdOid, ACCOUNT_SMITH222_AD_DN, resourceDummyAdType, caseIgnoreMatchingRule);
assertAdministrativeStatusEnabled(accountAdModel);
smith222AdIcfUid = getIcfUid(accountAdModel);
// Check account in dummy resource
assertDummyAccountById(RESOURCE_DUMMY_AD_ID, smith222AdIcfUid);
assertDummyAccount(RESOURCE_DUMMY_AD_ID, ACCOUNT_SMITH222_AD_DN);
assertDummyAccountActivation(RESOURCE_DUMMY_AD_ID, ACCOUNT_SMITH222_AD_DN, true);
assertDummyAccountAttribute(RESOURCE_DUMMY_AD_ID, ACCOUNT_SMITH222_AD_DN,
DummyResourceContoller.DUMMY_ACCOUNT_ATTRIBUTE_AD_SAM_ACCOUNT_NAME_NAME, ACCOUNT_SMITH222_AD_SAM_NAME);
assertDummyAccountAttribute(RESOURCE_DUMMY_AD_ID, ACCOUNT_SMITH222_AD_DN,
DummyResourceContoller.DUMMY_ACCOUNT_ATTRIBUTE_AD_USER_PRINCIPAL_NAME_NAME, ACCOUNT_SMITH222_AD_SAM_NAME + "@" + TRAFO_MAIL_DOMAIN);
assertDummyAccountAttribute(RESOURCE_DUMMY_AD_ID, ACCOUNT_SMITH222_AD_DN,
DummyResourceContoller.DUMMY_ACCOUNT_ATTRIBUTE_AD_GIVEN_NAME_NAME, "John");
assertDummyAccountAttribute(RESOURCE_DUMMY_AD_ID, ACCOUNT_SMITH222_AD_DN,
DummyResourceContoller.DUMMY_ACCOUNT_ATTRIBUTE_AD_SN_NAME, "Smith");
assertDummyAccountAttribute(RESOURCE_DUMMY_AD_ID, ACCOUNT_SMITH222_AD_DN,
DummyResourceContoller.DUMMY_ACCOUNT_ATTRIBUTE_AD_MAIL_NAME, "John.Smith2@" + TRAFO_MAIL_DOMAIN);
assertDummyAccountNoAttribute(RESOURCE_DUMMY_AD_ID, ACCOUNT_SMITH222_AD_DN,
DummyResourceContoller.DUMMY_ACCOUNT_ATTRIBUTE_AD_TELEPHONE_NUMBER_NAME);
assertDummyAccountAttribute(RESOURCE_DUMMY_AD_ID, ACCOUNT_SMITH222_AD_DN,
DummyResourceContoller.DUMMY_ACCOUNT_ATTRIBUTE_AD_USER_SHARED_FOLDER_OTHER_NAME, "\\\\medusa\\User\\Smith_smith222");
// MAIL ACCOUNT
// Check shadow
PrismObject<ShadowType> accountMailShadow = repositoryService.getObject(ShadowType.class, accountMailOid, null, result);
assertAccountShadowRepo(accountMailShadow, accountMailOid, ACCOUNT_SMITH222_MAIL_USERNAME, resourceDummyMailType, caseIgnoreMatchingRule);
// Check account
PrismObject<ShadowType> accountMailModel = modelService.getObject(ShadowType.class, accountMailOid, null, task, result);
display("Mail shadow", accountMailModel);
assertAccountShadowModel(accountMailModel, accountMailOid, ACCOUNT_SMITH222_MAIL_USERNAME, resourceDummyMailType, caseIgnoreMatchingRule);
assertAdministrativeStatusEnabled(accountMailModel);
smith222MailIcfUid = getIcfUid(accountMailModel);
// Check account in dummy resource
assertDummyAccountById(RESOURCE_DUMMY_MAIL_ID, smith222MailIcfUid);
assertDummyAccount(RESOURCE_DUMMY_MAIL_ID, ACCOUNT_SMITH222_MAIL_USERNAME);
assertDummyAccountActivation(RESOURCE_DUMMY_MAIL_ID, ACCOUNT_SMITH222_MAIL_USERNAME, true);
assertDummyAccountAttribute(RESOURCE_DUMMY_MAIL_ID, ACCOUNT_SMITH222_MAIL_USERNAME,
DUMMY_ACCOUNT_ATTRIBUTE_MAIL_INTERNET_ADDRESS_NAME, "John.Smith2@" + TRAFO_MAIL_DOMAIN);
assertDummyAccountAttribute(RESOURCE_DUMMY_MAIL_ID, ACCOUNT_SMITH222_MAIL_USERNAME,
DUMMY_ACCOUNT_ATTRIBUTE_MAIL_FIRST_NAME_NAME, "John");
assertDummyAccountAttribute(RESOURCE_DUMMY_MAIL_ID, ACCOUNT_SMITH222_MAIL_USERNAME,
DUMMY_ACCOUNT_ATTRIBUTE_MAIL_LAST_NAME_NAME, "Smith2");
assertDummyAccountAttribute(RESOURCE_DUMMY_MAIL_ID, ACCOUNT_SMITH222_MAIL_USERNAME,
DUMMY_ACCOUNT_ATTRIBUTE_MAIL_ID_FILE_NAME, "c:\\install\\test-id-folder\\jsmith2.id");
assertDummyAccountAttribute(RESOURCE_DUMMY_MAIL_ID, ACCOUNT_SMITH222_MAIL_USERNAME,
DUMMY_ACCOUNT_ATTRIBUTE_MAIL_SHORT_NAME_NAME, "PS222", "jsmith2");
assertDummyAccountAttribute(RESOURCE_DUMMY_MAIL_ID, ACCOUNT_SMITH222_MAIL_USERNAME,
DUMMY_ACCOUNT_ATTRIBUTE_MAIL_MAIL_FILE_NAME_NAME, "mail\\js222");
assertDummyAccountAttribute(RESOURCE_DUMMY_MAIL_ID, ACCOUNT_SMITH222_MAIL_USERNAME,
DUMMY_ACCOUNT_ATTRIBUTE_MAIL_MAIL_DOMAIN_NAME, "TRAFO");
// Set by inbound mappings
PrismAsserts.assertPropertyValue(userSmith, UserType.F_EMAIL_ADDRESS, "John.Smith2@" + TRAFO_MAIL_DOMAIN);
PrismAsserts.assertPropertyValue(userSmith,
new ItemPath(UserType.F_EXTENSION, TRAFO_EXTENSION_HOMEDIR_QNAME), "\\\\medusa\\User\\Smith_smith222");
// Check audit
display("Audit", dummyAuditService);
dummyAuditService.assertRecords(5);
dummyAuditService.assertSimpleRecordSanity();
dummyAuditService.assertAnyRequestDeltas();
dummyAuditService.assertExecutionDeltas(0,3);
dummyAuditService.assertHasDelta(0,ChangeType.ADD, UserType.class); // primary
dummyAuditService.assertHasDelta(0,ChangeType.MODIFY, UserType.class); // link
dummyAuditService.assertHasDelta(0,ChangeType.ADD, ShadowType.class); // AD account
dummyAuditService.assertExecutionDeltas(1,3);
dummyAuditService.assertHasDelta(1,ChangeType.MODIFY, UserType.class); // link, inbound (2 deltas)
dummyAuditService.assertHasDelta(1,ChangeType.ADD, ShadowType.class); // Mail account
dummyAuditService.assertExecutionDeltas(2,2);
dummyAuditService.assertHasDelta(2,ChangeType.MODIFY, UserType.class); // inbound
dummyAuditService.assertHasDelta(2,ChangeType.MODIFY, ShadowType.class); // AD account
dummyAuditService.assertExecutionDeltas(3,1);
dummyAuditService.assertHasDelta(3,ChangeType.MODIFY, UserType.class); // inbound - SHOULD THIS BE HERE?? FIXME
dummyAuditService.assertExecutionSuccess();
}
/**
* Attempt to rename two employees that are boh "John Smith". This is the first user. Everything shouyld do as normal.
* Note: this is a different case than jack-angelica. Jack and Angelica are "externists". Smithes are employees (type "T")
*/
@Test
public void test300Smith111Rename() throws Exception {
final String TEST_NAME = "test300Smith111Rename";
TestUtil.displayTestTile(this, TEST_NAME);
// GIVEN
Task task = taskManager.createTaskInstance(TestTrafo.class.getName() + "." + TEST_NAME);
OperationResult result = task.getResult();
dummyAuditService.clear();
// WHEN
TestUtil.displayWhen(TEST_NAME);
// addObject(USER_SMITH111_FILE);
// TestUtil.displayThen(TEST_NAME);
// result.computeStatus();
// TestUtil.assertSuccess(result);
PrismObject<UserType> userSmith = getUser(USER_SMITH111_OID);
display("User smith111 before change execution", userSmith);
assertUser(userSmith, USER_SMITH111_OID, USER_SMITH111_USERNAME, "John Smith", "John", "Smith");
assertLinks(userSmith, 2);
String accountAdOid = getLinkRefOid(userSmith, RESOURCE_DUMMY_AD_OID);
String accountMailOid = getLinkRefOid(userSmith, RESOURCE_DUMMY_MAIL_OID);
// THEN
TestUtil.displayThen(TEST_NAME);
result.computeStatus();
TestUtil.assertSuccess(result);
Collection<? extends ItemDelta> fullNameModification = PropertyDelta.createModificationReplacePropertyCollection(UserType.F_FAMILY_NAME, userSmith.getDefinition(), new PolyString("Smither", "smither"));
ObjectDelta.createModifyDelta(userSmith.getOid(), fullNameModification, UserType.class, prismContext);
modifyUserReplace(userSmith.getOid(), UserType.F_FAMILY_NAME, task, result, new PolyString("Smither", "smither"));
// AD ACCOUNT
// Check shadow
PrismObject<ShadowType> accountAdShadow = repositoryService.getObject(ShadowType.class, accountAdOid, null, result);
display("AD shadow", accountAdShadow);
assertAccountShadowRepo(accountAdShadow, accountAdOid, ACCOUNT_SMITH111_AD_DN_AFTER_RENAME, resourceDummyAdType, caseIgnoreMatchingRule);
// Check account
PrismObject<ShadowType> accountAdModel = modelService.getObject(ShadowType.class, accountAdOid, null, task, result);
display("AD shadow", accountAdModel);
assertAccountShadowModel(accountAdModel, accountAdOid, ACCOUNT_SMITH111_AD_DN_AFTER_RENAME, resourceDummyAdType, caseIgnoreMatchingRule);
assertAdministrativeStatusEnabled(accountAdModel);
smith111AdIcfUid = getIcfUid(accountAdModel);
// Check account in dummy resource
assertDummyAccountById(RESOURCE_DUMMY_AD_ID, smith111AdIcfUid);
assertDummyAccount(RESOURCE_DUMMY_AD_ID, ACCOUNT_SMITH111_AD_DN_AFTER_RENAME);
assertDummyAccountActivation(RESOURCE_DUMMY_AD_ID, ACCOUNT_SMITH111_AD_DN_AFTER_RENAME, true);
assertDummyAccountAttribute(RESOURCE_DUMMY_AD_ID, ACCOUNT_SMITH111_AD_DN_AFTER_RENAME,
DummyResourceContoller.DUMMY_ACCOUNT_ATTRIBUTE_AD_SAM_ACCOUNT_NAME_NAME, ACCOUNT_SMITH111_AD_SAM_NAME);
assertDummyAccountAttribute(RESOURCE_DUMMY_AD_ID, ACCOUNT_SMITH111_AD_DN_AFTER_RENAME,
DummyResourceContoller.DUMMY_ACCOUNT_ATTRIBUTE_AD_USER_PRINCIPAL_NAME_NAME, ACCOUNT_SMITH111_AD_SAM_NAME + "@" + TRAFO_MAIL_DOMAIN);
assertDummyAccountAttribute(RESOURCE_DUMMY_AD_ID, ACCOUNT_SMITH111_AD_DN_AFTER_RENAME,
DummyResourceContoller.DUMMY_ACCOUNT_ATTRIBUTE_AD_GIVEN_NAME_NAME, "John");
assertDummyAccountAttribute(RESOURCE_DUMMY_AD_ID, ACCOUNT_SMITH111_AD_DN_AFTER_RENAME,
DummyResourceContoller.DUMMY_ACCOUNT_ATTRIBUTE_AD_SN_NAME, "Smither");
assertDummyAccountAttribute(RESOURCE_DUMMY_AD_ID, ACCOUNT_SMITH111_AD_DN_AFTER_RENAME,
DummyResourceContoller.DUMMY_ACCOUNT_ATTRIBUTE_AD_MAIL_NAME, "John.Smither@" + TRAFO_MAIL_DOMAIN);
assertDummyAccountNoAttribute(RESOURCE_DUMMY_AD_ID, ACCOUNT_SMITH111_AD_DN_AFTER_RENAME,
DummyResourceContoller.DUMMY_ACCOUNT_ATTRIBUTE_AD_TELEPHONE_NUMBER_NAME);
assertDummyAccountAttribute(RESOURCE_DUMMY_AD_ID, ACCOUNT_SMITH111_AD_DN_AFTER_RENAME,
DummyResourceContoller.DUMMY_ACCOUNT_ATTRIBUTE_AD_USER_SHARED_FOLDER_OTHER_NAME, "\\\\medusa\\User\\Smither_smith111");
// MAIL ACCOUNT
// Check shadow
PrismObject<ShadowType> accountMailShadow = repositoryService.getObject(ShadowType.class, accountMailOid, null, result);
assertAccountShadowRepo(accountMailShadow, accountMailOid, ACCOUNT_SMITH111_MAIL_USERNAME_AFTER_RENAME, resourceDummyMailType, caseIgnoreMatchingRule);
// Check account
PrismObject<ShadowType> accountMailModel = modelService.getObject(ShadowType.class, accountMailOid, null, task, result);
display("Mail shadow", accountMailModel);
assertAccountShadowModel(accountMailModel, accountMailOid, ACCOUNT_SMITH111_MAIL_USERNAME_AFTER_RENAME, resourceDummyMailType, caseIgnoreMatchingRule);
assertAdministrativeStatusEnabled(accountMailModel);
smith111MailIcfUid = getIcfUid(accountMailModel);
// Check account in dummy resource
assertDummyAccountById(RESOURCE_DUMMY_MAIL_ID, smith111MailIcfUid);
assertDummyAccount(RESOURCE_DUMMY_MAIL_ID, ACCOUNT_SMITH111_MAIL_USERNAME_AFTER_RENAME);
assertDummyAccountActivation(RESOURCE_DUMMY_MAIL_ID, ACCOUNT_SMITH111_MAIL_USERNAME_AFTER_RENAME, true);
assertDummyAccountAttribute(RESOURCE_DUMMY_MAIL_ID, ACCOUNT_SMITH111_MAIL_USERNAME_AFTER_RENAME,
DUMMY_ACCOUNT_ATTRIBUTE_MAIL_INTERNET_ADDRESS_NAME, "John.Smither@" + TRAFO_MAIL_DOMAIN);
assertDummyAccountAttribute(RESOURCE_DUMMY_MAIL_ID, ACCOUNT_SMITH111_MAIL_USERNAME_AFTER_RENAME,
DUMMY_ACCOUNT_ATTRIBUTE_MAIL_FIRST_NAME_NAME, "John");
assertDummyAccountAttribute(RESOURCE_DUMMY_MAIL_ID, ACCOUNT_SMITH111_MAIL_USERNAME_AFTER_RENAME,
DUMMY_ACCOUNT_ATTRIBUTE_MAIL_LAST_NAME_NAME, "Smither");
assertDummyAccountAttribute(RESOURCE_DUMMY_MAIL_ID, ACCOUNT_SMITH111_MAIL_USERNAME_AFTER_RENAME,
DUMMY_ACCOUNT_ATTRIBUTE_MAIL_ID_FILE_NAME, "c:\\install\\test-id-folder\\jsmith.id");
assertDummyAccountAttribute(RESOURCE_DUMMY_MAIL_ID, ACCOUNT_SMITH111_MAIL_USERNAME_AFTER_RENAME,
DUMMY_ACCOUNT_ATTRIBUTE_MAIL_SHORT_NAME_NAME, "PS111", "jsmither");
assertDummyAccountAttribute(RESOURCE_DUMMY_MAIL_ID, ACCOUNT_SMITH111_MAIL_USERNAME_AFTER_RENAME,
DUMMY_ACCOUNT_ATTRIBUTE_MAIL_MAIL_FILE_NAME_NAME, "mail\\js111");
assertDummyAccountAttribute(RESOURCE_DUMMY_MAIL_ID, ACCOUNT_SMITH111_MAIL_USERNAME_AFTER_RENAME,
DUMMY_ACCOUNT_ATTRIBUTE_MAIL_MAIL_DOMAIN_NAME, "TRAFO");
PrismObject<UserType> userSmithAfter = getUser(USER_SMITH111_OID);
display("User smith111 after change execution", userSmithAfter);
// Set by inbound mappings
PrismAsserts.assertPropertyValue(userSmithAfter, UserType.F_EMAIL_ADDRESS, "John.Smither@" + TRAFO_MAIL_DOMAIN);
// [pmed] This is nondeterministic: extension/homedir is filled-in from both AD and Mail resources. (With different values.)
// So it's hard to say which value will be there in the end.
// PrismAsserts.assertPropertyValue(userSmithAfter,
// new ItemPath(UserType.F_EXTENSION, TRAFO_EXTENSION_HOMEDIR_QNAME), "\\\\medusa\\User\\Smither_smith111");
// Check audit
display("Audit", dummyAuditService);
dummyAuditService.assertRecords(5);
dummyAuditService.assertSimpleRecordSanity();
dummyAuditService.assertAnyRequestDeltas();
dummyAuditService.assertExecutionDeltas(0,2);
dummyAuditService.assertHasDelta(0,ChangeType.MODIFY, UserType.class); // primary
// dummyAuditService.asserHasDelta(0,ChangeType.MODIFY, UserType.class); // link
dummyAuditService.assertHasDelta(0,ChangeType.MODIFY, ShadowType.class); // AD account (outbound)
dummyAuditService.assertExecutionDeltas(1,2);
dummyAuditService.assertHasDelta(1,ChangeType.MODIFY, UserType.class); // link, inbound (2 deltas)
dummyAuditService.assertHasDelta(1,ChangeType.MODIFY, ShadowType.class); // Mail account (outboud)
dummyAuditService.assertExecutionDeltas(2,2);
dummyAuditService.assertHasDelta(2,ChangeType.MODIFY, UserType.class); // inbound
dummyAuditService.assertHasDelta(2,ChangeType.MODIFY, ShadowType.class); // AD account (mail change compued from outboud)
dummyAuditService.assertExecutionDeltas(3,1);
dummyAuditService.assertHasDelta(3,ChangeType.MODIFY, UserType.class); // inbound - SHOULD THIS BE HERE?? FIXME
dummyAuditService.assertExecutionSuccess();
}
/**
* Attempt to rename two employees that are boh "John Smith". This is the second user. There should be a naming conflict.
* Note: this is a different case than jack-angelica. Jack and Angelica are "externists". Smithes are employees (type "T")
*/
@Test
public void test310Smith222Rename() throws Exception {
final String TEST_NAME = "test310Smith222Rename";
TestUtil.displayTestTile(this, TEST_NAME);
// GIVEN
Task task = taskManager.createTaskInstance(TestTrafo.class.getName() + "." + TEST_NAME);
OperationResult result = task.getResult();
dummyAuditService.clear();
// WHEN
TestUtil.displayWhen(TEST_NAME);
PrismObject<UserType> userSmith = getUser(USER_SMITH222_OID);
display("User smith222 before change execution", userSmith);
assertUser(userSmith, USER_SMITH222_OID, USER_SMITH222_USERNAME, "John Smith", "John", "Smith");
assertLinks(userSmith, 2);
String accountAdOid = getLinkRefOid(userSmith, RESOURCE_DUMMY_AD_OID);
String accountMailOid = getLinkRefOid(userSmith, RESOURCE_DUMMY_MAIL_OID);
// THEN
TestUtil.displayThen(TEST_NAME);
result.computeStatus();
TestUtil.assertSuccess(result);
modifyUserReplace(userSmith.getOid(), UserType.F_FAMILY_NAME, task, result, new PolyString("Smither", "smither"));
// AD ACCOUNT
// Check shadow
PrismObject<ShadowType> accountAdShadow = repositoryService.getObject(ShadowType.class, accountAdOid, null, result);
display("AD shadow", accountAdShadow);
assertAccountShadowRepo(accountAdShadow, accountAdOid, ACCOUNT_SMITH222_AD_DN_AFTER_RENAME, resourceDummyAdType, caseIgnoreMatchingRule);
// Check account
PrismObject<ShadowType> accountAdModel = modelService.getObject(ShadowType.class, accountAdOid, null, task, result);
display("AD shadow", accountAdModel);
assertAccountShadowModel(accountAdModel, accountAdOid, ACCOUNT_SMITH222_AD_DN_AFTER_RENAME, resourceDummyAdType, caseIgnoreMatchingRule);
assertAdministrativeStatusEnabled(accountAdModel);
smith222AdIcfUid = getIcfUid(accountAdModel);
// Check account in dummy resource
assertDummyAccountById(RESOURCE_DUMMY_AD_ID, smith222AdIcfUid);
assertDummyAccount(RESOURCE_DUMMY_AD_ID, ACCOUNT_SMITH222_AD_DN_AFTER_RENAME);
assertDummyAccountActivation(RESOURCE_DUMMY_AD_ID, ACCOUNT_SMITH222_AD_DN_AFTER_RENAME, true);
assertDummyAccountAttribute(RESOURCE_DUMMY_AD_ID, ACCOUNT_SMITH222_AD_DN_AFTER_RENAME,
DummyResourceContoller.DUMMY_ACCOUNT_ATTRIBUTE_AD_SAM_ACCOUNT_NAME_NAME, ACCOUNT_SMITH222_AD_SAM_NAME);
assertDummyAccountAttribute(RESOURCE_DUMMY_AD_ID, ACCOUNT_SMITH222_AD_DN_AFTER_RENAME,
DummyResourceContoller.DUMMY_ACCOUNT_ATTRIBUTE_AD_USER_PRINCIPAL_NAME_NAME, ACCOUNT_SMITH222_AD_SAM_NAME + "@" + TRAFO_MAIL_DOMAIN);
assertDummyAccountAttribute(RESOURCE_DUMMY_AD_ID, ACCOUNT_SMITH222_AD_DN_AFTER_RENAME,
DummyResourceContoller.DUMMY_ACCOUNT_ATTRIBUTE_AD_GIVEN_NAME_NAME, "John");
assertDummyAccountAttribute(RESOURCE_DUMMY_AD_ID, ACCOUNT_SMITH222_AD_DN_AFTER_RENAME,
DummyResourceContoller.DUMMY_ACCOUNT_ATTRIBUTE_AD_SN_NAME, "Smither");
assertDummyAccountAttribute(RESOURCE_DUMMY_AD_ID, ACCOUNT_SMITH222_AD_DN_AFTER_RENAME,
DummyResourceContoller.DUMMY_ACCOUNT_ATTRIBUTE_AD_MAIL_NAME, "John.Smither2@" + TRAFO_MAIL_DOMAIN);
assertDummyAccountNoAttribute(RESOURCE_DUMMY_AD_ID, ACCOUNT_SMITH222_AD_DN_AFTER_RENAME,
DummyResourceContoller.DUMMY_ACCOUNT_ATTRIBUTE_AD_TELEPHONE_NUMBER_NAME);
assertDummyAccountAttribute(RESOURCE_DUMMY_AD_ID, ACCOUNT_SMITH222_AD_DN_AFTER_RENAME,
DummyResourceContoller.DUMMY_ACCOUNT_ATTRIBUTE_AD_USER_SHARED_FOLDER_OTHER_NAME, "\\\\medusa\\User\\Smither_smith222");
// MAIL ACCOUNT
// Check shadow
PrismObject<ShadowType> accountMailShadow = repositoryService.getObject(ShadowType.class, accountMailOid, null, result);
assertAccountShadowRepo(accountMailShadow, accountMailOid, ACCOUNT_SMITH222_MAIL_USERNAME_AFTER_RENAME, resourceDummyMailType, caseIgnoreMatchingRule);
// Check account
PrismObject<ShadowType> accountMailModel = modelService.getObject(ShadowType.class, accountMailOid, null, task, result);
display("Mail shadow", accountMailModel);
assertAccountShadowModel(accountMailModel, accountMailOid, ACCOUNT_SMITH222_MAIL_USERNAME_AFTER_RENAME, resourceDummyMailType, caseIgnoreMatchingRule);
assertAdministrativeStatusEnabled(accountMailModel);
smith222MailIcfUid = getIcfUid(accountMailModel);
// Check account in dummy resource
assertDummyAccountById(RESOURCE_DUMMY_MAIL_ID, smith222MailIcfUid);
assertDummyAccount(RESOURCE_DUMMY_MAIL_ID, ACCOUNT_SMITH222_MAIL_USERNAME_AFTER_RENAME);
assertDummyAccountActivation(RESOURCE_DUMMY_MAIL_ID, ACCOUNT_SMITH222_MAIL_USERNAME_AFTER_RENAME, true);
assertDummyAccountAttribute(RESOURCE_DUMMY_MAIL_ID, ACCOUNT_SMITH222_MAIL_USERNAME_AFTER_RENAME,
DUMMY_ACCOUNT_ATTRIBUTE_MAIL_INTERNET_ADDRESS_NAME, "John.Smither2@" + TRAFO_MAIL_DOMAIN);
assertDummyAccountAttribute(RESOURCE_DUMMY_MAIL_ID, ACCOUNT_SMITH222_MAIL_USERNAME_AFTER_RENAME,
DUMMY_ACCOUNT_ATTRIBUTE_MAIL_FIRST_NAME_NAME, "John");
assertDummyAccountAttribute(RESOURCE_DUMMY_MAIL_ID, ACCOUNT_SMITH222_MAIL_USERNAME_AFTER_RENAME,
DUMMY_ACCOUNT_ATTRIBUTE_MAIL_LAST_NAME_NAME, "Smither2");
assertDummyAccountAttribute(RESOURCE_DUMMY_MAIL_ID, ACCOUNT_SMITH222_MAIL_USERNAME_AFTER_RENAME,
DUMMY_ACCOUNT_ATTRIBUTE_MAIL_ID_FILE_NAME, "c:\\install\\test-id-folder\\jsmith2.id");
assertDummyAccountAttribute(RESOURCE_DUMMY_MAIL_ID, ACCOUNT_SMITH222_MAIL_USERNAME_AFTER_RENAME,
DUMMY_ACCOUNT_ATTRIBUTE_MAIL_SHORT_NAME_NAME, "PS222", "jsmither2");
assertDummyAccountAttribute(RESOURCE_DUMMY_MAIL_ID, ACCOUNT_SMITH222_MAIL_USERNAME_AFTER_RENAME,
DUMMY_ACCOUNT_ATTRIBUTE_MAIL_MAIL_FILE_NAME_NAME, "mail\\js222");
assertDummyAccountAttribute(RESOURCE_DUMMY_MAIL_ID, ACCOUNT_SMITH222_MAIL_USERNAME_AFTER_RENAME,
DUMMY_ACCOUNT_ATTRIBUTE_MAIL_MAIL_DOMAIN_NAME, "TRAFO");
PrismObject<UserType> userSmithAfter = getUser(USER_SMITH222_OID);
display("User smith222 after change execution", userSmithAfter);
// Set by inbound mappings
PrismAsserts.assertPropertyValue(userSmithAfter, UserType.F_EMAIL_ADDRESS, "John.Smither2@" + TRAFO_MAIL_DOMAIN);
// [pmed] This is nondeterministic: extension/homedir is filled-in from both AD and Mail resources. (With different values.)
// So it's hard to say which value will be there in the end.
// PrismAsserts.assertPropertyValue(userSmithAfter,
// new ItemPath(UserType.F_EXTENSION, TRAFO_EXTENSION_HOMEDIR_QNAME), "\\\\medusa\\User\\Smither_smith222");
// Check audit
display("Audit", dummyAuditService);
dummyAuditService.assertRecords(5);
dummyAuditService.assertSimpleRecordSanity();
dummyAuditService.assertAnyRequestDeltas();
dummyAuditService.assertExecutionDeltas(0,2);
dummyAuditService.assertHasDelta(0,ChangeType.MODIFY, UserType.class); // primary
// dummyAuditService.asserHasDelta(0,ChangeType.MODIFY, UserType.class); // link
dummyAuditService.assertHasDelta(0,ChangeType.MODIFY, ShadowType.class); // AD account (outbound)
dummyAuditService.assertExecutionDeltas(1,2);
dummyAuditService.assertHasDelta(1,ChangeType.MODIFY, UserType.class); // link, inbound (2 deltas)
dummyAuditService.assertHasDelta(1,ChangeType.MODIFY, ShadowType.class); // Mail account (outboud)
dummyAuditService.assertExecutionDeltas(2,2);
dummyAuditService.assertHasDelta(2,ChangeType.MODIFY, UserType.class); // inbound
dummyAuditService.assertHasDelta(2,ChangeType.MODIFY, ShadowType.class); // AD account (mail change compued from outboud)
dummyAuditService.assertExecutionDeltas(3,1);
dummyAuditService.assertHasDelta(3,ChangeType.MODIFY, UserType.class); // inbound - SHOULD THIS BE HERE?? FIXME
dummyAuditService.assertExecutionSuccess();
}
}