/* * Copyright (c) 2010-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. */ package com.evolveum.midpoint.model.impl.controller; import static com.evolveum.midpoint.test.IntegrationTestTools.display; import static org.mockito.Matchers.any; import static org.mockito.Matchers.argThat; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import static org.testng.AssertJUnit.assertEquals; import java.io.File; import java.io.IOException; import javax.xml.bind.JAXBException; import com.evolveum.midpoint.util.exception.NoFocusNameSchemaException; import org.mockito.Mockito; import org.mockito.invocation.InvocationOnMock; import org.mockito.stubbing.Answer; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.testng.AbstractTestNGSpringContextTests; import org.testng.AssertJUnit; import org.testng.annotations.BeforeMethod; import org.testng.annotations.BeforeSuite; import org.testng.annotations.Test; import org.xml.sax.SAXException; import com.evolveum.midpoint.model.impl.ModelCrudService; import com.evolveum.midpoint.model.impl.util.ModelTUtil; import com.evolveum.midpoint.model.impl.util.ObjectTypeNameMatcher; import com.evolveum.midpoint.prism.PrismObject; import com.evolveum.midpoint.prism.util.PrismAsserts; import com.evolveum.midpoint.prism.util.PrismTestUtil; import com.evolveum.midpoint.provisioning.api.ProvisioningOperationOptions; import com.evolveum.midpoint.provisioning.api.ProvisioningService; import com.evolveum.midpoint.repo.api.RepoAddOptions; import com.evolveum.midpoint.repo.api.RepositoryService; import com.evolveum.midpoint.schema.MidPointPrismContextFactory; 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.task.api.TaskManager; import com.evolveum.midpoint.test.IntegrationTestTools; import com.evolveum.midpoint.test.util.TestUtil; import com.evolveum.midpoint.util.PrettyPrinter; import com.evolveum.midpoint.util.exception.CommunicationException; import com.evolveum.midpoint.util.exception.ConfigurationException; import com.evolveum.midpoint.util.exception.ExpressionEvaluationException; import com.evolveum.midpoint.util.exception.ObjectAlreadyExistsException; import com.evolveum.midpoint.util.exception.ObjectNotFoundException; import com.evolveum.midpoint.util.exception.PolicyViolationException; import com.evolveum.midpoint.util.exception.SchemaException; import com.evolveum.midpoint.util.exception.SecurityViolationException; import com.evolveum.midpoint.util.logging.Trace; import com.evolveum.midpoint.util.logging.TraceManager; import com.evolveum.midpoint.xml.ns._public.common.common_3.OperationProvisioningScriptsType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ResourceType; import com.evolveum.midpoint.xml.ns._public.common.common_3.UserType; import com.evolveum.midpoint.xml.ns._public.common.fault_3.FaultMessage; /** * * @author lazyman * */ @ContextConfiguration(locations = { "classpath:ctx-model-test-no-repo.xml"}) public class ControllerAddObjectTest extends AbstractTestNGSpringContextTests { private static final File TEST_FOLDER = new File("./src/test/resources/controller/addObject"); private static final File TEST_FOLDER_COMMON = new File("./src/test/resources/common"); private static final Trace LOGGER = TraceManager.getTrace(ControllerAddObjectTest.class); @Autowired(required = true) private ModelCrudService controller; @Autowired(required = true) @Qualifier("cacheRepositoryService") private RepositoryService repository; @Autowired(required = true) private ProvisioningService provisioning; @Autowired(required = true) private TaskManager taskManager; @BeforeSuite public void setup() throws SchemaException, SAXException, IOException { PrettyPrinter.setDefaultNamespacePrefix(MidPointConstants.NS_MIDPOINT_PUBLIC_PREFIX); PrismTestUtil.resetPrismContext(MidPointPrismContextFactory.FACTORY); } @BeforeMethod public void before() { Mockito.reset(provisioning, repository); } @Test(expectedExceptions = IllegalArgumentException.class) public void nullObject() throws Exception { TestUtil.displayTestTile("nullObject"); controller.addObject(null, null, taskManager.createTaskInstance(), new OperationResult("Test Operation")); } @Test(expectedExceptions = IllegalArgumentException.class) public void nullResult() throws Exception { TestUtil.displayTestTile("nullResult"); controller.addObject(new UserType().asPrismObject(), null, taskManager.createTaskInstance(), null); } @Test(expectedExceptions = NoFocusNameSchemaException.class) @SuppressWarnings("unchecked") public void addUserWithoutName() throws Exception { TestUtil.displayTestTile("addUserWithoutName"); final UserType expectedUser = (UserType) PrismTestUtil.parseObject(new File(TEST_FOLDER, "add-user-without-name.xml")).asObjectable(); OperationResult result = new OperationResult("Test Operation"); try { controller.addObject(expectedUser.asPrismObject(), null, taskManager.createTaskInstance(), result); } finally { LOGGER.debug(result.debugDump()); } } /** * Testing add user with undefined user template */ // @Test @SuppressWarnings("unchecked") public void addUserCorrect() throws Exception { TestUtil.displayTestTile("addUserCorrect"); // GIVEN Task task = taskManager.createTaskInstance(); ModelTUtil.mockGetSystemConfiguration(repository, new File(TEST_FOLDER_COMMON, "system-configuration.xml")); final PrismObject<UserType> expectedUser = PrismTestUtil.parseObject(new File(TEST_FOLDER, "add-user-correct.xml")); final UserType expectedUserType = expectedUser.asObjectable(); final String oid = "abababab-abab-abab-abab-000000000001"; when( repository.addObject(argThat(new ObjectTypeNameMatcher(expectedUserType.getName())), any(RepoAddOptions.class), any(OperationResult.class))).thenAnswer(new Answer<String>() { @Override public String answer(InvocationOnMock invocation) throws Throwable { PrismObject<UserType> user = (PrismObject<UserType>) invocation.getArguments()[0]; IntegrationTestTools.display("Got user", user); PrismAsserts.assertEquivalent("Unexpected argument to addObject", expectedUser, user); return oid; } }); OperationResult result = new OperationResult("Test Operation"); // WHEN String userOid = controller.addObject(expectedUser, null, task, result); // THEN display("addObject result",result.debugDump()); verify(repository, times(1)).addObject(argThat(new ObjectTypeNameMatcher(expectedUserType.getName())), any(RepoAddOptions.class), any(OperationResult.class)); assertEquals(oid, userOid); } // @Test @SuppressWarnings("unchecked") public void addResourceCorrect() throws JAXBException, FaultMessage, ObjectAlreadyExistsException, SchemaException, CommunicationException, ObjectNotFoundException, ExpressionEvaluationException, IOException, ConfigurationException, PolicyViolationException, SecurityViolationException { TestUtil.displayTestTile("addResourceCorrect"); Task task = taskManager.createTaskInstance(); final PrismObject<ResourceType> expectedResource = PrismTestUtil.parseObject(new File( TEST_FOLDER, "add-resource-correct.xml")); final ResourceType expectedResourceType = expectedResource.asObjectable(); AssertJUnit.assertNotNull("resource to add must not be null", expectedResource); final String oid = "abababab-abab-abab-abab-000000000002"; when( provisioning.addObject(argThat(new ObjectTypeNameMatcher(expectedResourceType.getName())), any(OperationProvisioningScriptsType.class), any(ProvisioningOperationOptions.class), any(Task.class), any(OperationResult.class))).thenAnswer(new Answer<String>() { @Override public String answer(InvocationOnMock invocation) throws Throwable { PrismObject<ResourceType> resource = (PrismObject<ResourceType>) invocation.getArguments()[0]; PrismAsserts.assertEquivalent("Wrong argument to addObject", expectedResource, resource); return oid; } }); OperationResult result = new OperationResult("Test Operation"); try { String resourceOid = controller.addObject(expectedResource, null, task, result); assertEquals(oid, resourceOid); } finally { LOGGER.debug(result.debugDump()); verify(provisioning, times(1)).addObject( argThat(new ObjectTypeNameMatcher(expectedResourceType.getName())), any(OperationProvisioningScriptsType.class), any(ProvisioningOperationOptions.class), any(Task.class), any(OperationResult.class)); } } }