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 */
016package edu.samplu.admin.test;
017
018import edu.samplu.common.Failable;
019import edu.samplu.common.FreemarkerSTBase;
020import edu.samplu.common.ITUtil;
021import edu.samplu.common.PropertiesUtils;
022import org.openqa.selenium.By;
023
024import java.io.File;
025import java.io.IOException;
026import java.util.ArrayList;
027import java.util.List;
028import java.util.Properties;
029
030/**
031 * Tests uploads of new users and group.
032 *
033 * @author Kuali Rice Team (rice.collab@kuali.org)
034 */
035
036public abstract class XMLIngesterAbstractSmokeTestBase extends FreemarkerSTBase {
037
038    /**
039     * http://env12.rice.kuali.org/portal.do?channelTitle=XML%20Ingester&channelUrl=http://env12.rice.kuali.org/kew/../core/Ingester.do
040     */
041    public static final String BOOKMARK_URL = ITUtil.PORTAL + "?channelTitle=XML%20Ingester&channelUrl="
042            + ITUtil.getBaseUrlString() + "/kew/../core/Ingester.do";
043
044    // File generation
045    private String PROPS_LOCATION = System.getProperty("xmlingester.props.location", null);
046    private static final String DEFAULT_PROPS_LOCATION = "XML/xmlingester.properties";
047
048    // Templates for File Generation
049    private static final String DIR_TMPL = "/XML/";
050    private static final String TMPL_USER_CONTENT = "SimpleUserContent.ftl";
051    private static final String TMPL_GROUP_CONTENT = "SimpleGroupContent.ftl";
052
053    /**
054     *
055     * @param name of temp file to create
056     * @return tempFile
057     * @throws IOException
058     */
059    protected abstract File newTempFile(String name) throws IOException;
060
061    /**
062     * {@inheritDoc}
063     * {@link #DIR_TMPL}
064     * @return
065     */
066    @Override
067    protected String getTemplateDir() {
068        return DIR_TMPL;
069    }
070
071    /**
072     * Nav tests start at {@link ITUtil#PORTAL}.  Bookmark Tests should override and return {@link XMLIngesterAbstractSmokeTestBase#BOOKMARK_URL}
073     * {@inheritDoc}
074     * @return
075     */
076    @Override
077    public String getTestUrl() {
078        return ITUtil.PORTAL;
079    }
080
081    /**
082     * "admin" xml ingestion requires admin permissions.
083     * {@inheritDoc}
084     * @return
085     */
086    @Override
087    public String getUserName() {
088        return "admin";
089    }
090
091    /**
092     * go to the getMenuLinkLocator() Menu and click the getLinkLocator()
093     */
094    protected void navigate(Failable failable) throws Exception {
095        selectTopFrame();
096        waitAndClickAdministration(failable);
097        waitForTitleToEqualKualiPortalIndex();
098        waitAndClickXMLIngester(failable);
099        selectFrameIframePortlet();
100        checkForIncidentReport("XML Ingester", failable, "");
101    }
102
103    /**
104     * Navigate to the page under test and call {@link #testIngestion}
105     *
106     * @param failable {@link edu.samplu.common.Failable}
107     * @throws Exception
108     */
109    protected void testIngestionNav(Failable failable) throws Exception {
110        navigate(failable);
111        testIngestion(failable);
112        passed();
113    }
114
115    protected void testIngestionBookmark(Failable failable) throws Exception {
116        testIngestion(failable);
117        passed();
118    }
119
120    /**
121     * Based on load user and groups manual tests; dynamically generates user and group file
122     * and loads into the xml ingester screen.
123     * This test should suffice for both KRAD and KNS versions of the ingester screen.
124     *
125     *
126     */
127    protected void testIngestion(Failable failable) throws Exception {
128        selectFrameIframePortlet();
129        List<File> fileUploadList = buildFileUploadList();
130        int cnt = 0;
131
132        for(File file : fileUploadList) {
133            String path = file.getAbsolutePath().toString();
134            if (isKrad()){
135                driver.findElement(By.name("files[" + cnt + "]")).sendKeys(path);
136            } else {
137                driver.findElement(By.name("file[" + cnt + "]")).sendKeys(path);
138            }
139            cnt++;
140        }
141
142        // Click the Upload Button
143        if (isKrad()){
144            waitAndClickByXpath("//button");
145        } else {
146            waitAndClickByXpath("//*[@id='imageField']");
147        }
148
149        // confirm all files were uploaded successfully
150        Thread.sleep(1000);
151        for(File file: fileUploadList) {
152            assertTextPresent("Ingested xml doc: " + file.getName());
153        }
154    }
155
156    protected List<File> buildFileUploadList() throws Exception {
157        List<File> fileUploadList = new ArrayList<File>();
158        try {
159            // update properties with timestamp value if includeDTSinPrefix is true
160            Properties props = loadProperties(PROPS_LOCATION, DEFAULT_PROPS_LOCATION);
161            if(props.get("userIncludeDTSinPrefix") != null
162                    && "true".equalsIgnoreCase((String) props.get("userIncludeDTSinPrefix"))) {
163                props.setProperty("userPrefix", "" + props.get("userPrefix") + ITUtil.DTS);
164            }
165            PropertiesUtils.systemPropertiesOverride(props, "XMLIngester");
166
167            // build files and add to array
168            fileUploadList.add(
169                    writeTemplateToFile(newTempFile("loadtest-users.xml"), cfg.getTemplate(TMPL_USER_CONTENT), props));
170            fileUploadList.add(
171                    writeTemplateToFile(newTempFile("loadtest-group.xml"), cfg.getTemplate(TMPL_GROUP_CONTENT), props));
172        } catch( Exception e) {
173            throw new Exception("Unable to generate files for upload", e);
174        }
175
176        return fileUploadList;
177    }
178}