diff --git a/infra/schema/src/main/java/com/evolveum/midpoint/schema/util/CertCampaignTypeUtil.java b/infra/schema/src/main/java/com/evolveum/midpoint/schema/util/CertCampaignTypeUtil.java index 8764040ab5d..7773bf2a468 100644 --- a/infra/schema/src/main/java/com/evolveum/midpoint/schema/util/CertCampaignTypeUtil.java +++ b/infra/schema/src/main/java/com/evolveum/midpoint/schema/util/CertCampaignTypeUtil.java @@ -264,4 +264,13 @@ public static ObjectQuery createCasesForCampaignQuery(String campaignOid, PrismC .ownerId(campaignOid) .build(); } + + public static AccessCertificationCaseStageOutcomeType getStageOutcome(AccessCertificationCaseType aCase, int stageNumber) { + for (AccessCertificationCaseStageOutcomeType outcome : aCase.getCompletedStageOutcome()) { + if (outcome.getStageNumber() == stageNumber) { + return outcome; + } + } + throw new IllegalStateException("No outcome registered for stage " + stageNumber + " in case " + aCase); + } } diff --git a/model/certification-impl/src/main/java/com/evolveum/midpoint/certification/impl/AccCertResponseComputationHelper.java b/model/certification-impl/src/main/java/com/evolveum/midpoint/certification/impl/AccCertResponseComputationHelper.java index ba79297ee6f..e9cd5d1f904 100644 --- a/model/certification-impl/src/main/java/com/evolveum/midpoint/certification/impl/AccCertResponseComputationHelper.java +++ b/model/certification-impl/src/main/java/com/evolveum/midpoint/certification/impl/AccCertResponseComputationHelper.java @@ -206,7 +206,12 @@ private ResponsesSummary summarize(List respons return summary; } + public AccessCertificationResponseType computeOverallOutcome(AccessCertificationCaseType aCase, AccessCertificationCampaignType campaign) { + return computeOverallOutcome(aCase, campaign, null); + } + // aCase contains outcomes from stages 1..N-1. Outcome from stage N is in currentStageOutcome + // (alternatively: aCase has stages 1..N and currentStageOutcome is null) public AccessCertificationResponseType computeOverallOutcome(AccessCertificationCaseType aCase, AccessCertificationCampaignType campaign, AccessCertificationCaseStageOutcomeType currentStageOutcome) { final OutcomeStrategy strategy = getOverallOutcomeStrategy(campaign); @@ -214,7 +219,9 @@ public AccessCertificationResponseType computeOverallOutcome(AccessCertification for (AccessCertificationCaseStageOutcomeType stageOutcome : aCase.getCompletedStageOutcome()) { stageOutcomes.add(stageOutcome.getOutcome()); } - stageOutcomes.add(currentStageOutcome.getOutcome()); + if (currentStageOutcome != null) { + stageOutcomes.add(currentStageOutcome.getOutcome()); + } return strategy.computeOutcome(summarize(stageOutcomes)); } } diff --git a/model/certification-impl/src/main/java/com/evolveum/midpoint/certification/impl/AccCertUpdateHelper.java b/model/certification-impl/src/main/java/com/evolveum/midpoint/certification/impl/AccCertUpdateHelper.java index 2ba1a451f80..844ed253d70 100644 --- a/model/certification-impl/src/main/java/com/evolveum/midpoint/certification/impl/AccCertUpdateHelper.java +++ b/model/certification-impl/src/main/java/com/evolveum/midpoint/certification/impl/AccCertUpdateHelper.java @@ -278,15 +278,15 @@ protected AccessCertificationStageType createStage(AccessCertificationCampaignTy stage.setStart(XmlTypeConverter.createXMLGregorianCalendar(new Date())); AccessCertificationStageDefinitionType stageDef = CertCampaignTypeUtil.findStageDefinition(campaign, stage.getNumber()); - XMLGregorianCalendar end = (XMLGregorianCalendar) stage.getStart().clone(); + XMLGregorianCalendar deadline = (XMLGregorianCalendar) stage.getStart().clone(); if (stageDef.getDuration() != null) { - end.add(stageDef.getDuration()); + deadline.add(stageDef.getDuration()); } - end.setHour(23); - end.setMinute(59); - end.setSecond(59); - end.setMillisecond(999); - stage.setEnd(end); + deadline.setHour(23); + deadline.setMinute(59); + deadline.setSecond(59); + deadline.setMillisecond(999); + stage.setDeadline(deadline); stage.setName(stageDef.getName()); stage.setDescription(stageDef.getDescription()); diff --git a/model/certification-impl/src/test/java/com/evolveum/midpoint/certification/test/AbstractCertificationTest.java b/model/certification-impl/src/test/java/com/evolveum/midpoint/certification/test/AbstractCertificationTest.java index 51f9bdde9e3..89f2d3395fa 100644 --- a/model/certification-impl/src/test/java/com/evolveum/midpoint/certification/test/AbstractCertificationTest.java +++ b/model/certification-impl/src/test/java/com/evolveum/midpoint/certification/test/AbstractCertificationTest.java @@ -19,6 +19,7 @@ import com.evolveum.midpoint.certification.api.CertificationManager; import com.evolveum.midpoint.certification.impl.AccCertGeneralHelper; import com.evolveum.midpoint.certification.impl.AccCertQueryHelper; +import com.evolveum.midpoint.certification.impl.AccCertResponseComputationHelper; import com.evolveum.midpoint.model.api.AccessCertificationService; import com.evolveum.midpoint.model.test.AbstractModelIntegrationTest; import com.evolveum.midpoint.prism.PrismObject; @@ -50,6 +51,7 @@ import com.evolveum.midpoint.xml.ns._public.common.common_3.AccessCertificationDecisionType; import com.evolveum.midpoint.xml.ns._public.common.common_3.AccessCertificationDefinitionType; import com.evolveum.midpoint.xml.ns._public.common.common_3.AccessCertificationResponseType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.AccessCertificationStageType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ActivationStatusType; import com.evolveum.midpoint.xml.ns._public.common.common_3.AssignmentType; import com.evolveum.midpoint.xml.ns._public.common.common_3.FocusType; @@ -74,6 +76,9 @@ import java.util.Set; import static com.evolveum.midpoint.schema.RetrieveOption.INCLUDE; +import static com.evolveum.midpoint.xml.ns._public.common.common_3.AccessCertificationCampaignStateType.CREATED; +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.AccessCertificationCampaignStateType.REVIEW_STAGE_DONE; 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.AccessCertificationResponseType.NO_RESPONSE; import static org.testng.AssertJUnit.assertEquals; @@ -87,6 +92,9 @@ * */ public class AbstractCertificationTest extends AbstractModelIntegrationTest { + + @Autowired + private AccCertResponseComputationHelper computationHelper; public static final File SYSTEM_CONFIGURATION_FILE = new File(COMMON_DIR, "system-configuration.xml"); public static final String SYSTEM_CONFIGURATION_OID = SystemObjectsType.SYSTEM_CONFIGURATION.value(); @@ -297,6 +305,30 @@ protected void assertApproximateTime(String itemName, Date expected, XMLGregoria Math.abs(actualAsDate.getTime() - expected.getTime()) < 600000); // 10 minutes } + protected void assertAfterCampaignStart(AccessCertificationCampaignType campaign, AccessCertificationDefinitionType definition, int cases) { + assertStateAndStage(campaign, IN_REVIEW_STAGE, 1); + assertDefinitionAndOwner(campaign, definition); + assertApproximateTime("start time", new Date(), campaign.getStart()); + assertNull("Unexpected end time", campaign.getEnd()); + assertEquals("wrong # of defined stages", definition.getStageDefinition().size(), campaign.getStageDefinition().size()); + assertEquals("wrong # of stages", 1, campaign.getStage().size()); + AccessCertificationStageType stage = campaign.getStage().get(0); + assertEquals("wrong stage #", 1, stage.getNumber()); + assertApproximateTime("stage 1 start", new Date(), stage.getStart()); + assertNotNull("stage 1 deadline", stage.getDeadline()); // too lazy to compute exact datetime + assertNull("unexpected stage 1 end", stage.getEnd()); + assertEquals("Wrong number of certification cases", cases, campaign.getCase().size()); + } + + protected void assertAfterCampaignCreate(AccessCertificationCampaignType campaign, AccessCertificationDefinitionType definition) { + assertEquals("Unexpected certification cases", 0, campaign.getCase().size()); + assertStateAndStage(campaign, CREATED, 0); + assertEquals("Unexpected # of stages", definition.getStageDefinition().size(), campaign.getStageDefinition().size()); + assertDefinitionAndOwner(campaign, definition); + assertNull("Unexpected start time", campaign.getStart()); + assertNull("Unexpected end time", campaign.getEnd()); + } + protected void assertStateAndStage(AccessCertificationCampaignType campaign, AccessCertificationCampaignStateType state, int stage) { assertEquals("Unexpected campaign state", state, campaign.getState()); assertEquals("Unexpected stage number", stage, campaign.getStageNumber()); @@ -349,7 +381,7 @@ protected void recordDecision(String campaignOid, AccessCertificationCaseType _c protected void assertSingleDecision(AccessCertificationCaseType _case, AccessCertificationResponseType response, String comment, int stageNumber, String reviewerOid, AccessCertificationResponseType aggregatedResponse, boolean checkHistory) { List currentDecisions = getCurrentDecisions(_case, stageNumber, false); - assertEquals("wrong # of decisions", 1, currentDecisions.size()); + assertEquals("wrong # of decisions for stage " + stageNumber, 1, currentDecisions.size()); AccessCertificationDecisionType storedDecision = currentDecisions.get(0); assertEquals("wrong response", response, storedDecision.getResponse()); assertEquals("wrong comment", comment, storedDecision.getComment()); @@ -441,5 +473,35 @@ protected AccessCertificationCampaignType getCampaignWithCases(String campaignOi } + protected void assertAfterStageClose(AccessCertificationCampaignType campaign, AccessCertificationDefinitionType definition, int stageNumber) { + assertStateAndStage(campaign, REVIEW_STAGE_DONE, stageNumber); + assertDefinitionAndOwner(campaign, definition); + assertNull("Unexpected end time", campaign.getEnd()); + assertEquals("wrong # of stages", stageNumber, campaign.getStage().size()); + AccessCertificationStageType stage = CertCampaignTypeUtil.getCurrentStage(campaign); + assertEquals("wrong stage #", 1, stage.getNumber()); + assertApproximateTime("stage 1 start", new Date(), stage.getStart()); + assertApproximateTime("stage 1 end", new Date(), stage.getStart()); + for (AccessCertificationCaseType aCase : campaign.getCase()) { + if (aCase.getCurrentStageNumber() != stageNumber) { + continue; + } + checkCaseOutcomes(aCase, campaign, stageNumber); + } + } + + private void checkCaseOutcomes(AccessCertificationCaseType aCase, AccessCertificationCampaignType campaign, int stageNumber) { + List stageOutcomes = new ArrayList<>(stageNumber); + for (int i = 1; i <= stageNumber; i++) { + stageOutcomes.add(checkCaseStageOutcome(aCase, stageNumber)); + } + assertEquals("Wrong # of completed stage outcomes", stageNumber, aCase.getCompletedStageOutcome().size()); + AccessCertificationResponseType expectedOverall = computationHelper.computeOverallOutcome(aCase, campaign); + assertEquals("Inconsistent overall outcome", expectedOverall, aCase.getOverallOutcome()); + } + + private AccessCertificationResponseType checkCaseStageOutcome(AccessCertificationCaseType aCase, int stageNumber) { + return CertCampaignTypeUtil.getStageOutcome(aCase, stageNumber).getOutcome(); + } } diff --git a/model/certification-impl/src/test/java/com/evolveum/midpoint/certification/test/BasicCertificationTest.java b/model/certification-impl/src/test/java/com/evolveum/midpoint/certification/test/BasicCertificationTest.java index 3b810c69508..1a3463998bb 100644 --- a/model/certification-impl/src/test/java/com/evolveum/midpoint/certification/test/BasicCertificationTest.java +++ b/model/certification-impl/src/test/java/com/evolveum/midpoint/certification/test/BasicCertificationTest.java @@ -26,22 +26,20 @@ import com.evolveum.midpoint.prism.query.builder.QueryBuilder; import com.evolveum.midpoint.schema.GetOperationOptions; import com.evolveum.midpoint.schema.SelectorOptions; -import com.evolveum.midpoint.schema.constants.ObjectTypes; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.schema.util.CertCampaignTypeUtil; import com.evolveum.midpoint.schema.util.ObjectTypeUtil; import com.evolveum.midpoint.task.api.Task; import com.evolveum.midpoint.test.util.TestUtil; import com.evolveum.midpoint.util.exception.SecurityViolationException; -import com.evolveum.midpoint.xml.ns._public.common.common_3.AccessCertificationCampaignStateType; import com.evolveum.midpoint.xml.ns._public.common.common_3.AccessCertificationCampaignType; import com.evolveum.midpoint.xml.ns._public.common.common_3.AccessCertificationCaseType; import com.evolveum.midpoint.xml.ns._public.common.common_3.AccessCertificationDecisionType; import com.evolveum.midpoint.xml.ns._public.common.common_3.AccessCertificationDefinitionType; import com.evolveum.midpoint.xml.ns._public.common.common_3.AccessCertificationResponseType; import com.evolveum.midpoint.xml.ns._public.common.common_3.AccessCertificationStageType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectReferenceType; import com.evolveum.midpoint.xml.ns._public.common.common_3.TaskType; +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.Test; @@ -54,12 +52,13 @@ import static com.evolveum.midpoint.schema.util.CertCampaignTypeUtil.getOrderBy; import static com.evolveum.midpoint.test.IntegrationTestTools.display; import static com.evolveum.midpoint.xml.ns._public.common.common_3.AccessCertificationCampaignStateType.CLOSED; -import static com.evolveum.midpoint.xml.ns._public.common.common_3.AccessCertificationCampaignStateType.CREATED; 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.AccessCertificationCampaignStateType.REVIEW_STAGE_DONE; import static com.evolveum.midpoint.xml.ns._public.common.common_3.AccessCertificationCaseType.F_ACTIVATION; import static com.evolveum.midpoint.xml.ns._public.common.common_3.AccessCertificationCaseType.F_TARGET_REF; +import static com.evolveum.midpoint.xml.ns._public.common.common_3.AccessCertificationResponseType.ACCEPT; +import static com.evolveum.midpoint.xml.ns._public.common.common_3.AccessCertificationResponseType.NO_RESPONSE; +import static com.evolveum.midpoint.xml.ns._public.common.common_3.AccessCertificationResponseType.REVOKE; import static com.evolveum.midpoint.xml.ns._public.common.common_3.ActivationStatusType.ENABLED; import static com.evolveum.midpoint.xml.ns._public.common.common_3.ActivationType.F_ADMINISTRATIVE_STATUS; import static org.testng.AssertJUnit.assertEquals; @@ -126,12 +125,7 @@ public void test001CreateForeignCampaign() throws Exception { campaign = getCampaignWithCases(roleInducementCampaignOid); display("campaign", campaign); - assertEquals("Unexpected certification cases", 0, campaign.getCase().size()); - assertStateAndStage(campaign, CREATED, 0); - assertEquals("Unexpected # of stages", 2, campaign.getStageDefinition().size()); - assertDefinitionAndOwner(campaign, roleInducementCertDefinition); - assertNull("Unexpected start time", campaign.getStart()); - assertNull("Unexpected end time", campaign.getEnd()); + assertAfterCampaignCreate(campaign, roleInducementCertDefinition); } @Test @@ -154,18 +148,7 @@ public void test002OpenFirstForeignStage() throws Exception { AccessCertificationCampaignType campaign = getCampaignWithCases(roleInducementCampaignOid); display("campaign in stage 1", campaign); - - assertStateAndStage(campaign, IN_REVIEW_STAGE, 1); - assertDefinitionAndOwner(campaign, roleInducementCertDefinition); - assertApproximateTime("start time", new Date(), campaign.getStart()); - assertNull("Unexpected end time", campaign.getEnd()); - assertEquals("wrong # of defined stages", 2, campaign.getStageDefinition().size()); - assertEquals("wrong # of stages", 1, campaign.getStage().size()); - AccessCertificationStageType stage = campaign.getStage().get(0); - assertEquals("wrong stage #", 1, stage.getNumber()); - assertApproximateTime("stage 1 start", new Date(), stage.getStart()); - assertNotNull("stage 1 end", stage.getDeadline()); // too lazy to compute exact datetime - assertEquals("Wrong number of certification cases", 5, campaign.getCase().size()); + assertAfterCampaignStart(campaign, roleInducementCertDefinition, 5); } @Test @@ -214,16 +197,7 @@ public void test010CreateCampaignAllowed() throws Exception { campaign = getObject(AccessCertificationCampaignType.class, campaignOid).asObjectable(); display("campaign", campaign); - assertEquals("Unexpected certification cases", 0, campaign.getCase().size()); - assertStateAndStage(campaign, CREATED, 0); - assertDefinitionAndOwner(campaign, certificationDefinition, USER_BOB_OID); - assertNull("Unexpected start time", campaign.getStart()); - assertNull("Unexpected end time", campaign.getEnd()); - } - - protected void assertStateAndStage(AccessCertificationCampaignType campaign, AccessCertificationCampaignStateType state, int stage) { - assertEquals("Unexpected campaign state", state, campaign.getState()); - assertEquals("Unexpected stage number", stage, campaign.getStageNumber()); + assertAfterCampaignCreate(campaign, certificationDefinition); } @Test @@ -307,25 +281,10 @@ public void test021OpenFirstStageAllowed() throws Exception { AccessCertificationCampaignType campaign = getCampaignWithCases(campaignOid); display("campaign in stage 1", campaign); - assertStateAndStage(campaign, IN_REVIEW_STAGE, 1); - assertDefinitionAndOwner(campaign, certificationDefinition, USER_BOB_OID); - assertApproximateTime("start time", new Date(), campaign.getStart()); - assertNull("Unexpected end time", campaign.getEnd()); - assertEquals("wrong # of stages", 1, campaign.getStage().size()); - AccessCertificationStageType stage = campaign.getStage().get(0); - assertEquals("wrong stage #", 1, stage.getNumber()); - assertApproximateTime("stage 1 start", new Date(), stage.getStart()); - assertNotNull("stage 1 end", stage.getDeadline()); // too lazy to compute exact datetime + assertAfterCampaignStart(campaign, certificationDefinition, 7); checkAllCases(campaign.getCase(), campaignOid); } -// protected void assertDefinitionAndOwner(AccessCertificationCampaignType campaign, PrismObject certificationDefinition) { -// assertEquals("Unexpected ownerRef", ObjectTypeUtil.createObjectRef(USER_ADMINISTRATOR_OID, ObjectTypes.USER), campaign.getOwnerRef()); -// assertEquals("Unexpected definitionRef", -// ObjectTypeUtil.createObjectRef(CERT_DEF_USER_ASSIGNMENT_BASIC_OID, ObjectTypes.ACCESS_CERTIFICATION_DEFINITION), -// campaign.getDefinitionRef()); -// } - @Test public void test030SearchAllCasesDenied() throws Exception { final String TEST_NAME = "test030SearchCasesDenied"; @@ -530,10 +489,9 @@ public void test100RecordDecision() throws Exception { // WHEN TestUtil.displayWhen(TEST_NAME); AccessCertificationDecisionType decision = new AccessCertificationDecisionType(prismContext); - decision.setResponse(AccessCertificationResponseType.ACCEPT); + decision.setResponse(ACCEPT); decision.setComment("no comment"); decision.setStageNumber(0); // will be replaced by current stage number - ObjectReferenceType administratorRef = ObjectTypeUtil.createObjectRef(USER_ADMINISTRATOR_OID, ObjectTypes.USER); long id = superuserCase.asPrismContainerValue().getId(); certificationService.recordDecision(campaignOid, id, decision, task, result); @@ -548,14 +506,7 @@ public void test100RecordDecision() throws Exception { superuserCase = findCase(caseList, USER_ADMINISTRATOR_OID, ROLE_SUPERUSER_OID); assertEquals("changed case ID", Long.valueOf(id), superuserCase.asPrismContainerValue().getId()); - assertEquals("wrong # of decisions", 1, superuserCase.getDecision().size()); - AccessCertificationDecisionType storedDecision = superuserCase.getDecision().get(0); - assertEquals("wrong response", AccessCertificationResponseType.ACCEPT, storedDecision.getResponse()); - assertEquals("wrong comment", "no comment", storedDecision.getComment()); - assertEquals("wrong reviewerRef", administratorRef, storedDecision.getReviewerRef()); - assertEquals("wrong stage number", 1, storedDecision.getStageNumber()); - assertApproximateTime("timestamp", new Date(), storedDecision.getTimestamp()); - assertEquals("wrong current response", AccessCertificationResponseType.ACCEPT, superuserCase.getCurrentStageOutcome()); + assertSingleDecision(superuserCase, ACCEPT, "no comment", 1, USER_ADMINISTRATOR_OID, ACCEPT, false); } @Test @@ -574,7 +525,7 @@ public void test105RecordAcceptJackCeo() throws Exception { // WHEN TestUtil.displayWhen(TEST_NAME); AccessCertificationDecisionType decision = new AccessCertificationDecisionType(prismContext); - decision.setResponse(AccessCertificationResponseType.ACCEPT); + decision.setResponse(ACCEPT); decision.setComment("ok"); decision.setStageNumber(1); // reviewerRef will be taken from the current user @@ -592,14 +543,7 @@ public void test105RecordAcceptJackCeo() throws Exception { ceoCase = findCase(caseList, USER_JACK_OID, ROLE_CEO_OID); assertEquals("changed case ID", Long.valueOf(id), ceoCase.asPrismContainerValue().getId()); - assertEquals("wrong # of decisions", 1, ceoCase.getDecision().size()); - AccessCertificationDecisionType storedDecision = ceoCase.getDecision().get(0); - assertEquals("wrong response", AccessCertificationResponseType.ACCEPT, storedDecision.getResponse()); - assertEquals("wrong comment", "ok", storedDecision.getComment()); - assertEquals("wrong reviewerRef", ObjectTypeUtil.createObjectRef(USER_ADMINISTRATOR_OID, ObjectTypes.USER), storedDecision.getReviewerRef()); - assertEquals("wrong stage number", 1, storedDecision.getStageNumber()); - assertApproximateTime("timestamp", new Date(), storedDecision.getTimestamp()); - assertEquals("wrong current response", AccessCertificationResponseType.ACCEPT, ceoCase.getCurrentStageOutcome()); + assertSingleDecision(ceoCase, ACCEPT, "ok", 1, USER_ADMINISTRATOR_OID, ACCEPT, false); } @Test @@ -618,7 +562,7 @@ public void test110RecordRevokeJackCeo() throws Exception { // WHEN TestUtil.displayWhen(TEST_NAME); AccessCertificationDecisionType decision = new AccessCertificationDecisionType(prismContext); - decision.setResponse(AccessCertificationResponseType.REVOKE); + decision.setResponse(REVOKE); decision.setComment("no way"); decision.setStageNumber(1); // reviewerRef will be taken from the current user @@ -637,14 +581,7 @@ public void test110RecordRevokeJackCeo() throws Exception { ceoCase = findCase(caseList, USER_JACK_OID, ROLE_CEO_OID); display("CEO case", ceoCase.asPrismContainerValue()); assertEquals("changed case ID", Long.valueOf(id), ceoCase.asPrismContainerValue().getId()); - assertEquals("wrong # of decisions", 1, ceoCase.getDecision().size()); - AccessCertificationDecisionType storedDecision = ceoCase.getDecision().get(0); - assertEquals("wrong response", AccessCertificationResponseType.REVOKE, storedDecision.getResponse()); - assertEquals("wrong comment", "no way", storedDecision.getComment()); - assertEquals("wrong reviewerRef", ObjectTypeUtil.createObjectRef(USER_ADMINISTRATOR_OID, ObjectTypes.USER), storedDecision.getReviewerRef()); - assertEquals("wrong stage number", 1, storedDecision.getStageNumber()); - assertApproximateTime("timestamp", new Date(), storedDecision.getTimestamp()); - assertEquals("wrong current response", AccessCertificationResponseType.REVOKE, ceoCase.getCurrentStageOutcome()); + assertSingleDecision(ceoCase, REVOKE, "no way", 1, USER_ADMINISTRATOR_OID, REVOKE, false); } protected void checkAllCases(Collection caseList, String campaignOid) { @@ -718,16 +655,22 @@ public void test152CloseFirstStageAllow() throws Exception { AccessCertificationCampaignType campaign = getCampaignWithCases(campaignOid); display("campaign in stage 1", campaign); + assertAfterStageClose(campaign, certificationDefinition, 1); + List caseList = campaign.getCase(); + checkAllCases(caseList, campaignOid); + checkCaseOutcome(caseList, USER_ADMINISTRATOR_OID, ROLE_SUPERUSER_OID, ACCEPT, ACCEPT); + checkCaseOutcome(caseList, USER_ADMINISTRATOR_OID, ROLE_COO_OID, NO_RESPONSE, NO_RESPONSE); + checkCaseOutcome(caseList, USER_ADMINISTRATOR_OID, ROLE_CEO_OID, NO_RESPONSE, NO_RESPONSE); + checkCaseOutcome(caseList, USER_ADMINISTRATOR_OID, ORG_EROOT_OID, NO_RESPONSE, NO_RESPONSE); + checkCaseOutcome(caseList, USER_JACK_OID, ROLE_CEO_OID, REVOKE, REVOKE); + checkCaseOutcome(caseList, USER_JACK_OID, ORG_EROOT_OID, NO_RESPONSE, NO_RESPONSE); + } - assertStateAndStage(campaign, REVIEW_STAGE_DONE, 1); - assertDefinitionAndOwner(campaign, certificationDefinition, USER_BOB_OID); - assertNull("Unexpected end time", campaign.getEnd()); - assertEquals("wrong # of stages", 1, campaign.getStage().size()); - AccessCertificationStageType stage = campaign.getStage().get(0); - assertEquals("wrong stage #", 1, stage.getNumber()); - assertApproximateTime("stage 1 start", new Date(), stage.getStart()); - //assertApproximateTime("stage 1 end", new Date(), stage.getStart()); // TODO when implemented - checkAllCases(campaign.getCase(), campaignOid); + private void checkCaseOutcome(List caseList, String subjectOid, String targetOid, + AccessCertificationResponseType stageOutcome, AccessCertificationResponseType overallOutcome) { + AccessCertificationCaseType ccase = findCase(caseList, subjectOid, targetOid); + assertEquals("Wrong stage outcome in " + ccase, stageOutcome, ccase.getCurrentStageOutcome()); + assertEquals("Wrong overall outcome in " + ccase, overallOutcome, ccase.getOverallOutcome()); } @Test @@ -783,9 +726,9 @@ public void test205StartRemediationAllow() throws Exception { assertEquals("wrong campaign state", CLOSED, campaign.getState()); assertEquals("wrong campaign stage", 2, campaign.getStageNumber()); assertDefinitionAndOwner(campaign, certificationDefinition, USER_BOB_OID); - // TODO assertApproximateTime("end time", new Date(), campaign.getEnd()); + assertApproximateTime("end time", new Date(), campaign.getEnd()); assertEquals("wrong # of stages", 1, campaign.getStage().size()); - //assertApproximateTime("stage 1 end", new Date(), stage.getStart()); // TODO when implemented + assertApproximateTime("stage 1 end", new Date(), campaign.getStage().get(0).getEnd()); List caseList = queryHelper.searchCases(campaignOid, null, null, result); AccessCertificationCaseType jackCase = findCase(caseList, USER_JACK_OID, ROLE_CEO_OID); diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/util/PrismIdentifierGenerator.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/util/PrismIdentifierGenerator.java index 6cb4c4dadba..87dffb567a1 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/util/PrismIdentifierGenerator.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/util/PrismIdentifierGenerator.java @@ -117,6 +117,7 @@ private List getChildrenContainers(PrismObject parent) { containers.add(decisionContainer); } } + containers.add(parent.findContainer(AccessCertificationCampaignType.F_STAGE)); } if (FocusType.class.isAssignableFrom(parent.getCompileTimeClass())) {