001 /**
002 * Copyright 2005-2013 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.kew.batch;
017
018 import static org.junit.Assert.assertNotNull;
019 import static org.junit.Assert.assertTrue;
020 import static org.junit.Assert.fail;
021
022 import java.io.File;
023 import java.util.Iterator;
024 import java.util.LinkedList;
025 import java.util.List;
026 import java.util.Map;
027 import java.util.Properties;
028 import java.util.regex.Pattern;
029
030 import javax.servlet.FilterChain;
031 import javax.servlet.ServletRequest;
032 import javax.servlet.ServletResponse;
033
034 import org.apache.struts.action.ActionForward;
035 import org.apache.struts.action.ActionMapping;
036 import org.apache.struts.upload.FormFile;
037 import org.junit.Test;
038 import org.kuali.rice.core.web.impex.IngesterAction;
039 import org.kuali.rice.core.web.impex.IngesterForm;
040 import org.kuali.rice.kew.test.KEWTestCase;
041 import org.kuali.rice.kew.test.web.MockFormFile;
042 import org.kuali.rice.kew.test.web.WorkflowServletRequest;
043 import org.kuali.rice.krad.web.filter.UserLoginFilter;
044 import org.kuali.rice.krad.UserSession;
045 import org.kuali.rice.krad.util.GlobalVariables;
046 import org.kuali.rice.krad.util.KRADConstants;
047 import org.springframework.mock.web.MockHttpServletResponse;
048
049 /**
050 * Tests workflow Struts IngesterAction
051 * @author Kuali Rice Team (rice.collab@kuali.org)
052 */
053 public class IngesterActionTest extends KEWTestCase {
054
055 private static final org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(IngesterActionTest.class);
056
057 private static final String TRANSACTION_FAILED_REGEX = "(?i)^Ingestion failed$";
058 private static final String SUCCESS_MESSAGE_REGEX_PRE = "(?ism)^Ingested xml doc.*";
059 private static final String SUCCESS_MESSAGE_REGEX_POST = ".*";
060 private static final String FAILURE_MESSAGE_REGEX_PRE = "(?ism)^((Failed to ingest xml doc)|(Rolled back doc)).*";
061 private static final String FAILURE_MESSAGE_REGEX_POST = ".*";
062
063 private static final String escape(String fileName) {
064 return fileName.replaceAll("\\.", "\\\\.");
065 }
066
067 private static final String getSuccessRegex(String fileName) {
068 return SUCCESS_MESSAGE_REGEX_PRE + escape(fileName) + SUCCESS_MESSAGE_REGEX_POST;
069 }
070
071 private static final String getFailureRegex(String fileName) {
072 return FAILURE_MESSAGE_REGEX_PRE + escape(fileName) + FAILURE_MESSAGE_REGEX_POST;
073 }
074
075 private boolean findMessage(List messages, String regex) {
076 Pattern p = Pattern.compile(regex);
077 Iterator it = messages.iterator();
078 LOG.error(regex);
079 while (it.hasNext()) {
080 String message = (String) it.next();
081 LOG.error(message);
082 if (p.matcher(message).matches()) {
083 return true;
084 }
085 }
086 return false;
087 }
088
089 @Test public void testSuccessfulIngestion() throws Exception {
090 testIngestion("IngesterActionTest_success.txt", true);
091 }
092
093 @Test public void testFailedIngestion() throws Exception {
094 testIngestion("IngesterActionTest_failure.txt", false);
095 }
096
097 @SuppressWarnings("unchecked")
098 private void testIngestion(String config, boolean shouldSucceed) throws Exception {
099 IngesterForm form = new IngesterForm();
100 Properties filesToIngest = new Properties();
101 filesToIngest.load(getClass().getResourceAsStream(config));
102 List shouldPass = new LinkedList();
103 List shouldFail = new LinkedList();
104
105 // add all test files to form
106 Iterator entries = filesToIngest.entrySet().iterator();
107 int i = 0;
108 while (entries.hasNext()) {
109 Map.Entry entry = (Map.Entry) entries.next();
110 String filePath = entry.getKey().toString();
111 filePath = filePath.replace("${basedir}", getBaseDir());
112 String fileName = new File(filePath).getName();
113 if (Boolean.valueOf(entry.getValue().toString()).booleanValue()) {
114 shouldPass.add(fileName);
115 } else {
116 shouldFail.add(fileName);
117 }
118 FormFile file = new MockFormFile(new File(filePath));
119 form.setFile(i, file);
120 assertTrue(form.getFiles().size() == i+1);
121 i++;
122 }
123
124 assertTrue(form.getFiles().size() > 0);
125
126 // invoke action
127 IngesterAction action = new IngesterAction();
128 ActionMapping mapping = new ActionMapping();
129 mapping.addForwardConfig(new ActionForward("view", "/nowhere", false));
130 WorkflowServletRequest request = new WorkflowServletRequest();
131 MockHttpServletResponse response = new MockHttpServletResponse();
132 request.setUser("admin");
133 // add the user to the session
134 new UserLoginFilter().doFilter(request, response, new FilterChain() {
135 public void doFilter(ServletRequest req, ServletResponse res) {
136 }
137 });
138 request.setMethod("post");
139 try {
140 UserSession userSession = (UserSession)request.getSession().getAttribute(KRADConstants.USER_SESSION_KEY);
141 assertNotNull("UserSession should have been established.", userSession);
142 GlobalVariables.setUserSession(userSession);
143 action.execute(mapping, form, request, response);
144 } finally {
145 GlobalVariables.setUserSession(null);
146 }
147
148 // test result
149 List messages = (List) request.getAttribute("messages");
150 assertNotNull(messages);
151
152 Iterator it = shouldFail.iterator();
153 while (it.hasNext()) {
154 String file = it.next().toString();
155 LOG.error("file: " + file);
156 LOG.error("file replaced: " + escape(file));
157 assertTrue(findMessage(messages, getFailureRegex(file)));
158 }
159
160
161 // test that the global transaction failure message was emitted
162 boolean failed = shouldFail.size() > 0;
163 if (failed && shouldSucceed) {
164 fail("Ingestation failed but should have succeeded");
165 } else if (!failed && !shouldSucceed) {
166 fail("Ingestation succeeded but should have failed");
167 }
168
169 if (failed) {
170 assertTrue(findMessage(messages, TRANSACTION_FAILED_REGEX));
171 }
172
173 it = shouldPass.iterator();
174 while (it.hasNext()) {
175 if (failed) {
176 assertTrue(findMessage(messages, getFailureRegex(it.next().toString())));
177 } else {
178 assertTrue(findMessage(messages, getSuccessRegex(it.next().toString())));
179 }
180 }
181 }
182 }