/**
* Copyright (c) 2000-present Liferay, Inc. All rights reserved.
*
* This library is free software; you can redistribute it and/or modify it under
* the terms of the GNU Lesser General Public License as published by the Free
* Software Foundation; either version 2.1 of the License, or (at your option)
* any later version.
*
* This library is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
* details.
*/
package com.liferay.users.admin.indexer.test;
import com.liferay.arquillian.extension.junit.bridge.junit.Arquillian;
import com.liferay.portal.kernel.model.User;
import com.liferay.portal.kernel.search.Document;
import com.liferay.portal.kernel.search.Field;
import com.liferay.portal.kernel.search.Hits;
import com.liferay.portal.kernel.search.Indexer;
import com.liferay.portal.kernel.search.IndexerRegistry;
import com.liferay.portal.kernel.search.SearchContext;
import com.liferay.portal.kernel.service.ServiceContext;
import com.liferay.portal.kernel.service.UserLocalService;
import com.liferay.portal.kernel.test.rule.AggregateTestRule;
import com.liferay.portal.kernel.test.rule.DeleteAfterTestRun;
import com.liferay.portal.kernel.test.rule.Sync;
import com.liferay.portal.kernel.test.rule.SynchronousDestinationTestRule;
import com.liferay.portal.kernel.test.util.RandomTestUtil;
import com.liferay.portal.kernel.test.util.ServiceContextTestUtil;
import com.liferay.portal.kernel.test.util.TestPropsValues;
import com.liferay.portal.kernel.util.GetterUtil;
import com.liferay.portal.kernel.util.LocaleUtil;
import com.liferay.portal.kernel.util.StringPool;
import com.liferay.portal.test.rule.LiferayIntegrationTestRule;
import com.liferay.registry.Registry;
import com.liferay.registry.RegistryUtil;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Collections;
import java.util.List;
import java.util.Locale;
import org.junit.Assert;
import org.junit.Before;
import org.junit.ClassRule;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TestName;
import org.junit.runner.RunWith;
/**
* @author André de Oliveira
*/
@RunWith(Arquillian.class)
@Sync
public class UserIndexerTest {
@ClassRule
@Rule
public static final AggregateTestRule aggregateTestRule =
new AggregateTestRule(
new LiferayIntegrationTestRule(),
SynchronousDestinationTestRule.INSTANCE);
@Before
public void setUp() throws Exception {
Registry registry = RegistryUtil.getRegistry();
_userLocalService = registry.getService(UserLocalService.class);
IndexerRegistry indexerRegistry = registry.getService(
IndexerRegistry.class);
_indexer = indexerRegistry.getIndexer(User.class);
_serviceContext = ServiceContextTestUtil.getServiceContext();
}
@Test
public void testEmailAddress() throws Exception {
User user = addUserEmailAddress("Em.Ail@liferay.com");
user = assertSearchOneUser("Em.Ail@liferay.com", user);
Assert.assertEquals("em.ail@liferay.com", user.getEmailAddress());
}
@Test
public void testEmailAddressField() throws Exception {
User user = addUserEmailAddress("Em.Ail@liferay.com");
user = assertSearchOneUser("emailAddress", "em.ail@liferay.com", user);
Assert.assertEquals("em.ail@liferay.com", user.getEmailAddress());
}
@Test
public void testEmailAddressPrefix() throws Exception {
User user = addUserEmailAddress("Em.Ail@liferay.com");
user = assertSearchOneUser("EM.AIL", user);
Assert.assertEquals("em.ail@liferay.com", user.getEmailAddress());
}
@Test
public void testEmailAddressSubstring() throws Exception {
User user = addUserEmailAddress("Em.Ail@liferay.com");
user = assertSearchOneUser("ail@life", user);
Assert.assertEquals("em.ail@liferay.com", user.getEmailAddress());
}
@Test
public void testEmptyQuery() throws Exception {
User user = addUser();
assertSearch(StringPool.BLANK, user);
}
@Test
public void testFirstNameExactPhrase() throws Exception {
String firstName = "Mary Jane";
String middleName = "Watson";
String lastName = "Parker";
User user = addUserNameFields(firstName, lastName, middleName);
user = assertSearchOneUser("firstName", "\"Mary Jane\"", user);
Assert.assertEquals(firstName, user.getFirstName());
}
@Test
public void testFirstNameMixedExactPhrase() throws Exception {
String firstName = "Mary Jane Watson";
String middleName = "Joanne";
String lastName = "Parker";
User user = addUserNameFields(firstName, lastName, middleName);
assertNoHits("firstName", "\"Mary Watson\"");
assertNoHits("firstName", "\"Mary Jane\" Missingword");
user = assertSearchOneUser("firstName", "Mary \"Jane Watson\"", user);
Assert.assertEquals(firstName, user.getFirstName());
}
@Test
public void testLikeCharacter() throws Exception {
User user = addUser();
assertSearch(StringPool.PERCENT, user);
assertNoHits(StringPool.PERCENT + RandomTestUtil.randomString());
}
@Test
public void testLuceneQueryParserUnfriendlyCharacters() throws Exception {
User user = addUser();
assertSearch(StringPool.AT, user);
assertNoHits(StringPool.AT + RandomTestUtil.randomString());
assertNoHits(StringPool.EXCLAMATION);
assertNoHits(StringPool.EXCLAMATION + RandomTestUtil.randomString());
}
@Test
public void testNameFieldsNotTokenized() throws Exception {
String firstName = "Liferay7";
String lastName = "dell'Apostrophe";
String middleName = "ALLOY_4";
testNameFields(firstName, lastName, middleName);
}
@Test
public void testNameFieldsNotTokenizedLowercase() throws Exception {
String firstName = "liferay7";
String lastName = "dell'apostrophe";
String middleName = "alloy_4";
testNameFields(firstName, lastName, middleName);
}
@Test
public void testNamesPrefix() throws Exception {
String firstName = "First";
String lastName = "Last";
String middleName = "Middle";
User user = addUserNameFields(firstName, lastName, middleName);
user = assertSearchOneUser("Fir", user);
Assert.assertEquals("First", user.getFirstName());
user = assertSearchOneUser("LasT", user);
Assert.assertEquals("Last", user.getLastName());
user = assertSearchOneUser("midd", user);
Assert.assertEquals("Middle", user.getMiddleName());
}
@Test
public void testNamesSubstring() throws Exception {
String firstName = "First";
String lastName = "Last";
String middleName = "Middle";
User user = addUserNameFields(firstName, lastName, middleName);
user = assertSearchOneUser("Fir", user);
Assert.assertEquals("First", user.getFirstName());
user = assertSearchOneUser("asT", user);
Assert.assertEquals("Last", user.getLastName());
user = assertSearchOneUser("idd", user);
Assert.assertEquals("Middle", user.getMiddleName());
}
@Test
public void testScreenName() throws Exception {
User user = addUserScreenName("Open4Life");
user = assertSearchOneUser("Open4Life", user);
Assert.assertEquals("open4life", user.getScreenName());
}
@Test
public void testScreenNameField() throws Exception {
User user = addUserScreenName("Open4Life");
user = assertSearchOneUser("screenName", "open4life", user);
Assert.assertEquals("open4life", user.getScreenName());
}
@Test
public void testScreenNameSubstring() throws Exception {
User user = addUserScreenName("Open4Life");
user = assertSearchOneUser("open lite", user);
Assert.assertEquals("open4life", user.getScreenName());
user = assertSearchOneUser("OPE", user);
Assert.assertEquals("open4life", user.getScreenName());
user = assertSearchOneUser("4lif", user);
Assert.assertEquals("open4life", user.getScreenName());
}
@Rule
public TestName testName = new TestName();
protected User addUser() throws Exception {
String emailAddress = RandomTestUtil.randomString() + "@liferay.com";
String firstName = RandomTestUtil.randomString();
String lastName = RandomTestUtil.randomString();
String middleName = RandomTestUtil.randomString();
String screenName = testName.getMethodName();
return addUser(
firstName, lastName, middleName, screenName, emailAddress);
}
protected User addUser(
String firstName, String lastName, String middleName,
String screenName, String emailAddress)
throws Exception {
long creatorUserId = TestPropsValues.getUserId();
long companyId = TestPropsValues.getCompanyId();
boolean autoPassword = true;
String password1 = null;
String password2 = null;
boolean autoScreenName = false;
long facebookId = 0;
String openId = null;
Locale locale = LocaleUtil.getDefault();
long prefixId = 0;
long suffixId = 0;
boolean male = false;
int birthdayMonth = Calendar.JANUARY;
int birthdayDay = 1;
int birthdayYear = 1970;
String jobTitle = null;
long[] groupIds = new long[] {TestPropsValues.getGroupId()};
long[] organizationIds = null;
long[] roleIds = null;
long[] userGroupIds = null;
boolean sendMail = false;
User user = _userLocalService.addUser(
creatorUserId, companyId, autoPassword, password1, password2,
autoScreenName, screenName, emailAddress, facebookId, openId,
locale, firstName, middleName, lastName, prefixId, suffixId, male,
birthdayMonth, birthdayDay, birthdayYear, jobTitle, groupIds,
organizationIds, roleIds, userGroupIds, sendMail, _serviceContext);
_users.add(user);
return user;
}
protected User addUserEmailAddress(String emailAddress) throws Exception {
String firstName = RandomTestUtil.randomString();
String lastName = RandomTestUtil.randomString();
String middleName = RandomTestUtil.randomString();
String screenName = testName.getMethodName();
return addUser(
firstName, lastName, middleName, screenName, emailAddress);
}
protected User addUserNameFields(
String firstName, String lastName, String middleName)
throws Exception {
String screenName = testName.getMethodName();
String emailAddress = RandomTestUtil.randomString() + "@liferay.com";
return addUser(
firstName, lastName, middleName, screenName, emailAddress);
}
protected User addUserScreenName(String screenName) throws Exception {
String firstName = RandomTestUtil.randomString();
String lastName = RandomTestUtil.randomString();
String middleName = RandomTestUtil.randomString();
String emailAddress = RandomTestUtil.randomString() + "@liferay.com";
return addUser(
firstName, lastName, middleName, screenName, emailAddress);
}
protected void assertLength(Hits hits, int length) {
Assert.assertEquals(hits.toString(), length, hits.getLength());
}
protected void assertNoHits(String keywords) throws Exception {
Hits hits = search(keywords);
assertLength(hits, 0);
}
protected void assertNoHits(String field, String value) throws Exception {
Hits hits = search(field, value);
assertLength(hits, 0);
}
protected List<User> assertSearch(Hits hits, User... expectedUsers)
throws Exception {
List<User> actualUsers = getUsers(hits);
List<String> actualScreenNames = getScreenNames(actualUsers);
List<String> expectedScreenNames = getScreenNames(
Arrays.asList(expectedUsers));
if (!actualScreenNames.containsAll(expectedScreenNames)) {
Assert.assertEquals(
toString(expectedScreenNames), toString(actualScreenNames));
}
return actualUsers;
}
protected List<User> assertSearch(String keywords, User... expectedUsers)
throws Exception {
Hits hits = search(keywords);
return assertSearch(hits, expectedUsers);
}
protected User assertSearchOneUser(String field, String value, User user)
throws Exception {
Hits hits = search(field, value);
List<User> actualUsers = assertSearch(hits, user);
return findByUserId(actualUsers, user.getUserId());
}
protected User assertSearchOneUser(String keywords, User user)
throws Exception {
List<User> actualUsers = assertSearch(keywords, user);
return findByUserId(actualUsers, user.getUserId());
}
protected User findByUserId(List<User> users, long userId) {
for (User user : users) {
if (user.getUserId() == userId) {
return user;
}
}
return null;
}
protected List<String> getScreenNames(List<User> users) {
List<String> screenNames = new ArrayList<>(users.size());
for (User user : users) {
screenNames.add(user.getScreenName());
}
return screenNames;
}
protected SearchContext getSearchContext() throws Exception {
SearchContext searchContext = new SearchContext();
searchContext.setCompanyId(TestPropsValues.getCompanyId());
searchContext.setGroupIds(new long[] {TestPropsValues.getGroupId()});
return searchContext;
}
protected User getUser(Document document) throws Exception {
long userId = GetterUtil.getLong(document.get(Field.USER_ID));
return _userLocalService.getUser(userId);
}
protected List<User> getUsers(Hits hits) throws Exception {
Document[] documents = hits.getDocs();
List<User> users = new ArrayList<>(documents.length);
for (Document document : documents) {
users.add(getUser(document));
}
return users;
}
protected Hits search(SearchContext searchContext) throws Exception {
return _indexer.search(searchContext);
}
protected Hits search(String keywords) throws Exception {
SearchContext searchContext = getSearchContext();
searchContext.setKeywords(keywords);
return search(searchContext);
}
protected Hits search(String field, String value) throws Exception {
SearchContext searchContext = getSearchContext();
searchContext.setAttribute(field, value);
return search(searchContext);
}
protected void testNameFields(
String firstName, String lastName, String middleName)
throws Exception {
User user = addUserNameFields(firstName, lastName, middleName);
user = assertSearchOneUser("firstName", firstName, user);
Assert.assertEquals(firstName, user.getFirstName());
user = assertSearchOneUser("lastName", lastName, user);
Assert.assertEquals(lastName, user.getLastName());
user = assertSearchOneUser("middleName", middleName, user);
Assert.assertEquals(middleName, user.getMiddleName());
}
protected String toString(List<String> strings) {
Collections.sort(strings);
return strings.toString();
}
private Indexer<User> _indexer;
private ServiceContext _serviceContext;
private UserLocalService _userLocalService;
@DeleteAfterTestRun
private final List<User> _users = new ArrayList<>();
}