package com.evolveum.midpoint.testing.story; import static com.evolveum.midpoint.test.IntegrationTestTools.display; import static org.testng.AssertJUnit.assertEquals; import static org.testng.AssertJUnit.assertNotNull; import static org.testng.AssertJUnit.assertNull; import java.io.File; import java.io.FileInputStream; import java.util.List; import javax.xml.datatype.XMLGregorianCalendar; import javax.xml.namespace.QName; 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 com.evolveum.midpoint.common.Utils; import com.evolveum.midpoint.common.configuration.api.MidpointConfiguration; import com.evolveum.midpoint.model.api.expr.MidpointFunctions; import com.evolveum.midpoint.model.common.expression.functions.BasicExpressionFunctions; import com.evolveum.midpoint.prism.PrismObject; import com.evolveum.midpoint.prism.delta.ObjectDelta; import com.evolveum.midpoint.prism.match.PolyStringNormMatchingRule; import com.evolveum.midpoint.prism.path.ItemPath; import com.evolveum.midpoint.prism.query.builder.QueryBuilder; import com.evolveum.midpoint.prism.util.PrismTestUtil; import com.evolveum.midpoint.prism.xml.XmlTypeConverter; import com.evolveum.midpoint.schema.SearchResultList; import com.evolveum.midpoint.schema.constants.SchemaConstants; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.task.api.Task; import com.evolveum.midpoint.test.util.MidPointTestConstants; import com.evolveum.midpoint.test.util.TestUtil; import com.evolveum.midpoint.util.ClassPathUtil; import com.evolveum.midpoint.util.exception.ObjectNotFoundException; import com.evolveum.midpoint.util.exception.SchemaException; import com.evolveum.midpoint.util.exception.SystemException; import com.evolveum.midpoint.util.logging.Trace; import com.evolveum.midpoint.util.logging.TraceManager; import com.evolveum.midpoint.xml.ns._public.common.common_3.ActivationStatusType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ActivationType; import com.evolveum.midpoint.xml.ns._public.common.common_3.AssignmentType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ConnectorConfigurationType; import com.evolveum.midpoint.xml.ns._public.common.common_3.OrgType; 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.SystemConfigurationType; import com.evolveum.midpoint.xml.ns._public.common.common_3.UserType; @ContextConfiguration(locations = {"classpath:ctx-story-test-main.xml"}) @DirtiesContext(classMode = ClassMode.AFTER_CLASS) public class TestMachineIntelligence extends AbstractStoryTest { public static Trace LOGGER = TraceManager.getTrace(TestMachineIntelligence.class); public static final File TEST_DIR = new File(MidPointTestConstants.TEST_RESOURCES_DIR, "machineintelligence"); private static final File RESOURCE_HR_FILE = new File(TEST_DIR, "resource-csv-HR.xml"); private static final String RESOURCE_HR_OID = "10000000-0000-0000-0000-000000000001"; private static final File RESOURCE_CSV_CONTENT_FILE = new File(TEST_DIR, "HR.csv"); private static String sourceFilePath; private static final File SHADOW_RUR_FILE = new File(TEST_DIR, "shadow-rur.xml"); private static final String SHADOW_RUR_OID = "shadow00-0000-0000-0000-111111111111"; private static final File SHADOW_CHAPPIE_FILE = new File(TEST_DIR, "shadow-chappie.xml"); private static final String SHADOW_CHAPPIE_OID = "shadow00-0000-0000-0000-111111111112"; private static final String NS_RESOURCE_CSV = "http://midpoint.evolveum.com/xml/ns/public/connector/icf-1/bundle/com.evolveum.polygon.connector-csvfile/com.evolveum.polygon.csvfile.CSVFileConnector"; @Autowired MidpointConfiguration midPointConfig; @Override protected File getSystemConfigurationFile() { return super.getSystemConfigurationFile(); } @Override public void initSystem(Task initTask, OperationResult initResult) throws Exception { String home = midPointConfig.getMidpointHome(); File resourceDir = new File(home, "machineintelligence"); resourceDir.mkdir(); LOGGER.info("Start copying HR.csv from {} to {}", RESOURCE_CSV_CONTENT_FILE.getAbsolutePath(), resourceDir.getAbsolutePath()); File desticationFile = new File(resourceDir, "HR.csv"); ClassPathUtil.copyFile(new FileInputStream(RESOURCE_CSV_CONTENT_FILE), "HR.csv", desticationFile); if (!desticationFile.exists()){ throw new SystemException("Source file for HR resource was not created"); } sourceFilePath = desticationFile.getAbsolutePath(); super.initSystem(initTask, initResult); importObjectFromFile(RESOURCE_HR_FILE); } @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 result = modelService.testResource(RESOURCE_HR_OID, task); modifyObjectReplaceProperty(ResourceType.class, RESOURCE_HR_OID, new ItemPath(ResourceType.F_CONNECTOR_CONFIGURATION, SchemaConstants.ICF_CONFIGURATION_PROPERTIES, new QName(NS_RESOURCE_CSV, "filePath")), task, result, sourceFilePath); OperationResult testResultOpenDj = modelService.testResource(RESOURCE_HR_OID, task); TestUtil.assertSuccess(testResultOpenDj); SystemConfigurationType systemConfiguration = getSystemConfiguration(); assertNotNull("No system configuration", systemConfiguration); display("System config", systemConfiguration); } /** * * WHEN: Create account in the HR, import this acount to the midPoint * THEN: User is imported to midPoint, new Organization is created, * user is assigned to the organization, assignment is active/inactive * according to the setting in the resource */ @Test public void test010importActiveUserRUR() throws Exception { final String TEST_NAME = "test010importActiveUserRUR"; TestUtil.displayTestTile(this, TEST_NAME); Task task = taskManager.createTaskInstance(TestTrafo.class.getName() + "." + TEST_NAME); OperationResult result = task.getResult(); // WHEN PrismObject<ShadowType> shadow = addObject(SHADOW_RUR_FILE, task, result); assertEquals(SHADOW_RUR_OID, shadow.getOid()); //AND modelService.importFromResource(SHADOW_RUR_OID, task, result); //THEN //assert created organization SearchResultList<PrismObject<OrgType>> orgs = modelService.searchObjects( OrgType.class, QueryBuilder.queryFor(OrgType.class, prismContext).item(OrgType.F_NAME) .eq("Universe").matching(PolyStringNormMatchingRule.NAME).build(), null, task, result); assertEquals("Found unexpected number of organizations, expected 1, found " + orgs.size(), 1, orgs.size()); //assert created owner of shadow PrismObject<UserType> userRur = assertShadowOwner(SHADOW_RUR_OID, "R.U.R", "Rossum", "Universal Robots", "Rossum's Universal Robots", task, result); //assert assignment of org assertAssignedOrg(userRur, orgs.iterator().next()); //assert assignment of or in more depth assertAssignment(userRur.asObjectable(), ActivationStatusType.ENABLED, null); } @Test public void test011importInactiveUserChappie() throws Exception { final String TEST_NAME = "test020ResourceOpenDjGet"; TestUtil.displayTestTile(this, TEST_NAME); Task task = taskManager.createTaskInstance(TestTrafo.class.getName() + "." + TEST_NAME); OperationResult result = task.getResult(); // WHEN PrismObject<ShadowType> shadow = addObject(SHADOW_CHAPPIE_FILE, task, result); assertEquals(SHADOW_CHAPPIE_OID, shadow.getOid()); //AND modelService.importFromResource(SHADOW_CHAPPIE_OID, task, result); //THEN //assert created organization SearchResultList<PrismObject<OrgType>> orgs = modelService .searchObjects( OrgType.class, QueryBuilder.queryFor(OrgType.class, prismContext).item(OrgType.F_NAME) .eq("Earth").matching(PolyStringNormMatchingRule.NAME).build(), null, task, result); assertEquals("Found unexpected number of organizations, expected 1, found " + orgs.size(), 1, orgs.size()); //assert created owner of shadow PrismObject<UserType> userRur = assertShadowOwner(SHADOW_CHAPPIE_OID, "chappie", "Chappie", "von Tetravaal", "Chappie von Tetravaal", task, result); //assert assignment of org assertAssignedOrg(userRur, orgs.iterator().next()); //assert assignment of or in more depth XMLGregorianCalendar validTo = XmlTypeConverter .createXMLGregorianCalendar(2016, 12, 31, 23, 59, 59); assertAssignment(userRur.asObjectable(), ActivationStatusType.DISABLED, validTo); } private PrismObject<UserType> assertShadowOwner(String shadowOid, String userName, String userGivenName, String userFamilyName, String userFullName, Task task, OperationResult result) throws Exception{ PrismObject<UserType> userRur = (PrismObject<UserType>) modelService.searchShadowOwner(shadowOid, null, task, result); assertNotNull("Owner must not be null", userRur); UserType userType = userRur.asObjectable(); assertEquals("Unexpected name in the user", PrismTestUtil.createPolyStringType(userName) , userType.getName()); assertEquals("Unexpected givenName in the user", PrismTestUtil.createPolyStringType(userGivenName) , userType.getGivenName()); assertEquals("Unexpected familyName in the user", PrismTestUtil.createPolyStringType(userFamilyName) , userType.getFamilyName()); assertEquals("Unexpected fullName in the user", PrismTestUtil.createPolyStringType(userFullName) , userType.getFullName()); return userRur; } private void assertAssignment(UserType userType, ActivationStatusType administrativeStatus, XMLGregorianCalendar validTo) { List<AssignmentType> assignments = userType.getAssignment(); assertEquals("Unexpected assignment in user, expected 1, found " + assignments.size(), 1, assignments.size()); AssignmentType assignmentType = assignments.iterator().next(); ActivationType assignmentActivation = assignmentType.getActivation(); assertEquals(administrativeStatus, assignmentActivation.getAdministrativeStatus()); assertEquals(administrativeStatus, assignmentActivation.getEffectiveStatus()); if (validTo == null) { assertNull("Unexpected validTo value: " + assignmentActivation.getValidTo(), assignmentActivation.getValidTo()); } else { //TODO: } } }