com.liferay.users.admin.indexer.test.UserIndexerTest.java Source code

Java tutorial

Introduction

Here is the source code for com.liferay.users.admin.indexer.test.UserIndexerTest.java

Source

/**
 * 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.petra.string.StringPool;
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.QueryConfig;
import com.liferay.portal.kernel.search.SearchContext;
import com.liferay.portal.kernel.search.SearchException;
import com.liferay.portal.kernel.search.Summary;
import com.liferay.portal.kernel.search.highlight.HighlightUtil;
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.util.RandomTestUtil;
import com.liferay.portal.kernel.test.util.TestPropsValues;
import com.liferay.portal.kernel.test.util.UserTestUtil;
import com.liferay.portal.kernel.util.GetterUtil;
import com.liferay.portal.kernel.util.StringBundler;
import com.liferay.portal.kernel.util.StringUtil;
import com.liferay.portal.test.rule.Inject;
import com.liferay.portal.test.rule.LiferayIntegrationTestRule;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Optional;
import java.util.stream.Stream;

import org.junit.Assert;
import org.junit.Before;
import org.junit.ClassRule;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;

/**
 * @author Andr de Oliveira
 */
@RunWith(Arquillian.class)
public class UserIndexerTest {

    @ClassRule
    @Rule
    public static final AggregateTestRule aggregateTestRule = new LiferayIntegrationTestRule();

    @Before
    public void setUp() throws Exception {
        _indexer = _indexerRegistry.getIndexer(User.class);
    }

    @Test
    public void testEmailAddress() throws Exception {
        _expectedUser = UserTestUtil.addUser();

        String expectedEmailAddress = _expectedUser.getEmailAddress();

        User actualUser = assertSearchOneUser(StringUtil.toUpperCase(expectedEmailAddress), _expectedUser);

        Assert.assertEquals(expectedEmailAddress, actualUser.getEmailAddress());
    }

    @Test
    public void testEmailAddressField() throws Exception {
        _expectedUser = UserTestUtil.addUser();

        String expectedEmailAddress = _expectedUser.getEmailAddress();

        User actualUser = assertSearchOneUser("emailAddress", expectedEmailAddress, _expectedUser);

        Assert.assertEquals(expectedEmailAddress, actualUser.getEmailAddress());
    }

    @Test
    public void testEmailAddressPrefix() throws Exception {
        _expectedUser = UserTestUtil.addUser();

        String expectedEmailAddress = _expectedUser.getEmailAddress();

        User actualUser = assertSearchOneUser(StringUtil.removeSubstring(expectedEmailAddress, "@liferay.com"),
                _expectedUser);

        Assert.assertEquals(expectedEmailAddress, actualUser.getEmailAddress());
    }

    @Test
    public void testEmailAddressSubstring() throws Exception {
        _expectedUser = UserTestUtil.addUser();

        String expectedEmailAddress = _expectedUser.getEmailAddress();

        User actualUser = assertSearchOneUser(expectedEmailAddress.substring(4, expectedEmailAddress.length() - 7),
                _expectedUser);

        Assert.assertEquals(expectedEmailAddress, actualUser.getEmailAddress());
    }

    @Test
    public void testEmptyQuery() throws Exception {
        _expectedUser = UserTestUtil.addUser();

        assertSearch(StringPool.BLANK, _expectedUser);
    }

    @Test
    public void testFirstNameExactPhrase() throws Exception {
        String firstName = "Mary Jane";
        String middleName = "Watson";
        String lastName = "Parker";

        _expectedUser = UserTestUtil.addUser();

        _expectedUser.setFirstName(firstName);
        _expectedUser.setMiddleName(middleName);
        _expectedUser.setLastName(lastName);

        _expectedUser = _userLocalService.updateUser(_expectedUser);

        User actualUser = assertSearchOneUser("firstName", "\"Mary Jane\"", _expectedUser);

        Assert.assertEquals(firstName, actualUser.getFirstName());
    }

    @Test
    public void testFirstNameMixedExactPhrase() throws Exception {
        String firstName = "Mary Jane Watson";
        String middleName = "Joanne";
        String lastName = "Parker";

        _expectedUser = UserTestUtil.addUser();

        _expectedUser.setFirstName(firstName);
        _expectedUser.setMiddleName(middleName);
        _expectedUser.setLastName(lastName);

        _expectedUser = _userLocalService.updateUser(_expectedUser);

        assertNoHits("firstName", "\"Mary Watson\"");
        assertNoHits("firstName", "\"Mary Jane\" Missingword");

        User actualUser = assertSearchOneUser("firstName", "Mary \"Jane Watson\"", _expectedUser);

        Assert.assertEquals(firstName, actualUser.getFirstName());
    }

    @Test
    public void testLikeCharacter() throws Exception {
        _expectedUser = UserTestUtil.addUser();

        assertSearch(StringPool.PERCENT, _expectedUser);

        assertNoHits(StringPool.PERCENT + RandomTestUtil.randomString());
    }

    @Test
    public void testLuceneQueryParserUnfriendlyCharacters() throws Exception {
        _expectedUser = UserTestUtil.addUser();

        assertSearch(StringPool.AT, _expectedUser);

        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";

        _expectedUser = UserTestUtil.addUser();

        _expectedUser.setFirstName(firstName);
        _expectedUser.setMiddleName(middleName);
        _expectedUser.setLastName(lastName);

        _expectedUser = _userLocalService.updateUser(_expectedUser);

        User actualUser = assertSearchOneUser("Fir", _expectedUser);

        Assert.assertEquals("First", actualUser.getFirstName());

        actualUser = assertSearchOneUser("LasT", _expectedUser);

        Assert.assertEquals("Last", actualUser.getLastName());

        actualUser = assertSearchOneUser("midd", _expectedUser);

        Assert.assertEquals("Middle", actualUser.getMiddleName());
    }

    @Test
    public void testNamesSubstring() throws Exception {
        String firstName = "First";
        String lastName = "Last";
        String middleName = "Middle";

        _expectedUser = UserTestUtil.addUser();

        _expectedUser.setFirstName(firstName);
        _expectedUser.setMiddleName(middleName);
        _expectedUser.setLastName(lastName);

        _expectedUser = _userLocalService.updateUser(_expectedUser);

        User actualUser = assertSearchOneUser("Fir", _expectedUser);

        Assert.assertEquals("First", actualUser.getFirstName());

        actualUser = assertSearchOneUser("asT", _expectedUser);

        Assert.assertEquals("Last", actualUser.getLastName());

        actualUser = assertSearchOneUser("idd", _expectedUser);

        Assert.assertEquals("Middle", actualUser.getMiddleName());
    }

    @Test
    public void testScreenName() throws Exception {
        _expectedUser = UserTestUtil.addUser("Open4Life", new long[] { TestPropsValues.getGroupId() });

        User actualUser = assertSearchOneUser("Open4Life", _expectedUser);

        Assert.assertEquals("open4life", actualUser.getScreenName());
    }

    @Test
    public void testScreenNameField() throws Exception {
        _expectedUser = UserTestUtil.addUser("Open4Life", new long[] { TestPropsValues.getGroupId() });

        User actualUser = assertSearchOneUser("screenName", "open4life", _expectedUser);

        Assert.assertEquals("open4life", actualUser.getScreenName());
    }

    @Test
    public void testScreenNameSubstring() throws Exception {
        _expectedUser = UserTestUtil.addUser("Open4Life", new long[] { TestPropsValues.getGroupId() });

        User actualUser = assertSearchOneUser("open lite", _expectedUser);

        Assert.assertEquals("open4life", actualUser.getScreenName());

        actualUser = assertSearchOneUser("OPE", _expectedUser);

        Assert.assertEquals("open4life", actualUser.getScreenName());

        actualUser = assertSearchOneUser("4lif", _expectedUser);

        Assert.assertEquals("open4life", actualUser.getScreenName());
    }

    @Test
    public void testSummaryHighlight() throws Exception {
        _expectedUser = UserTestUtil.addUser();

        String firstName = "First";

        _expectedUser.setFirstName(firstName);

        String lastName = "Last";

        _expectedUser.setLastName(lastName);

        _expectedUser = _userLocalService.updateUser(_expectedUser);

        assertSummary(firstName, StringBundler.concat(HighlightUtil.HIGHLIGHT_TAG_OPEN, firstName,
                HighlightUtil.HIGHLIGHT_TAG_CLOSE, StringPool.SPACE, lastName));
        assertSummary(StringUtil.toLowerCase(firstName + " " + lastName),
                StringBundler.concat(HighlightUtil.HIGHLIGHT_TAG_OPEN, firstName, HighlightUtil.HIGHLIGHT_TAG_CLOSE,
                        StringPool.SPACE, HighlightUtil.HIGHLIGHT_TAG_OPEN, lastName,
                        HighlightUtil.HIGHLIGHT_TAG_CLOSE));
        assertSummary(lastName + " " + firstName,
                StringBundler.concat(HighlightUtil.HIGHLIGHT_TAG_OPEN, firstName, HighlightUtil.HIGHLIGHT_TAG_CLOSE,
                        StringPool.SPACE, HighlightUtil.HIGHLIGHT_TAG_OPEN, lastName,
                        HighlightUtil.HIGHLIGHT_TAG_CLOSE));
    }

    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 getUser(actualUsers, user.getUserId());
    }

    protected User assertSearchOneUser(String keywords, User user) throws Exception {

        List<User> actualUsers = assertSearch(keywords, user);

        return getUser(actualUsers, user.getUserId());
    }

    protected void assertSummary(String keywords, String title) throws Exception, SearchException {

        SearchContext searchContext = getSearchContext();

        QueryConfig queryConfig = searchContext.getQueryConfig();

        queryConfig.setHighlightEnabled(true);

        searchContext.setKeywords(keywords);

        Hits hits = search(searchContext);

        Document document = getDocument(hits.getDocs(), _expectedUser.getUserId());

        Summary summary = _indexer.getSummary(document, null, null, null);

        Assert.assertEquals(StringPool.BLANK, summary.getContent());
        Assert.assertEquals(title, summary.getTitle());
    }

    protected Document getDocument(Document[] documents, long userId) {
        String userIdString = String.valueOf(userId);

        Stream<Document> stream = Stream.of(documents);

        Optional<Document> optional = stream.filter(document -> userIdString.equals(document.get("userId")))
                .findAny();

        return optional.get();
    }

    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 User getUser(List<User> users, long userId) {
        for (User user : users) {
            if (user.getUserId() == userId) {
                return user;
            }
        }

        return null;
    }

    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 {

        _expectedUser = UserTestUtil.addUser();

        _expectedUser.setFirstName(firstName);
        _expectedUser.setMiddleName(middleName);
        _expectedUser.setLastName(lastName);

        _expectedUser = _userLocalService.updateUser(_expectedUser);

        User actualUser = assertSearchOneUser("firstName", firstName, _expectedUser);

        Assert.assertEquals(firstName, actualUser.getFirstName());

        actualUser = assertSearchOneUser("lastName", lastName, _expectedUser);

        Assert.assertEquals(lastName, actualUser.getLastName());

        actualUser = assertSearchOneUser("middleName", middleName, _expectedUser);

        Assert.assertEquals(middleName, actualUser.getMiddleName());
    }

    protected String toString(List<String> strings) {
        Collections.sort(strings);

        return strings.toString();
    }

    @Inject
    private static IndexerRegistry _indexerRegistry;

    @Inject
    private static UserLocalService _userLocalService;

    @DeleteAfterTestRun
    private User _expectedUser;

    private Indexer<User> _indexer;

}