001    /**
002     * Copyright 2005-2014 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.kns.workflow;
017    
018    import org.junit.Test;
019    import org.kuali.rice.kew.api.document.search.DocumentSearchCriteria;
020    import org.kuali.rice.kew.api.document.search.DocumentSearchResults;
021    import org.kuali.rice.kew.docsearch.service.DocumentSearchService;
022    import org.kuali.rice.kew.doctype.bo.DocumentType;
023    import org.kuali.rice.kew.engine.RouteContext;
024    import org.kuali.rice.kew.service.KEWServiceLocator;
025    import org.kuali.rice.kim.api.services.KimApiServiceLocator;
026    import org.kuali.rice.krad.UserSession;
027    import org.kuali.rice.krad.document.Document;
028    import org.kuali.rice.krad.service.KRADServiceLocatorWeb;
029    import org.kuali.rice.krad.test.document.SearchAttributeIndexTestDocument;
030    import org.kuali.rice.krad.util.GlobalVariables;
031    import org.kuali.rice.krad.test.KRADTestCase;
032    
033    import static org.junit.Assert.assertEquals;
034    import org.junit.Assert;
035    
036    /**
037     * tests that a document, which goes through a regular or blanket approval process, is indexed correctly
038     * 
039     * @author Kuali Rice Team (rice.collab@kuali.org)
040     *
041     * @deprecated KNS test class, convert to KRAD equivalent if applicable.
042     */
043    @Deprecated
044    public class SearchAttributeIndexRequestTest extends KRADTestCase {
045    
046        private static final String SEARCH_ATTRIBUTE_INDEX_DOCUMENT_TEST_DOC_TYPE = "SearchAttributeIndexTestDocument";
047            
048            private enum DOCUMENT_FIXTURE {
049                    NORMAL_DOCUMENT("hippo","routing");
050                    
051                    private String constantString;
052                    private String routingString;
053                    private DOCUMENT_FIXTURE(String constantString, String routingString) {
054                            this.constantString = constantString;
055                            this.routingString = routingString;
056                    }
057                    
058                    public Document getDocument() throws Exception {
059                Document document = KRADServiceLocatorWeb.getDocumentService().getNewDocument(SEARCH_ATTRIBUTE_INDEX_DOCUMENT_TEST_DOC_TYPE);
060                            SearchAttributeIndexTestDocument searchAttributeIndexTestDocument = (SearchAttributeIndexTestDocument) document;
061                searchAttributeIndexTestDocument.initialize(constantString, routingString);
062    
063                return searchAttributeIndexTestDocument;
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            final String principalName = "quickstart";
073            final String principalId = KimApiServiceLocator.getPersonService().getPersonByPrincipalName(principalName).getPrincipalId();
074            GlobalVariables.setUserSession(new UserSession(principalName));
075            RouteContext.clearCurrentRouteContext();
076    
077                    Document document = DOCUMENT_FIXTURE.NORMAL_DOCUMENT.getDocument();
078                    document.getDocumentHeader().setDocumentDescription("Routed SAIndexTestDoc");
079                    final DocumentType documentType = KEWServiceLocator.getDocumentTypeService().findByName(SEARCH_ATTRIBUTE_INDEX_DOCUMENT_TEST_DOC_TYPE);
080    
081            assertApproveAttributes(document, documentType, principalId);
082            }
083    
084        protected void assertApproveAttributes(Document document, DocumentType documentType, String principalId) throws Exception {
085            KRADServiceLocatorWeb.getDocumentService().routeDocument(document, "Routed SearchAttributeIndexTestDocument", null);
086    
087            assertDDSearchableAttributesWork(documentType, principalId, "routeLevelCount",
088                    new String[] {"1","0","2","7"},
089                    new int[] {1, 0, 0, 0}
090            );
091    
092            assertDDSearchableAttributesWork(documentType, principalId, "constantString",
093                    new String[] {"hippo","monkey"},
094                    new int[] {1, 0}
095            );
096    
097            assertDDSearchableAttributesWork(documentType, principalId, "routedString",
098                    new String[] {"routing","hippo"},
099                    new int[] {1, 0}
100            );
101    
102            GlobalVariables.setUserSession(new UserSession("user1"));
103            document = KRADServiceLocatorWeb.getDocumentService().getByDocumentHeaderId(document.getDocumentNumber());
104            KRADServiceLocatorWeb.getDocumentService().approveDocument(document, "User1 approved document", null);
105    
106            assertDDSearchableAttributesWork(documentType, principalId, "routeLevelCount",
107                    new String[] {"1","0","2","7"},
108                    new int[] {0, 0, 1, 0}
109            );
110    
111            assertDDSearchableAttributesWork(documentType, principalId, "constantString",
112                    new String[] {"hippo","monkey"},
113                    new int[] {1, 0}
114            );
115    
116            assertDDSearchableAttributesWork(documentType, principalId, "routedString",
117                    new String[] {"routing","hippo"},
118                    new int[] {1, 0}
119            );
120    
121            GlobalVariables.setUserSession(new UserSession("user2"));
122            document = KRADServiceLocatorWeb.getDocumentService().getByDocumentHeaderId(document.getDocumentNumber());
123            KRADServiceLocatorWeb.getDocumentService().approveDocument(document, "User1 approved document", null);
124    
125            assertDDSearchableAttributesWork(documentType, principalId, "routeLevelCount",
126                    new String[] {"1","0","2","3","4","7"},
127                    new int[] {0, 0, 0, 1, 0, 0}
128            );
129    
130            assertDDSearchableAttributesWork(documentType, principalId, "constantString",
131                    new String[] {"hippo","monkey"},
132                    new int[] {1, 0}
133            );
134    
135            assertDDSearchableAttributesWork(documentType, principalId, "routedString",
136                    new String[] {"routing","hippo"},
137                    new int[] {1, 0}
138            );
139    
140            GlobalVariables.setUserSession(new UserSession("user3"));
141            document = KRADServiceLocatorWeb.getDocumentService().getByDocumentHeaderId(document.getDocumentNumber());
142            KRADServiceLocatorWeb.getDocumentService().approveDocument(document, "User3 approved document", null);
143    
144            assertDDSearchableAttributesWork(documentType, principalId, "routeLevelCount",
145                    new String[] {"1","0","2","3","4","7"},
146                    new int[] {0, 0, 0, 1, 0, 0}
147            );
148    
149            assertDDSearchableAttributesWork(documentType, principalId, "constantString",
150                    new String[] {"hippo","monkey"},
151                    new int[] {1, 0}
152            );
153    
154            assertDDSearchableAttributesWork(documentType, principalId, "routedString",
155                    new String[] {"routing","hippo"},
156                    new int[] {1, 0}
157            );
158    
159            GlobalVariables.setUserSession(null);
160        }
161            
162            /**
163             * Tests that a blanket approved document is indexed correctly
164             */
165            @Test
166            public void blanketApproveTest() throws Exception {
167            final String principalName = "admin";
168            final String principalId = KimApiServiceLocator.getPersonService().getPersonByPrincipalName(principalName).getPrincipalId();
169            GlobalVariables.setUserSession(new UserSession(principalName));
170    
171            Document document = DOCUMENT_FIXTURE.NORMAL_DOCUMENT.getDocument();
172            document.getDocumentHeader().setDocumentDescription("Blanket Approved SAIndexTestDoc");
173            final DocumentType documentType = KEWServiceLocator.getDocumentTypeService().findByName(SEARCH_ATTRIBUTE_INDEX_DOCUMENT_TEST_DOC_TYPE);
174    
175            assertBlanketApproveAttributes(document, documentType, principalId);
176            }
177    
178        protected void assertBlanketApproveAttributes(Document document, DocumentType documentType, String principalId) throws Exception {
179            KRADServiceLocatorWeb.getDocumentService().blanketApproveDocument(document, "Blanket Approved SearchAttributeIndexTestDocument", null);
180    
181            assertDDSearchableAttributesWork(documentType, principalId, "routeLevelCount",
182                    new String[] {"1","0","2","3","7"},
183                    new int[] {0, 0, 0, 1, 0}
184            );
185    
186            assertDDSearchableAttributesWork(documentType, principalId, "constantString",
187                    new String[] {"hippo","monkey"},
188                    new int[] {1, 0}
189            );
190    
191            assertDDSearchableAttributesWork(documentType, principalId, "routedString",
192                    new String[] {"routing","hippo"},
193                    new int[] {1, 0}
194            );
195    
196            GlobalVariables.setUserSession(null);
197        }
198            
199            /**
200         * A convenience method for testing wildcards on data dictionary searchable attributes.
201         *
202         * @param docType The document type containing the attributes.
203         * @param principalId The ID of the user performing the search.
204         * @param fieldName The name of the field on the test document.
205         * @param searchValues The search expressions to test. Has to be a String array (for regular fields) or a String[] array (for multi-select fields).
206         * @param resultSizes The number of expected documents to be returned by the search; use -1 to indicate that an error should have occurred.
207         * @throws Exception
208         */
209        private void assertDDSearchableAttributesWork(DocumentType docType, String principalId, String fieldName, Object[] searchValues,
210                    int[] resultSizes) throws Exception {
211            if (!(searchValues instanceof String[]) && !(searchValues instanceof String[][])) {
212                    throw new IllegalArgumentException("'searchValues' parameter has to be either a String[] or a String[][]");
213            }
214            DocumentSearchCriteria.Builder criteria = null;
215            DocumentSearchResults results = null;
216            DocumentSearchService docSearchService = KEWServiceLocator.getDocumentSearchService();
217            for (int i = 0; i < resultSizes.length; i++) {
218                    criteria = DocumentSearchCriteria.Builder.create();
219                    criteria.setDocumentTypeName(docType.getName());
220                    criteria.addDocumentAttributeValue(fieldName, searchValues[i].toString());
221                    try {
222                            results = docSearchService.lookupDocuments(principalId, criteria.build());
223                            if (resultSizes[i] < 0) {
224                                    Assert.fail(fieldName + "'s search at loop index " + i + " should have thrown an exception");
225                            }
226                            if(resultSizes[i] != results.getSearchResults().size()){
227                                    assertEquals(fieldName + "'s search results at loop index " + i + " returned the wrong number of documents.", resultSizes[i], results.getSearchResults().size());
228                            }
229                    } catch (Exception ex) {
230                            if (resultSizes[i] >= 0) {
231                                    Assert.fail(fieldName + "'s search at loop index " + i + " should not have thrown an exception");
232                            }
233                    }
234                    GlobalVariables.clear();
235            }
236        }
237    }