Repository: syncope Updated Branches: refs/heads/2_0_X 468e80a88 -> efbd83fdc refs/heads/master 1fa7fe115 -> 93b84e7ed
[SYNCOPE-1200] Ensuring createApproval works, besides updateApproval Project: http://git-wip-us.apache.org/repos/asf/syncope/repo Commit: http://git-wip-us.apache.org/repos/asf/syncope/commit/efbd83fd Tree: http://git-wip-us.apache.org/repos/asf/syncope/tree/efbd83fd Diff: http://git-wip-us.apache.org/repos/asf/syncope/diff/efbd83fd Branch: refs/heads/2_0_X Commit: efbd83fdc6a565aca259098ddacf0dbedfca7fa2 Parents: 468e80a Author: Francesco Chicchiriccò <ilgro...@apache.org> Authored: Tue Aug 29 14:43:13 2017 +0200 Committer: Francesco Chicchiriccò <ilgro...@apache.org> Committed: Tue Aug 29 14:43:13 2017 +0200 ---------------------------------------------------------------------- .../java/data/AbstractAnyDataBinder.java | 9 ++---- .../java/data/AnyObjectDataBinderImpl.java | 7 +++-- .../java/data/GroupDataBinderImpl.java | 9 ++++-- .../java/data/UserDataBinderImpl.java | 7 +++-- .../cxf/service/UserWorkflowServiceImpl.java | 12 ++++---- .../activiti/ActivitiUserWorkflowAdapter.java | 28 +++++++++++++++++-- .../workflow/activiti/task/AutoActivate.java | 29 ++++++++++++++++++++ .../flowable/FlowableUserWorkflowAdapter.java | 28 +++++++++++++++++-- .../workflow/flowable/task/AutoActivate.java | 29 ++++++++++++++++++++ .../syncope/fit/core/UserWorkflowITCase.java | 15 +++++++++- 10 files changed, 146 insertions(+), 27 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/syncope/blob/efbd83fd/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/AbstractAnyDataBinder.java ---------------------------------------------------------------------- diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/AbstractAnyDataBinder.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/AbstractAnyDataBinder.java index c950a6f..b280874 100644 --- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/AbstractAnyDataBinder.java +++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/AbstractAnyDataBinder.java @@ -74,7 +74,6 @@ import org.apache.syncope.core.persistence.api.entity.group.Group; import org.apache.syncope.core.persistence.api.entity.resource.ExternalResource; import org.apache.syncope.core.persistence.api.entity.resource.MappingItem; import org.apache.syncope.core.persistence.api.entity.resource.Provision; -import org.apache.syncope.core.persistence.api.entity.user.User; import org.apache.syncope.core.provisioning.api.DerAttrHandler; import org.apache.syncope.core.provisioning.api.IntAttrName; import org.apache.syncope.core.provisioning.api.MappingManager; @@ -634,14 +633,10 @@ abstract class AbstractAnyDataBinder { return membershipTO; } - protected Map<String, String> getConnObjectKeys(final Any<?> any) { + protected Map<String, String> getConnObjectKeys(final Any<?> any, final AnyUtils anyUtils) { Map<String, String> connObjectKeys = new HashMap<>(); - Iterable<? extends ExternalResource> iterable = any instanceof User - ? userDAO.findAllResources((User) any) - : any instanceof AnyObject - ? anyObjectDAO.findAllResources((AnyObject) any) - : ((Group) any).getResources(); + Iterable<? extends ExternalResource> iterable = anyUtils.getAllResources(any); for (ExternalResource resource : iterable) { Provision provision = resource.getProvision(any.getType()); if (provision != null && provision.getMapping() != null) { http://git-wip-us.apache.org/repos/asf/syncope/blob/efbd83fd/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/AnyObjectDataBinderImpl.java ---------------------------------------------------------------------- diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/AnyObjectDataBinderImpl.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/AnyObjectDataBinderImpl.java index 2e85e60..e6176b1 100644 --- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/AnyObjectDataBinderImpl.java +++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/AnyObjectDataBinderImpl.java @@ -270,10 +270,12 @@ public class AnyObjectDataBinderImpl extends AbstractAnyDataBinder implements An SyncopeClientCompositeException scce = SyncopeClientException.buildComposite(); + AnyUtils anyUtils = anyUtilsFactory.getInstance(AnyTypeKind.ANY_OBJECT); + Collection<String> currentResources = anyObjectDAO.findAllResourceKeys(anyObject.getKey()); // fetch connObjectKeys before update - Map<String, String> oldConnObjectKeys = getConnObjectKeys(anyObject); + Map<String, String> oldConnObjectKeys = getConnObjectKeys(anyObject, anyUtils); // realm setRealm(anyObject, anyObjectPatch); @@ -285,7 +287,6 @@ public class AnyObjectDataBinderImpl extends AbstractAnyDataBinder implements An anyObject.setName(anyObjectPatch.getName().getValue()); } - AnyUtils anyUtils = anyUtilsFactory.getInstance(AnyTypeKind.ANY_OBJECT); // attributes and resources propByRes.merge(fill(anyObject, anyObjectPatch, anyUtils, scce)); @@ -437,7 +438,7 @@ public class AnyObjectDataBinderImpl extends AbstractAnyDataBinder implements An } // check if some connObjectKey was changed by the update above - Map<String, String> newcCnnObjectKeys = getConnObjectKeys(anyObject); + Map<String, String> newcCnnObjectKeys = getConnObjectKeys(anyObject, anyUtils); for (Map.Entry<String, String> entry : oldConnObjectKeys.entrySet()) { if (newcCnnObjectKeys.containsKey(entry.getKey()) && !entry.getValue().equals(newcCnnObjectKeys.get(entry.getKey()))) { http://git-wip-us.apache.org/repos/asf/syncope/blob/efbd83fd/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/GroupDataBinderImpl.java ---------------------------------------------------------------------- diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/GroupDataBinderImpl.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/GroupDataBinderImpl.java index 92fd3ab..96b249d 100644 --- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/GroupDataBinderImpl.java +++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/GroupDataBinderImpl.java @@ -44,6 +44,7 @@ import org.apache.syncope.core.persistence.api.dao.search.SearchCond; import org.apache.syncope.core.persistence.api.entity.Any; import org.apache.syncope.core.persistence.api.entity.AnyType; import org.apache.syncope.core.persistence.api.entity.AnyTypeClass; +import org.apache.syncope.core.persistence.api.entity.AnyUtils; import org.apache.syncope.core.persistence.api.entity.DerSchema; import org.apache.syncope.core.persistence.api.entity.DynGroupMembership; import org.apache.syncope.core.persistence.api.entity.Realm; @@ -195,8 +196,10 @@ public class GroupDataBinderImpl extends AbstractAnyDataBinder implements GroupD SyncopeClientCompositeException scce = SyncopeClientException.buildComposite(); + AnyUtils anyUtils = anyUtilsFactory.getInstance(AnyTypeKind.GROUP); + // fetch connObjectKeys before update - Map<String, String> oldConnObjectKeys = getConnObjectKeys(group); + Map<String, String> oldConnObjectKeys = getConnObjectKeys(group, anyUtils); // realm setRealm(group, groupPatch); @@ -221,10 +224,10 @@ public class GroupDataBinderImpl extends AbstractAnyDataBinder implements GroupD } // attributes and resources - propByRes.merge(fill(group, groupPatch, anyUtilsFactory.getInstance(AnyTypeKind.GROUP), scce)); + propByRes.merge(fill(group, groupPatch, anyUtils, scce)); // check if some connObjectKey was changed by the update above - Map<String, String> newConnObjectKeys = getConnObjectKeys(group); + Map<String, String> newConnObjectKeys = getConnObjectKeys(group, anyUtils); for (Map.Entry<String, String> entry : oldConnObjectKeys.entrySet()) { if (newConnObjectKeys.containsKey(entry.getKey()) && !entry.getValue().equals(newConnObjectKeys.get(entry.getKey()))) { http://git-wip-us.apache.org/repos/asf/syncope/blob/efbd83fd/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/UserDataBinderImpl.java ---------------------------------------------------------------------- diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/UserDataBinderImpl.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/UserDataBinderImpl.java index 72d7243..b9bdf21 100644 --- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/UserDataBinderImpl.java +++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/UserDataBinderImpl.java @@ -309,10 +309,12 @@ public class UserDataBinderImpl extends AbstractAnyDataBinder implements UserDat SyncopeClientCompositeException scce = SyncopeClientException.buildComposite(); + AnyUtils anyUtils = anyUtilsFactory.getInstance(AnyTypeKind.USER); + Collection<String> currentResources = userDAO.findAllResourceKeys(user.getKey()); // fetch connObjectKeys before update - Map<String, String> oldConnObjectKeys = getConnObjectKeys(user); + Map<String, String> oldConnObjectKeys = getConnObjectKeys(user, anyUtils); // realm setRealm(user, userPatch); @@ -382,7 +384,6 @@ public class UserDataBinderImpl extends AbstractAnyDataBinder implements UserDat } } - AnyUtils anyUtils = anyUtilsFactory.getInstance(AnyTypeKind.USER); // attributes and resources propByRes.merge(fill(user, userPatch, anyUtils, scce)); @@ -535,7 +536,7 @@ public class UserDataBinderImpl extends AbstractAnyDataBinder implements UserDat } // check if some connObjectKey was changed by the update above - Map<String, String> newcCnnObjectKeys = getConnObjectKeys(user); + Map<String, String> newcCnnObjectKeys = getConnObjectKeys(user, anyUtils); for (Map.Entry<String, String> entry : oldConnObjectKeys.entrySet()) { if (newcCnnObjectKeys.containsKey(entry.getKey()) && !entry.getValue().equals(newcCnnObjectKeys.get(entry.getKey()))) { http://git-wip-us.apache.org/repos/asf/syncope/blob/efbd83fd/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/UserWorkflowServiceImpl.java ---------------------------------------------------------------------- diff --git a/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/UserWorkflowServiceImpl.java b/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/UserWorkflowServiceImpl.java index a3e6040..c24d66f 100644 --- a/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/UserWorkflowServiceImpl.java +++ b/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/UserWorkflowServiceImpl.java @@ -30,30 +30,30 @@ import org.springframework.stereotype.Service; public class UserWorkflowServiceImpl implements UserWorkflowService { @Autowired - private UserWorkflowLogic lofic; + private UserWorkflowLogic logic; @Override public WorkflowFormTO claimForm(final String taskId) { - return lofic.claimForm(taskId); + return logic.claimForm(taskId); } @Override public UserTO executeTask(final String taskId, final UserTO userTO) { - return lofic.executeWorkflowTask(userTO, taskId); + return logic.executeWorkflowTask(userTO, taskId); } @Override public WorkflowFormTO getFormForUser(final String userKey) { - return lofic.getFormForUser(userKey); + return logic.getFormForUser(userKey); } @Override public List<WorkflowFormTO> getForms() { - return lofic.getForms(); + return logic.getForms(); } @Override public UserTO submitForm(final WorkflowFormTO form) { - return lofic.submitForm(form); + return logic.submitForm(form); } } http://git-wip-us.apache.org/repos/asf/syncope/blob/efbd83fd/core/workflow-activiti/src/main/java/org/apache/syncope/core/workflow/activiti/ActivitiUserWorkflowAdapter.java ---------------------------------------------------------------------- diff --git a/core/workflow-activiti/src/main/java/org/apache/syncope/core/workflow/activiti/ActivitiUserWorkflowAdapter.java b/core/workflow-activiti/src/main/java/org/apache/syncope/core/workflow/activiti/ActivitiUserWorkflowAdapter.java index 3ad12eb..9530b17 100644 --- a/core/workflow-activiti/src/main/java/org/apache/syncope/core/workflow/activiti/ActivitiUserWorkflowAdapter.java +++ b/core/workflow-activiti/src/main/java/org/apache/syncope/core/workflow/activiti/ActivitiUserWorkflowAdapter.java @@ -206,14 +206,33 @@ public class ActivitiUserWorkflowAdapter extends AbstractUserWorkflowAdapter { protected void saveForFormSubmit(final User user, final String password, final PropagationByResource propByRes) { String formTaskId = getFormTask(user); if (formTaskId != null) { + UserTO userTO = engine.getRuntimeService().getVariable(user.getWorkflowId(), USER_TO, UserTO.class); + if (userTO != null) { + userTO.setKey(user.getKey()); + userTO.setCreationDate(user.getCreationDate()); + userTO.setLastChangeDate(user.getLastChangeDate()); + if (password == null) { + String encryptedPwd = engine.getRuntimeService(). + getVariable(user.getWorkflowId(), ENCRYPTED_PWD, String.class); + if (encryptedPwd != null) { + userTO.setPassword(decrypt(encryptedPwd)); + } + } else { + userTO.setPassword(password); + } + + engine.getRuntimeService().setVariable(user.getWorkflowId(), USER_TO, userTO); + } + // SYNCOPE-238: This is needed to simplify the task query in this.getForms() engine.getTaskService().setVariableLocal(formTaskId, TASK_IS_FORM, Boolean.TRUE); + engine.getRuntimeService().setVariable(user.getWorkflowId(), PROP_BY_RESOURCE, propByRes); if (propByRes != null) { propByRes.clear(); } - if (StringUtils.isNotBlank(password)) { + if (password != null) { engine.getRuntimeService().setVariable(user.getWorkflowId(), ENCRYPTED_PWD, encrypt(password)); } } @@ -441,13 +460,18 @@ public class ActivitiUserWorkflowAdapter extends AbstractUserWorkflowAdapter { public WorkflowResult<String> execute(final UserTO userTO, final String taskId) { User user = userDAO.authFind(userTO.getKey()); - final Map<String, Object> variables = new HashMap<>(); + Map<String, Object> variables = new HashMap<>(); variables.put(USER_TO, userTO); Set<String> performedTasks = doExecuteTask(user, taskId, variables); updateStatus(user); User updated = userDAO.save(user); + PropagationByResource propByRes = engine.getRuntimeService().getVariable( + user.getWorkflowId(), PROP_BY_RESOURCE, PropagationByResource.class); + + saveForFormSubmit(user, userTO.getPassword(), propByRes); + return new WorkflowResult<>(updated.getKey(), null, performedTasks); } http://git-wip-us.apache.org/repos/asf/syncope/blob/efbd83fd/core/workflow-activiti/src/main/java/org/apache/syncope/core/workflow/activiti/task/AutoActivate.java ---------------------------------------------------------------------- diff --git a/core/workflow-activiti/src/main/java/org/apache/syncope/core/workflow/activiti/task/AutoActivate.java b/core/workflow-activiti/src/main/java/org/apache/syncope/core/workflow/activiti/task/AutoActivate.java index 51dfb50..c326ef5 100644 --- a/core/workflow-activiti/src/main/java/org/apache/syncope/core/workflow/activiti/task/AutoActivate.java +++ b/core/workflow-activiti/src/main/java/org/apache/syncope/core/workflow/activiti/task/AutoActivate.java @@ -18,14 +18,43 @@ */ package org.apache.syncope.core.workflow.activiti.task; +import org.apache.syncope.common.lib.AnyOperations; +import org.apache.syncope.common.lib.patch.UserPatch; +import org.apache.syncope.common.lib.to.UserTO; +import org.apache.syncope.core.persistence.api.dao.UserDAO; +import org.apache.syncope.core.persistence.api.entity.user.User; +import org.apache.syncope.core.provisioning.api.data.UserDataBinder; import org.apache.syncope.core.workflow.activiti.ActivitiUserWorkflowAdapter; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @Component public class AutoActivate extends AbstractActivitiServiceTask { + @Autowired + private UserDataBinder dataBinder; + + @Autowired + private UserDAO userDAO; + @Override protected void doExecute(final String executionId) { + User user = engine.getRuntimeService(). + getVariable(executionId, ActivitiUserWorkflowAdapter.USER, User.class); + UserTO userTO = engine.getRuntimeService(). + getVariable(executionId, ActivitiUserWorkflowAdapter.USER_TO, UserTO.class); + if (userTO != null && userTO.getKey() != null && user.getKey() != null) { + user = userDAO.save(user); + + UserPatch userPatch = AnyOperations.diff(userTO, dataBinder.getUserTO(user, true), false); + // don't mess with password, as the cleartext values was already properly saved + userPatch.setPassword(null); + + dataBinder.update(user, userPatch); + + engine.getRuntimeService().setVariable(executionId, ActivitiUserWorkflowAdapter.USER, user); + } + engine.getRuntimeService().setVariable(executionId, ActivitiUserWorkflowAdapter.PROPAGATE_ENABLE, Boolean.TRUE); } } http://git-wip-us.apache.org/repos/asf/syncope/blob/efbd83fd/core/workflow-flowable/src/main/java/org/apache/syncope/core/workflow/flowable/FlowableUserWorkflowAdapter.java ---------------------------------------------------------------------- diff --git a/core/workflow-flowable/src/main/java/org/apache/syncope/core/workflow/flowable/FlowableUserWorkflowAdapter.java b/core/workflow-flowable/src/main/java/org/apache/syncope/core/workflow/flowable/FlowableUserWorkflowAdapter.java index 6552449..2ca3f08 100644 --- a/core/workflow-flowable/src/main/java/org/apache/syncope/core/workflow/flowable/FlowableUserWorkflowAdapter.java +++ b/core/workflow-flowable/src/main/java/org/apache/syncope/core/workflow/flowable/FlowableUserWorkflowAdapter.java @@ -206,14 +206,33 @@ public class FlowableUserWorkflowAdapter extends AbstractUserWorkflowAdapter { protected void saveForFormSubmit(final User user, final String password, final PropagationByResource propByRes) { String formTaskId = getFormTask(user); if (formTaskId != null) { + UserTO userTO = engine.getRuntimeService().getVariable(user.getWorkflowId(), USER_TO, UserTO.class); + if (userTO != null) { + userTO.setKey(user.getKey()); + userTO.setCreationDate(user.getCreationDate()); + userTO.setLastChangeDate(user.getLastChangeDate()); + if (password == null) { + String encryptedPwd = engine.getRuntimeService(). + getVariable(user.getWorkflowId(), ENCRYPTED_PWD, String.class); + if (encryptedPwd != null) { + userTO.setPassword(decrypt(encryptedPwd)); + } + } else { + userTO.setPassword(password); + } + + engine.getRuntimeService().setVariable(user.getWorkflowId(), USER_TO, userTO); + } + // SYNCOPE-238: This is needed to simplify the task query in this.getForms() engine.getTaskService().setVariableLocal(formTaskId, TASK_IS_FORM, Boolean.TRUE); + engine.getRuntimeService().setVariable(user.getWorkflowId(), PROP_BY_RESOURCE, propByRes); if (propByRes != null) { propByRes.clear(); } - if (StringUtils.isNotBlank(password)) { + if (password != null) { engine.getRuntimeService().setVariable(user.getWorkflowId(), ENCRYPTED_PWD, encrypt(password)); } } @@ -441,13 +460,18 @@ public class FlowableUserWorkflowAdapter extends AbstractUserWorkflowAdapter { public WorkflowResult<String> execute(final UserTO userTO, final String taskId) { User user = userDAO.authFind(userTO.getKey()); - final Map<String, Object> variables = new HashMap<>(); + Map<String, Object> variables = new HashMap<>(); variables.put(USER_TO, userTO); Set<String> performedTasks = doExecuteTask(user, taskId, variables); updateStatus(user); User updated = userDAO.save(user); + PropagationByResource propByRes = engine.getRuntimeService().getVariable( + user.getWorkflowId(), PROP_BY_RESOURCE, PropagationByResource.class); + + saveForFormSubmit(updated, userTO.getPassword(), propByRes); + return new WorkflowResult<>(updated.getKey(), null, performedTasks); } http://git-wip-us.apache.org/repos/asf/syncope/blob/efbd83fd/core/workflow-flowable/src/main/java/org/apache/syncope/core/workflow/flowable/task/AutoActivate.java ---------------------------------------------------------------------- diff --git a/core/workflow-flowable/src/main/java/org/apache/syncope/core/workflow/flowable/task/AutoActivate.java b/core/workflow-flowable/src/main/java/org/apache/syncope/core/workflow/flowable/task/AutoActivate.java index 8aeb9f9..02ee77f 100644 --- a/core/workflow-flowable/src/main/java/org/apache/syncope/core/workflow/flowable/task/AutoActivate.java +++ b/core/workflow-flowable/src/main/java/org/apache/syncope/core/workflow/flowable/task/AutoActivate.java @@ -18,14 +18,43 @@ */ package org.apache.syncope.core.workflow.flowable.task; +import org.apache.syncope.common.lib.AnyOperations; +import org.apache.syncope.common.lib.patch.UserPatch; +import org.apache.syncope.common.lib.to.UserTO; +import org.apache.syncope.core.persistence.api.dao.UserDAO; +import org.apache.syncope.core.persistence.api.entity.user.User; +import org.apache.syncope.core.provisioning.api.data.UserDataBinder; import org.apache.syncope.core.workflow.flowable.FlowableUserWorkflowAdapter; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @Component public class AutoActivate extends AbstractFlowableServiceTask { + @Autowired + private UserDataBinder dataBinder; + + @Autowired + private UserDAO userDAO; + @Override protected void doExecute(final String executionId) { + User user = engine.getRuntimeService(). + getVariable(executionId, FlowableUserWorkflowAdapter.USER, User.class); + UserTO userTO = engine.getRuntimeService(). + getVariable(executionId, FlowableUserWorkflowAdapter.USER_TO, UserTO.class); + if (userTO != null && userTO.getKey() != null && user.getKey() != null) { + user = userDAO.save(user); + + UserPatch userPatch = AnyOperations.diff(userTO, dataBinder.getUserTO(user, true), false); + // don't mess with password, as the cleartext values was already properly saved + userPatch.setPassword(null); + + dataBinder.update(user, userPatch); + + engine.getRuntimeService().setVariable(executionId, FlowableUserWorkflowAdapter.USER, user); + } + engine.getRuntimeService().setVariable(executionId, FlowableUserWorkflowAdapter.PROPAGATE_ENABLE, Boolean.TRUE); } } http://git-wip-us.apache.org/repos/asf/syncope/blob/efbd83fd/fit/core-reference/src/test/java/org/apache/syncope/fit/core/UserWorkflowITCase.java ---------------------------------------------------------------------- diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/UserWorkflowITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/UserWorkflowITCase.java index ac563aa..6ea2f25 100644 --- a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/UserWorkflowITCase.java +++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/UserWorkflowITCase.java @@ -29,6 +29,7 @@ import static org.junit.Assert.fail; import java.util.Collections; import java.util.List; +import java.util.UUID; import javax.sql.DataSource; import javax.ws.rs.core.Response; import org.apache.syncope.client.lib.SyncopeClient; @@ -180,21 +181,33 @@ public class UserWorkflowITCase extends AbstractITCase { assertNotNull(forms); assertEquals(preForms + 1, forms.size()); + // 3. as admin, request for changes: still pending approval + String updatedUsername = "changed-" + UUID.randomUUID().toString(); + userTO.setUsername(updatedUsername); + userWorkflowService.executeTask("default", userTO); + WorkflowFormTO form = userWorkflowService.getFormForUser(userTO.getKey()); assertNotNull(form); assertNotNull(form.getTaskId()); + assertNotNull(form.getUserTO()); + assertEquals(updatedUsername, form.getUserTO().getUsername()); + assertNull(form.getUserPatch()); assertNull(form.getOwner()); - // 4. claim task (from admin) + // 4. claim task (as admin) form = userWorkflowService.claimForm(form.getTaskId()); assertNotNull(form); assertNotNull(form.getTaskId()); + assertNotNull(form.getUserTO()); + assertEquals(updatedUsername, form.getUserTO().getUsername()); + assertNull(form.getUserPatch()); assertNotNull(form.getOwner()); // 5. approve user (and verify that propagation occurred) form.getProperty("approve").setValue(Boolean.TRUE.toString()); userTO = userWorkflowService.submitForm(form); assertNotNull(userTO); + assertEquals(updatedUsername, userTO.getUsername()); assertEquals("active", userTO.getStatus()); assertEquals(Collections.singleton(RESOURCE_NAME_TESTDB), userTO.getResources());