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 */
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 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}