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