blob: 498693daa207474206dd895f966836d4af4c9a26 [file] [log] [blame]
/*
* 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.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertNotEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.junit.jupiter.api.Assertions.fail;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import javax.ws.rs.core.Response;
import org.apache.commons.lang3.RandomStringUtils;
import org.apache.syncope.client.lib.SyncopeClient;
import org.apache.syncope.client.ui.commons.ConnIdSpecialName;
import org.apache.syncope.common.lib.Attr;
import org.apache.syncope.common.lib.SyncopeClientException;
import org.apache.syncope.common.lib.SyncopeConstants;
import org.apache.syncope.common.lib.request.AnyObjectCR;
import org.apache.syncope.common.lib.request.AnyObjectUR;
import org.apache.syncope.common.lib.request.GroupCR;
import org.apache.syncope.common.lib.request.MembershipUR;
import org.apache.syncope.common.lib.request.UserCR;
import org.apache.syncope.common.lib.request.UserUR;
import org.apache.syncope.common.lib.request.AttrPatch;
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.PagedConnObjectTOResult;
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.lib.types.ClientExceptionType;
import org.apache.syncope.common.rest.api.beans.AnyQuery;
import org.apache.syncope.common.rest.api.beans.ConnObjectTOQuery;
import org.apache.syncope.common.rest.api.service.RoleService;
import org.apache.syncope.fit.AbstractITCase;
import org.apache.syncope.fit.ElasticsearchDetector;
import org.junit.jupiter.api.Assertions;
import org.identityconnectors.framework.common.objects.Name;
import org.junit.jupiter.api.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());
matchingUsers.getResult().stream().forEach(Assertions::assertNotNull);
// ISNULL
matchingUsers = userService.search(new AnyQuery.Builder().realm(SyncopeConstants.ROOT_REALM).
fiql(SyncopeClient.getUserSearchConditionBuilder().isNull("loginDate").query()).build());
assertNotNull(matchingUsers);
assertFalse(matchingUsers.getResult().isEmpty());
assertEquals(2, matchingUsers.getResult().stream().
filter(user -> "74cd8ece-715a-44a4-a736-e17b46c4e7e6".equals(user.getKey())
|| "b3cbc78d-32e6-4bd4-92e0-bbe07566a2ee".equals(user.getKey())).count());
}
@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().get(0).getUsername());
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().get(0).getUsername());
matchingUsers = userService.search(
new AnyQuery.Builder().realm(SyncopeConstants.ROOT_REALM).
fiql("fullname=~*ino*rossini*").page(1).size(2).build());
assertNotNull(matchingUsers);
assertEquals(1, matchingUsers.getResult().size());
assertEquals("rossini", matchingUsers.getResult().get(0).getUsername());
}
@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().get(0).getUsername());
}
@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> matchingChild = userService.search(
new AnyQuery.Builder().realm(SyncopeConstants.ROOT_REALM).
fiql(SyncopeClient.getUserSearchConditionBuilder().inGroups("child").query()).
build());
assertTrue(matchingChild.getResult().stream().anyMatch(user -> "verdi".equals(user.getUsername())));
PagedResult<UserTO> matchingOtherChild = userService.search(
new AnyQuery.Builder().realm(SyncopeConstants.ROOT_REALM).
fiql(SyncopeClient.getUserSearchConditionBuilder().inGroups("otherchild").query()).
build());
assertTrue(matchingOtherChild.getResult().stream().anyMatch(user -> "rossini".equals(user.getUsername())));
Set<String> union = Stream.concat(
matchingChild.getResult().stream().map(UserTO::getUsername),
matchingOtherChild.getResult().stream().map(UserTO::getUsername)).
collect(Collectors.toSet());
PagedResult<UserTO> matchingStar = userService.search(
new AnyQuery.Builder().realm(SyncopeConstants.ROOT_REALM).
fiql(SyncopeClient.getUserSearchConditionBuilder().inGroups("*child").query()).
build());
assertTrue(matchingStar.getResult().stream().anyMatch(user -> "verdi".equals(user.getUsername())));
assertTrue(matchingStar.getResult().stream().anyMatch(user -> "rossini".equals(user.getUsername())));
assertEquals(union, matchingStar.getResult().stream().map(UserTO::getUsername).collect(Collectors.toSet()));
}
@Test
public void searchByDynGroup() {
GroupCR groupCR = GroupITCase.getBasicSample("dynMembership");
groupCR.setUDynMembershipCond("cool==true");
GroupTO group = createGroup(groupCR).getEntity();
assertNotNull(group);
if (ElasticsearchDetector.isElasticSearchEnabled(adminClient.platform())) {
try {
Thread.sleep(2000);
} catch (InterruptedException ex) {
// ignore
}
}
PagedResult<GroupTO> matchingGroups = groupService.search(
new AnyQuery.Builder().realm(SyncopeConstants.ROOT_REALM).
fiql(SyncopeClient.getGroupSearchConditionBuilder().
is("creationContext").equalTo("REST").query()).
build());
assertNotNull(matchingGroups);
assertTrue(matchingGroups.getTotalCount() > 0);
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(matchingUsers.getResult().stream().
anyMatch(user -> "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(matchingUsers.getResult().stream().anyMatch(user -> "rossini".equals(user.getUsername())));
}
@Test
public void searchByPrivilege() {
PagedResult<UserTO> matchingUsers = userService.search(
new AnyQuery.Builder().realm(SyncopeConstants.ROOT_REALM).
fiql(SyncopeClient.getUserSearchConditionBuilder().withPrivileges("postMighty").query()).
build());
assertNotNull(matchingUsers);
assertFalse(matchingUsers.getResult().isEmpty());
assertTrue(matchingUsers.getResult().stream().anyMatch(user -> "rossini".equals(user.getUsername())));
}
@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);
if (ElasticsearchDetector.isElasticSearchEnabled(adminClient.platform())) {
try {
Thread.sleep(2000);
} catch (InterruptedException ex) {
// ignore
}
}
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(matchingUsers.getResult().stream().
anyMatch(user -> "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(matchingUsers.getResult().stream().
anyMatch(user -> "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();
if (ElasticsearchDetector.isElasticSearchEnabled(adminClient.platform())) {
try {
Thread.sleep(2000);
} catch (InterruptedException ex) {
// ignore
}
}
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());
// SYNCOPE-1321
PagedResult<UserTO> issueSYNCOPE1321 = userService.search(new AnyQuery.Builder().
realm(SyncopeConstants.ROOT_REALM).
fiql(SyncopeClient.getUserSearchConditionBuilder().
is("lastLoginDate").lexicalNotBefore("2016-03-02T15:21:22+0300").
and("username").equalTo("bellini").query()).
build());
assertEquals(users, issueSYNCOPE1321);
}
@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());
matchingUsers.getResult().forEach(Assertions::assertNotNull);
}
@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(anyObjects.getResult().stream().
anyMatch(anyObject -> "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(users.getResult().stream().
anyMatch(user -> "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(anyObjects.getResult().stream().
anyMatch(anyObject -> "fc6dbc3a-6c07-4965-8781-921e7401a4a5".equals(anyObject.getKey())));
assertTrue(anyObjects.getResult().stream().
anyMatch(anyObject -> "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(users.getResult().stream().
anyMatch(user -> "c9b2dec2-00a7-4855-97c0-d854842b4b24".equals(user.getKey())));
}
@Test
public void searchBySecurityAnswer() {
String securityAnswer = RandomStringUtils.randomAlphanumeric(10);
UserCR userCR = UserITCase.getUniqueSample("securityAnswer@syncope.apache.org");
userCR.setSecurityQuestion("887028ea-66fc-41e7-b397-620d7ea6dfbb");
userCR.setSecurityAnswer(securityAnswer);
UserTO userTO = createUser(userCR).getEntity();
assertNotNull(userTO.getSecurityQuestion());
PagedResult<UserTO> matchingUsers = userService.search(
new AnyQuery.Builder().realm(SyncopeConstants.ROOT_REALM).
fiql(SyncopeClient.getUserSearchConditionBuilder().
is("securityAnswer").equalTo(securityAnswer).query()).build());
assertNotNull(matchingUsers);
assertTrue(matchingUsers.getResult().isEmpty());
}
@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(groups.getResult().stream().
anyMatch(group -> "034740a9-fa10-453b-af37-dc7897e98fb1".equals(group.getKey())));
assertFalse(groups.getResult().stream().
anyMatch(group -> "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(anyObjects.getResult().stream().
anyMatch(anyObject -> "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(groups.getResult().stream().anyMatch(group -> "root".equals(group.getName())));
assertTrue(groups.getResult().stream().anyMatch(group -> "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());
matchingUsers.getResult().forEach(Assertions::assertNotNull);
}
@Test
public void searchConnObjectsBrowsePagedResult() {
List<String> groupKeys = new ArrayList<>();
for (int i = 0; i < 10; i++) {
GroupCR groupCR = GroupITCase.getSample("group");
groupCR.getResources().add(RESOURCE_NAME_LDAP);
GroupTO group = createGroup(groupCR).getEntity();
groupKeys.add(group.getKey());
}
int totalRead = 0;
Set<String> read = new HashSet<>();
try {
// 1. first search with no filters
ConnObjectTOQuery.Builder builder = new ConnObjectTOQuery.Builder().size(10);
PagedConnObjectTOResult matches;
do {
matches = null;
boolean succeeded = false;
// needed because ApacheDS seems to randomly fail when searching with cookie
for (int i = 0; i < 5 && !succeeded; i++) {
try {
matches = resourceService.searchConnObjects(
RESOURCE_NAME_LDAP,
AnyTypeKind.GROUP.name(),
builder.build());
succeeded = true;
} catch (SyncopeClientException e) {
assertEquals(ClientExceptionType.ConnectorException, e.getType());
}
}
assertNotNull(matches);
totalRead += matches.getResult().size();
read.addAll(matches.getResult().stream().
map(input -> input.getAttr(ConnIdSpecialName.NAME).get().getValues().get(0)).
collect(Collectors.toList()));
if (matches.getPagedResultsCookie() != null) {
builder.pagedResultsCookie(matches.getPagedResultsCookie());
}
} while (matches.getPagedResultsCookie() != null);
assertEquals(totalRead, read.size());
assertTrue(totalRead >= 10);
} finally {
groupKeys.forEach(key -> {
groupService.delete(key);
});
}
}
@Test
public void searchConnObjectsWithFilter() {
PagedConnObjectTOResult matches = resourceService.searchConnObjects(
RESOURCE_NAME_LDAP,
AnyTypeKind.USER.name(),
new ConnObjectTOQuery.Builder().size(100).fiql(
SyncopeClient.getConnObjectTOFiqlSearchConditionBuilder().
is("givenName").equalTo("pullFromLDAP").query()).build());
assertTrue(matches.getResult().stream().
anyMatch(connObject -> connObject.getAttr("givenName").get().getValues().contains("pullFromLDAP")));
matches = resourceService.searchConnObjects(
RESOURCE_NAME_LDAP,
AnyTypeKind.USER.name(),
new ConnObjectTOQuery.Builder().size(100).fiql(
SyncopeClient.getConnObjectTOFiqlSearchConditionBuilder().
is("mail").equalTo("pullFromLDAP*").query()).build());
assertTrue(matches.getResult().stream().
anyMatch(connObject -> connObject.getAttr("cn").get().getValues().contains("pullFromLDAP")));
matches = resourceService.searchConnObjects(
RESOURCE_NAME_LDAP,
AnyTypeKind.USER.name(),
new ConnObjectTOQuery.Builder().size(100).fiql(
SyncopeClient.getConnObjectTOFiqlSearchConditionBuilder().
is("mail").equalTo("*@syncope.apache.org").query()).build());
assertTrue(matches.getResult().stream().
anyMatch(connObject -> connObject.getAttr("cn").get().getValues().contains("pullFromLDAP")));
matches = resourceService.searchConnObjects(
RESOURCE_NAME_LDAP,
AnyTypeKind.USER.name(),
new ConnObjectTOQuery.Builder().size(100).fiql(
SyncopeClient.getConnObjectTOFiqlSearchConditionBuilder().
is("givenName").equalToIgnoreCase("pullfromldap").query()).build());
assertTrue(matches.getResult().stream().
anyMatch(connObject -> connObject.getAttr("givenName").get().getValues().contains("pullFromLDAP")));
matches = resourceService.searchConnObjects(
RESOURCE_NAME_LDAP,
AnyTypeKind.USER.name(),
new ConnObjectTOQuery.Builder().size(100).fiql(
SyncopeClient.getConnObjectTOFiqlSearchConditionBuilder().
is(Name.NAME).equalTo("uid=pullFromLDAP%252Cou=people%252Co=isp").query()).build());
assertTrue(matches.getResult().stream().
anyMatch(connObject -> connObject.getAttr("cn").get().getValues().contains("pullFromLDAP")));
matches = resourceService.searchConnObjects(
RESOURCE_NAME_LDAP,
AnyTypeKind.USER.name(),
new ConnObjectTOQuery.Builder().size(100).fiql(
SyncopeClient.getConnObjectTOFiqlSearchConditionBuilder().
is("givenName").notEqualTo("pullFromLDAP").query()).build());
assertFalse(matches.getResult().stream().
anyMatch(connObject -> connObject.getAttr("givenName").get().getValues().contains("pullFromLDAP")));
matches = resourceService.searchConnObjects(
RESOURCE_NAME_LDAP,
AnyTypeKind.USER.name(),
new ConnObjectTOQuery.Builder().size(100).fiql(
SyncopeClient.getConnObjectTOFiqlSearchConditionBuilder().
is("homePhone").notNullValue().query()).build());
assertTrue(matches.getResult().isEmpty());
matches = resourceService.searchConnObjects(
RESOURCE_NAME_LDAP,
AnyTypeKind.USER.name(),
new ConnObjectTOQuery.Builder().size(100).fiql(
SyncopeClient.getConnObjectTOFiqlSearchConditionBuilder().
is("homePhone").nullValue().query()).build());
assertTrue(matches.getResult().stream().
anyMatch(connObject -> connObject.getAttr("homePhone").isEmpty()));
}
@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());
matchingUsers.getResult().forEach(user -> 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 {
AnyObjectCR anyObjectCR = new AnyObjectCR.Builder(SyncopeConstants.ROOT_REALM, service.getKey(), "one").
membership(new MembershipTO.Builder("29f96485-729e-4d31-88a1-6fc60e4677f3").build()).
build();
serviceKey = createAnyObject(anyObjectCR).getEntity().getKey();
AnyObjectUR anyObjectUR = new AnyObjectUR.Builder("fc6dbc3a-6c07-4965-8781-921e7401a4a5").
membership(new MembershipUR.Builder("29f96485-729e-4d31-88a1-6fc60e4677f3").build()).
build();
updateAnyObject(anyObjectUR);
if (ElasticsearchDetector.isElasticSearchEnabled(adminClient.platform())) {
try {
Thread.sleep(2000);
} catch (InterruptedException ex) {
// ignore
}
}
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());
}
@Test
public void issueSYNCOPE1223() {
UserUR req = new UserUR();
req.setKey("vivaldi");
req.getPlainAttrs().add(new AttrPatch.Builder(attr("ctype", "ou=sample,o=isp")).build());
userService.update(req);
if (ElasticsearchDetector.isElasticSearchEnabled(adminClient.platform())) {
try {
Thread.sleep(2000);
} catch (InterruptedException ex) {
// ignore
}
}
try {
PagedResult<UserTO> users = userService.search(new AnyQuery.Builder().fiql(
SyncopeClient.getUserSearchConditionBuilder().is("ctype").equalTo("ou=sample%252Co=isp").query()).
build());
assertEquals(1, users.getTotalCount());
assertEquals("vivaldi", users.getResult().get(0).getUsername());
} finally {
req.getPlainAttrs().clear();
req.getPlainAttrs().add(new AttrPatch.Builder(attr("ctype", "F")).build());
userService.update(req);
}
}
@Test
public void issueSYNCOPE1304() {
PagedResult<GroupTO> groups = groupService.search(new AnyQuery.Builder().realm(SyncopeConstants.ROOT_REALM).
orderBy("userOwner DESC").build());
assertNotNull(groups);
assertFalse(groups.getResult().isEmpty());
}
@Test
public void issueSYNCOPE1416() {
// check the search for attributes of type different from stringvalue
PagedResult<UserTO> issueSYNCOPE1416 = userService.search(new AnyQuery.Builder().
realm(SyncopeConstants.ROOT_REALM).
fiql(SyncopeClient.getUserSearchConditionBuilder().
is("loginDate").lexicalNotBefore("2009-05-26").
and("username").equalTo("rossini").query()).
orderBy(SyncopeClient.getOrderByClauseBuilder().asc("loginDate").build()).
build());
assertEquals(1, issueSYNCOPE1416.getSize());
assertEquals("rossini", issueSYNCOPE1416.getResult().get(0).getUsername());
// search by attribute with unique constraint
issueSYNCOPE1416 = userService.search(new AnyQuery.Builder().
realm(SyncopeConstants.ROOT_REALM).
fiql(SyncopeClient.getUserSearchConditionBuilder().isNotNull("fullname").query()).
orderBy(SyncopeClient.getOrderByClauseBuilder().asc("loginDate").build()).
build());
// some identities could have been imported by pull tasks executions
assertTrue(issueSYNCOPE1416.getSize() >= 5);
issueSYNCOPE1416 = userService.search(new AnyQuery.Builder().
realm(SyncopeConstants.ROOT_REALM).
fiql(SyncopeClient.getUserSearchConditionBuilder().isNull("fullname").query()).
orderBy(SyncopeClient.getOrderByClauseBuilder().asc("loginDate").build()).
build());
assertEquals(0, issueSYNCOPE1416.getSize());
}
@Test
public void issueSYNCOPE1417() {
try {
userService.search(new AnyQuery.Builder().realm(SyncopeConstants.ROOT_REALM).
fiql(SyncopeClient.getUserSearchConditionBuilder().is("userId").equalTo("*@apache.org").query()).
orderBy(SyncopeClient.getOrderByClauseBuilder().asc("surname").desc("firstname").build()).build());
if (!ElasticsearchDetector.isElasticSearchEnabled(adminClient.platform())) {
fail();
}
} catch (SyncopeClientException e) {
assertEquals(ClientExceptionType.InvalidSearchExpression, e.getType());
}
}
@Test
public void issueSYNCOPE1419() {
UserTO rossini = userService.read("rossini");
assertNotNull(rossini);
UserUR req = new UserUR();
req.setKey(rossini.getKey());
req.getPlainAttrs().add(new AttrPatch.Builder(
new Attr.Builder("loginDate").value("2009-05-26").build()).build());
rossini = updateUser(req).getEntity();
assertNotNull(rossini);
assertEquals("2009-05-26", rossini.getPlainAttr("loginDate").get().getValues().get(0));
PagedResult<UserTO> total = userService.search(
new AnyQuery.Builder().realm(SyncopeConstants.ROOT_REALM).page(1).size(1).build());
PagedResult<UserTO> matching = userService.search(
new AnyQuery.Builder().realm(SyncopeConstants.ROOT_REALM).
fiql(SyncopeClient.getUserSearchConditionBuilder().
is("loginDate").equalTo("2009-05-26").query()).page(1).size(1).build());
assertTrue(matching.getSize() > 0);
PagedResult<UserTO> unmatching = userService.search(
new AnyQuery.Builder().realm(SyncopeConstants.ROOT_REALM).
fiql(SyncopeClient.getUserSearchConditionBuilder().
is("loginDate").notEqualTo("2009-05-26").query()).page(1).size(1).build());
assertTrue(unmatching.getSize() > 0);
assertEquals(total.getTotalCount(), matching.getTotalCount() + unmatching.getTotalCount());
}
}