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 edu.sampleu.admin;
017
018 import freemarker.cache.ClassTemplateLoader;
019 import freemarker.template.Configuration;
020 import freemarker.template.Template;
021 import freemarker.template.TemplateException;
022 import org.apache.commons.io.FileUtils;
023 import org.apache.log4j.Logger;
024 import org.junit.Ignore;
025 import org.junit.Rule;
026 import org.junit.Test;
027 import org.junit.rules.TemporaryFolder;
028 import org.kuali.rice.testtools.selenium.AutomatedFunctionalTestUtils;
029 import org.openqa.selenium.By;
030 import org.springframework.ui.freemarker.FreeMarkerTemplateUtils;
031
032 import java.io.File;
033 import java.io.FileInputStream;
034 import java.io.IOException;
035 import java.io.InputStream;
036 import java.util.ArrayList;
037 import java.util.Enumeration;
038 import java.util.List;
039 import java.util.Properties;
040
041 /**
042 * tests uploads of new users and group
043 *
044 * <pre>mvn -f rice-middleware/sampleapp/pom.xml -Pstests failsafe:integration-test -Dremote.public.url=env7.rice.kuali.org -Dit.test=XMLIngester -DXMLIngester.groupId=2008 -DXMLIngester.userIncludeDTSinPrefix=false -DXMLIngester.userCntBegin=0 -DXMLIngester.userCnt=600 -DXMLIngester.userPrefix=loadtester -Dremote.driver.dontTearDown=y</pre>
045 *
046 * @deprecated XMLIngesterSTJUnitNavGen
047 * @author Kuali Rice Team (rice.collab@kuali.org)
048 */
049 public class XmlIngester extends AdminTmplMthdAftNavBase {
050
051 protected final Logger LOG = Logger.getLogger(getClass());
052
053 // File generation
054 private Configuration cfg;
055 private String PROPS_LOCATION = System.getProperty("xmlingester.props.location", null);
056 private String DEFAULT_PROPS_LOCATION = "XML/xmlingester.properties";
057
058 // Templates for File Generation
059 private static final String DIR_TMPL = "/XML/";
060 private static final String TMPL_USER_CONTENT = "SimpleUserContent.ftl";
061 private static final String TMPL_GROUP_CONTENT = "SimpleGroupContent.ftl";
062
063 @Rule
064 public TemporaryFolder folder= new TemporaryFolder();
065
066 @Ignore // empty test, XML Ingester does not have Create New Cancel functionality
067 @Override
068 public void testCreateNewCancel() throws Exception {}
069
070 @Ignore // empty test, XML Ingester does not have Edit Cancel functionality
071 @Override
072 public void testEditCancel() throws Exception {}
073
074 @Override
075 protected String getBookmarkUrl() {
076 return null; // no bookmark test yet
077 }
078
079 @Override
080 protected String getLinkLocator() {
081 return "XML Ingester";
082 }
083
084 @Override
085 public String getUserName() {
086 return "admin"; // xml ingestion requires admin permissions
087 }
088
089 @Override
090 public void testSetUp() {
091 super.testSetUp();
092 // generated load users and group resources
093 cfg = new Configuration();
094 cfg.setTemplateLoader(new ClassTemplateLoader(getClass().getClassLoader().getClass(), DIR_TMPL));
095 }
096
097 private List<File> buildFileUploadList() throws Exception {
098 List<File> fileUploadList = new ArrayList<File>();
099 try {
100 // update properties with timestamp value if includeDTSinPrefix is true
101 Properties props = loadProperties(PROPS_LOCATION, DEFAULT_PROPS_LOCATION);
102 if(props.get("userIncludeDTSinPrefix") != null
103 && "true".equalsIgnoreCase((String) props.get("userIncludeDTSinPrefix"))) {
104 props.setProperty("userPrefix", "" + props.get("userPrefix") + AutomatedFunctionalTestUtils.DTS);
105 }
106 systemPropertiesOverride(props);
107
108 // build files and add to array
109 fileUploadList.add(
110 writeTemplateToFile(
111 folder.newFile("loadtest-users.xml"), cfg.getTemplate(TMPL_USER_CONTENT), props));
112 fileUploadList.add(
113 writeTemplateToFile(
114 folder.newFile("loadtest-group.xml"), cfg.getTemplate(TMPL_GROUP_CONTENT), props));
115 } catch( Exception e) {
116 throw new Exception("Unable to generate files for upload", e);
117 }
118 return fileUploadList;
119 }
120
121 /**
122 * -DXMLIngester.userCnt=176 will override the userCnt in property files.
123 * @param props
124 */
125 private void systemPropertiesOverride(Properties props) {
126 Enumeration<?> names = props.propertyNames();
127 Object nameObject;
128 String name;
129 while (names.hasMoreElements()) {
130 nameObject = names.nextElement();
131 if (nameObject instanceof String) {
132 name = (String)nameObject;
133 props.setProperty(name, System.getProperty("XMLIngester." + name, props.getProperty(name)));
134 }
135 }
136 }
137
138 /**
139 * Based on load user and groups manual tests; dynamically generates user and group file
140 * and loads into the xml ingester screen
141 *
142 */
143 @Test
144 public void testXMLIngesterSuccessfulFileUploadNav() throws Exception {
145 List<File> fileUploadList = buildFileUploadList();
146 navigate();
147 int cnt = 0;
148 for(File file : fileUploadList) {
149 String path = file.getAbsolutePath().toString();
150 driver.findElement(By.name("file[" + cnt + "]")).sendKeys(path);
151 cnt++;
152 }
153 waitAndClickByXpath("//*[@id='imageField']");
154
155 // confirm all files were uploaded successfully
156 for(File file: fileUploadList) {
157 assertTextPresent("Ingested xml doc: " + file.getName());
158 }
159 passed();
160 }
161
162 /**
163 * Loads properties from user defined properties file, if not available uses resource file
164 *
165 * @return
166 * @throws IOException
167 */
168 private Properties loadProperties(String fileLocation, String resourceLocation) throws IOException {
169 Properties props = new Properties();
170 InputStream in = null;
171 if(fileLocation != null) {
172 in = new FileInputStream(fileLocation);
173 } else {
174 in = getClass().getClassLoader().getResourceAsStream(resourceLocation);
175 }
176 if(in != null) {
177 props.load(in);
178 in.close();
179 }
180 return props;
181 }
182
183 /**
184 * writes processed template to file
185 *
186 * @param file
187 * @param template
188 * @param props
189 * @return
190 * @throws IOException
191 * @throws TemplateException
192 */
193 private File writeTemplateToFile(File file, Template template, Properties props) throws IOException, TemplateException {
194 String output = FreeMarkerTemplateUtils.processTemplateIntoString(template, props);
195 LOG.debug("Generated File Output: " + output);
196 FileUtils.writeStringToFile(file, output);
197 return file;
198 }
199 }