/**
* 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.wiki.search.test;
import com.liferay.arquillian.extension.junit.bridge.junit.Arquillian;
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.search.SearchContext;
import com.liferay.portal.kernel.search.SearchEngine;
import com.liferay.portal.kernel.search.SearchEngineHelperUtil;
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.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.wiki.asset.WikiPageAssetRenderer;
import com.liferay.wiki.model.WikiPage;
import com.liferay.wiki.service.WikiNodeLocalServiceUtil;
import com.liferay.wiki.service.WikiPageLocalServiceUtil;
import com.liferay.wiki.service.WikiPageServiceUtil;
import com.liferay.wiki.util.test.WikiTestUtil;
import java.util.List;
import org.junit.Assert;
import org.junit.Assume;
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 Eudaldo Alonso
*/
@RunWith(Arquillian.class)
@Sync
public class WikiPageSearchTest 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();
}
@Ignore
@Override
@Test
public void testLocalizedSearch() throws Exception {
}
@Ignore
@Override
@Test
public void testSearchByDDMStructureField() throws Exception {
}
@Ignore
@Override
@Test
public void testSearchByKeywordsInsideParentBaseModel() throws Exception {
}
@Ignore
@Override
@Test
public void testSearchMyEntries() throws Exception {
}
@Ignore
@Override
@Test
public void testSearchRecentEntries() throws Exception {
}
@Ignore
@Override
@Test
public void testSearchStatus() throws Exception {
}
@Ignore
@Override
@Test
public void testSearchWithinDDMStructure() throws Exception {
}
@Test
public void testSpecificFields() throws Exception {
TestSpecificFieldsHelper testSpecificFieldsHelper =
new TestSpecificFieldsHelper();
testSpecificFieldsHelper.testSearchSpecificFields();
}
@Override
protected void addAttachment(ClassedModel classedModel) throws Exception {
WikiPage page = (WikiPage)classedModel;
WikiTestUtil.addWikiAttachment(
TestPropsValues.getUserId(), page.getNodeId(), page.getTitle(),
WikiPageSearchTest.class);
}
@Override
protected BaseModel<?> addBaseModelWithWorkflow(
BaseModel<?> parentBaseModel, boolean approved, String keywords,
ServiceContext serviceContext)
throws Exception {
return WikiTestUtil.addPage(
TestPropsValues.getUserId(),
(Long)parentBaseModel.getPrimaryKeyObj(),
RandomTestUtil.randomString(), keywords, approved, serviceContext);
}
@Override
protected void deleteBaseModel(long primaryKey) throws Exception {
WikiPageLocalServiceUtil.deleteWikiPage(primaryKey);
}
@Override
protected void expireBaseModelVersions(
BaseModel<?> baseModel, boolean expireAllVersions,
ServiceContext serviceContext)
throws Exception {
WikiPage page = (WikiPage)baseModel;
if (expireAllVersions) {
WikiPageServiceUtil.deletePage(page.getNodeId(), page.getTitle());
}
else {
List<WikiPage> pages = WikiPageServiceUtil.getPages(
page.getGroupId(), page.getNodeId(), false,
WorkflowConstants.STATUS_ANY, QueryUtil.ALL_POS,
QueryUtil.ALL_POS, null);
WikiPage previousPage = pages.get(0);
WikiPageServiceUtil.revertPage(
page.getNodeId(), page.getTitle(), previousPage.getVersion(),
serviceContext);
}
}
@Override
protected Class<?> getBaseModelClass() {
return WikiPage.class;
}
@Override
protected Long getBaseModelClassPK(ClassedModel classedModel) {
return WikiPageAssetRenderer.getClassPK((WikiPage)classedModel);
}
@Override
protected BaseModel<?> getParentBaseModel(
Group group, ServiceContext serviceContext)
throws Exception {
serviceContext = (ServiceContext)serviceContext.clone();
serviceContext.setWorkflowAction(WorkflowConstants.STATUS_APPROVED);
return WikiNodeLocalServiceUtil.addNode(
TestPropsValues.getUserId(), getSearchKeywords(),
getSearchKeywords(), serviceContext);
}
@Override
protected String getSearchKeywords() {
return "Title";
}
@Override
protected boolean isExpirableAllVersions() {
return true;
}
@Override
protected void moveBaseModelToTrash(long primaryKey) throws Exception {
WikiPage page = WikiPageLocalServiceUtil.getPageByPageId(primaryKey);
WikiPageLocalServiceUtil.movePageToTrash(
TestPropsValues.getUserId(), page.getNodeId(), page.getTitle());
}
@Override
protected BaseModel<?> updateBaseModel(
BaseModel<?> baseModel, String keywords,
ServiceContext serviceContext)
throws Exception {
WikiPage page = (WikiPage)baseModel;
return WikiTestUtil.updatePage(
page, TestPropsValues.getUserId(), keywords, serviceContext);
}
protected class TestSpecificFieldsHelper {
/**
* See https://dev.liferay.com/discover/portal/-/knowledge_base/6-2/searching-for-content-in-liferay
*/
public void testSearchSpecificFields() throws Exception {
Assume.assumeTrue(
isSearchSpecificFieldsImplementedForSearchEngine());
addPageWithTitle(RandomTestUtil.randomString());
addPageWithTitle("foo");
addPageWithTitle("bar");
addPageWithTitle("foo bar");
addPageWithTitle("fooxyz");
assertSearch("foo", 2);
assertSearch("title:foo", 2);
assertSearch("title:foo -title:bar", 1);
}
protected TestSpecificFieldsHelper() throws Exception {
_serviceContext = ServiceContextTestUtil.getServiceContext(
group.getGroupId());
_parentBaseModel = getParentBaseModel(group, _serviceContext);
}
protected void addPageWithTitle(String title) throws Exception {
WikiTestUtil.addPage(
TestPropsValues.getUserId(),
(Long)_parentBaseModel.getPrimaryKeyObj(), title,
RandomTestUtil.randomString(), true, _serviceContext);
}
protected void assertSearch(String keywords, int count)
throws Exception {
SearchContext searchContext =
SearchContextTestUtil.getSearchContext(group.getGroupId());
searchContext.setKeywords(keywords);
Assert.assertEquals(
count,
searchBaseModelsCount(
getBaseModelClass(), group.getGroupId(), searchContext));
}
protected boolean isSearchSpecificFieldsImplementedForSearchEngine() {
SearchEngine searchEngine = SearchEngineHelperUtil.getSearchEngine(
SearchEngineHelperUtil.getDefaultSearchEngineId());
String vendor = searchEngine.getVendor();
if (vendor.equals("Lucene")) {
return true;
}
return false;
}
private final BaseModel<?> _parentBaseModel;
private final ServiceContext _serviceContext;
}
}