/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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 org.apache.syncope.fit.core;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import java.util.Collection;
import javax.ws.rs.core.Response;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.collections4.IterableUtils;
import org.apache.commons.collections4.Predicate;
import org.apache.syncope.client.lib.SyncopeClient;
import org.apache.syncope.common.lib.SyncopeConstants;
import org.apache.syncope.common.lib.patch.AnyObjectPatch;
import org.apache.syncope.common.lib.patch.MembershipPatch;
import org.apache.syncope.common.lib.to.AnyObjectTO;
import org.apache.syncope.common.lib.to.AnyTypeTO;
import org.apache.syncope.common.lib.to.PagedResult;
import org.apache.syncope.common.lib.to.GroupTO;
import org.apache.syncope.common.lib.to.MembershipTO;
import org.apache.syncope.common.lib.to.RoleTO;
import org.apache.syncope.common.lib.to.UserTO;
import org.apache.syncope.common.lib.types.AnyTypeKind;
import org.apache.syncope.common.rest.api.beans.AnyQuery;
import org.apache.syncope.common.rest.api.service.RoleService;
import org.apache.syncope.fit.AbstractITCase;
import org.junit.Test;
public class SearchITCase extends AbstractITCase {
@Test
public void searchUser() {
// LIKE
PagedResult<UserTO> matchingUsers = userService.search(
new AnyQuery.Builder().realm(SyncopeConstants.ROOT_REALM).
fiql(SyncopeClient.getUserSearchConditionBuilder().
is("fullname").equalTo("*o*").and("fullname").equalTo("*i*").query()).build());
assertNotNull(matchingUsers);
assertFalse(matchingUsers.getResult().isEmpty());
for (UserTO user : matchingUsers.getResult()) {
assertNotNull(user);
}
// ISNULL
matchingUsers = userService.search(new AnyQuery.Builder().realm(SyncopeConstants.ROOT_REALM).
fiql(SyncopeClient.getUserSearchConditionBuilder().isNull("loginDate").query()).build());
assertNotNull(matchingUsers);
assertFalse(matchingUsers.getResult().isEmpty());
Collection<UserTO> found = CollectionUtils.select(matchingUsers.getResult(), new Predicate<UserTO>() {
@Override
public boolean evaluate(final UserTO user) {
return "74cd8ece-715a-44a4-a736-e17b46c4e7e6".equals(user.getKey())
|| "b3cbc78d-32e6-4bd4-92e0-bbe07566a2ee".equals(user.getKey());
}
});
assertEquals(2, found.size());
}
@Test
public void searchUserIgnoreCase() {
PagedResult<UserTO> matchingUsers = userService.search(
new AnyQuery.Builder().realm(SyncopeConstants.ROOT_REALM).
fiql(SyncopeClient.getUserSearchConditionBuilder().
is("username").equalToIgnoreCase("RoSsINI").and("key").lessThan(2).query()).build());
assertNotNull(matchingUsers);
assertEquals(1, matchingUsers.getResult().size());
assertEquals("rossini", matchingUsers.getResult().iterator().next().getUsername());
assertEquals("1417acbe-cbf6-4277-9372-e75e04f97000", matchingUsers.getResult().iterator().next().getKey());
matchingUsers = userService.search(
new AnyQuery.Builder().realm(SyncopeConstants.ROOT_REALM).
fiql("(fullname=~*oSsINi)").page(1).size(2).build());
assertNotNull(matchingUsers);
assertEquals(1, matchingUsers.getResult().size());
assertEquals("rossini", matchingUsers.getResult().iterator().next().getUsername());
assertEquals("1417acbe-cbf6-4277-9372-e75e04f97000", matchingUsers.getResult().iterator().next().getKey());
}
@Test
public void searchByUsernameAndKey() {
PagedResult<UserTO> matchingUsers = userService.search(
new AnyQuery.Builder().realm(SyncopeConstants.ROOT_REALM).
fiql(SyncopeClient.getUserSearchConditionBuilder().
is("username").equalTo("rossini").and("key").lessThan(2).query()).build());
assertNotNull(matchingUsers);
assertEquals(1, matchingUsers.getResult().size());
assertEquals("rossini", matchingUsers.getResult().iterator().next().getUsername());
assertEquals("1417acbe-cbf6-4277-9372-e75e04f97000", matchingUsers.getResult().iterator().next().getKey());
}
@Test
public void searchByGroupNameAndKey() {
PagedResult<GroupTO> groups = groupService.search(new AnyQuery.Builder().realm(SyncopeConstants.ROOT_REALM).
fiql(SyncopeClient.getGroupSearchConditionBuilder().
is("name").equalTo("root").and("key").equalTo("37d15e4c-cdc1-460b-a591-8505c8133806").
query()).build());
assertNotNull(groups);
assertEquals(1, groups.getResult().size());
assertEquals("root", groups.getResult().iterator().next().getName());
assertEquals("37d15e4c-cdc1-460b-a591-8505c8133806", groups.getResult().iterator().next().getKey());
}
@Test
public void searchByGroup() {
PagedResult<UserTO> matchingUsers = userService.search(
new AnyQuery.Builder().realm(SyncopeConstants.ROOT_REALM).
fiql(SyncopeClient.getUserSearchConditionBuilder().inGroups("root").query()).
build());
assertNotNull(matchingUsers);
assertFalse(matchingUsers.getResult().isEmpty());
assertTrue(IterableUtils.matchesAny(matchingUsers.getResult(), new Predicate<UserTO>() {
@Override
public boolean evaluate(final UserTO user) {
return "1417acbe-cbf6-4277-9372-e75e04f97000".equals(user.getKey());
}
}));
}
@Test
public void searchByDynGroup() {
GroupTO group = GroupITCase.getBasicSampleTO("dynMembership");
group.setUDynMembershipCond("cool==true");
group = createGroup(group).getEntity();
assertNotNull(group);
PagedResult<UserTO> matchingUsers = userService.search(
new AnyQuery.Builder().realm(SyncopeConstants.ROOT_REALM).
fiql(SyncopeClient.getUserSearchConditionBuilder().inGroups(group.getKey()).query()).
build());
assertNotNull(matchingUsers);
assertFalse(matchingUsers.getResult().isEmpty());
assertTrue(IterableUtils.matchesAny(matchingUsers.getResult(), new Predicate<UserTO>() {
@Override
public boolean evaluate(final UserTO user) {
return "c9b2dec2-00a7-4855-97c0-d854842b4b24".equals(user.getKey());
}
}));
}
@Test
public void searchByRole() {
PagedResult<UserTO> matchingUsers = userService.search(
new AnyQuery.Builder().realm(SyncopeConstants.ROOT_REALM).
fiql(SyncopeClient.getUserSearchConditionBuilder().inRoles("Other").query()).
build());
assertNotNull(matchingUsers);
assertFalse(matchingUsers.getResult().isEmpty());
assertTrue(IterableUtils.matchesAny(matchingUsers.getResult(), new Predicate<UserTO>() {
@Override
public boolean evaluate(final UserTO user) {
return "1417acbe-cbf6-4277-9372-e75e04f97000".equals(user.getKey());
}
}));
}
@Test
public void searchByDynRole() {
RoleTO role = RoleITCase.getSampleRoleTO("dynMembership");
role.setDynMembershipCond("cool==true");
Response response = roleService.create(role);
role = getObject(response.getLocation(), RoleService.class, RoleTO.class);
assertNotNull(role);
PagedResult<UserTO> matchingUsers = userService.search(
new AnyQuery.Builder().realm(SyncopeConstants.ROOT_REALM).
fiql(SyncopeClient.getUserSearchConditionBuilder().inRoles(role.getKey()).query()).
build());
assertNotNull(matchingUsers);
assertFalse(matchingUsers.getResult().isEmpty());
assertTrue(IterableUtils.matchesAny(matchingUsers.getResult(), new Predicate<UserTO>() {
@Override
public boolean evaluate(final UserTO user) {
return "c9b2dec2-00a7-4855-97c0-d854842b4b24".equals(user.getKey());
}
}));
}
@Test
public void searchUserByResourceName() {
PagedResult<UserTO> matchingUsers = userService.search(
new AnyQuery.Builder().realm(SyncopeConstants.ROOT_REALM).
fiql(SyncopeClient.getUserSearchConditionBuilder().hasResources(RESOURCE_NAME_MAPPINGS2).query()).
build());
assertNotNull(matchingUsers);
assertFalse(matchingUsers.getResult().isEmpty());
assertTrue(IterableUtils.matchesAny(matchingUsers.getResult(), new Predicate<UserTO>() {
@Override
public boolean evaluate(final UserTO user) {
return "74cd8ece-715a-44a4-a736-e17b46c4e7e6".equals(user.getKey());
}
}));
}
@Test
public void paginatedSearch() {
// LIKE
PagedResult<UserTO> matchingUsers = userService.search(
new AnyQuery.Builder().realm(SyncopeConstants.ROOT_REALM).
fiql(SyncopeClient.getUserSearchConditionBuilder().
is("fullname").equalTo("*o*").and("fullname").equalTo("*i*").query()).page(1).size(2).
build());
assertNotNull(matchingUsers);
assertFalse(matchingUsers.getResult().isEmpty());
for (UserTO user : matchingUsers.getResult()) {
assertNotNull(user);
}
// ISNULL
matchingUsers = userService.search(new AnyQuery.Builder().realm(SyncopeConstants.ROOT_REALM).
fiql(SyncopeClient.getUserSearchConditionBuilder().isNull("loginDate").query()).page(2).size(2).
build());
assertNotNull(matchingUsers);
assertEquals(2, matchingUsers.getPage());
assertFalse(matchingUsers.getResult().isEmpty());
}
@Test
public void searchByBooleanAnyCond() {
PagedResult<GroupTO> groups = groupService.search(new AnyQuery.Builder().realm(SyncopeConstants.ROOT_REALM).
fiql(SyncopeClient.getGroupSearchConditionBuilder().is("show").equalTo("true").query()).build());
assertNotNull(groups);
assertFalse(groups.getResult().isEmpty());
}
@Test
public void searchByDate() {
clientFactory.create("bellini", "password").self();
PagedResult<UserTO> users = userService.search(new AnyQuery.Builder().realm(SyncopeConstants.ROOT_REALM).
fiql(SyncopeClient.getUserSearchConditionBuilder().
is("lastLoginDate").lexicalNotBefore("2016-03-02 15:21:22").
and("username").equalTo("bellini").query()).
build());
assertNotNull(users);
assertEquals(1, users.getTotalCount());
assertEquals(1, users.getResult().size());
}
@Test
public void searchByRelationshipAnyCond() {
PagedResult<GroupTO> groups = groupService.search(new AnyQuery.Builder().realm(SyncopeConstants.ROOT_REALM).
fiql(SyncopeClient.getGroupSearchConditionBuilder().
is("userOwner").equalTo("823074dc-d280-436d-a7dd-07399fae48ec").query()).build());
assertNotNull(groups);
assertEquals(1, groups.getResult().size());
assertEquals(
"ebf97068-aa4b-4a85-9f01-680e8c4cf227",
groups.getResult().iterator().next().getKey());
}
@Test
public void nested() {
PagedResult<UserTO> matchingUsers = userService.search(
new AnyQuery.Builder().realm(SyncopeConstants.ROOT_REALM).
fiql("((fullname==*o*,fullname==*i*);$resources!=ws-target-resource-1)").page(1).size(2).build());
assertNotNull(matchingUsers);
assertFalse(matchingUsers.getResult().isEmpty());
for (UserTO user : matchingUsers.getResult()) {
assertNotNull(user);
}
}
@Test
public void searchByType() {
PagedResult<AnyObjectTO> matching = anyObjectService.search(new AnyQuery.Builder().realm(
SyncopeConstants.ROOT_REALM).
fiql(SyncopeClient.getAnyObjectSearchConditionBuilder("PRINTER").query()).build());
assertNotNull(matching);
assertFalse(matching.getResult().isEmpty());
for (AnyObjectTO printer : matching.getResult()) {
assertNotNull(printer);
}
matching = anyObjectService.search(new AnyQuery.Builder().realm(SyncopeConstants.ROOT_REALM).
fiql(SyncopeClient.getAnyObjectSearchConditionBuilder("UNEXISTING").query()).build());
assertNotNull(matching);
assertTrue(matching.getResult().isEmpty());
}
@Test
public void searchByRelationship() {
PagedResult<AnyObjectTO> anyObjects = anyObjectService.search(new AnyQuery.Builder().realm(
SyncopeConstants.ROOT_REALM).
fiql(SyncopeClient.getAnyObjectSearchConditionBuilder("PRINTER").
inRelationships("Canon MF 8030cn").query()).
build());
assertNotNull(anyObjects);
assertTrue(IterableUtils.matchesAny(anyObjects.getResult(), new Predicate<AnyObjectTO>() {
@Override
public boolean evaluate(final AnyObjectTO anyObject) {
return "fc6dbc3a-6c07-4965-8781-921e7401a4a5".equals(anyObject.getKey());
}
}));
PagedResult<UserTO> users = userService.search(new AnyQuery.Builder().realm(SyncopeConstants.ROOT_REALM).
fiql(SyncopeClient.getUserSearchConditionBuilder().inRelationships("HP LJ 1300n").query()).
build());
assertNotNull(users);
assertTrue(IterableUtils.matchesAny(users.getResult(), new Predicate<UserTO>() {
@Override
public boolean evaluate(final UserTO user) {
return "c9b2dec2-00a7-4855-97c0-d854842b4b24".equals(user.getKey());
}
}));
}
@Test
public void searchByRelationshipType() {
PagedResult<AnyObjectTO> anyObjects = anyObjectService.search(new AnyQuery.Builder().realm(
SyncopeConstants.ROOT_REALM).
fiql(SyncopeClient.getAnyObjectSearchConditionBuilder("PRINTER").
inRelationshipTypes("neighborhood").query()).
build());
assertNotNull(anyObjects);
assertTrue(IterableUtils.matchesAny(anyObjects.getResult(), new Predicate<AnyObjectTO>() {
@Override
public boolean evaluate(final AnyObjectTO anyObject) {
return "fc6dbc3a-6c07-4965-8781-921e7401a4a5".equals(anyObject.getKey());
}
}));
assertTrue(IterableUtils.matchesAny(anyObjects.getResult(), new Predicate<AnyObjectTO>() {
@Override
public boolean evaluate(final AnyObjectTO anyObject) {
return "8559d14d-58c2-46eb-a2d4-a7d35161e8f8".equals(anyObject.getKey());
}
}));
PagedResult<UserTO> users = userService.search(new AnyQuery.Builder().realm(SyncopeConstants.ROOT_REALM).
fiql(SyncopeClient.getUserSearchConditionBuilder().inRelationshipTypes("neighborhood").query()).
build());
assertNotNull(users);
assertTrue(IterableUtils.matchesAny(users.getResult(), new Predicate<UserTO>() {
@Override
public boolean evaluate(final UserTO user) {
return "c9b2dec2-00a7-4855-97c0-d854842b4b24".equals(user.getKey());
}
}));
}
@Test
public void assignable() {
PagedResult<GroupTO> groups = groupService.search(new AnyQuery.Builder().realm("/even/two").page(1).size(1000).
fiql(SyncopeClient.getGroupSearchConditionBuilder().isAssignable().
and("name").equalTo("*").query()).
build());
assertNotNull(groups);
assertTrue(IterableUtils.matchesAny(groups.getResult(), new Predicate<GroupTO>() {
@Override
public boolean evaluate(final GroupTO group) {
return "034740a9-fa10-453b-af37-dc7897e98fb1".equals(group.getKey());
}
}));
assertFalse(IterableUtils.matchesAny(groups.getResult(), new Predicate<GroupTO>() {
@Override
public boolean evaluate(final GroupTO group) {
return "e7ff94e8-19c9-4f0a-b8b7-28327edbf6ed".equals(group.getKey());
}
}));
PagedResult<AnyObjectTO> anyObjects = anyObjectService.search(new AnyQuery.Builder().realm("/odd").
fiql(SyncopeClient.getAnyObjectSearchConditionBuilder("PRINTER").isAssignable().
and("name").equalTo("*").query()).
build());
assertNotNull(anyObjects);
assertFalse(IterableUtils.matchesAny(anyObjects.getResult(), new Predicate<AnyObjectTO>() {
@Override
public boolean evaluate(final AnyObjectTO anyObject) {
return "9e1d130c-d6a3-48b1-98b3-182477ed0688".equals(anyObject.getKey());
}
}));
}
@Test
public void member() {
PagedResult<GroupTO> groups = groupService.search(new AnyQuery.Builder().realm("/").
fiql(SyncopeClient.getGroupSearchConditionBuilder().withMembers("rossini").query()).
build());
assertNotNull(groups);
assertTrue(IterableUtils.matchesAny(groups.getResult(), new Predicate<GroupTO>() {
@Override
public boolean evaluate(final GroupTO group) {
return "root".equals(group.getName());
}
}));
assertTrue(IterableUtils.matchesAny(groups.getResult(), new Predicate<GroupTO>() {
@Override
public boolean evaluate(final GroupTO group) {
return "otherchild".equals(group.getName());
}
}));
}
@Test
public void orderBy() {
PagedResult<UserTO> matchingUsers = userService.search(
new AnyQuery.Builder().realm(SyncopeConstants.ROOT_REALM).
fiql(SyncopeClient.getUserSearchConditionBuilder().is("userId").equalTo("*@apache.org").query()).
orderBy(SyncopeClient.getOrderByClauseBuilder().asc("status").desc("firstname").build()).build());
assertNotNull(matchingUsers);
assertFalse(matchingUsers.getResult().isEmpty());
for (UserTO user : matchingUsers.getResult()) {
assertNotNull(user);
}
}
@Test
public void issueSYNCOPE768() {
int usersWithNullable = userService.search(new AnyQuery.Builder().realm(SyncopeConstants.ROOT_REALM).
fiql(SyncopeClient.getUserSearchConditionBuilder().is("ctype").nullValue().query()).build()).
getTotalCount();
assertTrue(usersWithNullable > 0);
int nonOrdered = userService.search(new AnyQuery.Builder().realm(SyncopeConstants.ROOT_REALM).
fiql(SyncopeClient.getUserSearchConditionBuilder().is("username").notNullValue().query()).build()).
getTotalCount();
assertTrue(nonOrdered > 0);
int orderedByNullable = userService.search(new AnyQuery.Builder().realm(SyncopeConstants.ROOT_REALM).
fiql(SyncopeClient.getUserSearchConditionBuilder().is("username").notNullValue().query()).
orderBy(SyncopeClient.getOrderByClauseBuilder().asc("ctype").build()).build()).
getTotalCount();
assertEquals(nonOrdered, orderedByNullable);
}
@Test
public void issueSYNCOPE929() {
PagedResult<UserTO> matchingUsers = userService.search(
new AnyQuery.Builder().realm(SyncopeConstants.ROOT_REALM).
fiql("(surname==Rossini,gender==M);surname==Bellini").build());
assertNotNull(matchingUsers);
assertFalse(matchingUsers.getResult().isEmpty());
for (UserTO user : matchingUsers.getResult()) {
assertTrue(user.getUsername().startsWith("bellini"));
}
}
@Test
public void issueSYNCOPE980() {
AnyTypeTO service = new AnyTypeTO();
service.setKey("SERVICE");
service.setKind(AnyTypeKind.ANY_OBJECT);
Response response = anyTypeService.create(service);
assertEquals(Response.Status.CREATED.getStatusCode(), response.getStatusInfo().getStatusCode());
String serviceKey = null;
try {
AnyObjectTO anyObjectTO = new AnyObjectTO();
anyObjectTO.setName("one");
anyObjectTO.setRealm(SyncopeConstants.ROOT_REALM);
anyObjectTO.setType(service.getKey());
anyObjectTO.getMemberships().add(
new MembershipTO.Builder().group("29f96485-729e-4d31-88a1-6fc60e4677f3").build());
serviceKey = createAnyObject(anyObjectTO).getEntity().getKey();
AnyObjectPatch anyObjectPatch = new AnyObjectPatch();
anyObjectPatch.setKey("fc6dbc3a-6c07-4965-8781-921e7401a4a5");
anyObjectPatch.getMemberships().add(
new MembershipPatch.Builder().group("29f96485-729e-4d31-88a1-6fc60e4677f3").build());
updateAnyObject(anyObjectPatch);
PagedResult<AnyObjectTO> matching = anyObjectService.search(new AnyQuery.Builder().fiql(
SyncopeClient.getAnyObjectSearchConditionBuilder(service.getKey()).
inGroups("29f96485-729e-4d31-88a1-6fc60e4677f3").
query()).build());
assertEquals(1, matching.getSize());
assertEquals(serviceKey, matching.getResult().get(0).getKey());
} finally {
if (serviceKey != null) {
anyObjectService.delete(serviceKey);
}
anyTypeService.delete(service.getKey());
}
}
@Test
public void issueSYNCOPE983() {
PagedResult<UserTO> users = userService.search(
new AnyQuery.Builder().
fiql(SyncopeClient.getUserSearchConditionBuilder().is("surname").equalTo("*o*").query()).
orderBy(SyncopeClient.getOrderByClauseBuilder().asc("surname").desc("username").build()).
build());
assertNotEquals(0, users.getTotalCount());
}
}