/* * Copyright (c) 2010-2015 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.repo.sql; import com.evolveum.midpoint.prism.PrismObject; import com.evolveum.midpoint.prism.PrismObjectDefinition; import com.evolveum.midpoint.prism.PrismReferenceValue; import com.evolveum.midpoint.prism.delta.ObjectDelta; import com.evolveum.midpoint.prism.delta.PropertyDelta; import com.evolveum.midpoint.prism.delta.ReferenceDelta; import com.evolveum.midpoint.prism.path.ItemPath; import com.evolveum.midpoint.prism.util.PrismAsserts; import com.evolveum.midpoint.prism.util.PrismTestUtil; import com.evolveum.midpoint.schema.DeltaConvertor; import com.evolveum.midpoint.schema.MidPointPrismContextFactory; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.test.util.TestUtil; import com.evolveum.midpoint.xml.ns._public.common.api_types_3.ObjectModificationType; import com.evolveum.midpoint.xml.ns._public.common.common_3.MetadataType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowType; import com.evolveum.midpoint.xml.ns._public.common.common_3.UserType; import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.ContextConfiguration; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; import java.io.File; import java.util.Arrays; /** * This is not real test, it's just used to check how hibernate handles insert/modify of different objects. * * @author lazyman */ @ContextConfiguration(locations = {"../../../../../ctx-test.xml"}) @DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_CLASS) public class ModifyUser extends BaseSQLRepoTest { private static final String USER_FULLNAME = "Guybrush Threepwood"; private String userOid; private String userBigOid; private String shadowOid; @BeforeClass public void beforeClass() throws Exception { super.beforeClass(); PrismTestUtil.resetPrismContext(MidPointPrismContextFactory.FACTORY); } @Test public void test010Add() throws Exception { PrismObject<UserType> user = PrismTestUtil.parseObject(new File(FOLDER_BASIC, "user.xml")); userOid = repositoryService.addObject(user, null, new OperationResult("asdf")); user = PrismTestUtil.parseObject(new File(FOLDER_BASIC, "user-big.xml")); userBigOid = repositoryService.addObject(user, null, new OperationResult("asdf")); PrismObject<ShadowType> shadow = PrismTestUtil.parseObject(new File(FOLDER_BASIC, "account-shadow.xml")); shadowOid = repositoryService.addObject(shadow, null, new OperationResult("asdf")); } @Test public void test020ModifyUser() throws Exception { final String TEST_NAME = "test020ModifyUser"; TestUtil.displayTestTile(TEST_NAME); OperationResult result = new OperationResult(TEST_NAME); ObjectModificationType modification = PrismTestUtil.parseAtomicValue( new File(FOLDER_BASIC, "t002.xml"), ObjectModificationType.COMPLEX_TYPE); ObjectDelta delta = DeltaConvertor.createObjectDelta(modification, UserType.class, prismContext); delta.setOid(userOid); // WHEN TestUtil.displayWhen(TEST_NAME); repositoryService.modifyObject(UserType.class, userOid, delta.getModifications(), result); // THEN TestUtil.displayThen(TEST_NAME); result.computeStatus(); TestUtil.assertSuccess(result); PrismObject<UserType> userAfter = repositoryService.getObject(UserType.class, userOid, null, result); PrismAsserts.assertPropertyValue(userAfter, UserType.F_FULL_NAME, PrismTestUtil.createPolyString(USER_FULLNAME)); PrismAsserts.assertPropertyValue(userAfter, UserType.F_EMPLOYEE_NUMBER, "en1234"); } @Test public void test021ModifyUserNoEmpNum() throws Exception { final String TEST_NAME = "test021ModifyUserNoEmpNum"; TestUtil.displayTestTile(TEST_NAME); OperationResult result = new OperationResult(TEST_NAME); ObjectModificationType modification = PrismTestUtil.parseAtomicValue( new File(FOLDER_BASIC, "t002a.xml"), ObjectModificationType.COMPLEX_TYPE); ObjectDelta delta = DeltaConvertor.createObjectDelta(modification, UserType.class, prismContext); delta.setOid(userOid); // WHEN TestUtil.displayWhen(TEST_NAME); repositoryService.modifyObject(UserType.class, userOid, delta.getModifications(), result); // THEN TestUtil.displayThen(TEST_NAME); result.computeStatus(); TestUtil.assertSuccess(result); PrismObject<UserType> userAfter = repositoryService.getObject(UserType.class, userOid, null, result); PrismAsserts.assertPropertyValue(userAfter, UserType.F_FULL_NAME, PrismTestUtil.createPolyString(USER_FULLNAME)); PrismAsserts.assertNoItem(userAfter, UserType.F_EMPLOYEE_NUMBER); } @Test public void test022ModifyUserEmptyEmpNum() throws Exception { final String TEST_NAME = "test022ModifyUserEmptyEmpNum"; TestUtil.displayTestTile(TEST_NAME); OperationResult result = new OperationResult(TEST_NAME); ObjectModificationType modification = PrismTestUtil.parseAtomicValue( new File(FOLDER_BASIC, "t002b.xml"), ObjectModificationType.COMPLEX_TYPE); ObjectDelta delta = DeltaConvertor.createObjectDelta(modification, UserType.class, prismContext); delta.setOid(userOid); // WHEN TestUtil.displayWhen(TEST_NAME); repositoryService.modifyObject(UserType.class, userOid, delta.getModifications(), result); // THEN TestUtil.displayThen(TEST_NAME); result.computeStatus(); TestUtil.assertSuccess(result); PrismObject<UserType> userAfter = repositoryService.getObject(UserType.class, userOid, null, result); PrismAsserts.assertPropertyValue(userAfter, UserType.F_FULL_NAME, PrismTestUtil.createPolyString(USER_FULLNAME)); PrismAsserts.assertPropertyValue(userAfter, UserType.F_EMPLOYEE_NUMBER, ""); } @Test public void test030ModifyShadow() throws Exception { ObjectModificationType modification = PrismTestUtil.parseAtomicValue( new File(FOLDER_BASIC, "t003.xml"), ObjectModificationType.COMPLEX_TYPE); ObjectDelta delta = DeltaConvertor.createObjectDelta(modification, ShadowType.class, prismContext); delta.setOid(userOid); repositoryService.modifyObject(ShadowType.class, shadowOid, delta.getModifications(), new OperationResult("asdf")); } @Test public void test040GetShadow() throws Exception { repositoryService.getObject(ShadowType.class, shadowOid, null, new OperationResult("asdf")); } @Test public void test050ModifyBigUser() throws Exception { PrismObjectDefinition def = prismContext.getSchemaRegistry().findObjectDefinitionByCompileTimeClass(UserType.class); PropertyDelta delta = PropertyDelta.createModificationReplaceProperty(ObjectType.F_DESCRIPTION, def, "new description"); repositoryService.modifyObject(UserType.class, userBigOid, Arrays.asList(delta), new OperationResult("asdf")); } @Test public void test060GetBigUser() throws Exception { repositoryService.getObject(UserType.class, userBigOid, null, new OperationResult("asdf")); } /** * This test fails with java.lang.IllegalStateException: An entity copy was already assigned to a different entity. * It's ok to fail, but it should fail somehow differently. * * todo improve later [lazyman] */ @Test(enabled = false) public void test070ModifyBigUser() throws Exception { ObjectModificationType modification = PrismTestUtil.parseAtomicValue( new File(FOLDER_BASIC, "t004.xml"), ObjectModificationType.COMPLEX_TYPE); ObjectDelta delta = DeltaConvertor.createObjectDelta(modification, UserType.class, prismContext); repositoryService.modifyObject(UserType.class, userBigOid, delta.getModifications(), new OperationResult("asdf")); } @Test public void test100ModifyUserApproverMetadata() throws Exception { PrismObjectDefinition userDefinition = prismContext.getSchemaRegistry().findObjectDefinitionByCompileTimeClass(UserType.class); ReferenceDelta delta1 = ReferenceDelta.createModificationAdd( new ItemPath(UserType.F_METADATA, MetadataType.F_CREATE_APPROVER_REF), userDefinition, new PrismReferenceValue("target-oid-1", UserType.COMPLEX_TYPE)); ReferenceDelta delta2 = ReferenceDelta.createModificationAdd( new ItemPath(UserType.F_METADATA, MetadataType.F_MODIFY_APPROVER_REF), userDefinition, new PrismReferenceValue("target-oid-1", UserType.COMPLEX_TYPE)); // the same as in delta1 repositoryService.modifyObject(UserType.class, userOid, Arrays.asList(delta1, delta2), new OperationResult("asdf")); } }