001 /** 002 * Copyright 2005-2011 The Kuali Foundation 003 * 004 * Licensed under the Educational Community License, Version 2.0 (the "License"); 005 * you may not use this file except in compliance with the License. 006 * You may obtain a copy of the License at 007 * 008 * http://www.opensource.org/licenses/ecl2.php 009 * 010 * Unless required by applicable law or agreed to in writing, software 011 * distributed under the License is distributed on an "AS IS" BASIS, 012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 013 * See the License for the specific language governing permissions and 014 * limitations under the License. 015 */ 016 package org.kuali.rice.krad.workflow; 017 018 import org.junit.Test; 019 import org.kuali.rice.core.api.uif.RemotableAttributeField; 020 import org.kuali.rice.kew.api.document.search.DocumentSearchCriteria; 021 import org.kuali.rice.kew.api.document.search.DocumentSearchResults; 022 import org.kuali.rice.kew.docsearch.service.DocumentSearchService; 023 import org.kuali.rice.kew.doctype.bo.DocumentType; 024 import org.kuali.rice.kew.engine.RouteContext; 025 import org.kuali.rice.kew.framework.document.attribute.SearchableAttribute; 026 import org.kuali.rice.kew.routeheader.DocumentRouteHeaderValue; 027 import org.kuali.rice.kew.service.KEWServiceLocator; 028 import org.kuali.rice.kim.api.services.KimApiServiceLocator; 029 import org.kuali.rice.krad.UserSession; 030 import org.kuali.rice.krad.service.DocumentService; 031 import org.kuali.rice.krad.service.KRADServiceLocator; 032 import org.kuali.rice.krad.service.KRADServiceLocatorWeb; 033 import org.kuali.rice.krad.test.document.SearchAttributeIndexTestDocument; 034 import org.kuali.rice.krad.util.GlobalVariables; 035 import org.kuali.test.KRADTestCase; 036 037 import static org.junit.Assert.assertEquals; 038 import static org.junit.Assert.fail; 039 040 /** 041 * This is a description of what this class does - jksmith don't forget to fill this in. 042 * 043 * @author Kuali Rice Team (rice.collab@kuali.org) 044 * 045 */ 046 public class SearchAttributeIndexRequestTest extends KRADTestCase { 047 static org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(SearchAttributeIndexRequestTest.class); 048 final static String SEARCH_ATTRIBUTE_INDEX_DOCUMENT_TEST_DOC_TYPE = "SearchAttributeIndexTestDocument"; 049 050 enum DOCUMENT_FIXTURE { 051 NORMAL_DOCUMENT("hippo","routing"); 052 053 private String constantString; 054 private String routingString; 055 private DOCUMENT_FIXTURE(String constantString, String routingString) { 056 this.constantString = constantString; 057 this.routingString = routingString; 058 } 059 060 public SearchAttributeIndexTestDocument getDocument(DocumentService documentService) throws Exception { 061 SearchAttributeIndexTestDocument doc = (SearchAttributeIndexTestDocument)documentService.getNewDocument(SearchAttributeIndexRequestTest.SEARCH_ATTRIBUTE_INDEX_DOCUMENT_TEST_DOC_TYPE); 062 doc.initialize(constantString, routingString); 063 return doc; 064 } 065 } 066 067 /** 068 * Tests that a document, which goes through a regular approval process, is indexed correctly 069 */ 070 @Test 071 public void regularApproveTest() throws Exception { 072 LOG.warn("message.delivery state: "+ KRADServiceLocator.getKualiConfigurationService().getPropertyValueAsString( 073 "message.delivery")); 074 075 final DocumentService documentService = KRADServiceLocatorWeb.getDocumentService(); 076 final String principalName = "quickstart"; 077 final String principalId = KimApiServiceLocator.getPersonService().getPersonByPrincipalName(principalName).getPrincipalId(); 078 GlobalVariables.setUserSession(new UserSession(principalName)); 079 RouteContext.clearCurrentRouteContext(); 080 081 SearchAttributeIndexTestDocument document = DOCUMENT_FIXTURE.NORMAL_DOCUMENT.getDocument(documentService); 082 document.getDocumentHeader().setDocumentDescription("Routed SAIndexTestDoc"); 083 final String documentNumber = document.getDocumentNumber(); 084 final DocumentType docType = KEWServiceLocator.getDocumentTypeService().findByName(SearchAttributeIndexRequestTest.SEARCH_ATTRIBUTE_INDEX_DOCUMENT_TEST_DOC_TYPE); 085 086 documentService.routeDocument(document, "Routed SearchAttributeIndexTestDocument", null); 087 088 document = (SearchAttributeIndexTestDocument)documentService.getByDocumentHeaderId(documentNumber); 089 DocumentRouteHeaderValue routeHeader = KEWServiceLocator.getRouteHeaderService().getRouteHeader(documentNumber); 090 091 assertDDSearchableAttributesWork(docType,principalId,"routeLevelCount", 092 new String[] {"1","0","2","7"}, 093 new int[] {1, 0, 0, 0} 094 ); 095 096 assertDDSearchableAttributesWork(docType,principalId,"constantString", 097 new String[] {"hippo","monkey"}, 098 new int[] {1, 0} 099 ); 100 101 assertDDSearchableAttributesWork(docType,principalId,"routedString", 102 new String[] {"routing","hippo"}, 103 new int[] {1, 0} 104 ); 105 106 GlobalVariables.setUserSession(new UserSession("user1")); 107 document = (SearchAttributeIndexTestDocument)documentService.getByDocumentHeaderId(documentNumber); 108 documentService.approveDocument(document, "User1 approved document", null); 109 110 routeHeader = KEWServiceLocator.getRouteHeaderService().getRouteHeader(documentNumber); 111 112 assertDDSearchableAttributesWork(docType,principalId,"routeLevelCount", 113 new String[] {"1","0","2","7"}, 114 new int[] {0, 0, 1, 0} 115 ); 116 117 assertDDSearchableAttributesWork(docType,principalId,"constantString", 118 new String[] {"hippo","monkey"}, 119 new int[] {1, 0} 120 ); 121 122 assertDDSearchableAttributesWork(docType,principalId,"routedString", 123 new String[] {"routing","hippo"}, 124 new int[] {1, 0} 125 ); 126 127 LOG.info("Read Access Count not at expected value: "+document.getReadAccessCount()); 128 129 GlobalVariables.setUserSession(new UserSession("user2")); 130 document = (SearchAttributeIndexTestDocument)documentService.getByDocumentHeaderId(documentNumber); 131 documentService.approveDocument(document, "User1 approved document", null); 132 133 routeHeader = KEWServiceLocator.getRouteHeaderService().getRouteHeader(documentNumber); 134 135 assertDDSearchableAttributesWork(docType,principalId,"routeLevelCount", 136 new String[] {"1","0","2","3","4","7"}, 137 new int[] {0, 0, 0, 1, 0, 0} 138 ); 139 140 assertDDSearchableAttributesWork(docType,principalId,"constantString", 141 new String[] {"hippo","monkey"}, 142 new int[] {1, 0} 143 ); 144 145 assertDDSearchableAttributesWork(docType,principalId,"routedString", 146 new String[] {"routing","hippo"}, 147 new int[] {1, 0} 148 ); 149 150 LOG.info("Read Access Count not at expected value: "+document.getReadAccessCount()); 151 152 GlobalVariables.setUserSession(new UserSession("user3")); 153 document = (SearchAttributeIndexTestDocument)documentService.getByDocumentHeaderId(documentNumber); 154 documentService.approveDocument(document, "User3 approved document", null); 155 156 routeHeader = KEWServiceLocator.getRouteHeaderService().getRouteHeader(documentNumber); 157 158 assertDDSearchableAttributesWork(docType,principalId,"routeLevelCount", 159 new String[] {"1","0","2","3","4","7"}, 160 new int[] {0, 0, 0, 1, 0, 0} 161 ); 162 163 assertDDSearchableAttributesWork(docType,principalId,"constantString", 164 new String[] {"hippo","monkey"}, 165 new int[] {1, 0} 166 ); 167 168 assertDDSearchableAttributesWork(docType,principalId,"routedString", 169 new String[] {"routing","hippo"}, 170 new int[] {1, 0} 171 ); 172 173 LOG.info("Read Access Count not at expected value: "+document.getReadAccessCount()); 174 175 GlobalVariables.setUserSession(null); 176 } 177 178 /** 179 * Tests that a blanket approved document is indexed correctly 180 */ 181 @Test 182 public void blanketApproveTest() throws Exception { 183 LOG.warn("message.delivery state: "+ KRADServiceLocator.getKualiConfigurationService().getPropertyValueAsString( 184 "message.delivery")); 185 186 final DocumentService documentService = KRADServiceLocatorWeb.getDocumentService(); 187 final String principalName = "admin"; 188 final String principalId = KimApiServiceLocator.getPersonService().getPersonByPrincipalName(principalName).getPrincipalId(); 189 GlobalVariables.setUserSession(new UserSession(principalName)); 190 191 SearchAttributeIndexTestDocument document = DOCUMENT_FIXTURE.NORMAL_DOCUMENT.getDocument(documentService); 192 document.getDocumentHeader().setDocumentDescription("Blanket Approved SAIndexTestDoc"); 193 final String documentNumber = document.getDocumentNumber(); 194 final DocumentType docType = KEWServiceLocator.getDocumentTypeService().findByName(SearchAttributeIndexRequestTest.SEARCH_ATTRIBUTE_INDEX_DOCUMENT_TEST_DOC_TYPE); 195 196 documentService.blanketApproveDocument(document, "Blanket Approved SearchAttributeIndexTestDocument", null); 197 198 document = (SearchAttributeIndexTestDocument)documentService.getByDocumentHeaderId(documentNumber); 199 DocumentRouteHeaderValue routeHeader = KEWServiceLocator.getRouteHeaderService().getRouteHeader(documentNumber); 200 201 assertDDSearchableAttributesWork(docType,principalId,"routeLevelCount", 202 new String[] {"1","0","2","3","7"}, 203 new int[] {0, 0, 0, 1, 0} 204 ); 205 206 assertDDSearchableAttributesWork(docType,principalId,"constantString", 207 new String[] {"hippo","monkey"}, 208 new int[] {1, 0} 209 ); 210 211 assertDDSearchableAttributesWork(docType,principalId,"routedString", 212 new String[] {"routing","hippo"}, 213 new int[] {1, 0} 214 ); 215 216 LOG.info("Read Access Count not at expected value: "+document.getReadAccessCount()); 217 218 GlobalVariables.setUserSession(null); 219 } 220 221 /** 222 * A convenience method for testing wildcards on data dictionary searchable attributes. 223 * 224 * @param docType The document type containing the attributes. 225 * @param principalId The ID of the user performing the search. 226 * @param fieldName The name of the field on the test document. 227 * @param searchValues The search expressions to test. Has to be a String array (for regular fields) or a String[] array (for multi-select fields). 228 * @param resultSizes The number of expected documents to be returned by the search; use -1 to indicate that an error should have occurred. 229 * @throws Exception 230 */ 231 private void assertDDSearchableAttributesWork(DocumentType docType, String principalId, String fieldName, Object[] searchValues, 232 int[] resultSizes) throws Exception { 233 if (!(searchValues instanceof String[]) && !(searchValues instanceof String[][])) { 234 throw new IllegalArgumentException("'searchValues' parameter has to be either a String[] or a String[][]"); 235 } 236 DocumentSearchCriteria.Builder criteria = null; 237 DocumentSearchResults results = null; 238 DocumentSearchService docSearchService = KEWServiceLocator.getDocumentSearchService(); 239 for (int i = 0; i < resultSizes.length; i++) { 240 criteria = DocumentSearchCriteria.Builder.create(); 241 criteria.setDocumentTypeName(docType.getName()); 242 criteria.addDocumentAttributeValue(fieldName, searchValues[i].toString()); 243 try { 244 results = docSearchService.lookupDocuments(principalId, criteria.build()); 245 if (resultSizes[i] < 0) { 246 fail(fieldName + "'s search at loop index " + i + " should have thrown an exception"); 247 } 248 if(resultSizes[i] != results.getSearchResults().size()){ 249 assertEquals(fieldName + "'s search results at loop index " + i + " returned the wrong number of documents.", resultSizes[i], results.getSearchResults().size()); 250 } 251 } catch (Exception ex) { 252 if (resultSizes[i] >= 0) { 253 fail(fieldName + "'s search at loop index " + i + " should not have thrown an exception"); 254 } 255 } 256 GlobalVariables.clear(); 257 } 258 } 259 }