com.liferay.journal.search.test.JournalArticleSearchTest.java Source code

Java tutorial

Introduction

Here is the source code for com.liferay.journal.search.test.JournalArticleSearchTest.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.journal.search.test;

import com.liferay.arquillian.extension.junit.bridge.junit.Arquillian;
import com.liferay.dynamic.data.mapping.model.DDMForm;
import com.liferay.dynamic.data.mapping.model.DDMFormLayout;
import com.liferay.dynamic.data.mapping.model.DDMStructure;
import com.liferay.dynamic.data.mapping.model.DDMTemplate;
import com.liferay.dynamic.data.mapping.service.DDMStructureLocalServiceUtil;
import com.liferay.dynamic.data.mapping.test.util.DDMStructureTestUtil;
import com.liferay.dynamic.data.mapping.test.util.DDMTemplateTestUtil;
import com.liferay.dynamic.data.mapping.test.util.search.TestOrderHelper;
import com.liferay.dynamic.data.mapping.util.DDMIndexer;
import com.liferay.dynamic.data.mapping.util.DDMUtil;
import com.liferay.journal.configuration.JournalServiceConfiguration;
import com.liferay.journal.model.JournalArticle;
import com.liferay.journal.model.JournalArticleConstants;
import com.liferay.journal.model.JournalFolder;
import com.liferay.journal.model.JournalFolderConstants;
import com.liferay.journal.service.JournalArticleLocalServiceUtil;
import com.liferay.journal.service.JournalArticleServiceUtil;
import com.liferay.journal.service.JournalFolderServiceUtil;
import com.liferay.journal.test.util.JournalTestUtil;
import com.liferay.portal.kernel.dao.orm.QueryUtil;
import com.liferay.portal.kernel.model.BaseModel;
import com.liferay.portal.kernel.model.ClassedModel;
import com.liferay.portal.kernel.model.Group;
import com.liferay.portal.kernel.module.configuration.ConfigurationProviderUtil;
import com.liferay.portal.kernel.portlet.PortalPreferences;
import com.liferay.portal.kernel.portlet.PortletPreferencesFactoryUtil;
import com.liferay.portal.kernel.search.BooleanQuery;
import com.liferay.portal.kernel.search.Hits;
import com.liferay.portal.kernel.search.IndexSearcherHelperUtil;
import com.liferay.portal.kernel.search.SearchContext;
import com.liferay.portal.kernel.search.generic.BooleanQueryImpl;
import com.liferay.portal.kernel.security.auth.CompanyThreadLocal;
import com.liferay.portal.kernel.service.PortalPreferencesLocalServiceUtil;
import com.liferay.portal.kernel.service.ServiceContext;
import com.liferay.portal.kernel.test.rule.AggregateTestRule;
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.SearchContextTestUtil;
import com.liferay.portal.kernel.test.util.ServiceContextTestUtil;
import com.liferay.portal.kernel.test.util.TestPropsValues;
import com.liferay.portal.kernel.util.LocaleUtil;
import com.liferay.portal.kernel.util.PortalUtil;
import com.liferay.portal.kernel.util.PortletKeys;
import com.liferay.portal.kernel.workflow.WorkflowConstants;
import com.liferay.portal.search.test.BaseSearchTestCase;
import com.liferay.portal.service.test.ServiceTestUtil;
import com.liferay.portal.test.rule.LiferayIntegrationTestRule;
import com.liferay.registry.Registry;
import com.liferay.registry.RegistryUtil;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;

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

/**
 * @author Juan Fernndez
 * @author Tibor Lipusz
 */
@RunWith(Arquillian.class)
@Sync
public class JournalArticleSearchTest extends BaseSearchTestCase {

    @ClassRule
    @Rule
    public static final AggregateTestRule aggregateTestRule = new AggregateTestRule(
            new LiferayIntegrationTestRule(), SynchronousDestinationTestRule.INSTANCE);

    @Before
    @Override
    public void setUp() throws Exception {
        ServiceTestUtil.setUser(TestPropsValues.getUser());

        super.setUp();

        CompanyThreadLocal.setCompanyId(TestPropsValues.getCompanyId());

        ServiceContext serviceContext = ServiceContextTestUtil.getServiceContext();

        serviceContext.setCompanyId(TestPropsValues.getCompanyId());

        PortalPreferences portalPreferenceces = PortletPreferencesFactoryUtil
                .getPortalPreferences(TestPropsValues.getUserId(), true);

        _originalPortalPreferencesXML = PortletPreferencesFactoryUtil.toXML(portalPreferenceces);

        portalPreferenceces.setValue("", "articleCommentsEnabled", "true");

        PortalPreferencesLocalServiceUtil.updatePreferences(TestPropsValues.getCompanyId(),
                PortletKeys.PREFS_OWNER_TYPE_COMPANY, PortletPreferencesFactoryUtil.toXML(portalPreferenceces));

        _journalServiceConfiguration = ConfigurationProviderUtil
                .getCompanyConfiguration(JournalServiceConfiguration.class, TestPropsValues.getCompanyId());

        setUpDDMIndexer();
    }

    @After
    public void tearDown() throws Exception {
        PortalPreferencesLocalServiceUtil.updatePreferences(TestPropsValues.getCompanyId(),
                PortletKeys.PREFS_OWNER_TYPE_COMPANY, _originalPortalPreferencesXML);
    }

    @Test
    public void testArticleIdCaseInsensitive() throws Exception {
        ServiceContext serviceContext = ServiceContextTestUtil.getServiceContext(group.getGroupId());

        Map<Locale, String> keywordsMap = new HashMap<>();

        String keywords = "keywords";

        keywordsMap.put(LocaleUtil.getDefault(), keywords);
        keywordsMap.put(LocaleUtil.GERMANY, keywords);
        keywordsMap.put(LocaleUtil.SPAIN, keywords);

        String articleId = "Article.Id";

        JournalArticle article = JournalTestUtil.addArticle(group.getGroupId(),
                JournalFolderConstants.DEFAULT_PARENT_FOLDER_ID, JournalArticleConstants.CLASSNAME_ID_DEFAULT,
                articleId, false, keywordsMap, keywordsMap, keywordsMap, null, LocaleUtil.getDefault(), null, true,
                true, serviceContext);

        updateBaseModel(article, keywords, serviceContext);

        SearchContext searchContext = SearchContextTestUtil.getSearchContext(group.getGroupId());

        int initialBaseModelsSearchCount = 1;

        assertBaseModelsCount(initialBaseModelsSearchCount, "ARTICLE.ID", searchContext);
        assertBaseModelsCount(initialBaseModelsSearchCount, "article.id", searchContext);
        assertBaseModelsCount(initialBaseModelsSearchCount, "ArtiCle.Id", searchContext);
    }

    @Test
    public void testMatchNotOnlyCompanyIdButAlsoQueryTerms() throws Exception {
        SearchContext searchContext = new SearchContext();

        searchContext.setCompanyId(TestPropsValues.getCompanyId());

        BooleanQuery query = new BooleanQueryImpl();

        query.addTerm("title", RandomTestUtil.randomString());

        assertEquals(0, query, searchContext);
    }

    @Test
    public void testOrderByDDMBooleanField() throws Exception {
        TestOrderHelper testOrderHelper = new JournalArticleSearchTestOrderHelper(_ddmIndexer, group);

        testOrderHelper.testOrderByDDMBooleanField();
    }

    @Test
    public void testOrderByDDMBooleanFieldRepeatable() throws Exception {
        TestOrderHelper testOrderHelper = new JournalArticleSearchTestOrderHelper(_ddmIndexer, group);

        testOrderHelper.testOrderByDDMBooleanFieldRepeatable();
    }

    @Test
    public void testOrderByDDMDateField() throws Exception {
        TestOrderHelper testOrderHelper = new JournalArticleSearchTestOrderHelper(_ddmIndexer, group);

        testOrderHelper.testOrderByDDMDateField();
    }

    @Test
    public void testOrderByDDMIntegerField() throws Exception {
        TestOrderHelper testOrderHelper = new JournalArticleSearchTestOrderHelper(_ddmIndexer, group);

        testOrderHelper.testOrderByDDMIntegerField();
    }

    @Test
    public void testOrderByDDMIntegerFieldRepeatable() throws Exception {
        TestOrderHelper testOrderHelper = new JournalArticleSearchTestOrderHelper(_ddmIndexer, group);

        testOrderHelper.testOrderByDDMIntegerFieldRepeatable();
    }

    @Test
    public void testOrderByDDMNumberField() throws Exception {
        TestOrderHelper testOrderHelper = new JournalArticleSearchTestOrderHelper(_ddmIndexer, group);

        testOrderHelper.testOrderByDDMNumberField();
    }

    @Test
    public void testOrderByDDMNumberFieldRepeatable() throws Exception {
        TestOrderHelper testOrderHelper = new JournalArticleSearchTestOrderHelper(_ddmIndexer, group);

        testOrderHelper.testOrderByDDMNumberFieldRepeatable();
    }

    @Test
    public void testOrderByDDMRadioField() throws Exception {
        TestOrderHelper testOrderHelper = new JournalArticleSearchTestOrderHelper(_ddmIndexer, group);

        testOrderHelper.testOrderByDDMRadioField();
    }

    @Test
    public void testOrderByDDMRadioFieldKeyword() throws Exception {
        TestOrderHelper testOrderHelper = new JournalArticleSearchTestOrderHelper(_ddmIndexer, group);

        testOrderHelper.testOrderByDDMRadioFieldKeyword();
    }

    @Test
    public void testOrderByDDMTextField() throws Exception {
        TestOrderHelper testOrderHelper = new JournalArticleSearchTestOrderHelper(_ddmIndexer, group);

        testOrderHelper.testOrderByDDMTextField();
    }

    @Test
    public void testOrderByDDMTextFieldKeyword() throws Exception {
        TestOrderHelper testOrderHelper = new JournalArticleSearchTestOrderHelper(_ddmIndexer, group);

        testOrderHelper.testOrderByDDMTextFieldKeyword();
    }

    @Test
    public void testOrderByDDMTextFieldRepeatable() throws Exception {
        TestOrderHelper testOrderHelper = new JournalArticleSearchTestOrderHelper(_ddmIndexer, group);

        testOrderHelper.testOrderByDDMTextFieldRepeatable();
    }

    @Ignore
    @Override
    @Test
    public void testSearchAttachments() throws Exception {
    }

    protected BaseModel<?> addArticleWithXmlContent(BaseModel<?> parentBaseModel, String content,
            DDMStructure ddmStructure, DDMTemplate ddmTemplate, ServiceContext serviceContext) throws Exception {

        _ddmStructure = ddmStructure;

        JournalFolder folder = (JournalFolder) parentBaseModel;

        return JournalTestUtil.addArticleWithXMLContent(folder.getFolderId(), content,
                ddmStructure.getStructureKey(), ddmTemplate.getTemplateKey(), serviceContext);
    }

    @Override
    protected BaseModel<?> addBaseModelWithDDMStructure(BaseModel<?> parentBaseModel, String keywords,
            ServiceContext serviceContext) throws Exception {

        String content = DDMStructureTestUtil.getSampleStructuredContent(keywords);

        DDMForm ddmForm = DDMStructureTestUtil.getSampleDDMForm("name");

        DDMStructure ddmStructure = DDMStructureTestUtil.addStructure(serviceContext.getScopeGroupId(),
                JournalArticle.class.getName(), ddmForm);

        DDMTemplate ddmTemplate = DDMTemplateTestUtil.addTemplate(serviceContext.getScopeGroupId(),
                ddmStructure.getStructureId(), PortalUtil.getClassNameId(JournalArticle.class));

        return addArticleWithXmlContent(parentBaseModel, content, ddmStructure, ddmTemplate, serviceContext);
    }

    @Override
    protected BaseModel<?> addBaseModelWithWorkflow(BaseModel<?> parentBaseModel, boolean approved,
            Map<Locale, String> keywordsMap, ServiceContext serviceContext) throws Exception {

        return JournalTestUtil.addArticleWithWorkflow(group.getGroupId(), keywordsMap, null, keywordsMap, approved);
    }

    @Override
    protected BaseModel<?> addBaseModelWithWorkflow(BaseModel<?> parentBaseModel, boolean approved, String keywords,
            ServiceContext serviceContext) throws Exception {

        JournalFolder folder = (JournalFolder) parentBaseModel;

        long folderId = JournalFolderConstants.DEFAULT_PARENT_FOLDER_ID;

        if (folder != null) {
            folderId = folder.getFolderId();
        }

        return JournalTestUtil.addArticleWithWorkflow(group.getGroupId(), folderId, keywords,
                RandomTestUtil.randomString(50), approved, serviceContext);
    }

    protected void assertEquals(long length, BooleanQuery query, SearchContext searchContext) throws Exception {

        Hits hits = IndexSearcherHelperUtil.search(searchContext, query);

        Assert.assertEquals(hits.toString(), length, hits.getLength());
    }

    @Override
    protected void deleteBaseModel(BaseModel<?> baseModel) throws Exception {
        JournalArticleLocalServiceUtil.deleteArticle((JournalArticle) baseModel);
    }

    @Override
    protected void expireBaseModelVersions(BaseModel<?> baseModel, boolean expireAllVersions,
            ServiceContext serviceContext) throws Exception {

        JournalArticle article = (JournalArticle) baseModel;

        if (expireAllVersions) {
            JournalArticleLocalServiceUtil.expireArticle(article.getUserId(), article.getGroupId(),
                    article.getArticleId(), article.getUrlTitle(), serviceContext);
        } else {
            JournalArticleLocalServiceUtil.expireArticle(article.getUserId(), article.getGroupId(),
                    article.getArticleId(), article.getVersion(), article.getUrlTitle(), serviceContext);
        }
    }

    @Override
    protected Class<?> getBaseModelClass() {
        return JournalArticle.class;
    }

    @Override
    protected Long getBaseModelClassPK(ClassedModel classedModel) {
        JournalArticle article = (JournalArticle) classedModel;

        if ((article.isDraft() || article.isPending())
                && (article.getVersion() != JournalArticleConstants.VERSION_DEFAULT)) {

            return article.getPrimaryKey();
        }

        return article.getResourcePrimKey();
    }

    @Override
    protected String getDDMStructureFieldName() {
        return _ddmIndexer.encodeName(_ddmStructure.getStructureId(), "name", LocaleUtil.getSiteDefault());
    }

    @Override
    protected BaseModel<?> getParentBaseModel(BaseModel<?> parentBaseModel, ServiceContext serviceContext)
            throws Exception {

        return JournalTestUtil.addFolder((Long) parentBaseModel.getPrimaryKeyObj(), RandomTestUtil.randomString(),
                serviceContext);
    }

    @Override
    protected BaseModel<?> getParentBaseModel(Group group, ServiceContext serviceContext) throws Exception {

        return JournalTestUtil.addFolder(JournalFolderConstants.DEFAULT_PARENT_FOLDER_ID,
                RandomTestUtil.randomString(), serviceContext);
    }

    @Override
    protected String getParentBaseModelClassName() {
        return JournalFolder.class.getName();
    }

    @Override
    protected String getSearchKeywords() {
        return "Title";
    }

    @Override
    protected boolean isCheckBaseModelPermission() {
        return _journalServiceConfiguration.articleViewPermissionsCheckEnabled();
    }

    @Override
    protected boolean isExpirableAllVersions() {
        return _journalServiceConfiguration.expireAllArticleVersionsEnabled();
    }

    @Override
    protected void moveBaseModelToTrash(long primaryKey) throws Exception {
        JournalArticle article = JournalArticleLocalServiceUtil.getArticle(primaryKey);

        JournalArticleLocalServiceUtil.moveArticleToTrash(TestPropsValues.getUserId(), article);
    }

    @Override
    protected void moveParentBaseModelToTrash(long primaryKey) throws Exception {

        JournalFolderServiceUtil.moveFolderToTrash(primaryKey);
    }

    @Override
    protected Hits searchGroupEntries(long groupId, long creatorUserId) throws Exception {

        return JournalArticleServiceUtil.search(groupId, creatorUserId, WorkflowConstants.STATUS_APPROVED,
                QueryUtil.ALL_POS, QueryUtil.ALL_POS);
    }

    protected void setUpDDMIndexer() {
        Registry registry = RegistryUtil.getRegistry();

        _ddmIndexer = registry.getService(DDMIndexer.class);
    }

    @Override
    protected BaseModel<?> updateBaseModel(BaseModel<?> baseModel, String keywords, ServiceContext serviceContext)
            throws Exception {

        JournalArticle article = (JournalArticle) baseModel;

        return JournalTestUtil.updateArticle(article, keywords, article.getContent(), false, true, serviceContext);
    }

    @Override
    protected void updateDDMStructure(ServiceContext serviceContext) throws Exception {

        DDMForm ddmForm = DDMStructureTestUtil.getSampleDDMForm("title");

        DDMFormLayout ddmFormLayout = DDMUtil.getDefaultDDMFormLayout(ddmForm);

        DDMStructureLocalServiceUtil.updateStructure(_ddmStructure.getUserId(), _ddmStructure.getStructureId(),
                _ddmStructure.getParentStructureId(), _ddmStructure.getNameMap(), _ddmStructure.getDescriptionMap(),
                ddmForm, ddmFormLayout, serviceContext);
    }

    protected class JournalArticleSearchTestOrderHelper extends TestOrderHelper {

        protected JournalArticleSearchTestOrderHelper(DDMIndexer ddmIndexer, Group group) throws Exception {

            super(ddmIndexer, group);
        }

        @Override
        protected BaseModel<?> addSearchableAssetEntry(String fieldValue, BaseModel<?> parentBaseModel,
                DDMStructure ddmStructure, DDMTemplate ddmTemplate, ServiceContext serviceContext)
                throws Exception {

            String content = DDMStructureTestUtil.getSampleStructuredContent(fieldValue);

            return addArticleWithXmlContent(parentBaseModel, content, ddmStructure, ddmTemplate, serviceContext);
        }

        @Override
        protected BaseModel<?> addSearchableAssetEntryRepeatable(String[] fieldValues, BaseModel<?> parentBaseModel,
                DDMStructure ddmStructure, DDMTemplate ddmTemplate, ServiceContext serviceContext)
                throws Exception {

            ArrayList<Map<Locale, String>> contents = new ArrayList<>(fieldValues.length);

            for (String fieldValue : fieldValues) {
                Map<Locale, String> map = new HashMap<>();

                map.put(Locale.US, fieldValue);

                contents.add(map);
            }

            String content = DDMStructureTestUtil.getSampleStructuredContent("name", contents, "en_US");

            return addArticleWithXmlContent(parentBaseModel, content, ddmStructure, ddmTemplate, serviceContext);
        }

        @Override
        protected long getClassNameId() {
            return PortalUtil.getClassNameId(JournalArticle.class);
        }

        @Override
        protected String getSearchableAssetEntryClassName() {
            return getBaseModelClassName();
        }

        @Override
        protected BaseModel<?> getSearchableAssetEntryParentBaseModel(Group group, ServiceContext serviceContext)
                throws Exception {

            return getParentBaseModel(group, serviceContext);
        }

        @Override
        protected String getSearchableAssetEntryStructureClassName() {
            return getBaseModelClassName();
        }

    }

    private DDMIndexer _ddmIndexer;
    private DDMStructure _ddmStructure;
    private JournalServiceConfiguration _journalServiceConfiguration;
    private String _originalPortalPreferencesXML;

}