http://git-wip-us.apache.org/repos/asf/syncope/blob/9cd92305/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/UserITCase.java ---------------------------------------------------------------------- diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/UserITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/UserITCase.java index 7de863e..91da759 100644 --- a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/UserITCase.java +++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/UserITCase.java @@ -45,7 +45,6 @@ import org.apache.commons.lang3.tuple.Pair; import org.apache.cxf.common.util.Base64Utility; import org.apache.cxf.helpers.IOUtils; import org.apache.syncope.client.lib.SyncopeClient; -import org.apache.syncope.common.lib.AnyOperations; import org.apache.syncope.common.lib.SyncopeClientException; import org.apache.syncope.common.lib.SyncopeConstants; import org.apache.syncope.common.lib.patch.AssociationPatch; @@ -137,7 +136,6 @@ public class UserITCase extends AbstractITCase { userTO.getPlainAttrs().add(attrTO("email", email)); userTO.getPlainAttrs().add(attrTO("loginDate", DATE_FORMAT.get().format(new Date()))); userTO.getDerAttrs().add(attrTO("cn", null)); - userTO.getVirAttrs().add(attrTO("virtualdata", "virtualvalue")); return userTO; } @@ -154,7 +152,6 @@ public class UserITCase extends AbstractITCase { // create a new user UserTO userTO = getUniqueSampleTO("[email protected]"); - userTO.setPassword("password123"); userTO.getResources().add(RESOURCE_NAME_NOPROPAGATION); @@ -173,7 +170,6 @@ public class UserITCase extends AbstractITCase { // get last task PropagationTaskTO taskTO = taskService.read(newMaxId); - assertNotNull(taskTO); assertTrue(taskTO.getExecutions().isEmpty()); } @@ -387,15 +383,6 @@ public class UserITCase extends AbstractITCase { // check for changePwdDate assertNotNull(newUserTO.getCreationDate()); - // 2. check for virtual attribute value - newUserTO = userService.read(newUserTO.getKey()); - assertNotNull(newUserTO); - - assertNotNull(newUserTO.getVirAttrMap()); - assertNotNull(newUserTO.getVirAttrMap().get("virtualdata").getValues()); - assertFalse(newUserTO.getVirAttrMap().get("virtualdata").getValues().isEmpty()); - assertEquals("virtualvalue", newUserTO.getVirAttrMap().get("virtualdata").getValues().get(0)); - // get the new task list tasks = taskService.list( TaskType.PROPAGATION, @@ -751,7 +738,7 @@ public class UserITCase extends AbstractITCase { long newMaxKey = tasks.getResult().iterator().next().getKey(); - // default configuration for ws-target-resource2: + // default configuration for ws-target-resource2 during create: // only failed executions have to be registered // --> no more tasks/executions should be added assertEquals(newMaxKey, maxKey); @@ -762,7 +749,7 @@ public class UserITCase extends AbstractITCase { UserPatch userPatch = new UserPatch(); userPatch.setKey(userTO.getKey()); - userPatch.getPlainAttrs().add(attrAddReplacePatch("surname", "surname")); + userPatch.getPlainAttrs().add(attrAddReplacePatch("surname", "surname2")); userTO = updateUser(userPatch); @@ -776,11 +763,11 @@ public class UserITCase extends AbstractITCase { maxKey = newMaxKey; newMaxKey = tasks.getResult().iterator().next().getKey(); - // default configuration for ws-target-resource2: + // default configuration for ws-target-resource2 during update: // all update executions have to be registered assertTrue(newMaxKey > maxKey); - final PropagationTaskTO taskTO = taskService.read(newMaxKey); + PropagationTaskTO taskTO = taskService.read(newMaxKey); assertNotNull(taskTO); assertEquals(1, taskTO.getExecutions().size()); @@ -1004,37 +991,6 @@ public class UserITCase extends AbstractITCase { } @Test - public void issue270() { - // 1. create a new user without virtual attributes - UserTO original = getUniqueSampleTO("[email protected]"); - // be sure to remove all virtual attributes - original.getVirAttrs().clear(); - - original = createUser(original); - - assertNotNull(original); - - assertTrue(original.getVirAttrs().isEmpty()); - - UserTO toBeUpdated = userService.read(original.getKey()); - - AttrTO virtual = attrTO("virtualdata", "virtualvalue"); - toBeUpdated.getVirAttrs().add(virtual); - - // 2. try to update by adding a resource, but no password: must fail - UserPatch userPatch = AnyOperations.diff(toBeUpdated, original, false); - assertNotNull(userPatch); - - toBeUpdated = updateUser(userPatch); - assertNotNull(toBeUpdated); - - assertFalse(toBeUpdated.getVirAttrs().isEmpty()); - assertNotNull(toBeUpdated.getVirAttrs().iterator().next()); - - assertEquals(virtual.getSchema(), toBeUpdated.getVirAttrs().iterator().next().getSchema()); - } - - @Test public final void issue280() { UserTO userTO = getUniqueSampleTO("[email protected]"); userTO.getResources().clear(); @@ -1353,6 +1309,7 @@ public class UserITCase extends AbstractITCase { // create user and check virtual attribute value propagation // ---------------------------------- UserTO userTO = getUniqueSampleTO("[email protected]"); + userTO.getVirAttrs().add(attrTO("virtualdata", "virtualvalue")); userTO.getResources().clear(); userTO.getResources().add(RESOURCE_NAME_DBVIRATTR);
http://git-wip-us.apache.org/repos/asf/syncope/blob/9cd92305/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/VirAttrITCase.java ---------------------------------------------------------------------- diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/VirAttrITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/VirAttrITCase.java index 1856eee..e96026f 100644 --- a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/VirAttrITCase.java +++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/VirAttrITCase.java @@ -18,6 +18,7 @@ */ package org.apache.syncope.fit.core.reference; +import static org.apache.syncope.fit.core.reference.AbstractITCase.getUUIDString; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; @@ -25,14 +26,15 @@ import static org.junit.Assert.assertTrue; import java.util.Locale; import java.util.Map; +import javax.ws.rs.core.Response; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.Predicate; import org.apache.commons.lang3.SerializationUtils; -import org.apache.syncope.common.lib.patch.AttrPatch; import org.apache.syncope.common.lib.patch.PasswordPatch; import org.apache.syncope.common.lib.patch.StatusPatch; import org.apache.syncope.common.lib.patch.StringPatchItem; import org.apache.syncope.common.lib.patch.UserPatch; +import org.apache.syncope.common.lib.to.AnyTypeClassTO; import org.apache.syncope.common.lib.to.AttrTO; import org.apache.syncope.common.lib.to.ConnInstanceTO; import org.apache.syncope.common.lib.to.ConnObjectTO; @@ -43,13 +45,16 @@ import org.apache.syncope.common.lib.to.ResourceTO; import org.apache.syncope.common.lib.to.GroupTO; import org.apache.syncope.common.lib.to.ProvisionTO; import org.apache.syncope.common.lib.to.UserTO; +import org.apache.syncope.common.lib.to.VirSchemaTO; import org.apache.syncope.common.lib.types.AnyTypeKind; import org.apache.syncope.common.lib.types.ConnConfProperty; import org.apache.syncope.common.lib.types.IntMappingType; import org.apache.syncope.common.lib.types.MappingPurpose; import org.apache.syncope.common.lib.types.PatchOperation; import org.apache.syncope.common.lib.types.PropagationTaskExecStatus; +import org.apache.syncope.common.lib.types.SchemaType; import org.apache.syncope.common.lib.types.StatusPatchType; +import org.apache.syncope.common.rest.api.service.AnyTypeClassService; import org.apache.syncope.common.rest.api.service.ResourceService; import org.identityconnectors.framework.common.objects.ObjectClass; import org.junit.FixMethodOrder; @@ -63,38 +68,60 @@ public class VirAttrITCase extends AbstractITCase { @Test public void issueSYNCOPE16() { UserTO userTO = UserITCase.getUniqueSampleTO("[email protected]"); - + userTO.getVirAttrs().add(attrTO("virtualdata", "virtualvalue")); + userTO.getResources().add(RESOURCE_NAME_DBVIRATTR); userTO.getMemberships().add(new MembershipTO.Builder().group(8L).build()); // 1. create user - UserTO actual = createUser(userTO); - assertNotNull(actual); + userTO = createUser(userTO); + assertNotNull(userTO); // 2. check for virtual attribute value - actual = userService.read(actual.getKey()); - assertNotNull(actual); - assertEquals("virtualvalue", actual.getVirAttrMap().get("virtualdata").getValues().get(0)); + userTO = userService.read(userTO.getKey()); + assertNotNull(userTO); + assertEquals("virtualvalue", userTO.getVirAttrMap().get("virtualdata").getValues().get(0)); UserPatch userPatch = new UserPatch(); - userPatch.setKey(actual.getKey()); - userPatch.getVirAttrs().add(attrAddReplacePatch("virtualdata", "virtualupdated")); + userPatch.setKey(userTO.getKey()); + userPatch.getVirAttrs().add(attrTO("virtualdata", "virtualupdated")); // 3. update virtual attribute - actual = updateUser(userPatch); - assertNotNull(actual); + userTO = updateUser(userPatch); + assertNotNull(userTO); // 4. check for virtual attribute value - actual = userService.read(actual.getKey()); - assertNotNull(actual); - assertEquals("virtualupdated", actual.getVirAttrMap().get("virtualdata").getValues().get(0)); + userTO = userService.read(userTO.getKey()); + assertNotNull(userTO); + assertEquals("virtualupdated", userTO.getVirAttrMap().get("virtualdata").getValues().get(0)); } @Test public void issueSYNCOPE260() { + // create new virtual schema for the resource below + ResourceTO ws2 = resourceService.read(RESOURCE_NAME_WS2); + ProvisionTO provision = ws2.getProvision(AnyTypeKind.USER.name()); + assertNotNull(provision); + + VirSchemaTO virSchema = new VirSchemaTO(); + virSchema.setKey("syncope260" + getUUIDString()); + virSchema.setExtAttrName("companyName"); + virSchema.setProvision(provision.getKey()); + virSchema = createSchema(SchemaType.VIRTUAL, virSchema); + assertNotNull(virSchema); + + AnyTypeClassTO newClass = new AnyTypeClassTO(); + newClass.setKey("syncope260" + getUUIDString()); + newClass.getVirSchemas().add(virSchema.getKey()); + Response response = anyTypeClassService.create(newClass); + assertEquals(Response.Status.CREATED.getStatusCode(), response.getStatusInfo().getStatusCode()); + newClass = getObject(response.getLocation(), AnyTypeClassService.class, AnyTypeClassTO.class); + // ---------------------------------- // create user and check virtual attribute value propagation // ---------------------------------- UserTO userTO = UserITCase.getUniqueSampleTO("[email protected]"); + userTO.getAuxClasses().add(newClass.getKey()); + userTO.getVirAttrs().add(attrTO(virSchema.getKey(), "virtualvalue")); userTO.getResources().add(RESOURCE_NAME_WS2); userTO = createUser(userTO); @@ -105,8 +132,7 @@ public class VirAttrITCase extends AbstractITCase { ConnObjectTO connObjectTO = resourceService.readConnObject(RESOURCE_NAME_WS2, AnyTypeKind.USER.name(), userTO.getKey()); - assertNotNull(connObjectTO); - assertEquals("virtualvalue", connObjectTO.getPlainAttrMap().get("NAME").getValues().get(0)); + assertEquals("virtualvalue", connObjectTO.getPlainAttrMap().get("COMPANYNAME").getValues().get(0)); // ---------------------------------- // ---------------------------------- @@ -114,17 +140,16 @@ public class VirAttrITCase extends AbstractITCase { // ---------------------------------- UserPatch userPatch = new UserPatch(); userPatch.setKey(userTO.getKey()); - userPatch.getVirAttrs().add(attrAddReplacePatch("virtualdata", "virtualvalue2")); + userPatch.getVirAttrs().add(attrTO(virSchema.getKey(), "virtualvalue2")); userTO = updateUser(userPatch); assertNotNull(userTO); assertFalse(userTO.getPropagationStatusTOs().isEmpty()); - assertEquals("ws-target-resource-2", userTO.getPropagationStatusTOs().get(0).getResource()); + assertEquals(RESOURCE_NAME_WS2, userTO.getPropagationStatusTOs().get(0).getResource()); assertEquals(PropagationTaskExecStatus.SUCCESS, userTO.getPropagationStatusTOs().get(0).getStatus()); connObjectTO = resourceService.readConnObject(RESOURCE_NAME_WS2, AnyTypeKind.USER.name(), userTO.getKey()); - assertNotNull(connObjectTO); - assertEquals("virtualvalue2", connObjectTO.getPlainAttrMap().get("NAME").getValues().get(0)); + assertEquals("virtualvalue2", connObjectTO.getPlainAttrMap().get("COMPANYNAME").getValues().get(0)); // ---------------------------------- // ---------------------------------- @@ -137,9 +162,7 @@ public class VirAttrITCase extends AbstractITCase { assertEquals("suspended", userTO.getStatus()); connObjectTO = resourceService.readConnObject(RESOURCE_NAME_WS2, AnyTypeKind.USER.name(), userTO.getKey()); - assertNotNull(connObjectTO); - assertFalse(connObjectTO.getPlainAttrMap().get("NAME").getValues().isEmpty()); - assertEquals("virtualvalue2", connObjectTO.getPlainAttrMap().get("NAME").getValues().get(0)); + assertEquals("virtualvalue2", connObjectTO.getPlainAttrMap().get("COMPANYNAME").getValues().get(0)); statusPatch = new StatusPatch(); statusPatch.setKey(userTO.getKey()); @@ -148,9 +171,7 @@ public class VirAttrITCase extends AbstractITCase { assertEquals("active", userTO.getStatus()); connObjectTO = resourceService.readConnObject(RESOURCE_NAME_WS2, AnyTypeKind.USER.name(), userTO.getKey()); - assertNotNull(connObjectTO); - assertFalse(connObjectTO.getPlainAttrMap().get("NAME").getValues().isEmpty()); - assertEquals("virtualvalue2", connObjectTO.getPlainAttrMap().get("NAME").getValues().get(0)); + assertEquals("virtualvalue2", connObjectTO.getPlainAttrMap().get("COMPANYNAME").getValues().get(0)); // ---------------------------------- // ---------------------------------- @@ -167,36 +188,11 @@ public class VirAttrITCase extends AbstractITCase { assertEquals(PropagationTaskExecStatus.SUCCESS, userTO.getPropagationStatusTOs().get(0).getStatus()); connObjectTO = resourceService.readConnObject(RESOURCE_NAME_WS2, AnyTypeKind.USER.name(), userTO.getKey()); - assertNotNull(connObjectTO); assertEquals("Surname2", connObjectTO.getPlainAttrMap().get("SURNAME").getValues().get(0)); - // attribute "name" mapped on virtual attribute "virtualdata" shouldn't be changed - assertFalse(connObjectTO.getPlainAttrMap().get("NAME").getValues().isEmpty()); - assertEquals("virtualvalue2", connObjectTO.getPlainAttrMap().get("NAME").getValues().get(0)); - // ---------------------------------- - - // ---------------------------------- - // remove user virtual attribute and check virtual attribute value (reset) - // ---------------------------------- - userPatch = new UserPatch(); - userPatch.setKey(userTO.getKey()); - userPatch.getVirAttrs().add(new AttrPatch.Builder(). - operation(PatchOperation.DELETE). - attrTO(new AttrTO.Builder().schema("virtualdata").build()).build()); - - userTO = updateUser(userPatch); - assertNotNull(userTO); - assertTrue(userTO.getVirAttrs().isEmpty()); - assertFalse(userTO.getPropagationStatusTOs().isEmpty()); - assertEquals(RESOURCE_NAME_WS2, userTO.getPropagationStatusTOs().get(0).getResource()); - assertEquals(PropagationTaskExecStatus.SUCCESS, userTO.getPropagationStatusTOs().get(0).getStatus()); - - connObjectTO = resourceService.readConnObject(RESOURCE_NAME_WS2, AnyTypeKind.USER.name(), userTO.getKey()); - assertNotNull(connObjectTO); - - // attribute "name" mapped on virtual attribute "virtualdata" should be reset - assertTrue(connObjectTO.getPlainAttrMap().get("NAME").getValues() == null - || connObjectTO.getPlainAttrMap().get("NAME").getValues().isEmpty()); + // virtual attribute value did not change + assertFalse(connObjectTO.getPlainAttrMap().get("COMPANYNAME").getValues().isEmpty()); + assertEquals("virtualvalue2", connObjectTO.getPlainAttrMap().get("COMPANYNAME").getValues().get(0)); // ---------------------------------- } @@ -241,7 +237,7 @@ public class VirAttrITCase extends AbstractITCase { UserPatch userPatch = new UserPatch(); userPatch.setKey(actual.getKey()); - userPatch.getVirAttrs().add(attrAddReplacePatch("virtualdata", "virtualupdated")); + userPatch.getVirAttrs().add(attrTO("virtualdata", "virtualupdated")); // 5. update virtual attribute actual = updateUser(userPatch); @@ -256,36 +252,46 @@ public class VirAttrITCase extends AbstractITCase { @Test public void issueSYNCOPE397() { ResourceTO csv = resourceService.read(RESOURCE_NAME_CSV); + + // change mapping of resource-csv MappingTO origMapping = SerializationUtils.clone(csv.getProvisions().get(0).getMapping()); try { - // change mapping of resource-csv - assertNotNull(origMapping); - for (MappingItemTO item : csv.getProvisions().get(0).getMapping().getItems()) { - if ("email".equals(item.getIntAttrName())) { - // unset internal attribute mail and set virtual attribute virtualdata as mapped to external email - item.setIntMappingType(IntMappingType.UserVirtualSchema); - item.setIntAttrName("virtualdata"); - item.setPurpose(MappingPurpose.BOTH); - item.setExtAttrName("email"); - } - } + // remove this mapping + CollectionUtils.filterInverse(csv.getProvisions().get(0).getMapping().getItems(), + new Predicate<MappingItemTO>() { + + @Override + public boolean evaluate(final MappingItemTO item) { + return "email".equals(item.getIntAttrName()); + } + }); resourceService.update(csv); csv = resourceService.read(RESOURCE_NAME_CSV); assertNotNull(csv.getProvisions().get(0).getMapping()); - boolean found = false; - for (MappingItemTO item : csv.getProvisions().get(0).getMapping().getItems()) { - if ("email".equals(item.getExtAttrName()) && "virtualdata".equals(item.getIntAttrName())) { - found = true; - } - } + // create new virtual schema for the resource below + ProvisionTO provision = csv.getProvision(AnyTypeKind.USER.name()); + assertNotNull(provision); - assertTrue(found); + VirSchemaTO virSchema = new VirSchemaTO(); + virSchema.setKey("syncope397" + getUUIDString()); + virSchema.setExtAttrName("email"); + virSchema.setProvision(provision.getKey()); + virSchema = createSchema(SchemaType.VIRTUAL, virSchema); + assertNotNull(virSchema); + + AnyTypeClassTO newClass = new AnyTypeClassTO(); + newClass.setKey("syncope397" + getUUIDString()); + newClass.getVirSchemas().add(virSchema.getKey()); + Response response = anyTypeClassService.create(newClass); + assertEquals(Response.Status.CREATED.getStatusCode(), response.getStatusInfo().getStatusCode()); + newClass = getObject(response.getLocation(), AnyTypeClassService.class, AnyTypeClassTO.class); // create a new user UserTO userTO = UserITCase.getUniqueSampleTO("[email protected]"); userTO.getAuxClasses().add("csv"); + userTO.getAuxClasses().add(newClass.getKey()); userTO.getResources().clear(); userTO.getMemberships().clear(); userTO.getDerAttrs().clear(); @@ -293,18 +299,18 @@ public class VirAttrITCase extends AbstractITCase { userTO.getDerAttrs().add(attrTO("csvuserid", null)); userTO.getDerAttrs().add(attrTO("cn", null)); - userTO.getVirAttrs().add(attrTO("virtualdata", "[email protected]")); + userTO.getVirAttrs().add(attrTO(virSchema.getKey(), "[email protected]")); // assign resource-csv to user userTO.getResources().add(RESOURCE_NAME_CSV); // save user - UserTO created = createUser(userTO); + userTO = createUser(userTO); // make std controls about user - assertNotNull(created); - assertTrue(RESOURCE_NAME_CSV.equals(created.getResources().iterator().next())); - assertEquals("[email protected]", created.getVirAttrs().iterator().next().getValues().get(0)); + assertNotNull(userTO); + assertTrue(RESOURCE_NAME_CSV.equals(userTO.getResources().iterator().next())); + assertEquals("[email protected]", userTO.getVirAttrs().iterator().next().getValues().get(0)); // update user - UserTO toBeUpdated = userService.read(created.getKey()); + UserTO toBeUpdated = userService.read(userTO.getKey()); UserPatch userPatch = new UserPatch(); userPatch.setKey(toBeUpdated.getKey()); userPatch.setPassword(new PasswordPatch.Builder().value("password234").build()); @@ -312,7 +318,7 @@ public class VirAttrITCase extends AbstractITCase { userPatch.getResources().add(new StringPatchItem.Builder(). operation(PatchOperation.ADD_REPLACE).value(RESOURCE_NAME_WS2).build()); // modify virtual attribute - userPatch.getVirAttrs().add(attrAddReplacePatch("virtualdata", "[email protected]")); + userPatch.getVirAttrs().add(attrTO(virSchema.getKey(), "[email protected]")); // check Syncope change password userPatch.setPassword(new PasswordPatch.Builder(). @@ -348,15 +354,15 @@ public class VirAttrITCase extends AbstractITCase { userTO.getResources().add(RESOURCE_NAME_DBVIRATTR); // 1. create user - UserTO actual = createUser(userTO); - assertNotNull(actual); + userTO = createUser(userTO); + assertNotNull(userTO); // 2. check for virtual attribute value - actual = userService.read(actual.getKey()); - assertEquals("virattrcache", actual.getVirAttrMap().get("virtualdata").getValues().get(0)); + userTO = userService.read(userTO.getKey()); + assertEquals("virattrcache", userTO.getVirAttrMap().get("virtualdata").getValues().get(0)); // ---------------------------------------- - // 3. force cache expiring without any modification + // 3. change connector URL so that we are sure that any provided value will come from virtual cache // ---------------------------------------- String jdbcURL = null; ConnInstanceTO connInstanceTO = connectorService.readByResource( @@ -370,36 +376,29 @@ public class VirAttrITCase extends AbstractITCase { } connectorService.update(connInstanceTO); - - UserPatch userPatch = new UserPatch(); - userPatch.setKey(actual.getKey()); - userPatch.getVirAttrs().add(attrAddReplacePatch("virtualdata", "virtualupdated")); - - actual = updateUser(userPatch); - assertNotNull(actual); // ---------------------------------------- // ---------------------------------------- - // 4. update virtual attribute + // 4. update value on external resource // ---------------------------------------- - final JdbcTemplate jdbcTemplate = new JdbcTemplate(testDataSource); + JdbcTemplate jdbcTemplate = new JdbcTemplate(testDataSource); String value = jdbcTemplate.queryForObject( - "SELECT USERNAME FROM testsync WHERE ID=?", String.class, actual.getKey()); + "SELECT USERNAME FROM testsync WHERE ID=?", String.class, userTO.getKey()); assertEquals("virattrcache", value); - jdbcTemplate.update("UPDATE testsync set USERNAME='virattrcache2' WHERE ID=?", actual.getKey()); + jdbcTemplate.update("UPDATE testsync set USERNAME='virattrcache2' WHERE ID=?", userTO.getKey()); value = jdbcTemplate.queryForObject( - "SELECT USERNAME FROM testsync WHERE ID=?", String.class, actual.getKey()); + "SELECT USERNAME FROM testsync WHERE ID=?", String.class, userTO.getKey()); assertEquals("virattrcache2", value); // ---------------------------------------- - actual = userService.read(actual.getKey()); - assertEquals("virattrcache", actual.getVirAttrMap().get("virtualdata").getValues().get(0)); + userTO = userService.read(userTO.getKey()); + assertEquals("virattrcache", userTO.getVirAttrMap().get("virtualdata").getValues().get(0)); // ---------------------------------------- - // 5. restore connector + // 5. restore connector URL, values can be read again from external resource // ---------------------------------------- for (ConnConfProperty prop : connInstanceTO.getConfiguration()) { if ("jdbcUrlTemplate".equals(prop.getSchema().getName())) { @@ -411,8 +410,20 @@ public class VirAttrITCase extends AbstractITCase { connectorService.update(connInstanceTO); // ---------------------------------------- - actual = userService.read(actual.getKey()); - assertEquals("virattrcache2", actual.getVirAttrMap().get("virtualdata").getValues().get(0)); + // cached value still in place... + userTO = userService.read(userTO.getKey()); + assertEquals("virattrcache", userTO.getVirAttrMap().get("virtualdata").getValues().get(0)); + + // force cache update by adding a resource which has virtualdata mapped for propagation + UserPatch userPatch = new UserPatch(); + userPatch.setKey(userTO.getKey()); + userPatch.getResources().add(new StringPatchItem.Builder(). + operation(PatchOperation.ADD_REPLACE).value(RESOURCE_NAME_WS2).build()); + userTO = updateUser(userPatch); + assertNotNull(userTO); + + userTO = userService.read(userTO.getKey()); + assertEquals("virattrcache2", userTO.getVirAttrMap().get("virtualdata").getValues().get(0)); } @Test @@ -423,7 +434,7 @@ public class VirAttrITCase extends AbstractITCase { userTO.getResources().add(RESOURCE_NAME_LDAP); userTO.getVirAttrs().add(attrTO("virtualReadOnly", "readOnly")); userTO = createUser(userTO); - //Finding no values because the virtual attribute is readonly + // finding no values because the virtual attribute is readonly assertTrue(userTO.getVirAttrMap().get("virtualReadOnly").getValues().isEmpty()); } @@ -527,27 +538,13 @@ public class VirAttrITCase extends AbstractITCase { public void issueSYNCOPE459() { UserTO userTO = UserITCase.getUniqueSampleTO("[email protected]"); userTO.getResources().clear(); + userTO.getResources().add(RESOURCE_NAME_LDAP); userTO.getMemberships().clear(); userTO.getVirAttrs().clear(); - AttrTO virtualReadOnly = attrTO("virtualReadOnly", ""); - virtualReadOnly.getValues().clear(); - - userTO.getVirAttrs().add(virtualReadOnly); - userTO = createUser(userTO); assertNotNull(userTO.getVirAttrMap().get("virtualReadOnly")); - - UserPatch userPatch = new UserPatch(); - userPatch.setKey(userTO.getKey()); - userPatch.getVirAttrs().add(new AttrPatch.Builder(). - operation(PatchOperation.ADD_REPLACE). - attrTO(new AttrTO.Builder().schema("virtualdata").build()). - build()); - - userTO = updateUser(userPatch); - assertNotNull(userTO.getVirAttrMap().get("virtualdata")); } @Test @@ -572,7 +569,7 @@ public class VirAttrITCase extends AbstractITCase { UserPatch userPatch = new UserPatch(); userPatch.setKey(userTO.getKey()); // change virtual attribute value - userPatch.getVirAttrs().add(attrAddReplacePatch("virtualdata", "[email protected]")); + userPatch.getVirAttrs().add(attrTO("virtualdata", "[email protected]")); userTO = updateUser(userPatch); assertNotNull(userTO); @@ -584,80 +581,76 @@ public class VirAttrITCase extends AbstractITCase { @Test public void issueSYNCOPE691() { - final String res = RESOURCE_NAME_LDAP + "691"; - ResourceTO ldap = resourceService.read(RESOURCE_NAME_LDAP); - ldap.setKey(res); - try { + ProvisionTO provision = ldap.getProvision(AnyTypeKind.USER.name()); + assertNotNull(provision); + CollectionUtils.filterInverse(provision.getMapping().getItems(), new Predicate<MappingItemTO>() { - CollectionUtils.filterInverse(ldap.getProvision(AnyTypeKind.USER.name()).getMapping().getItems(), - new Predicate<MappingItemTO>() { - - @Override - public boolean evaluate(final MappingItemTO item) { - return "mail".equals(item.getExtAttrName()); - } - }); - - final MappingItemTO mail = new MappingItemTO(); - // unset internal attribute mail and set virtual attribute virtualdata as mapped to external email - mail.setIntMappingType(IntMappingType.UserVirtualSchema); - mail.setIntAttrName("virtualdata"); - mail.setPurpose(MappingPurpose.BOTH); - mail.setExtAttrName("mail"); - - ldap.getProvision(AnyTypeKind.USER.name()).getMapping().getItems().add(mail); + @Override + public boolean evaluate(final MappingItemTO item) { + return "mail".equals(item.getExtAttrName()); + } + }); + provision.getVirSchemas().clear(); + ldap.setKey(RESOURCE_NAME_LDAP + "691" + getUUIDString()); resourceService.create(ldap); - ldap = resourceService.read(res); - assertNotNull(ldap.getProvision(AnyTypeKind.USER.name()).getMapping()); - - assertTrue(CollectionUtils.exists(ldap.getProvision(AnyTypeKind.USER.name()).getMapping().getItems(), - new Predicate<MappingItemTO>() { - - @Override - public boolean evaluate(final MappingItemTO item) { - return "mail".equals(item.getExtAttrName()) && "virtualdata".equals(item.getIntAttrName()); - } - })); + ldap = resourceService.read(ldap.getKey()); + provision = ldap.getProvision(AnyTypeKind.USER.name()); + assertNotNull(provision); + + // create new virtual schema for the resource below + VirSchemaTO virSchema = new VirSchemaTO(); + virSchema.setKey("syncope691" + getUUIDString()); + virSchema.setExtAttrName("mail"); + virSchema.setProvision(provision.getKey()); + virSchema = createSchema(SchemaType.VIRTUAL, virSchema); + assertNotNull(virSchema); + + AnyTypeClassTO newClass = new AnyTypeClassTO(); + newClass.setKey("syncope691" + getUUIDString()); + newClass.getVirSchemas().add(virSchema.getKey()); + Response response = anyTypeClassService.create(newClass); + assertEquals(Response.Status.CREATED.getStatusCode(), response.getStatusInfo().getStatusCode()); + newClass = getObject(response.getLocation(), AnyTypeClassService.class, AnyTypeClassTO.class); // create a new user UserTO userTO = UserITCase.getUniqueSampleTO("[email protected]"); + userTO.getAuxClasses().add(newClass.getKey()); userTO.getResources().clear(); userTO.getMemberships().clear(); userTO.getDerAttrs().clear(); userTO.getVirAttrs().clear(); - final AttrTO emailTO = new AttrTO(); - emailTO.setSchema("virtualdata"); + AttrTO emailTO = new AttrTO(); + emailTO.setSchema(virSchema.getKey()); emailTO.getValues().add("[email protected]"); emailTO.getValues().add("[email protected]"); userTO.getVirAttrs().add(emailTO); // assign resource-ldap691 to user - userTO.getResources().add(res); + userTO.getResources().add(ldap.getKey()); // save user - UserTO created = createUser(userTO); + userTO = createUser(userTO); // make std controls about user - assertNotNull(created); - assertTrue(res.equals(created.getResources().iterator().next())); + assertNotNull(userTO); + assertTrue(ldap.getKey().equals(userTO.getResources().iterator().next())); - assertEquals(2, created.getVirAttrs().iterator().next().getValues().size(), 0); - assertTrue(created.getVirAttrs().iterator().next().getValues().contains("[email protected]")); - assertTrue(created.getVirAttrs().iterator().next().getValues().contains("[email protected]")); + assertEquals(2, userTO.getVirAttrs().iterator().next().getValues().size(), 0); + assertTrue(userTO.getVirAttrs().iterator().next().getValues().contains("[email protected]")); + assertTrue(userTO.getVirAttrs().iterator().next().getValues().contains("[email protected]")); // update user UserPatch userPatch = new UserPatch(); - userPatch.setKey(created.getKey()); + userPatch.setKey(userTO.getKey()); // modify virtual attribute - userPatch.getVirAttrs().add(new AttrPatch.Builder(). - operation(PatchOperation.ADD_REPLACE). - attrTO(new AttrTO.Builder().schema("virtualdata"). - value("[email protected]"). - value("[email protected]"). - build()).build()); + userPatch.getVirAttrs().add( + new AttrTO.Builder().schema(virSchema.getKey()). + value("[email protected]"). + value("[email protected]"). + build()); UserTO updated = updateUser(userPatch); assertNotNull(updated); @@ -666,7 +659,7 @@ public class VirAttrITCase extends AbstractITCase { assertTrue(updated.getVirAttrs().iterator().next().getValues().contains("[email protected]")); } finally { try { - resourceService.delete(res); + resourceService.delete(ldap.getKey()); } catch (Exception ignore) { // ignore } http://git-wip-us.apache.org/repos/asf/syncope/blob/9cd92305/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/VirSchemaITCase.java ---------------------------------------------------------------------- diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/VirSchemaITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/VirSchemaITCase.java index a1ee34d..caae156 100644 --- a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/VirSchemaITCase.java +++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/VirSchemaITCase.java @@ -27,6 +27,7 @@ import static org.junit.Assert.fail; import java.util.List; import javax.ws.rs.core.Response; import org.apache.syncope.common.lib.SyncopeClientException; +import org.apache.syncope.common.lib.to.ResourceTO; import org.apache.syncope.common.lib.to.VirSchemaTO; import org.apache.syncope.common.lib.types.ClientExceptionType; import org.apache.syncope.common.lib.types.EntityViolationType; @@ -48,41 +49,47 @@ public class VirSchemaITCase extends AbstractITCase { } @Test - public void read() { - VirSchemaTO vSchemaTO = schemaService.read(SchemaType.VIRTUAL, "mvirtualdata"); - assertNotNull(vSchemaTO); - } + public void crud() { + ResourceTO csv = resourceService.read(RESOURCE_NAME_CSV); + assertNotNull(csv); + assertEquals(1, csv.getProvisions().size()); + assertTrue(csv.getProvisions().get(0).getVirSchemas().isEmpty()); - @Test - public void create() { VirSchemaTO schema = new VirSchemaTO(); - schema.setKey("virtual"); + schema.setKey("virtualTest" + getUUIDString()); + schema.setExtAttrName("name"); + schema.setProvision(csv.getProvisions().get(0).getKey()); - VirSchemaTO actual = createSchema(SchemaType.VIRTUAL, schema); - assertNotNull(actual); + schema = createSchema(SchemaType.VIRTUAL, schema); + assertNotNull(schema); + assertEquals(csv.getProvisions().get(0).getKey(), schema.getProvision()); - actual = schemaService.read(SchemaType.VIRTUAL, actual.getKey()); - assertNotNull(actual); - } + csv = resourceService.read(RESOURCE_NAME_CSV); + assertNotNull(csv); + assertEquals(1, csv.getProvisions().size()); + assertFalse(csv.getProvisions().get(0).getVirSchemas().isEmpty()); - @Test - public void delete() { - VirSchemaTO schema = schemaService.read(SchemaType.VIRTUAL, "rvirtualdata"); + schema = schemaService.read(SchemaType.VIRTUAL, schema.getKey()); assertNotNull(schema); schemaService.delete(SchemaType.VIRTUAL, schema.getKey()); try { - schemaService.read(SchemaType.VIRTUAL, "rvirtualdata"); + schemaService.read(SchemaType.VIRTUAL, schema.getKey()); fail(); } catch (SyncopeClientException e) { assertEquals(ClientExceptionType.NotFound, e.getType()); } + + csv = resourceService.read(RESOURCE_NAME_CSV); + assertNotNull(csv); + assertEquals(1, csv.getProvisions().size()); + assertTrue(csv.getProvisions().get(0).getVirSchemas().isEmpty()); } @Test public void issueSYNCOPE323() { - VirSchemaTO actual = schemaService.read(SchemaType.VIRTUAL, "mvirtualdata"); + VirSchemaTO actual = schemaService.read(SchemaType.VIRTUAL, "virtualdata"); assertNotNull(actual); try {
