/**
* 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.service.persistence.test;
import com.liferay.arquillian.extension.junit.bridge.junit.Arquillian;
import com.liferay.dynamic.data.mapping.model.DDMStructure;
import com.liferay.dynamic.data.mapping.model.DDMTemplate;
import com.liferay.dynamic.data.mapping.test.util.DDMStructureTestUtil;
import com.liferay.dynamic.data.mapping.test.util.DDMTemplateTestUtil;
import com.liferay.journal.model.JournalArticle;
import com.liferay.journal.model.JournalArticleConstants;
import com.liferay.journal.model.JournalFolder;
import com.liferay.journal.service.JournalArticleLocalServiceUtil;
import com.liferay.journal.service.persistence.JournalArticleFinder;
import com.liferay.journal.test.util.JournalTestUtil;
import com.liferay.journal.util.comparator.ArticleCreateDateComparator;
import com.liferay.journal.util.comparator.ArticleDisplayDateComparator;
import com.liferay.journal.util.comparator.ArticleIDComparator;
import com.liferay.journal.util.comparator.ArticleModifiedDateComparator;
import com.liferay.journal.util.comparator.ArticleReviewDateComparator;
import com.liferay.journal.util.comparator.ArticleVersionComparator;
import com.liferay.portal.kernel.dao.orm.QueryDefinition;
import com.liferay.portal.kernel.model.Group;
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.GroupTestUtil;
import com.liferay.portal.kernel.test.util.TestPropsValues;
import com.liferay.portal.kernel.transaction.Propagation;
import com.liferay.portal.kernel.transaction.Transactional;
import com.liferay.portal.kernel.util.OrderByComparator;
import com.liferay.portal.kernel.util.PortalUtil;
import com.liferay.portal.kernel.workflow.WorkflowConstants;
import com.liferay.portal.test.rule.LiferayIntegrationTestRule;
import com.liferay.portal.test.rule.TransactionalTestRule;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collections;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.List;
import org.junit.After;
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;
import org.osgi.framework.Bundle;
import org.osgi.framework.BundleContext;
import org.osgi.framework.FrameworkUtil;
import org.osgi.framework.ServiceReference;
/**
* @author Zsolt Berentey
* @author Laszlo Csontos
*/
@RunWith(Arquillian.class)
@Sync
public class JournalArticleFinderTest {
@ClassRule
@Rule
public static final AggregateTestRule aggregateTestRule =
new AggregateTestRule(
new LiferayIntegrationTestRule(),
SynchronousDestinationTestRule.INSTANCE,
new TransactionalTestRule(
Propagation.SUPPORTS, "com.liferay.journal.service"));
@Before
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void setUp() throws Exception {
_group = GroupTestUtil.addGroup();
_ddmStructure = DDMStructureTestUtil.addStructure(
_group.getGroupId(), JournalArticle.class.getName());
_folder = JournalTestUtil.addFolder(_group.getGroupId(), "Folder 1");
_basicWebContentDDMStructure = DDMStructureTestUtil.addStructure(
_group.getGroupId(), JournalArticle.class.getName());
_basicWebContentDDMTemplate = DDMTemplateTestUtil.addTemplate(
_group.getGroupId(), _basicWebContentDDMStructure.getStructureId(),
PortalUtil.getClassNameId(JournalArticle.class));
JournalArticle article = JournalTestUtil.addArticleWithXMLContent(
_group.getGroupId(), _folder.getFolderId(),
JournalArticleConstants.CLASSNAME_ID_DEFAULT,
"<title>Article 1</title>",
_basicWebContentDDMStructure.getStructureKey(),
_basicWebContentDDMTemplate.getTemplateKey());
_articles.add(article);
JournalFolder folder = JournalTestUtil.addFolder(
_group.getGroupId(), "Folder 2");
DDMTemplate ddmTemplate = DDMTemplateTestUtil.addTemplate(
_group.getGroupId(), _ddmStructure.getStructureId(),
PortalUtil.getClassNameId(JournalArticle.class));
article = JournalTestUtil.addArticleWithXMLContent(
_group.getGroupId(), folder.getFolderId(),
JournalArticleConstants.CLASSNAME_ID_DEFAULT,
"<title>Article 2</title>", _ddmStructure.getStructureKey(),
ddmTemplate.getTemplateKey());
_articles.add(article);
article = JournalTestUtil.addArticleWithXMLContent(
_group.getGroupId(), folder.getFolderId(),
JournalArticleConstants.CLASSNAME_ID_DEFAULT,
"<title>Article 3</title>",
_basicWebContentDDMStructure.getStructureKey(),
_basicWebContentDDMTemplate.getTemplateKey());
_articles.add(article);
article.setUserId(_USER_ID);
Calendar calendar = new GregorianCalendar();
calendar.add(Calendar.DATE, -1);
article.setExpirationDate(calendar.getTime());
article.setReviewDate(calendar.getTime());
JournalArticleLocalServiceUtil.updateJournalArticle(article);
JournalArticleLocalServiceUtil.moveArticleToTrash(
TestPropsValues.getUserId(), article);
article = JournalTestUtil.addArticleWithXMLContent(
_group.getGroupId(), folder.getFolderId(),
PortalUtil.getClassNameId(DDMStructure.class),
"<title>Article 4</title>", _ddmStructure.getStructureKey(),
ddmTemplate.getTemplateKey());
_articles.add(article);
_folderIds.clear();
_folderIds.add(_folder.getFolderId());
_folderIds.add(folder.getFolderId());
_article = _articles.get(0);
Bundle bundle = FrameworkUtil.getBundle(getClass());
_bundleContext = bundle.getBundleContext();
_serviceReference = _bundleContext.getServiceReference(
JournalArticleFinder.class);
_journalArticleFinder = _bundleContext.getService(_serviceReference);
}
@After
public void tearDown() {
_bundleContext.ungetService(_serviceReference);
}
@Test
public void testDraftArticles() throws Exception {
QueryDefinition<JournalArticle> queryDefinition = new QueryDefinition<>(
WorkflowConstants.STATUS_ANY);
testQueryByG_C(
_group.getGroupId(), Collections.<Long>emptyList(),
JournalArticleConstants.CLASSNAME_ID_DEFAULT, queryDefinition, 2);
queryDefinition.setOwnerUserId(TestPropsValues.getUserId());
JournalArticle article = JournalTestUtil.addArticleWithXMLContent(
_group.getGroupId(), _folder.getFolderId(),
JournalArticleConstants.CLASSNAME_ID_DEFAULT,
"<title>Article 1</title>",
_basicWebContentDDMStructure.getStructureKey(),
_basicWebContentDDMTemplate.getTemplateKey());
article.setUserId(_USER_ID);
article.setStatus(WorkflowConstants.STATUS_DRAFT);
JournalArticleLocalServiceUtil.updateJournalArticle(article);
_articles.add(article);
queryDefinition.setIncludeOwner(true);
queryDefinition.setOwnerUserId(_USER_ID);
queryDefinition.setStatus(WorkflowConstants.STATUS_APPROVED);
testQueryByG_C(
_group.getGroupId(), Collections.<Long>emptyList(),
JournalArticleConstants.CLASSNAME_ID_DEFAULT, queryDefinition, 3);
queryDefinition.setIncludeOwner(false);
testQueryByG_C(
_group.getGroupId(), Collections.<Long>emptyList(),
JournalArticleConstants.CLASSNAME_ID_DEFAULT, queryDefinition, 0);
}
@Test
public void testFindByExpirationDate() throws Exception {
// Status any
QueryDefinition<JournalArticle> queryDefinition =
new QueryDefinition<>();
queryDefinition.setStatus(WorkflowConstants.STATUS_ANY);
List<JournalArticle> articles =
_journalArticleFinder.findByExpirationDate(
JournalArticleConstants.CLASSNAME_ID_DEFAULT, new Date(),
queryDefinition);
Assert.assertEquals(articles.toString(), 1, articles.size());
JournalArticle article = articles.get(0);
Assert.assertEquals(_USER_ID, article.getUserId());
// Status in trash
queryDefinition.setStatus(WorkflowConstants.STATUS_IN_TRASH);
articles = _journalArticleFinder.findByExpirationDate(
JournalArticleConstants.CLASSNAME_ID_DEFAULT, new Date(),
queryDefinition);
Assert.assertEquals(articles.toString(), 1, articles.size());
article = articles.get(0);
Assert.assertEquals(_USER_ID, article.getUserId());
// Status not in trash
queryDefinition.setStatus(WorkflowConstants.STATUS_IN_TRASH, true);
articles = _journalArticleFinder.findByExpirationDate(
JournalArticleConstants.CLASSNAME_ID_DEFAULT, new Date(),
queryDefinition);
Assert.assertEquals(articles.toString(), 0, articles.size());
}
@Test
public void testFindByR_D() throws Exception {
JournalArticle article = _journalArticleFinder.findByR_D(
_article.getResourcePrimKey(), new Date());
Assert.assertNotNull(article);
Assert.assertEquals(_folder.getFolderId(), article.getFolderId());
}
@Test
public void testFindByReviewDate() throws Exception {
Calendar calendar = new GregorianCalendar();
calendar.add(Calendar.DATE, -2);
List<JournalArticle> articles = _journalArticleFinder.findByReviewDate(
JournalArticleConstants.CLASSNAME_ID_DEFAULT, new Date(),
calendar.getTime());
Assert.assertEquals(articles.toString(), 1, articles.size());
JournalArticle article = articles.get(0);
Assert.assertEquals(_USER_ID, article.getUserId());
}
@Test
public void testQueryByC_G_F_C_A_V_T_D_C_T_S_T_D_R() throws Exception {
// Status any
QueryDefinition<JournalArticle> queryDefinition =
new QueryDefinition<>();
queryDefinition.setStatus(WorkflowConstants.STATUS_ANY);
testQueryByC_G_F_C_A_V_T_D_C_T_S_T_D_R(
_group.getCompanyId(), _group.getGroupId(), _folderIds,
JournalArticleConstants.CLASSNAME_ID_DEFAULT, null, null, "Article",
null, null, null, (String)null, null, null, null, null, true,
queryDefinition, 3);
testQueryByC_G_F_C_A_V_T_D_C_T_S_T_D_R(
_group.getCompanyId(), _group.getGroupId(), _folderIds,
JournalArticleConstants.CLASSNAME_ID_DEFAULT, null, null, null,
null, null, null, _ddmStructure.getStructureKey(), null, null, null,
null, true, queryDefinition, 1);
// Status in trash
queryDefinition.setStatus(WorkflowConstants.STATUS_IN_TRASH);
testQueryByC_G_F_C_A_V_T_D_C_T_S_T_D_R(
_group.getCompanyId(), _group.getGroupId(), _folderIds,
JournalArticleConstants.CLASSNAME_ID_DEFAULT, null, null, "Article",
null, null, null, (String)null, null, null, null, null, true,
queryDefinition, 1);
// Status not in trash
queryDefinition.setStatus(WorkflowConstants.STATUS_IN_TRASH, true);
testQueryByC_G_F_C_A_V_T_D_C_T_S_T_D_R(
_group.getCompanyId(), _group.getGroupId(), _folderIds,
PortalUtil.getClassNameId(DDMStructure.class), null, null,
"Article", null, null, null, (String)null, null, null, null, null,
true, queryDefinition, 1);
}
@Test
public void testQueryByG_C_S() throws Exception {
// Status any
QueryDefinition<JournalArticle> queryDefinition =
new QueryDefinition<>();
queryDefinition.setStatus(WorkflowConstants.STATUS_ANY);
testQueryByG_C_S(
_group.getGroupId(), JournalArticleConstants.CLASSNAME_ID_DEFAULT,
_ddmStructure.getStructureKey(), queryDefinition, 1);
testQueryByG_C_S(
_group.getGroupId(), JournalArticleConstants.CLASSNAME_ID_DEFAULT,
_basicWebContentDDMStructure.getStructureKey(), queryDefinition, 2);
// Status in trash
queryDefinition.setStatus(WorkflowConstants.STATUS_IN_TRASH);
testQueryByG_C_S(
_group.getGroupId(), JournalArticleConstants.CLASSNAME_ID_DEFAULT,
_ddmStructure.getStructureKey(), queryDefinition, 0);
testQueryByG_C_S(
_group.getGroupId(), JournalArticleConstants.CLASSNAME_ID_DEFAULT,
_basicWebContentDDMStructure.getStructureKey(), queryDefinition, 1);
// Status not in trash
queryDefinition.setStatus(WorkflowConstants.STATUS_IN_TRASH, true);
testQueryByG_C_S(
_group.getGroupId(), JournalArticleConstants.CLASSNAME_ID_DEFAULT,
_ddmStructure.getStructureKey(), queryDefinition, 1);
testQueryByG_C_S(
_group.getGroupId(), JournalArticleConstants.CLASSNAME_ID_DEFAULT,
_basicWebContentDDMStructure.getStructureKey(), queryDefinition, 1);
}
@Test
public void testQueryByG_F() throws Exception {
// Status any
QueryDefinition<JournalArticle> queryDefinition =
new QueryDefinition<>();
queryDefinition.setStatus(WorkflowConstants.STATUS_ANY);
testQueryByG_F(_group.getGroupId(), _folderIds, queryDefinition, 4);
// Status in trash
queryDefinition.setStatus(WorkflowConstants.STATUS_IN_TRASH);
testQueryByG_F(_group.getGroupId(), _folderIds, queryDefinition, 1);
// Status not in trash
queryDefinition.setStatus(WorkflowConstants.STATUS_IN_TRASH, true);
testQueryByG_F(_group.getGroupId(), _folderIds, queryDefinition, 3);
// Comparators
testQueryByG_F(new ArticleCreateDateComparator(true));
testQueryByG_F(new ArticleCreateDateComparator(false));
testQueryByG_F(new ArticleDisplayDateComparator(true));
testQueryByG_F(new ArticleDisplayDateComparator(false));
testQueryByG_F(new ArticleIDComparator(true));
testQueryByG_F(new ArticleIDComparator(false));
testQueryByG_F(new ArticleModifiedDateComparator(true));
testQueryByG_F(new ArticleModifiedDateComparator(false));
testQueryByG_F(new ArticleReviewDateComparator(true));
testQueryByG_F(new ArticleReviewDateComparator(false));
testQueryByG_F(new ArticleVersionComparator(true));
testQueryByG_F(new ArticleVersionComparator(false));
}
@Test
public void testQueryByG_F_C() throws Exception {
// Status any (constructor), which is status not in trash
QueryDefinition<JournalArticle> queryDefinition = new QueryDefinition<>(
WorkflowConstants.STATUS_ANY);
queryDefinition.setOwnerUserId(TestPropsValues.getUserId());
testQueryByG_C(
_group.getGroupId(), Collections.<Long>emptyList(),
JournalArticleConstants.CLASSNAME_ID_DEFAULT, queryDefinition, 2);
// Status any
queryDefinition.setStatus(WorkflowConstants.STATUS_ANY);
queryDefinition.setOwnerUserId(_USER_ID);
testQueryByG_C(
_group.getGroupId(), Collections.<Long>emptyList(),
JournalArticleConstants.CLASSNAME_ID_DEFAULT, queryDefinition, 1);
// Status in trash
queryDefinition.setStatus(WorkflowConstants.STATUS_IN_TRASH);
queryDefinition.setOwnerUserId(_USER_ID);
testQueryByG_C(
_group.getGroupId(), Collections.<Long>emptyList(),
JournalArticleConstants.CLASSNAME_ID_DEFAULT, queryDefinition, 1);
// Status not in trash
queryDefinition.setStatus(WorkflowConstants.STATUS_IN_TRASH, true);
queryDefinition.setOwnerUserId(_USER_ID);
testQueryByG_C(
_group.getGroupId(), Collections.<Long>emptyList(),
JournalArticleConstants.CLASSNAME_ID_DEFAULT, queryDefinition, 0);
}
protected void prepareSortedArticles() throws Exception {
Calendar calendar = new GregorianCalendar();
calendar.set(Calendar.DATE, 1);
calendar.set(Calendar.MONTH, 1);
calendar.set(Calendar.YEAR, 2014);
for (int i = 0; i < _articles.size(); ++i) {
calendar.add(Calendar.DATE, 1);
JournalArticle article = _articles.get(i);
article.setCreateDate(calendar.getTime());
article.setModifiedDate(calendar.getTime());
article.setArticleId("a" + i);
article.setVersion(i);
article.setDisplayDate(calendar.getTime());
article.setReviewDate(calendar.getTime());
JournalArticleLocalServiceUtil.updateJournalArticle(article);
}
}
protected void testQueryByC_G_F_C_A_V_T_D_C_T_S_T_D_R(
long companyId, long groupId, List<Long> folderIds,
long classNameId, String articleId, Double version, String title,
String description, String content, String type,
String ddmStructureKey, String ddmTemplateKey, Date displayDateGT,
Date displayDateLT, Date reviewDate, boolean andOperator,
QueryDefinition<JournalArticle> queryDefinition, int expectedCount)
throws Exception {
int actualCount =
_journalArticleFinder.countByC_G_F_C_A_V_T_D_C_S_T_D_R(
companyId, groupId, folderIds, classNameId, articleId, version,
title, description, content, ddmStructureKey, ddmTemplateKey,
displayDateGT, displayDateLT, reviewDate, andOperator,
queryDefinition);
Assert.assertEquals(expectedCount, actualCount);
List<JournalArticle> articles =
_journalArticleFinder.findByC_G_F_C_A_V_T_D_C_S_T_D_R(
companyId, groupId, folderIds, classNameId, articleId, version,
title, description, content, ddmStructureKey, ddmTemplateKey,
displayDateGT, displayDateLT, reviewDate, andOperator,
queryDefinition);
actualCount = articles.size();
Assert.assertEquals(expectedCount, actualCount);
}
protected void testQueryByG_C(
long groupId, List<Long> folderIds, long classNameId,
QueryDefinition<JournalArticle> queryDefinition, int expectedCount)
throws Exception {
int actualCount = _journalArticleFinder.countByG_F_C(
groupId, folderIds, classNameId, queryDefinition);
List<JournalArticle> articles = _journalArticleFinder.findByG_F_C(
groupId, folderIds, classNameId, queryDefinition);
Assert.assertEquals(expectedCount, actualCount);
actualCount = articles.size();
Assert.assertEquals(expectedCount, actualCount);
}
protected void testQueryByG_C_S(
long groupId, long classNameId, String ddmStructureKey,
QueryDefinition<JournalArticle> queryDefinition, int expectedCount)
throws Exception {
int actualCount = _journalArticleFinder.countByG_C_S(
groupId, classNameId, ddmStructureKey, queryDefinition);
Assert.assertEquals(expectedCount, actualCount);
List<JournalArticle> articles = _journalArticleFinder.findByG_C_S(
groupId, classNameId, ddmStructureKey, queryDefinition);
actualCount = articles.size();
Assert.assertEquals(expectedCount, actualCount);
}
protected void testQueryByG_F(
long groupId, List<Long> folderIds,
QueryDefinition<JournalArticle> queryDefinition, int expectedCount)
throws Exception {
int actualCount = _journalArticleFinder.countByG_F(
groupId, folderIds, queryDefinition);
Assert.assertEquals(expectedCount, actualCount);
List<JournalArticle> articles = _journalArticleFinder.findByG_F(
groupId, folderIds, queryDefinition);
actualCount = articles.size();
Assert.assertEquals(expectedCount, actualCount);
}
protected void testQueryByG_F(
OrderByComparator<JournalArticle> orderByComparator)
throws Exception {
prepareSortedArticles();
QueryDefinition<JournalArticle> queryDefinition =
new QueryDefinition<>();
queryDefinition.setOrderByComparator(orderByComparator);
List<JournalArticle> expectedArticles = null;
if (orderByComparator.isAscending()) {
expectedArticles = _articles;
}
else {
expectedArticles = new ArrayList<>(_articles);
Collections.reverse(expectedArticles);
}
List<JournalArticle> actualArticles = _journalArticleFinder.findByG_F(
_group.getGroupId(), _folderIds, queryDefinition);
Assert.assertEquals(expectedArticles, actualArticles);
}
private static final long _USER_ID = 1234L;
private JournalArticle _article;
private final List<JournalArticle> _articles = new ArrayList<>();
private DDMStructure _basicWebContentDDMStructure;
private DDMTemplate _basicWebContentDDMTemplate;
private BundleContext _bundleContext;
private DDMStructure _ddmStructure;
private JournalFolder _folder;
private final List<Long> _folderIds = new ArrayList<>();
@DeleteAfterTestRun
private Group _group;
private JournalArticleFinder _journalArticleFinder;
private ServiceReference<JournalArticleFinder> _serviceReference;
}