/* * 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.PrismContainer; import com.evolveum.midpoint.prism.PrismContainerValue; import com.evolveum.midpoint.prism.PrismObject; import com.evolveum.midpoint.prism.PrismObjectDefinition; import com.evolveum.midpoint.prism.delta.ItemDelta; import com.evolveum.midpoint.prism.delta.builder.DeltaBuilder; import com.evolveum.midpoint.prism.path.IdItemPathSegment; import com.evolveum.midpoint.prism.path.ItemPath; import com.evolveum.midpoint.prism.polystring.PolyString; import com.evolveum.midpoint.prism.query.ObjectQuery; import com.evolveum.midpoint.prism.query.builder.QueryBuilder; import com.evolveum.midpoint.prism.util.CloneUtil; import com.evolveum.midpoint.prism.util.PrismAsserts; import com.evolveum.midpoint.prism.xml.XmlTypeConverter; import com.evolveum.midpoint.repo.api.RepoAddOptions; import com.evolveum.midpoint.repo.api.RepoModifyOptions; import com.evolveum.midpoint.schema.GetOperationOptions; import com.evolveum.midpoint.schema.SelectorOptions; import com.evolveum.midpoint.schema.constants.ObjectTypes; import com.evolveum.midpoint.schema.constants.SchemaConstants; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.schema.util.WorkItemTypeUtil; import com.evolveum.midpoint.util.exception.ObjectAlreadyExistsException; import com.evolveum.midpoint.util.exception.ObjectNotFoundException; import com.evolveum.midpoint.util.exception.SchemaException; import com.evolveum.midpoint.util.logging.Trace; import com.evolveum.midpoint.util.logging.TraceManager; import com.evolveum.midpoint.xml.ns._public.common.common_3.*; import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.ContextConfiguration; import org.testng.AssertJUnit; import org.testng.annotations.Test; import javax.xml.datatype.XMLGregorianCalendar; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.Collections; import java.util.Date; import java.util.List; import static com.evolveum.midpoint.prism.PrismConstants.T_PARENT; import static com.evolveum.midpoint.prism.delta.PropertyDelta.createModificationReplaceProperty; import static com.evolveum.midpoint.schema.GetOperationOptions.createDistinct; import static com.evolveum.midpoint.schema.RetrieveOption.INCLUDE; import static com.evolveum.midpoint.schema.SelectorOptions.createCollection; import static com.evolveum.midpoint.schema.util.ObjectTypeUtil.createObjectRef; import static com.evolveum.midpoint.xml.ns._public.common.common_3.AbstractWorkItemOutputType.F_OUTCOME; import static com.evolveum.midpoint.xml.ns._public.common.common_3.AccessCertificationCampaignStateType.IN_REMEDIATION; import static com.evolveum.midpoint.xml.ns._public.common.common_3.AccessCertificationCampaignStateType.IN_REVIEW_STAGE; import static com.evolveum.midpoint.xml.ns._public.common.common_3.AccessCertificationCampaignType.F_CASE; import static com.evolveum.midpoint.xml.ns._public.common.common_3.AccessCertificationCampaignType.F_STATE; import static com.evolveum.midpoint.xml.ns._public.common.common_3.AccessCertificationCaseType.*; import static com.evolveum.midpoint.xml.ns._public.common.common_3.AccessCertificationWorkItemType.*; import static com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType.F_NAME; import static org.testng.AssertJUnit.assertEquals; import static org.testng.AssertJUnit.assertNotNull; /** * @author mederly */ @ContextConfiguration(locations = {"../../../../../ctx-test.xml"}) @DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_CLASS) public class CertificationTest extends BaseSQLRepoTest { private static final Trace LOGGER = TraceManager.getTrace(CertificationTest.class); private static final File TEST_DIR = new File("src/test/resources/cert"); public static final File CAMPAIGN_1_FILE = new File(TEST_DIR, "cert-campaign-1.xml"); public static final File CAMPAIGN_2_FILE = new File(TEST_DIR, "cert-campaign-2.xml"); public static final long NEW_CASE_ID = 100L; public static final long SECOND_NEW_CASE_ID = 110L; private String campaign1Oid; private String campaign2Oid; private PrismObjectDefinition<AccessCertificationCampaignType> campaignDef; protected RepoModifyOptions getModifyOptions() { return null; } @Test public void test100AddCampaignNonOverwrite() throws Exception { PrismObject<AccessCertificationCampaignType> campaign = prismContext.parseObject(CAMPAIGN_1_FILE); campaignDef = campaign.getDefinition(); OperationResult result = new OperationResult("test100AddCampaignNonOverwrite"); campaign1Oid = repositoryService.addObject(campaign, null, result); result.recomputeStatus(); AssertJUnit.assertTrue(result.isSuccess()); checkCampaign(campaign1Oid, result, prismContext.parseObject(CAMPAIGN_1_FILE), null, null); checksCountsStandard(result); } @Test(expectedExceptions = ObjectAlreadyExistsException.class) public void test105AddCampaignNonOverwriteExisting() throws Exception { PrismObject<AccessCertificationCampaignType> campaign = prismContext.parseObject(CAMPAIGN_1_FILE); OperationResult result = new OperationResult("test105AddCampaignNonOverwriteExisting"); repositoryService.addObject(campaign, null, result); } @Test public void test108AddCampaignOverwriteExisting() throws Exception { PrismObject<AccessCertificationCampaignType> campaign = prismContext.parseObject(CAMPAIGN_1_FILE); OperationResult result = new OperationResult("test108AddCampaignOverwriteExisting"); campaign.setOid(campaign1Oid); // doesn't work without specifying OID campaign1Oid = repositoryService.addObject(campaign, RepoAddOptions.createOverwrite(), result); checkCampaign(campaign1Oid, result, prismContext.parseObject(CAMPAIGN_1_FILE), null, null); checksCountsStandard(result); } @Test public void test200ModifyCampaignProperties() throws Exception { OperationResult result = new OperationResult("test200ModifyCampaignProperties"); List<ItemDelta<?,?>> modifications = new ArrayList<>(); modifications.add(createModificationReplaceProperty(F_NAME, campaignDef, new PolyString("Campaign 1+", "campaign 1"))); modifications.add(createModificationReplaceProperty(F_STATE, campaignDef, IN_REVIEW_STAGE)); executeAndCheckModification(modifications, result, 1); checksCountsStandard(result); } @Test public void test210ModifyCaseProperties() throws Exception { OperationResult result = new OperationResult("test210ModifyCaseProperties"); List<ItemDelta<?,?>> modifications = new ArrayList<>(); ItemPath case1 = new ItemPath(F_CASE).subPath(new IdItemPathSegment(1L)); modifications.add(createModificationReplaceProperty(case1.subPath(F_CURRENT_STAGE_OUTCOME), campaignDef, SchemaConstants.MODEL_CERTIFICATION_OUTCOME_REDUCE)); modifications.add(createModificationReplaceProperty(case1.subPath(AccessCertificationCaseType.F_STAGE_NUMBER), campaignDef, 300)); executeAndCheckModification(modifications, result, 0); checksCountsStandard(result); } @Test public void test220ModifyWorkItemProperties() throws Exception { OperationResult result = new OperationResult("test220ModifyWorkItemProperties"); List<ItemDelta<?,?>> modifications = DeltaBuilder.deltaFor(AccessCertificationCampaignType.class, prismContext) .item(F_CASE, 1L, F_WORK_ITEM, 1L, F_OUTPUT).replace( new AbstractWorkItemOutputType() .outcome(SchemaConstants.MODEL_CERTIFICATION_OUTCOME_NOT_DECIDED) .comment("hi")) .asItemDeltas(); executeAndCheckModification(modifications, result, 0); checksCountsStandard(result); } @Test public void test230ModifyAllLevels() throws Exception { OperationResult result = new OperationResult("test230ModifyAllLevels"); List<ItemDelta<?,?>> modifications = DeltaBuilder.deltaFor(AccessCertificationCampaignType.class, prismContext) .item(F_NAME).replace(new PolyString("Campaign 2", "campaign 2")) .item(F_STATE).replace(IN_REMEDIATION) .item(F_CASE, 2, F_CURRENT_STAGE_OUTCOME).replace(SchemaConstants.MODEL_CERTIFICATION_OUTCOME_NO_RESPONSE) .item(F_CASE, 2, AccessCertificationCaseType.F_STAGE_NUMBER).replace(400) .item(F_CASE, 1, F_WORK_ITEM, 1, F_OUTPUT).replace( new AbstractWorkItemOutputType() .outcome(SchemaConstants.MODEL_CERTIFICATION_OUTCOME_NOT_DECIDED) .comment("low")) .asItemDeltas(); executeAndCheckModification(modifications, result, 1); checksCountsStandard(result); } @Test public void test240AddCases() throws Exception { OperationResult result = new OperationResult("test240AddDeleteCases"); AccessCertificationCaseType caseNoId = new AccessCertificationCaseType(prismContext); caseNoId.setObjectRef(createObjectRef("123", ObjectTypes.USER)); caseNoId.setTargetRef(createObjectRef("456", ObjectTypes.ROLE)); caseNoId.setStageNumber(1); // explicit ID is dangerous (possibility of conflict!) AccessCertificationCaseType case100 = new AccessCertificationCaseType(prismContext); case100.setId(NEW_CASE_ID); case100.setObjectRef(createObjectRef("100123", ObjectTypes.USER)); case100.setTargetRef(createObjectRef("100456", ObjectTypes.ROLE)); case100.beginWorkItem() .assigneeRef(createObjectRef("ref1", ObjectTypes.USER)) .end(); case100.setStageNumber(1); List<ItemDelta<?,?>> modifications = DeltaBuilder.deltaFor(AccessCertificationCampaignType.class, prismContext) .item(F_CASE).add(caseNoId, case100) .asItemDeltas(); executeAndCheckModification(modifications, result, 0); checkCasesForCampaign(campaign1Oid, 9, result); checkCasesTotal(9, result); checkWorkItemsForCampaign(campaign1Oid, 11, result); checkWorkItemsForCampaignAndCase(campaign1Oid, 1,2, result); checkWorkItemsForCampaignAndCase(campaign1Oid, 2,1, result); checkWorkItemsForCampaignAndCase(campaign1Oid, NEW_CASE_ID,1, result); checkWorkItemsTotal(11, result); } @Test public void test250DeleteCase() throws Exception { OperationResult result = new OperationResult("test250DeleteCase"); AccessCertificationCaseType case7 = new AccessCertificationCaseType(); case7.setId(7L); List<ItemDelta<?,?>> modifications = DeltaBuilder.deltaFor(AccessCertificationCampaignType.class, prismContext) .item(F_CASE).delete(case7) .asItemDeltas(); executeAndCheckModification(modifications, result, 0); checkCasesForCampaign(campaign1Oid, 8, result); checkCasesTotal(8, result); checkWorkItemsForCampaign(campaign1Oid, 9, result); checkWorkItemsForCampaignAndCase(campaign1Oid, 1,2, result); checkWorkItemsForCampaignAndCase(campaign1Oid, 2,1, result); checkWorkItemsForCampaignAndCase(campaign1Oid, NEW_CASE_ID,1, result); checkWorkItemsTotal(9, result); } @Test public void test260AddWorkItem() throws Exception { OperationResult result = new OperationResult("test260AddWorkItem"); AccessCertificationWorkItemType workItem = new AccessCertificationWorkItemType(prismContext) .beginOriginalAssigneeRef().oid("orig1").type(UserType.COMPLEX_TYPE).<AccessCertificationWorkItemType>end() .beginAssigneeRef().oid("rev1").type(UserType.COMPLEX_TYPE).<AccessCertificationWorkItemType>end() .beginAssigneeRef().oid("rev2").type(UserType.COMPLEX_TYPE).end(); List<ItemDelta<?,?>> modifications = DeltaBuilder.deltaFor(AccessCertificationCampaignType.class, prismContext) .item(F_CASE, NEW_CASE_ID, F_WORK_ITEM).add(workItem) .asItemDeltas(); // WHEN executeAndCheckModification(modifications, result, 0); // THEN checkCasesForCampaign(campaign1Oid, 8, result); checkCasesTotal(8, result); checkWorkItemsForCampaign(campaign1Oid, 10, result); checkWorkItemsForCampaignAndCase(campaign1Oid, 1,2, result); checkWorkItemsForCampaignAndCase(campaign1Oid, 2,1, result); checkWorkItemsForCampaignAndCase(campaign1Oid, NEW_CASE_ID,2, result); checkWorkItemsTotal(10, result); } @Test public void test270ModifyWorkItem() throws Exception { OperationResult result = new OperationResult("test270ModifyWorkItem"); PrismObject<AccessCertificationCampaignType> campaign = getFullCampaign(campaign1Oid, result); AccessCertificationCaseType case100 = campaign.asObjectable().getCase().stream() .filter(c -> c.getId() == NEW_CASE_ID).findFirst().orElseThrow(() -> new AssertionError("No case 100")); assertEquals("Wrong # of work items in case 100", 2, case100.getWorkItem().size()); AccessCertificationWorkItemType workItem = case100.getWorkItem().stream().filter(wi -> wi.getOriginalAssigneeRef() != null).findFirst().orElse(null); assertNotNull("No new work item", workItem); XMLGregorianCalendar closedTimestamp = XmlTypeConverter.createXMLGregorianCalendar(new Date()); List<ItemDelta<?,?>> modifications = DeltaBuilder.deltaFor(AccessCertificationCampaignType.class, prismContext) .item(F_CASE, NEW_CASE_ID, F_WORK_ITEM, workItem.getId(), AccessCertificationWorkItemType.F_CLOSE_TIMESTAMP) .replace(closedTimestamp) .asItemDeltas(); // WHEN executeAndCheckModification(modifications, result, 0); // THEN checkCasesForCampaign(campaign1Oid, 8, result); checkCasesTotal(8, result); checkWorkItemsForCampaign(campaign1Oid, 10, result); checkWorkItemsForCampaignAndCase(campaign1Oid, 1,2, result); checkWorkItemsForCampaignAndCase(campaign1Oid, 2,1, result); checkWorkItemsForCampaignAndCase(campaign1Oid, NEW_CASE_ID,2, result); checkWorkItemsTotal(10, result); } @Test public void test280DeleteWorkItem() throws Exception { OperationResult result = new OperationResult("test280DeleteWorkItem"); PrismObject<AccessCertificationCampaignType> campaign = getFullCampaign(campaign1Oid, result); AccessCertificationCaseType case100 = campaign.asObjectable().getCase().stream() .filter(c -> c.getId() == NEW_CASE_ID).findFirst().orElseThrow(() -> new AssertionError("No case 100")); assertEquals("Wrong # of work items in case 100", 2, case100.getWorkItem().size()); AccessCertificationWorkItemType workItem = case100.getWorkItem().stream().filter(wi -> wi.getOriginalAssigneeRef() != null).findFirst().orElse(null); assertNotNull("No new work item", workItem); List<ItemDelta<?,?>> modifications = DeltaBuilder.deltaFor(AccessCertificationCampaignType.class, prismContext) .item(F_CASE, NEW_CASE_ID, F_WORK_ITEM).delete(workItem.clone()) .asItemDeltas(); // WHEN executeAndCheckModification(modifications, result, 0); // THEN checkCasesForCampaign(campaign1Oid, 8, result); checkCasesTotal(8, result); checkWorkItemsForCampaign(campaign1Oid, 9, result); checkWorkItemsForCampaignAndCase(campaign1Oid, 1,2, result); checkWorkItemsForCampaignAndCase(campaign1Oid, 2,1, result); checkWorkItemsForCampaignAndCase(campaign1Oid, NEW_CASE_ID,1, result); checkWorkItemsTotal(9, result); } @Test public void test300AddDeleteModifyCase() throws Exception { OperationResult result = new OperationResult("test300AddDeleteModifyCase"); AccessCertificationCaseType caseNoId = new AccessCertificationCaseType(prismContext); caseNoId.setObjectRef(createObjectRef("x123", ObjectTypes.USER)); caseNoId.setTargetRef(createObjectRef("x456", ObjectTypes.ROLE)); caseNoId.setStageNumber(1); // explicit ID is dangerous AccessCertificationCaseType case110 = new AccessCertificationCaseType(prismContext) .id(SECOND_NEW_CASE_ID) .objectRef(createObjectRef("x100123", ObjectTypes.USER)) .targetRef(createObjectRef("x100456", ObjectTypes.ROLE)) .stageNumber(1) .beginWorkItem() .assigneeRef(createObjectRef("x100789", ObjectTypes.USER)) .end(); AccessCertificationCaseType case100 = new AccessCertificationCaseType(); case100.setId(NEW_CASE_ID); List<ItemDelta<?,?>> modifications = DeltaBuilder.deltaFor(AccessCertificationCampaignType.class, prismContext) .item(F_CASE).add(caseNoId, case110).delete(case100) .item(F_CASE, 3, AccessCertificationCaseType.F_STAGE_NUMBER).replace(400) .asItemDeltas(); executeAndCheckModification(modifications, result, 0); checkCasesForCampaign(campaign1Oid, 9, result); checkCasesTotal(9, result); checkWorkItemsForCampaign(campaign1Oid, 9, result); checkWorkItemsForCampaignAndCase(campaign1Oid, 1,2, result); checkWorkItemsForCampaignAndCase(campaign1Oid, 2,1, result); checkWorkItemsForCampaignAndCase(campaign1Oid, SECOND_NEW_CASE_ID,1, result); checkWorkItemsTotal(9, result); } @Test public void test320AddDeleteModifyResponse() throws Exception { OperationResult result = new OperationResult("test320AddDeleteModifyResponse"); AccessCertificationWorkItemType wiNoId = new AccessCertificationWorkItemType(prismContext); wiNoId.assigneeRef(createObjectRef("888", ObjectTypes.USER)); wiNoId.setStageNumber(1); AccessCertificationWorkItemType wi200 = new AccessCertificationWorkItemType(prismContext); wi200.setId(200L); // this is dangerous wi200.setStageNumber(1); wi200.assigneeRef(createObjectRef("200888", ObjectTypes.USER)); AccessCertificationWorkItemType wi1 = new AccessCertificationWorkItemType(); wi1.setId(1L); List<ItemDelta<?,?>> modifications = DeltaBuilder.deltaFor(AccessCertificationCampaignType.class, prismContext) .item(F_CASE, 6, F_WORK_ITEM).add(wiNoId, wi200) .item(F_CASE, 6, F_WORK_ITEM).delete(wi1) .item(F_CASE, 6, F_WORK_ITEM, 2, F_OUTPUT, F_OUTCOME).replace(SchemaConstants.MODEL_CERTIFICATION_OUTCOME_ACCEPT) .asItemDeltas(); executeAndCheckModification(modifications, result, 0); checkCasesForCampaign(campaign1Oid, 9, result); checkCasesTotal(9, result); checkWorkItemsForCampaign(campaign1Oid, 10, result); checkWorkItemsForCampaignAndCase(campaign1Oid, 1,2, result); checkWorkItemsForCampaignAndCase(campaign1Oid, 2,1, result); checkWorkItemsForCampaignAndCase(campaign1Oid, SECOND_NEW_CASE_ID,1, result); checkWorkItemsTotal(10, result); } @Test public void test330ReplaceWorkItemsExistingId() throws Exception { OperationResult result = new OperationResult("test330ReplaceWorkItemsExistingId"); AccessCertificationWorkItemType wi200 = new AccessCertificationWorkItemType(prismContext); wi200.setId(200L); //dangerous wi200.setStageNumber(44); wi200.assigneeRef(createObjectRef("999999", ObjectTypes.USER)); List<ItemDelta<?,?>> modifications = DeltaBuilder.deltaFor(AccessCertificationCampaignType.class, prismContext) .item(F_CASE, 6, F_WORK_ITEM).replace(wi200) .asItemDeltas(); executeAndCheckModification(modifications, result, 0); checkCasesForCampaign(campaign1Oid, 9, result); checkCasesTotal(9, result); checkWorkItemsForCampaign(campaign1Oid, 8, result); checkWorkItemsForCampaignAndCase(campaign1Oid, 1,2, result); checkWorkItemsForCampaignAndCase(campaign1Oid, 2,1, result); checkWorkItemsForCampaignAndCase(campaign1Oid, SECOND_NEW_CASE_ID,1, result); checkWorkItemsTotal(8, result); } @Test public void test340ReplaceWorkItemsNewId() throws Exception { OperationResult result = new OperationResult("test340ReplaceWorkItemsNewId"); AccessCertificationWorkItemType wi250 = new AccessCertificationWorkItemType(prismContext); wi250.setId(250L); //dangerous wi250.setStageNumber(440); wi250.assigneeRef(createObjectRef("250-999999", ObjectTypes.USER)); AccessCertificationWorkItemType wi251 = new AccessCertificationWorkItemType(prismContext); wi251.setId(251L); wi251.setStageNumber(1); List<ItemDelta<?,?>> modifications = DeltaBuilder.deltaFor(AccessCertificationCampaignType.class, prismContext) .item(F_CASE, 6, F_WORK_ITEM).replace(wi250, wi251) .asItemDeltas(); // TODO counts executeAndCheckModification(modifications, result, 0); checkCasesForCampaign(campaign1Oid, 9, result); checkCasesTotal(9, result); checkWorkItemsForCampaign(campaign1Oid, 9, result); checkWorkItemsForCampaignAndCase(campaign1Oid, 1,2, result); checkWorkItemsForCampaignAndCase(campaign1Oid, 2,1, result); checkWorkItemsForCampaignAndCase(campaign1Oid, SECOND_NEW_CASE_ID,1, result); checkWorkItemsTotal(9, result); } @Test public void test350ReplaceCase() throws Exception { OperationResult result = new OperationResult("test350ReplaceCase"); // explicit ID is dangerous AccessCertificationWorkItemType wi777 = new AccessCertificationWorkItemType(prismContext); wi777.setId(777L); wi777.setStageNumber(888); wi777.assigneeRef(createObjectRef("999", ObjectTypes.USER)); AccessCertificationWorkItemType wiNoId = new AccessCertificationWorkItemType(prismContext); wiNoId.setStageNumber(889); wiNoId.assigneeRef(createObjectRef("9999", ObjectTypes.USER)); AccessCertificationCaseType caseNoId = new AccessCertificationCaseType(prismContext) .objectRef(createObjectRef("aaa", ObjectTypes.USER)) .targetRef(createObjectRef("bbb", ObjectTypes.ROLE)) .beginWorkItem() .assigneeRef(createObjectRef("ccc", ObjectTypes.USER)) .<AccessCertificationCaseType>end() .workItem(wi777) .workItem(wiNoId) .stageNumber(1); List<ItemDelta<?,?>> modifications = DeltaBuilder.deltaFor(AccessCertificationCampaignType.class, prismContext) .item(F_CASE).replace(caseNoId) .asItemDeltas(); executeAndCheckModification(modifications, result, 0); checkCasesForCampaign(campaign1Oid, 1, result); checkCasesTotal(1, result); checkWorkItemsForCampaign(campaign1Oid, 3, result); checkWorkItemsTotal(3, result); } @Test public void test700PrepareForQueryCases() throws Exception { OperationResult result = new OperationResult("test700PrepareForQueryCases"); // overwrite the campaign PrismObject<AccessCertificationCampaignType> campaign = prismContext.parseObject(CAMPAIGN_1_FILE); campaign.setOid(campaign1Oid); // doesn't work without specifying OID campaign1Oid = repositoryService.addObject(campaign, RepoAddOptions.createOverwrite(), result); checkCampaign(campaign1Oid, result, prismContext.parseObject(CAMPAIGN_1_FILE), null, null); PrismObject<AccessCertificationCampaignType> campaign2 = prismContext.parseObject(CAMPAIGN_2_FILE); campaign2Oid = repositoryService.addObject(campaign2, null, result); checkCampaign(campaign2Oid, result, prismContext.parseObject(CAMPAIGN_2_FILE), null, null); } @Test public void test710CasesForCampaign() throws Exception { OperationResult result = new OperationResult("test710CasesForCampaign"); checkCasesForCampaign(campaign1Oid, null, result); checkCasesForCampaign(campaign2Oid, null, result); } @Test public void test720AllCases() throws Exception { OperationResult result = new OperationResult("test720AllCases"); List<AccessCertificationCaseType> cases = repositoryService.searchContainers(AccessCertificationCaseType.class, null, null, result); AccessCertificationCampaignType campaign1 = getFullCampaign(campaign1Oid, result).asObjectable(); AccessCertificationCampaignType campaign2 = getFullCampaign(campaign2Oid, result).asObjectable(); List<AccessCertificationCaseType> expectedCases = new ArrayList<>(); expectedCases.addAll(campaign1.getCase()); expectedCases.addAll(campaign2.getCase()); PrismAsserts.assertEqualsCollectionUnordered("list of cases is different", cases, expectedCases.toArray(new AccessCertificationCaseType[0])); } @Test public void test730CurrentUnansweredCases() throws Exception { OperationResult result = new OperationResult("test730CurrentUnansweredCases"); ObjectQuery query = QueryBuilder.queryFor(AccessCertificationCaseType.class, prismContext) .item(AccessCertificationCaseType.F_STAGE_NUMBER).eq().item(T_PARENT, AccessCertificationCampaignType.F_STAGE_NUMBER) .and().item(T_PARENT, F_STATE).eq(IN_REVIEW_STAGE) .and().exists(F_WORK_ITEM).block() .item(F_CLOSE_TIMESTAMP).isNull() .and().block() .item(F_OUTPUT, F_OUTCOME).isNull() .endBlock() .endBlock() .build(); List<AccessCertificationCaseType> cases = repositoryService.searchContainers(AccessCertificationCaseType.class, query, createCollection(createDistinct()), result); AccessCertificationCampaignType campaign1 = getFullCampaign(campaign1Oid, result).asObjectable(); AccessCertificationCampaignType campaign2 = getFullCampaign(campaign2Oid, result).asObjectable(); List<AccessCertificationCaseType> expectedCases = new ArrayList<>(); addUnansweredActiveCases(expectedCases, campaign1.getCase(), campaign1); addUnansweredActiveCases(expectedCases, campaign2.getCase(), campaign2); PrismAsserts.assertEqualsCollectionUnordered("list of cases is different", cases, expectedCases.toArray(new AccessCertificationCaseType[0])); } private void addUnansweredActiveCases(List<AccessCertificationCaseType> expectedCases, List<AccessCertificationCaseType> caseList, AccessCertificationCampaignType campaign) { for (AccessCertificationCaseType aCase : caseList) { if (aCase.getStageNumber() != campaign.getStageNumber()) { continue; } if (campaign.getState() != IN_REVIEW_STAGE) { continue; } boolean emptyDecisionFound = false; for (AccessCertificationWorkItemType workItem : aCase.getWorkItem()) { if (WorkItemTypeUtil.getOutcome(workItem) == null) { emptyDecisionFound = true; break; } } if (emptyDecisionFound) { LOGGER.info("Expecting case of {}:{}", campaign.getOid(), aCase.getId()); expectedCases.add(aCase); } } } private void checkCasesForCampaign(String oid, Integer expected, OperationResult result) throws SchemaException, ObjectNotFoundException { ObjectQuery query = QueryBuilder.queryFor(AccessCertificationCaseType.class, prismContext) .ownerId(oid) .build(); List<AccessCertificationCaseType> cases = repositoryService.searchContainers(AccessCertificationCaseType.class, query, null, result); assertCasesFound(expected, cases, " for " + oid); for (AccessCertificationCaseType aCase : cases) { PrismObject<AccessCertificationCampaignType> campaign = getOwningCampaignChecked(aCase); AssertJUnit.assertEquals("wrong parent OID", oid, campaign.getOid()); } AccessCertificationCampaignType campaign = getFullCampaign(oid, result).asObjectable(); PrismAsserts.assertEqualsCollectionUnordered("list of cases is different", cases, campaign.getCase().toArray(new AccessCertificationCaseType[0])); } private void checkWorkItemsForCampaign(String oid, Integer expected, OperationResult result) throws SchemaException, ObjectNotFoundException { ObjectQuery query = QueryBuilder.queryFor(AccessCertificationWorkItemType.class, prismContext) .exists(T_PARENT) .block() .ownerId(oid) .endBlock() .build(); List<AccessCertificationWorkItemType> workItems = repositoryService.searchContainers(AccessCertificationWorkItemType.class, query, null, result); assertWorkItemsCount(expected, workItems, " for " + oid); } private void checkWorkItemsForCampaignAndCase(String oid, long caseId, Integer expected, OperationResult result) throws SchemaException, ObjectNotFoundException { ObjectQuery query = QueryBuilder.queryFor(AccessCertificationWorkItemType.class, prismContext) .exists(T_PARENT) .block() .ownerId(oid) .and().id(caseId) .endBlock() .build(); List<AccessCertificationWorkItemType> workItems = repositoryService.searchContainers(AccessCertificationWorkItemType.class, query, null, result); assertWorkItemsCount(expected, workItems, " for " + oid + ":" + caseId); } private void checkCasesTotal(Integer expected, OperationResult result) throws SchemaException, ObjectNotFoundException { ObjectQuery query = QueryBuilder.queryFor(AccessCertificationCaseType.class, prismContext) .build(); List<AccessCertificationCaseType> cases = repositoryService.searchContainers(AccessCertificationCaseType.class, query, null, result); assertCasesFound(expected, cases, ""); } private void assertCasesFound(Integer expected, List<AccessCertificationCaseType> cases, String desc) { System.out.println("Cases found" + desc + ": " + cases.size()); if (expected != null) { assertEquals("Wrong # of cases" + desc, expected.intValue(), cases.size()); } } private void checkWorkItemsTotal(Integer expected, OperationResult result) throws SchemaException, ObjectNotFoundException { List<AccessCertificationWorkItemType> workItems = repositoryService.searchContainers(AccessCertificationWorkItemType.class, null, null, result); assertWorkItemsCount(expected, workItems, ""); } private void assertWorkItemsCount(Integer expected, List<AccessCertificationWorkItemType> workItems, String desc) { System.out.println("Work items found" + desc + ": " + workItems.size()); if (expected != null) { assertEquals("Wrong # of work items" + desc, expected.intValue(), workItems.size()); } } private PrismObject<AccessCertificationCampaignType> getOwningCampaignChecked(AccessCertificationCaseType aCase) { PrismContainer caseContainer = (PrismContainer) aCase.asPrismContainerValue().getParent(); assertNotNull("campaign is not fetched (case parent is null)", caseContainer); PrismContainerValue campaignValue = (PrismContainerValue) caseContainer.getParent(); assertNotNull("campaign is not fetched (case container parent is null)", caseContainer); PrismObject<AccessCertificationCampaignType> campaign = (PrismObject) campaignValue.getParent(); assertNotNull("campaign is not fetched (campaign PCV parent is null)", campaign); return campaign; } @Test public void test900DeleteCampaign() throws Exception { OperationResult result = new OperationResult("test900DeleteCampaign"); repositoryService.deleteObject(AccessCertificationCampaignType.class, campaign1Oid, result); result.recomputeStatus(); AssertJUnit.assertTrue(result.isSuccess()); } protected void executeAndCheckModification(List<ItemDelta<?,?>> modifications, OperationResult result, int versionDelta) throws ObjectNotFoundException, SchemaException, ObjectAlreadyExistsException, IOException { RepoModifyOptions modifyOptions = getModifyOptions(); if (RepoModifyOptions.isExecuteIfNoChanges(modifyOptions) && versionDelta == 0) { versionDelta = 1; } PrismObject<AccessCertificationCampaignType> before = getFullCampaign(campaign1Oid, result); int expectedVersion = Integer.parseInt(before.getVersion()) + versionDelta; List<ItemDelta> savedModifications = (List) CloneUtil.cloneCollectionMembers(modifications); repositoryService.modifyObject(AccessCertificationCampaignType.class, campaign1Oid, modifications, modifyOptions, result); checkCampaign(campaign1Oid, result, before, savedModifications, expectedVersion); } private void checkCampaign(String campaignOid, OperationResult result, PrismObject<AccessCertificationCampaignType> expectedObject, List<ItemDelta> modifications, Integer expectedVersion) throws SchemaException, ObjectNotFoundException, IOException { expectedObject.setOid(campaignOid); if (modifications != null) { ItemDelta.applyTo(modifications, expectedObject); } LOGGER.trace("Expected object = \n{}", expectedObject.debugDump()); PrismObject<AccessCertificationCampaignType> campaign = getFullCampaign(campaignOid, result); LOGGER.trace("Actual object from repo = \n{}", campaign.debugDump()); PrismAsserts.assertEquivalent("Campaign is not as expected", expectedObject, campaign); if (expectedVersion != null) { AssertJUnit.assertEquals("Incorrect version", (int) expectedVersion, Integer.parseInt(campaign.getVersion())); } } private PrismObject<AccessCertificationCampaignType> getFullCampaign(String campaignOid, OperationResult result) throws ObjectNotFoundException, SchemaException { SelectorOptions<GetOperationOptions> retrieve = SelectorOptions.create(F_CASE, GetOperationOptions.createRetrieve(INCLUDE)); return repositoryService.getObject(AccessCertificationCampaignType.class, campaignOid, Collections.singletonList(retrieve), result); } private void checksCountsStandard(OperationResult result) throws SchemaException, ObjectNotFoundException { checkCasesForCampaign(campaign1Oid, 7, result); checkCasesTotal(7, result); checkWorkItemsForCampaign(campaign1Oid, 10, result); checkWorkItemsForCampaignAndCase(campaign1Oid, 1,2, result); checkWorkItemsForCampaignAndCase(campaign1Oid, 2,1, result); checkWorkItemsTotal(10, result); } }