/* * 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.services.wcm.search; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.List; import javax.jcr.Node; import javax.jcr.RepositoryException; import org.apache.commons.lang.StringUtils; import org.exoplatform.component.test.ConfigurationUnit; import org.exoplatform.component.test.ConfiguredBy; import org.exoplatform.component.test.ContainerScope; import org.exoplatform.portal.mop.SiteKey; import org.exoplatform.portal.mop.page.PageContext; import org.exoplatform.portal.mop.page.PageKey; import org.exoplatform.portal.mop.page.PageService; import org.exoplatform.portal.mop.page.PageState; import org.exoplatform.services.cms.templates.TemplateService; import org.exoplatform.services.ecm.publication.IncorrectStateUpdateLifecycleException; import org.exoplatform.services.security.ConversationState; import org.exoplatform.services.security.Identity; import org.exoplatform.services.wcm.publication.PublicationDefaultStates; import org.exoplatform.services.wcm.search.base.AbstractPageList; import org.exoplatform.services.wcm.search.base.BaseSearchTest; import org.exoplatform.services.wcm.utils.WCMCoreUtils; /** * Created by The eXo Platform SAS * Author : eXoPlatform * chuong.phan@exoplatform.com, phan.le.thanh.chuong@gmail.com * Jul 14, 2009 */ @ConfiguredBy({ @ConfigurationUnit(scope = ContainerScope.PORTAL, path = "conf/exo.portal.component.portal-configuration.xml"), @ConfigurationUnit(scope = ContainerScope.PORTAL, path = "conf/exo.portal.component.identity-configuration.xml"), @ConfigurationUnit(scope = ContainerScope.PORTAL, path = "conf/standalone/ecms-test-configuration.xml"), @ConfigurationUnit(scope = ContainerScope.PORTAL, path = "conf/wcm/test-search-configuration.xml") }) public class TestSearchService extends BaseSearchTest { public void setUp() throws Exception { super.setUp(); ConversationState c = new ConversationState(new Identity(session.getUserID())); ConversationState.setCurrent(c); } protected void addChildNodes(Node parentNode)throws Exception{ PageService pageService = getService(PageService.class); pomSession = pomManager.getSession(); if (pomManager.getSession() == null) pomSession = pomManager.openSession(); PageContext page = pageService.loadPage(new PageKey(new SiteKey("portal", "classic"), "testpage")); if(page == null){ PageState pageState = new PageState("testpage", "test page", true, "testpage", null, null, null, null); page = new PageContext(new PageKey(new SiteKey("portal", "classic"), "testpage"), pageState); pageService.savePage(page); } Node webContentNode = null; HashMap<String, String> context = null; webContentNode = createWebcontentNode(parentNode, "webcontent0" , null, null, null); if(!webContentNode.isNodeType("metadata:siteMetadata")) webContentNode.addMixin("metadata:siteMetadata"); wcmPublicationService.enrollNodeInLifecycle(webContentNode, DumpPublicationPlugin.LIFECYCLE_NAME); context = new HashMap<String, String>(); // context.put(DumpPublicationPlugin.CURRENT_REVISION_NAME, webContentNode.getName()); publicationPlugin.changeState(webContentNode, PublicationDefaultStates.PUBLISHED, context); webContentNode = createWebcontentNode(parentNode, "webcontent1", null, null, null); if(!webContentNode.isNodeType("metadata:siteMetadata")) webContentNode.addMixin("metadata:siteMetadata"); wcmPublicationService.enrollNodeInLifecycle(webContentNode, DumpPublicationPlugin.LIFECYCLE_NAME); context = new HashMap<String, String>(); // context.put(DumpPublicationPlugin.CURRENT_REVISION_NAME, webContentNode.getName()); publicationPlugin.changeState(webContentNode, PublicationDefaultStates.DRAFT, context); session.save(); pomSession.close(); } protected void populateAdditionalSearchData(Node siteNode, String parentNode, int nodesCount) { Node resolvedParentNode = siteNode; if (!StringUtils.isEmpty(parentNode) && ("documents".equals(parentNode) || "web contents".equals(parentNode))) { try { if (siteNode.hasNode(parentNode)) { resolvedParentNode = siteNode.getNode(parentNode); } else { resolvedParentNode = siteNode.addNode(parentNode); session.save(); } } catch (RepositoryException e) { // Do nothing } } else { return; } if (("documents".equals(parentNode))) { populateDocumentNodes(resolvedParentNode, nodesCount); } else { populateWebContentNodes(resolvedParentNode, nodesCount); } } private void populateDocumentNodes(Node parentNode, int nodesCount) { for (int i = 0; i < nodesCount; i++) { Node dummyFile; String fileNamePrefix = "dummyFile"; try { dummyFile = parentNode.addNode(fileNamePrefix + i, "nt:file"); Node imageContent = dummyFile.addNode("jcr:content", "nt:resource"); imageContent.setProperty("jcr:encoding", "UTF-8"); imageContent.setProperty("jcr:mimeType", "text/html"); imageContent.setProperty("jcr:lastModified", new Date().getTime()); imageContent.setProperty("jcr:data", "A file with duplication searchKey."); wcmPublicationService.enrollNodeInLifecycle(dummyFile, DumpPublicationPlugin.LIFECYCLE_NAME); publicationPlugin.changeState(dummyFile, PublicationDefaultStates.PUBLISHED, new HashMap<String, String>()); } catch (RepositoryException e) { // Do nothing } catch (IncorrectStateUpdateLifecycleException e) { // Do nothing } catch (Exception e) { // Do nothing } } } protected void populateWebContentNodes(Node parentNode, int nodesCount) { String webContentNamePrefix = "dummyWebContent"; // html data for web content node: Must hold a common keyword "searchKey" String htmlData = "The default.html file and yes it holds duplication searchKey."; String cssData = "The default.css file."; String jsData = "The default.js file."; StringBuilder webContentName; for (int i = 0; i < nodesCount; i++) { webContentName = new StringBuilder(); try { Node populatedNode = createWebcontentNode(parentNode, webContentName.append(webContentNamePrefix).append(i).toString(),htmlData,cssData,jsData); if (!populatedNode.isNodeType("metadata:siteMetadata")) { populatedNode.addMixin("metadata:siteMetadata"); } wcmPublicationService.enrollNodeInLifecycle(populatedNode, DumpPublicationPlugin.LIFECYCLE_NAME); publicationPlugin.changeState(populatedNode, PublicationDefaultStates.PUBLISHED, new HashMap<String, String>()); } catch (Exception e) { // Do nothing } } } protected Node createWebcontentNode(Node parentNode, String nodeName, String htmlData, String cssData, String jsData) throws Exception { Node webcontent = parentNode.addNode(nodeName, "exo:webContent"); webcontent.setProperty("exo:title", nodeName); Node htmlNode; try { htmlNode = webcontent.getNode("default.html"); } catch (Exception ex) { htmlNode = webcontent.addNode("default.html", "nt:file"); } if (!htmlNode.isNodeType("exo:htmlFile")) htmlNode.addMixin("exo:htmlFile"); Node htmlContent; try { htmlContent = htmlNode.getNode("jcr:content"); } catch (Exception ex) { htmlContent = htmlNode.addNode("jcr:content", "nt:resource"); } htmlContent.setProperty("jcr:encoding", "UTF-8"); htmlContent.setProperty("jcr:mimeType", "text/html"); htmlContent.setProperty("jcr:lastModified", new Date().getTime()); if (htmlData == null) htmlData = "This is the default.html file."; htmlContent.setProperty("jcr:data", htmlData); if (!htmlContent.isNodeType("exo:webContentChild")) htmlContent.addMixin("exo:webContentChild"); Node jsFolder; try { jsFolder = webcontent.getNode("js"); } catch (Exception ex) { jsFolder = webcontent.addNode("js", "exo:jsFolder"); } Node jsNode; try { jsNode = jsFolder.getNode("default.js"); } catch (Exception ex) { jsNode = jsFolder.addNode("default.js", "nt:file"); } if (!jsNode.isNodeType("exo:jsFile")) jsNode.addMixin("exo:jsFile"); jsNode.setProperty("exo:active", true); jsNode.setProperty("exo:priority", 1); jsNode.setProperty("exo:sharedJS", true); Node jsContent; try { jsContent = jsNode.getNode("jcr:content"); } catch (Exception ex) { jsContent = jsNode.addNode("jcr:content", "nt:resource"); } jsContent.setProperty("jcr:encoding", "UTF-8"); jsContent.setProperty("jcr:mimeType", "text/javascript"); jsContent.setProperty("jcr:lastModified", new Date().getTime()); if (jsData == null) jsData = "This is the default.js file."; jsContent.setProperty("jcr:data", jsData); if (!jsContent.isNodeType("exo:webContentChild")) jsContent.addMixin("exo:webContentChild"); Node cssFolder; try { cssFolder = webcontent.getNode("css"); } catch (Exception ex) { cssFolder = webcontent.addNode("css", "exo:cssFolder"); } Node cssNode; try { cssNode = cssFolder.getNode("default.css"); } catch (Exception ex) { cssNode = cssFolder.addNode("default.css", "nt:file"); } if (!cssNode.isNodeType("exo:cssFile")) cssNode.addMixin("exo:cssFile"); cssNode.setProperty("exo:active", true); cssNode.setProperty("exo:priority", 1); cssNode.setProperty("exo:sharedCSS", true); Node cssContent; try { cssContent = cssNode.getNode("jcr:content"); } catch (Exception ex) { cssContent = cssNode.addNode("jcr:content", "nt:resource"); } cssContent.setProperty("jcr:encoding", "UTF-8"); cssContent.setProperty("jcr:mimeType", "text/css"); cssContent.setProperty("jcr:lastModified", new Date().getTime()); if (cssData == null) cssData = "This is the default.css file."; cssContent.setProperty("jcr:data", cssData); if (!cssContent.isNodeType("exo:webContentChild")) cssContent.addMixin("exo:webContentChild"); Node mediaFolder; try { mediaFolder = webcontent.getNode("medias"); } catch (Exception ex) { mediaFolder = webcontent.addNode("medias"); } if (!mediaFolder.hasNode("images")) mediaFolder.addNode("images", "nt:folder"); if (!mediaFolder.hasNode("videos")) mediaFolder.addNode("videos", "nt:folder"); if (!mediaFolder.hasNode("audio")) mediaFolder.addNode("audio", "nt:folder"); session.save(); return webcontent; } private AbstractPageList<ResultNode> getSearchResult(boolean isSearchContent, int searchItemPerPage) throws Exception{ return siteSearchService.searchSiteContents(WCMCoreUtils.getSystemSessionProvider(), queryCriteria, searchItemPerPage, isSearchContent); } protected String[] getWebContentSearchedDocTypes() { List<String> docTypes = null; try { docTypes = WCMCoreUtils.getService(TemplateService.class).getDocumentTemplates(); } catch (Exception e) { } return docTypes.toArray(new String[]{}); } /** * Test case 1: search all node (includes have or don't have publication property) * in shared portal and not live mode. In this case, set parameters:<br> * searchPageChecked = false<br> * searchDocumentChecked = true<br> * searchSelectedPortal = shared<br> * searchIsLiveMode = false<br> * * @throws Exception the exception */ public void testSearchSharedPortalNotLiveMode() throws Exception { queryCriteria = new QueryCriteria(); queryCriteria.setSiteName("shared"); queryCriteria.setKeyword(searchKeyword); queryCriteria.setSearchDocument(true); queryCriteria.setSearchWebContent(true); queryCriteria.setLiveMode(false); queryCriteria.setSearchWebpage(false); queryCriteria.setFuzzySearch(true); queryCriteria.setContentTypes(getWebContentSearchedDocTypes()); AbstractPageList<ResultNode> pageList = getSearchResult(true, seachItemsPerPage); assertEquals(2, pageList.getPage(1).size()); } /** * Test case 2: search all node (includes have or don't have publication property) * in shared portal. In this case, set parameters:<br> * searchPageChecked = true<br> * searchDocumentChecked = true<br> * searchSelectedPortal = shared<br> * searchIsLiveMode = true<br> * * @throws Exception the exception */ public void testSearchSharedPortalLiveMode() throws Exception { queryCriteria = new QueryCriteria(); queryCriteria.setSiteName("shared"); queryCriteria.setKeyword(searchKeyword); queryCriteria.setSearchDocument(true); queryCriteria.setSearchWebContent(true); queryCriteria.setLiveMode(true); queryCriteria.setSearchWebpage(false); queryCriteria.setFuzzySearch(true); queryCriteria.setContentTypes(getWebContentSearchedDocTypes()); int searchItemPerPage = 1; AbstractPageList<ResultNode> pageList = getSearchResult(true,searchItemPerPage); assertEquals(1, pageList.getPage(1).size()); assertEquals(2, pageList.getTotalNodes()); } /** * Test case 3: search all node (includes have or don't have publication property) in all portals. * In this case, set parameters:<br> * searchPageChecked = true<br> * searchDocumentChecked = true<br> * searchSelectedPortal = null<br> * searchIsLiveMode = false<br> * * @throws Exception the exception */ public void testSearchAllPortalNotLiveMode() throws Exception { queryCriteria = new QueryCriteria(); queryCriteria.setSiteName(null); queryCriteria.setKeyword(searchKeyword); queryCriteria.setSearchDocument(true); queryCriteria.setSearchWebContent(true); queryCriteria.setLiveMode(false); queryCriteria.setSearchWebpage(false); queryCriteria.setFuzzySearch(true); queryCriteria.setContentTypes(getWebContentSearchedDocTypes()); AbstractPageList<ResultNode> pageList = getSearchResult(true, seachItemsPerPage); assertEquals(4, pageList.getTotalNodes()); assertEquals(4, pageList.getPage(1).size()); } /** * Test case 4: search nodes which are live mode in all portals. * In this case, set parameters:<br> * searchPageChecked = true<br> * searchDocumentChecked = true<br> * searchSelectedPortal = null<br> * searchIsLiveMode = true<br> * * @throws Exception the exception */ public void testSearchAllPortalLiveMode() throws Exception { queryCriteria = new QueryCriteria(); queryCriteria.setSiteName(null); queryCriteria.setKeyword(searchKeyword); queryCriteria.setSearchDocument(true); queryCriteria.setSearchWebContent(true); queryCriteria.setLiveMode(true); queryCriteria.setSearchWebpage(false); queryCriteria.setFuzzySearch(true); queryCriteria.setContentTypes(getWebContentSearchedDocTypes()); int searchItemPerPage = 2; AbstractPageList<ResultNode> pageList = getSearchResult(true, searchItemPerPage); assertEquals(2, pageList.getPage(1).size()); assertEquals(4, pageList.getTotalNodes()); } //---------------------------------------------- Test search document ----------------------------------------------------------- /** * Test case 5: Test search document. * Search all documents in system (all portals) which are live mode. With this case, values of parameters are:<br> * searchPageChecked = false<br> * searchDocumentChecked = true<br> * searchSelectedPortal = null<br> * searchIsLiveMode = true<br> */ public void testSearchDocumentLiveMode() throws Exception { queryCriteria = new QueryCriteria(); queryCriteria.setSiteName(null); queryCriteria.setKeyword(searchKeyword); queryCriteria.setSearchDocument(true); queryCriteria.setSearchWebContent(true); queryCriteria.setLiveMode(true); queryCriteria.setSearchWebpage(false); queryCriteria.setFuzzySearch(true); queryCriteria.setContentTypes(getWebContentSearchedDocTypes()); int searchItemsPerPage = 2; AbstractPageList<ResultNode> pageList = getSearchResult(true, searchItemsPerPage); assertEquals(2, pageList.getPage(1).size()); } /** * Test case 6:Test search document. * Search all documents in system (all portals). With this case, values of parameters are:<br> * searchPageChecked = false<br> * searchDocumentChecked = true<br> * searchSelectedPortal = null<br> * searchIsLiveMode = false<br> */ public void testSearchDocumentNotLiveMode() throws Exception { queryCriteria = new QueryCriteria(); queryCriteria.setSiteName(null); queryCriteria.setKeyword(searchKeyword); queryCriteria.setSearchDocument(true); queryCriteria.setSearchWebContent(true); queryCriteria.setLiveMode(false); queryCriteria.setSearchWebpage(false); queryCriteria.setFuzzySearch(true); queryCriteria.setContentTypes(getWebContentSearchedDocTypes()); AbstractPageList<ResultNode> pageList = getSearchResult(true, seachItemsPerPage); assertEquals(4, pageList.getTotalNodes()); } /** * Test case 7:Test search document. * Search all documents in shared portal. With this case, values of parameters are:<br> * searchPageChecked = false<br> * searchDocumentChecked = true<br> * searchSelectedPortal = shared<br> * searchIsLiveMode = false<br> */ public void testSearchDocumentOfSharedPortal() throws Exception { queryCriteria = new QueryCriteria(); queryCriteria.setSiteName("shared"); queryCriteria.setKeyword(searchKeyword); queryCriteria.setSearchDocument(true); queryCriteria.setSearchWebContent(true); queryCriteria.setLiveMode(false); queryCriteria.setSearchWebpage(false); queryCriteria.setFuzzySearch(true); queryCriteria.setContentTypes(getWebContentSearchedDocTypes()); AbstractPageList<ResultNode> pageList = getSearchResult(true, seachItemsPerPage); assertEquals(2, pageList.getTotalNodes()); } /** * Test case 8:Test search document. * Search all documents in shared portal. With this case, values of parameters are:<br> * searchPageChecked = false<br> * searchDocumentChecked = true<br> * searchSelectedPortal = shared<br> * searchIsLiveMode = true<br> */ public void testSearchDocumentOfSharedPortalLiveMode() throws Exception { queryCriteria = new QueryCriteria(); queryCriteria.setSiteName("shared"); queryCriteria.setKeyword(searchKeyword); queryCriteria.setSearchDocument(true); queryCriteria.setSearchWebContent(true); queryCriteria.setLiveMode(true); queryCriteria.setSearchWebpage(false); queryCriteria.setFuzzySearch(true); queryCriteria.setContentTypes(getWebContentSearchedDocTypes()); int searchItemsPerPage = 1; AbstractPageList<ResultNode> pageList = getSearchResult(true, searchItemsPerPage); assertEquals(1, pageList.getPage(1).size()); assertEquals(2, pageList.getTotalNodes()); } //------------------------------------------- Test search pages ------------------------------------------------------------------ /** * Test case 9:Test search pages. * Search all pages in all portals. With this case, values of parameters are:<br> * searchPageChecked = true<br> * searchDocumentChecked = false<br> * searchSelectedPortal = null<br> * searchIsLiveMode = true<br> */ // public void testSearchPagesLiveMode() throws Exception { // this.searchDocumentChecked = false; // this.searchIsLiveMode = true; // this.searchSelectedPortal = null; // AbstractPageList<ResultNode> pageList = getSearchResult(); // assertEquals(5, pageList.getPage(1).size()); // } /** * Test case 10:Test search pages. * Search all pages in all portals and not live mode. With this case, values of parameters are:<br> * searchPageChecked = true<br> * searchDocumentChecked = false<br> * searchSelectedPortal = null<br> * searchIsLiveMode = false<br> */ // public void testSearchPages() throws Exception { // this.searchDocumentChecked = false; // this.searchSelectedPortal = null; // AbstractPageList<ResultNode> pageList = getSearchResult(); // assertEquals(10, pageList.getTotalNodes()); // } /** * Test case 11:Test search pages. * Search all pages in share and live mode. With this case, values of parameters are:<br> * searchPageChecked = true<br> * searchDocumentChecked = false<br> * searchSelectedPortal = shared<br> * searchIsLiveMode = true<br> */ // public void testSearchPagesSharedLiveMode() throws Exception { // this.searchDocumentChecked = false; // this.searchIsLiveMode = true; // AbstractPageList<ResultNode> pageList = getSearchResult(); // assertEquals(5, pageList.getPage(1).size()); // assertEquals(10, pageList.getTotalNodes()); // } /** * Test case 12:Test search pages. * Search all pages in share and live mode. With this case, values of parameters are:<br> * searchPageChecked = true<br> * searchDocumentChecked = false<br> * searchSelectedPortal = shared<br> * searchIsLiveMode = true<br> */ // public void testSearchPagesShared() throws Exception { // this.searchDocumentChecked = false; // AbstractPageList<ResultNode> pageList = getSearchResult(); // assertEquals(5, pageList.getPage(1).size()); // assertEquals(10, pageList.getTotalNodes()); // } //------------------------------------- test with not document or page -------------------------------------------------------------------- /** * Test case 13:Test search contents are not document or page in all portal. * Search all pages in share and live mode. With this case, values of parameters are:<br> * searchPageChecked = false<br> * searchDocumentChecked = false<br> * searchSelectedPortal = null<br> * searchIsLiveMode = true<br> */ // public void testSearchNotPagesDocument_AllPortalLiveMode() throws Exception { // this.searchDocumentChecked = false; // this.searchPageChecked = false; // this.searchIsLiveMode = true; // this.searchSelectedPortal = null; // AbstractPageList<ResultNode> pageList = getSearchResult(); // assertEquals(5, pageList.getPage(1).size()); // assertEquals(10, pageList.getTotalNodes()); // } /** * Test case 14:Test search contents are not document or page in all portal. * Search all pages in share and live mode. With this case, values of parameters are:<br> * searchPageChecked = false<br> * searchDocumentChecked = false<br> * searchSelectedPortal = null<br> * searchIsLiveMode = true<br> */ // public void testSearchNotPagesDocument_AllPortalNotLiveMode() throws Exception { // this.searchDocumentChecked = false; // this.searchPageChecked = false; // this.searchSelectedPortal = null; // AbstractPageList<ResultNode> pageList = getSearchResult(); // assertEquals(5, pageList.getPage(1).size()); // assertEquals(10, pageList.getTotalNodes()); // } /** * Test case 15:Test search contents are not document or page in all portal. * Search all pages in share and live mode. With this case, values of parameters are:<br> * searchPageChecked = false<br> * searchDocumentChecked = false<br> * searchSelectedPortal = null<br> * searchIsLiveMode = true<br> */ // public void testSearchNotPagesDocument_SharedLiveMode() throws Exception { // this.searchDocumentChecked = false; // this.searchPageChecked = false; // this.searchIsLiveMode = true; // AbstractPageList<ResultNode> pageList = getSearchResult(); // assertEquals(5, pageList.getPage(1).size()); // assertEquals(10, pageList.getTotalNodes()); // } /** * Test case 16:Test search contents are not document or page in all portal. * Search all pages in share and live mode. With this case, values of parameters are:<br> * searchPageChecked = false<br> * searchDocumentChecked = false<br> * searchSelectedPortal = null<br> * searchIsLiveMode = true<br> */ // public void testSearchNotPagesDocument_SharedNoLiveMode() throws Exception { // this.searchDocumentChecked = false; // this.searchPageChecked = false; // AbstractPageList<ResultNode> pageList = getSearchResult(); // assertEquals(5, pageList.getPage(1).size()); // assertEquals(10, pageList.getTotalNodes()); // } /** * Test case 17:Test search contents is document or page in all portal. And search * with created date and modified Date. * Search all pages in share and live mode. With this case, values of parameters are:<br> * searchPageChecked = false<br> * searchDocumentChecked = true<br> * searchSelectedPortal = null<br> * searchIsLiveMode = true<br> */ // @SuppressWarnings("deprecation") // public void testSearchPagesDocument_Date() throws Exception { // this.searchIsLiveMode = true; // this.searchSelectedPortal = null; // Date date = new Date(2009, 05, 05); // GregorianCalendar calFrom = new GregorianCalendar() ; // calFrom.setTime(date); // date = new Date(); // GregorianCalendar calTo = new GregorianCalendar() ; // calTo.setTime(date); // DatetimeRange datetimeRange = new DatetimeRange(calFrom, calTo); // queryCriteria.setCreatedDateRange(datetimeRange); // queryCriteria.setSearchWebpage(false); // queryCriteria.setSiteName(null); // AbstractPageList<ResultNode> pageList = getSearchResult(); // assertEquals(5, pageList.getPage(1).size()); // assertEquals(10, pageList.getTotalNodes()); // } /** * Test case 18:Test search contents is document or page in all portal. And search * with created date and modified Date. * Search all pages in share and live mode. With this case, values of parameters are:<br> * searchPageChecked = true<br> * searchDocumentChecked = true<br> * searchSelectedPortal = null<br> * searchIsLiveMode = true<br> */ // public void testSearchPagesDocument_NotFultextSearch() throws Exception { // this.searchIsLiveMode = true; // this.searchSelectedPortal = null; // queryCriteria.setFulltextSearch(false); // queryCriteria.setSearchWebpage(false); // AbstractPageList<ResultNode> pageList = getSearchResult(); // assertEquals(0, pageList.getPage(1).size()); // } /** * Test case 19:Test search contents is document or page in all portal. And search * with created date and modified Date. * Search all pages in share and live mode. With this case, values of parameters are:<br> * searchPageChecked = true<br> * searchDocumentChecked = true<br> * searchSelectedPortal = null<br> * searchIsLiveMode = true<br> * keyWord = null; */ // public void testSearchPagesDocument_ContentType() throws Exception { // this.searchIsLiveMode = true; // this.searchSelectedPortal = null; // queryCriteria.setSearchWebpage(false); // queryCriteria.setContentTypes(new String[]{"exo:webContent", "exo:htmlFile"}); // queryCriteria.setKeyword(null); // AbstractPageList<ResultNode> pageList = getSearchResult(); // assertEquals(5, pageList.getPage(1).size()); // } /** * Test case 20:Test search contents is document or page in all portal. And search * with created date and modified Date. * Search all pages in share and live mode. With this case, values of parameters are:<br> * searchPageChecked = true<br> * searchDocumentChecked = true<br> * searchSelectedPortal = null<br> * searchIsLiveMode = true<br> * keyWord = null; */ // public void testSearchPagesDocument_Property() throws Exception { // this.searchIsLiveMode = true; // this.searchSelectedPortal = null; // this.searchKeyword = "This is*"; // QueryProperty queryProperty1 = queryCriteria.new QueryProperty(); // queryProperty1.setName("jcr:data"); // queryProperty1.setValue("This is the"); // QueryProperty queryProperty2 = queryCriteria.new QueryProperty(); // queryProperty2.setName("jcr:data"); // queryProperty2.setValue("the default.css file"); // queryCriteria.setQueryMetadatas(new QueryProperty[]{queryProperty1, queryProperty2}); // queryCriteria.setSearchWebpage(false); // AbstractPageList<ResultNode> pageList = getSearchResult(); // assertEquals(0, pageList.getPage(1).size()); // } /** * Test case 21:Test search contents is document or page in all portal. And search * with created date and modified Date. * Search all pages in share and live mode. With this case, values of parameters are:<br> * searchPageChecked = true<br> * searchDocumentChecked = true<br> * searchSelectedPortal = null<br> * searchIsLiveMode = true<br> * keyWord = null; */ // public void testSearchPagesDocument_CategoryUUIDS() throws Exception{ // this.searchIsLiveMode = true; // this.searchSelectedPortal = null; // Node documentNode = ((Node)session.getItem("/sites content/live/shared/documents")).getNode("webcontent0"); // Node livenode = ((Node)session.getItem("/sites content/live/classic/web contents")).getNode("webcontent0"); // queryCriteria.setSearchWebpage(false); // queryCriteria.setCategoryUUIDs(new String[]{documentNode.getUUID(), livenode.getUUID()}); // AbstractPageList<ResultNode> pageList = getSearchResult(); // assertEquals(0, pageList.getAvailable()); // } public void testSearchByProperty()throws Exception{ queryCriteria = new QueryCriteria(); queryCriteria.setSiteName("shared"); queryCriteria.setKeyword(searchKeyword); queryCriteria.setSearchDocument(true); queryCriteria.setSearchWebContent(true); queryCriteria.setLiveMode(true); queryCriteria.setSearchWebpage(false); queryCriteria.setFulltextSearch(true); queryCriteria.setFulltextSearchProperty(new String[] {"dc:description"}); assertEquals(0, siteSearchService.searchSiteContents(sessionProvider, queryCriteria, 10, true).getTotalNodes()); } public void testSearchByDocumentType()throws Exception{ queryCriteria = new QueryCriteria(); queryCriteria.setSiteName("shared"); queryCriteria.setKeyword(null); queryCriteria.setSearchDocument(true); queryCriteria.setSearchWebContent(true); queryCriteria.setLiveMode(true); queryCriteria.setSearchWebpage(false); queryCriteria.setFulltextSearch(true); String documentType = "exo:webContent"; queryCriteria.setFulltextSearchProperty(null); queryCriteria.setContentTypes(documentType.split(",")); assertEquals(2, siteSearchService.searchSiteContents(sessionProvider, queryCriteria, 10, true).getTotalNodes()); } public void testSearchByDocumentAuthor()throws Exception{ queryCriteria = new QueryCriteria(); queryCriteria.setSiteName("shared"); queryCriteria.setKeyword(null); queryCriteria.setSearchDocument(true); queryCriteria.setSearchWebContent(true); queryCriteria.setLiveMode(true); queryCriteria.setSearchWebpage(false); queryCriteria.setFulltextSearch(true); queryCriteria.setFulltextSearchProperty(null); String author = "root"; queryCriteria.setAuthors(new String[]{author}); assertEquals(4, siteSearchService.searchSiteContents(sessionProvider, queryCriteria, 10, true).getTotalNodes()); } public void testSearchByMimeTypes()throws Exception{ queryCriteria = new QueryCriteria(); queryCriteria.setSiteName("shared"); queryCriteria.setKeyword(null); queryCriteria.setSearchDocument(true); queryCriteria.setSearchWebContent(true); queryCriteria.setLiveMode(true); queryCriteria.setSearchWebpage(false); queryCriteria.setFulltextSearch(true); queryCriteria.setFulltextSearchProperty(null); queryCriteria.setMimeTypes(new String[]{"exo:webContent", "exo:siteBreadcrumb"}); AbstractPageList<ResultNode> pageList = siteSearchService.searchSiteContents(sessionProvider, queryCriteria, 10, true); assertEquals(4, pageList.getTotalNodes()); } public void testSearchByTagUUID() throws Exception{ queryCriteria = new QueryCriteria(); queryCriteria.setSiteName("shared"); queryCriteria.setKeyword(null); queryCriteria.setSearchDocument(true); queryCriteria.setSearchWebContent(true); queryCriteria.setLiveMode(true); queryCriteria.setSearchWebpage(false); queryCriteria.setFulltextSearch(true); queryCriteria.setFulltextSearchProperty(null); queryCriteria.setMimeTypes(new String[]{"exo:webContent", "exo:siteBreadcrumb"}); Node node = (Node)session.getItem("/sites content/live/classic/web contents/webcontent0"); String uuid = node.getUUID(); queryCriteria.setTagUUIDs(new String[]{uuid}); assertEquals(4, siteSearchService.searchSiteContents(sessionProvider, queryCriteria, 10, true).getTotalNodes()); } /** * Test case 26: Search all nodes (includes have or don't have publication property) * in acme portal and not live mode. * This test case aims to check items duplication when the page list size is higher * than the default AbstractPageList.DEFAULT_BUFFER_SIZE. * Search page update are based on offset an limit of the QueryCriteria updates. Then * results are paginated using a pageSize local variable * Parameters are set to:<br> * searchSelectedPortal = acme<br> * keyword = "duplication searchKey"<br> * searchPageChecked = false<br> * searchDocumentChecked = true<br> * searchWebContentChecked = true<br> * searchIsLiveMode = false<br> * searchFuzzySearch = true<br> * * @throws Exception the exception */ public void testSearchByOffsetAndLimitWithNoDuplication() throws Exception { int pageSize = 10; int offset = 0; int limit = pageSize; boolean isItemDuplicated = false; queryCriteria.setSiteName("acme"); queryCriteria.setKeyword(duplicationSearchKeyword); queryCriteria = new QueryCriteria(); queryCriteria.setSearchDocument(true); queryCriteria.setSearchWebContent(true); queryCriteria.setLiveMode(true); queryCriteria.setSearchWebpage(false); queryCriteria.setFuzzySearch(true); // First query should retrieve from offset to limit queryCriteria.setOffset(offset); queryCriteria.setLimit(limit); queryCriteria.setContentTypes(getWebContentSearchedDocTypes()); String assertionMsg = "Returned search results should have no duplicates in different pages: %s"; /* Temp ResultNodes list which is aimed to hold always the previous page result. Those should then be used for comparison */ List auxList = getSearchResult(true, 10).currentPage(); int nbResultForCurrentPage = auxList.size(); List<Integer> hashResults = new ArrayList<Integer>(); while (nbResultForCurrentPage==limit && !isItemDuplicated) { offset+=limit; queryCriteria.setOffset(offset); queryCriteria.setLimit(limit); List<ResultNode> resultNodes = getSearchResult(true, 10).currentPage(); nbResultForCurrentPage = resultNodes.size(); int i=0; while (i<resultNodes.size() && !isItemDuplicated){ ResultNode node = resultNodes.get(i); Integer hash = new Integer(node.hashCode()); if (hashResults.contains(hash)) { isItemDuplicated=true; assertionMsg = String.format(assertionMsg,"Node: \"" + node.getPath() + "\" is duplicated at offset "+(offset-limit)); } else { hashResults.add(new Integer(hash)); } i++; } } assertFalse(assertionMsg, isItemDuplicated); } /** * Test case 27: Search all nodes (includes have or don't have publication property) * in acme portal and not live mode. * This test case aims to check items duplication when the page list size is higher * than the default AbstractPageList.DEFAULT_BUFFER_SIZE. * Search page update are based on the PageList#getPage which internally will populate * the new page nodes and increment the current page index: ECMS-6444 * Parameters are set to:<br> * searchSelectedPortal = acme<br> * keyword = "duplication searchKey"<br> * searchPageChecked = false<br> * searchDocumentChecked = true<br> * searchWebContentChecked = true<br> * searchIsLiveMode = false<br> * searchFuzzySearch = true<br> * * @throws Exception the exception */ public void testSearchByPageUpdateWithNoDuplication() throws Exception { boolean isItemDuplicated = false; int pageSize = 10; int offset = 0; int limit = pageSize; queryCriteria = new QueryCriteria(); queryCriteria.setSiteName("acme"); queryCriteria.setKeyword(duplicationSearchKeyword); queryCriteria.setSearchDocument(true); queryCriteria.setSearchWebContent(true); queryCriteria.setLiveMode(true); queryCriteria.setSearchWebpage(false); queryCriteria.setFuzzySearch(true); // Retrieve all nodes from 0 to 20 queryCriteria.setOffset(0); queryCriteria.setLimit(20); queryCriteria.setContentTypes(getWebContentSearchedDocTypes()); String assertionMsg = "Returned search results should have no duplicates in different pages: %s"; /* Temp ResultNodes list which is aimed to hold always the previous page result. Those should then be used for comparison */ List auxList = getSearchResult(false, 10).currentPage(); List<Integer> hashResults = new ArrayList<Integer>(); int nbResultForCurrentPage = auxList.size(); while (nbResultForCurrentPage==limit && !isItemDuplicated) { offset+=limit; queryCriteria.setOffset(offset); queryCriteria.setLimit(limit); List<ResultNode> resultNodes = getSearchResult(false, 10).currentPage(); nbResultForCurrentPage = resultNodes.size(); int i=0; while (i<resultNodes.size() && !isItemDuplicated){ ResultNode node = resultNodes.get(i); Integer hash = new Integer(node.hashCode()); if (hashResults.contains(hash)) { isItemDuplicated=true; assertionMsg = String.format(assertionMsg,"Node: \"" + node.getPath() + "\" is duplicated at offset "+(offset-limit)); } else { hashResults.add(new Integer(hash)); } i++; } } assertFalse(assertionMsg, isItemDuplicated); } /** * Test case 28: Test search document repetitively without offset setting * Each round is the same with testSearchDocumentLiveMode() (Test case 5) * Repeat 3 rounds to check cache eviction * Query results are stored in ArrayNodePageList * Search all documents in all sites which are in live mode (having publication property). * With this case, the parameter values are:<br> * searchDocumentChecked = true<br> * searchSelectedPortal = null<br> * searchIsLiveMode = true<br> * no setting of offset<br> * */ public void testRepeatSearchDocument_ArrayNodePageList() throws Exception { queryCriteria = new QueryCriteria(); queryCriteria.setSiteName(null); queryCriteria.setKeyword(searchKeyword); queryCriteria.setSearchDocument(true); queryCriteria.setSearchWebContent(true); queryCriteria.setLiveMode(true); queryCriteria.setSearchWebpage(false); queryCriteria.setFuzzySearch(true); queryCriteria.setContentTypes(getWebContentSearchedDocTypes()); int searchItemsPerPage = 2; AbstractPageList<ResultNode> pageList; int searchRounds = 3; for (int i = 1; i <= searchRounds; i++) { System.out.println("- Search round " + i + "/" + searchRounds); pageList = getSearchResult(true, searchItemsPerPage); assertEquals("Wrong result number at round " + i + ": ", 2, pageList.getPage(1).size()); assertEquals("Wrong total number at round " + i + ": ", 4, pageList.getTotalNodes()); } } /** * Test case 29: Test search document repetitively without offset setting * Each round is the same with testSearchDocumentLiveMode() (Test case 5) * Repeat 3 rounds to check cache eviction * Query results are stored in QueryResultPageList * Search all documents in all sites which are in live mode * and contain "duplicationSearchKeyword" * With this case, the parameter values are:<br> * searchDocumentChecked = true<br> * searchSelectedPortal = acme<br> * searchIsLiveMode = true<br> * no setting of offset<br> * */ public void testRepeatSearchDocument_QueryResultPageList() throws Exception { queryCriteria = new QueryCriteria(); queryCriteria.setSiteName(null); queryCriteria.setKeyword(duplicationSearchKeyword); queryCriteria.setSearchDocument(true); queryCriteria.setSearchWebContent(true); queryCriteria.setLiveMode(true); queryCriteria.setSearchWebpage(false); queryCriteria.setFuzzySearch(true); queryCriteria.setContentTypes(getWebContentSearchedDocTypes()); int searchItemsPerPage = 100; AbstractPageList<ResultNode> pageList; int searchRounds = 3; for (int i = 1; i <= searchRounds; i++) { System.out.println("- Search round " + i + "/" + searchRounds); pageList = getSearchResult(true, searchItemsPerPage); // 20 web contents + 101 documents assertEquals("Wrong result number of page 1 at round " + i + ": ", searchItemsPerPage, pageList.getPage(1).size()); assertEquals("Wrong result number of page 2 at round " + i + ": ", 1, pageList.getPage(2).size()); } } public void tearDown() throws Exception { super.tearDown(); } }