/*************************************************************************** * Copyright (C) 2003-2009 eXo Platform SAS. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Affero General Public License * as published by the Free Software Foundation; either version 3 * of the License, or (at your option) any later version. * * This program 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, see<http://www.gnu.org/licenses/>. ***************************************************************************/ package org.exoplatform.forum.service; import java.util.ArrayList; import java.util.Arrays; import java.util.Calendar; import java.util.GregorianCalendar; import java.util.List; import junit.framework.TestCase; import org.exoplatform.commons.utils.ISO8601; /** * Created by The eXo Platform SAS * Author : Vu Duy Tu * tu.duy@exoplatform.com * Dec 28, 2009 - 7:00:29 AM */ public class TestForumEventQuery extends TestCase { @Override protected void setUp() throws Exception { super.setUp(); } public void testQuerySearchCategory() { List<String> categoryIds = new ArrayList<String>(); String selector = "/jcr:root/forumPath//element(*,exo:forumCategory)"; ForumEventQuery eventQuery = new ForumEventQuery(); String predicate = ""; eventQuery.setType(Utils.CATEGORY); eventQuery.setPath("/forumPath"); // not conditions assertEquals(selector + predicate, eventQuery.getPathQuery(categoryIds)); // set text search eventQuery.setKeyValue("text search"); // only category name eventQuery.setValueIn("title"); predicate = "[(jcr:contains(@exo:name, 'text search'))"; assertEquals(selector + predicate + "]", eventQuery.getPathQuery(categoryIds)); // all value of category eventQuery.setValueIn("all"); predicate = "[(jcr:contains(., 'text search'))"; assertEquals(selector + predicate + "]", eventQuery.getPathQuery(categoryIds)); eventQuery.setByUser("root"); predicate += " and (@exo:owner='root')"; assertEquals(selector + predicate + "]", eventQuery.getPathQuery(categoryIds)); eventQuery.setModerator("demo"); predicate += " and (@exo:moderators='demo')"; assertEquals(selector + predicate + "]", eventQuery.getPathQuery(categoryIds)); String tempPredicate = predicate; // case 1: only from date Calendar calendar = GregorianCalendar.getInstance(); eventQuery.setFromDateCreated(calendar); predicate += " and (@exo:createdDate >= xs:dateTime('" + ISO8601.format(calendar) + "'))"; assertEquals(selector + predicate + "]", eventQuery.getPathQuery(categoryIds)); // case 2: only to date predicate = tempPredicate; eventQuery.setFromDateCreated(null); eventQuery.setToDateCreated(calendar); predicate += " and (@exo:createdDate <= xs:dateTime('" + ISO8601.format(calendar) + "'))"; assertEquals(selector + predicate + "]", eventQuery.getPathQuery(categoryIds)); // case 3: from date to date predicate = tempPredicate; eventQuery.setFromDateCreated(calendar); predicate += " and ((@exo:createdDate >= xs:dateTime('" + ISO8601.format(calendar) + "')) and (@exo:createdDate <= xs:dateTime('" + ISO8601.format(calendar) + "'))) "; assertEquals(selector + predicate + "]", eventQuery.getPathQuery(categoryIds)); // set category Scoping categoryIds.addAll(Arrays.asList(new String[] { "CategoryId1", "CategoryId2", "CategoryId3" })); predicate += " and (fn:name() = 'CategoryId1' or fn:name() = 'CategoryId2' or fn:name() = 'CategoryId3')"; assertEquals(selector + predicate + "]", eventQuery.getPathQuery(categoryIds)); } public void testQuerySearchForum() { List<String> categoryIds = new ArrayList<String>(); String selector = "/jcr:root/forumPath//element(*,exo:forum)"; ForumEventQuery eventQuery = new ForumEventQuery(); String predicate = ""; eventQuery.setType(Utils.FORUM); eventQuery.setPath("/forumPath"); // not conditions assertEquals(selector + predicate, eventQuery.getPathQuery(categoryIds)); eventQuery.setKeyValue("text search"); // only forum name eventQuery.setValueIn("title"); predicate = "[(jcr:contains(@exo:name, 'text search'))"; assertEquals(selector + predicate + "]", eventQuery.getPathQuery(categoryIds)); // all value of forums eventQuery.setValueIn("all"); predicate = "[(jcr:contains(., 'text search'))"; assertEquals(selector + predicate + "]", eventQuery.getPathQuery(categoryIds)); // set User eventQuery.setByUser("root"); predicate += " and (@exo:owner='root')"; assertEquals(selector + predicate + "]", eventQuery.getPathQuery(categoryIds)); // Set Close String tempPredicate = predicate; // Case 1: With Administrator search eventQuery.setUserPermission(0); eventQuery.setIsClose("true"); // or false, if value is 'all', not new X-path predicate += " and (@exo:isClosed='true')"; assertEquals(selector + predicate + "]", eventQuery.getPathQuery(categoryIds)); // With normal user or anonim-user not use value isClose. // Case 2: With moderator - add moderator search eventQuery.setUserPermission(1); // sub case 1: close is false; eventQuery.setIsClose("false"); // same for case search Administrator with isClose = false. predicate = tempPredicate + " and (@exo:isClosed='false')"; assertEquals(selector + predicate + "]", eventQuery.getPathQuery(categoryIds)); // sub case 2: close is true eventQuery.setIsClose("true"); List<String> listOfUser = Arrays.asList(new String[] { "john", "/exo", "/exo:moderator" });// userName, group and membership of this user. eventQuery.setListOfUser(listOfUser); predicate = tempPredicate + " and (@exo:isClosed='true' and (@exo:moderators='john' or @exo:moderators='john' or @exo:moderators='/exo' or @exo:moderators='/exo:moderator'))"; assertEquals(selector + predicate + "]", eventQuery.getPathQuery(categoryIds)); // sub case 3: close is all eventQuery.setIsClose("all"); predicate = tempPredicate + " and (@exo:isClosed='false' or @exo:moderators='john' or @exo:moderators='/exo' or @exo:moderators='/exo:moderator')"; assertEquals(selector + predicate + "]", eventQuery.getPathQuery(categoryIds)); // set Lock, if isLock = 'all', not build new x-path eventQuery.setIsLock("all"); assertEquals(selector + predicate + "]", eventQuery.getPathQuery(categoryIds)); // isLock != 'all' eventQuery.setIsLock("false"); predicate += " and (@exo:isLock='false')"; assertEquals(selector + predicate + "]", eventQuery.getPathQuery(categoryIds)); // set moderator eventQuery.setModerator("demo"); predicate += " and (@exo:moderators='demo')"; assertEquals(selector + predicate + "]", eventQuery.getPathQuery(categoryIds)); // set topic count eventQuery.setTopicCountMin("50"); predicate += " and (@exo:topicCount>=50)"; assertEquals(selector + predicate + "]", eventQuery.getPathQuery(categoryIds)); // set post count eventQuery.setPostCountMin("100"); predicate += " and (@exo:postCount>=100)"; assertEquals(selector + predicate + "]", eventQuery.getPathQuery(categoryIds)); // set from date tempPredicate = predicate; Calendar calendar = GregorianCalendar.getInstance(); eventQuery.setFromDateCreated(calendar); predicate += " and (@exo:createdDate >= xs:dateTime('" + ISO8601.format(calendar) + "'))"; assertEquals(selector + predicate + "]", eventQuery.getPathQuery(categoryIds)); // set to date but not from date eventQuery.setFromDateCreated(null); eventQuery.setToDateCreated(calendar); // set from date to date eventQuery.setFromDateCreated(calendar); predicate = tempPredicate + " and ((@exo:createdDate >= xs:dateTime('" + ISO8601.format(calendar) + "')) " + "and (@exo:createdDate <= xs:dateTime('" + ISO8601.format(calendar) + "'))) "; assertEquals(selector + predicate + "]", eventQuery.getPathQuery(categoryIds)); // set category Scoping categoryIds.addAll(Arrays.asList(new String[] { "CategoryId1", "CategoryId2", "CategoryId3" })); predicate += " and (fn:name() = 'CategoryId1' or fn:name() = 'CategoryId2' or fn:name() = 'CategoryId3')"; assertEquals(selector + predicate + "]", eventQuery.getPathQuery(categoryIds)); } public void testQuerySearchTopic() { List<String> categoryIds = new ArrayList<String>(); String selector = "/jcr:root/forumPath//element(*,exo:topic)"; ForumEventQuery eventQuery = new ForumEventQuery(); String predicate = ""; eventQuery.setType(Utils.TOPIC); eventQuery.setPath("/forumPath"); // not conditions assertEquals(selector + predicate, eventQuery.getPathQuery(categoryIds)); eventQuery.setKeyValue("text search"); // only forum name eventQuery.setValueIn("title"); predicate = "[(jcr:contains(@exo:name, 'text search'))"; assertEquals(selector + predicate + "]", eventQuery.getPathQuery(categoryIds)); // all value of forums eventQuery.setValueIn("all"); predicate = "[(jcr:contains(., 'text search'))"; assertEquals(selector + predicate + "]", eventQuery.getPathQuery(categoryIds)); // set User eventQuery.setByUser("root"); predicate += " and (@exo:owner='root')"; assertEquals(selector + predicate + "]", eventQuery.getPathQuery(categoryIds)); // set topic type, with topic: admin eventQuery.setTopicType("topicType"); predicate += " and (@exo:topicType='topicType')"; assertEquals(selector + predicate + "]", eventQuery.getPathQuery(categoryIds)); // Set Close, only use for administrator or moderator. they same x-path eventQuery.setUserPermission(0); // if value is 'all', not new x-path eventQuery.setIsClose("all"); assertEquals(selector + predicate + "]", eventQuery.getPathQuery(categoryIds)); // isClose != 'all' eventQuery.setIsClose("true"); // or false. predicate += " and (@exo:isClosed='true')"; assertEquals(selector + predicate + "]", eventQuery.getPathQuery(categoryIds)); // set Lock, if isLock = 'all', not build new x-path eventQuery.setIsLock("all"); assertEquals(selector + predicate + "]", eventQuery.getPathQuery(categoryIds)); // isLock != 'all' eventQuery.setIsLock("false"); predicate += " and (@exo:isLock='false')"; assertEquals(selector + predicate + "]", eventQuery.getPathQuery(categoryIds)); // set post count eventQuery.setPostCountMin("100"); predicate += " and (@exo:postCount>=100)"; assertEquals(selector + predicate + "]", eventQuery.getPathQuery(categoryIds)); // set view count eventQuery.setViewCountMin("200"); predicate += " and (@exo:viewCount>=200)"; assertEquals(selector + predicate + "]", eventQuery.getPathQuery(categoryIds)); // set from date String tempPredicate = predicate; Calendar calendar = GregorianCalendar.getInstance(); eventQuery.setFromDateCreated(calendar); predicate += " and (@exo:createdDate >= xs:dateTime('" + ISO8601.format(calendar) + "'))"; assertEquals(selector + predicate + "]", eventQuery.getPathQuery(categoryIds)); // set to date but not from date eventQuery.setFromDateCreated(null); eventQuery.setToDateCreated(calendar); // set from date to date eventQuery.setFromDateCreated(calendar); predicate = tempPredicate + " and ((@exo:createdDate >= xs:dateTime('" + ISO8601.format(calendar) + "')) " + "and (@exo:createdDate <= xs:dateTime('" + ISO8601.format(calendar) + "'))) "; assertEquals(selector + predicate + "]", eventQuery.getPathQuery(categoryIds)); // check can view for normal user and guest List<String> listOfUser = Arrays.asList(new String[] { "john", "/exo", "/exo:moderator" });// userName, group and membership of this user. eventQuery.setListOfUser(listOfUser); eventQuery.setUserPermission(2); predicate += " and (@exo:isApproved='true' and @exo:isActive='true' and @exo:isWaiting='false' and @exo:isActiveByForum='true')" + " and (not(@exo:canView) or @exo:canView='' or @exo:canView='john' or @exo:canView='/exo' or @exo:canView='/exo:moderator' or @exo:canView=' ')"; assertEquals(selector + predicate + "]", eventQuery.getPathQuery(categoryIds)); // set category Scoping categoryIds.addAll(Arrays.asList(new String[] { "CategoryId1", "CategoryId2", "CategoryId3" })); predicate += " and (@exo:path = 'CategoryId1' or @exo:path = 'CategoryId2' or @exo:path = 'CategoryId3')"; assertEquals(selector + predicate + "]", eventQuery.getPathQuery(categoryIds)); } public void testQuerySearchPost() { List<String> categoryIds = new ArrayList<String>(); String selector = "/jcr:root/forumPath//element(*,exo:post)"; String postPrivate = " and (@exo:userPrivate='exoUserPri' or @exo:userPrivate='john' or @exo:userPrivate='/exo' or @exo:userPrivate='/exo:moderator') and (@exo:isFirstPost='false')"; ForumEventQuery eventQuery = new ForumEventQuery(); String predicate = ""; eventQuery.setType(Utils.POST); eventQuery.setPath("/forumPath"); List<String> listOfUser = Arrays.asList(new String[] { "john", "/exo", "/exo:moderator" });// userName, group and membership of this user. eventQuery.setListOfUser(listOfUser); eventQuery.setUserPermission(0); // not conditions assertEquals(selector + predicate, eventQuery.getPathQuery(categoryIds)); eventQuery.setKeyValue("text search"); // only forum name eventQuery.setValueIn("title"); predicate = "[(jcr:contains(@exo:name, 'text search'))"; assertEquals(selector + predicate + postPrivate + "]", eventQuery.getPathQuery(categoryIds)); // all value of forums eventQuery.setValueIn("all"); predicate = "[(jcr:contains(., 'text search'))"; assertEquals(selector + predicate + postPrivate + "]", eventQuery.getPathQuery(categoryIds)); // set User eventQuery.setByUser("root"); predicate += " and (@exo:owner='root')"; assertEquals(selector + predicate + postPrivate + "]", eventQuery.getPathQuery(categoryIds)); String tempPredicate = predicate; // case 1: only from date Calendar calendar = GregorianCalendar.getInstance(); eventQuery.setFromDateCreated(calendar); predicate += " and (@exo:createdDate >= xs:dateTime('" + ISO8601.format(calendar) + "'))"; assertEquals(selector + predicate + postPrivate + "]", eventQuery.getPathQuery(categoryIds)); // case 2: only to date predicate = tempPredicate; eventQuery.setFromDateCreated(null); eventQuery.setToDateCreated(calendar); predicate += " and (@exo:createdDate <= xs:dateTime('" + ISO8601.format(calendar) + "'))"; assertEquals(selector + predicate + postPrivate + "]", eventQuery.getPathQuery(categoryIds)); // case 3: from date to date predicate = tempPredicate; eventQuery.setFromDateCreated(calendar); predicate += " and ((@exo:createdDate >= xs:dateTime('" + ISO8601.format(calendar) + "')) and (@exo:createdDate <= xs:dateTime('" + ISO8601.format(calendar) + "'))) "; assertEquals(selector + predicate + postPrivate + "]", eventQuery.getPathQuery(categoryIds)); // set category Scoping categoryIds.addAll(Arrays.asList(new String[] { "CategoryId1", "CategoryId2", "CategoryId3" })); predicate += postPrivate + " and (@exo:path = 'CategoryId1' or @exo:path = 'CategoryId2' or @exo:path = 'CategoryId3')"; assertEquals(selector + predicate + "]", eventQuery.getPathQuery(categoryIds)); } }