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 edu.sampleu.common.FreemarkerAftBase;
019    import freemarker.template.DefaultObjectWrapper;
020    import org.junit.Rule;
021    import org.junit.rules.TemporaryFolder;
022    import org.kuali.rice.testtools.common.JiraAwareFailable;
023    import org.kuali.rice.testtools.common.PropertiesUtils;
024    import org.kuali.rice.testtools.selenium.AutomatedFunctionalTestUtils;
025    import org.kuali.rice.testtools.selenium.WebDriverUtils;
026    import org.openqa.selenium.By;
027    
028    import java.io.File;
029    import java.io.IOException;
030    import java.util.ArrayList;
031    import java.util.LinkedList;
032    import java.util.List;
033    import java.util.Properties;
034    import java.util.StringTokenizer;
035    
036    /**
037     * Tests uploads of new users and group.
038     *
039     * @author Kuali Rice Team (rice.collab@kuali.org)
040     */
041    
042    public abstract class XmlIngesterAftBase extends FreemarkerAftBase {
043    
044        /**
045         * http://env12.rice.kuali.org/portal.do?channelTitle=XML%20Ingester&channelUrl=http://env12.rice.kuali.org/kew/../core/Ingester.do
046         */
047        public static final String BOOKMARK_URL = AutomatedFunctionalTestUtils.PORTAL + "?channelTitle=XML%20Ingester&channelUrl="
048                + WebDriverUtils.getBaseUrlString() + "/kew/../core/Ingester.do";
049    
050        // File generation
051        private String PROPS_LOCATION = System.getProperty("xmlingester.props.location", null);
052        private static final String DEFAULT_PROPS_LOCATION = "XML/xmlingester.properties";
053    
054        // Templates for File Generation
055        private static final String DIR_TMPL = "/XML/";
056        private static final String TMPL_USER_CONTENT = "SimpleUserContent.ftl";
057        private static final String TMPL_GROUP_CONTENT = "SimpleGroupContent.ftl";
058    
059        @Rule
060        public TemporaryFolder folder= new TemporaryFolder();
061    
062        protected File newTempFile(String name) throws IOException {
063            return folder.newFile(name);
064        }
065    
066        /**
067         * {@inheritDoc}
068         * {@link #DIR_TMPL}
069         * @return
070         */
071        @Override
072        protected String getTemplateDir() {
073            return DIR_TMPL;
074        }
075    
076        @Override
077        protected String getBookmarkUrl() {
078            return BOOKMARK_URL;
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        @Override
095        protected void navigate() throws Exception {
096            selectTopFrame();
097            waitAndClickAdministration();
098            waitForTitleToEqualKualiPortalIndex();
099            waitAndClickXMLIngester(this);
100            selectFrameIframePortlet();
101            checkForIncidentReport("XML Ingester", this, "");
102        }
103    
104        public void testXmlIngesterUserList() throws Exception {
105            List<File> fileUploadList = buildUserFileUploadList();
106            testIngestion(this, fileUploadList);
107        }
108    
109        /**
110         * Navigate to the page under test and call {@link #testIngestion}
111         *
112         * @param failable {@link org.kuali.rice.testtools.common.JiraAwareFailable}
113         * @throws Exception
114         */
115        protected void testIngestionNav(JiraAwareFailable failable) throws Exception {
116            List<File> fileUploadList = buildFileUploadList();
117            testIngestion(failable, fileUploadList);
118            passed();
119        }
120    
121        protected void testIngestionBookmark(JiraAwareFailable failable) throws Exception {
122            List<File> fileUploadList = buildFileUploadList();
123            testIngestion(failable, fileUploadList);
124            passed();
125        }
126    
127        /**
128         * Based on load user and groups manual tests; dynamically generates user and group file
129         * and loads into the xml ingester screen.
130         * This test should suffice for both KRAD and KNS versions of the ingester screen.
131         *
132         *
133         */
134        protected void testIngestion(JiraAwareFailable failable, List<File> fileUploadList) throws Exception {
135            selectFrameIframePortlet();
136            int cnt = 0;
137    
138            for(File file : fileUploadList) {
139                String path = file.getAbsolutePath().toString();
140                if (isKrad()){
141                    driver.findElement(By.name("files[" + cnt + "]")).sendKeys(path);
142                } else {
143                    driver.findElement(By.name("file[" + cnt + "]")).sendKeys(path);
144                }
145                cnt++;
146            }
147    
148            // Click the Upload Button
149            if (isKrad()){
150                waitAndClickByXpath("//button");
151            } else {
152                waitAndClickByXpath("//*[@id='imageField']");
153            }
154    
155            // confirm all files were uploaded successfully
156            Thread.sleep(1000);
157            for(File file: fileUploadList) {
158                waitForTextPresent("Ingested xml doc: " + file.getName(), 360);
159            }
160        }
161    
162        protected List<File> buildFileUploadList() throws Exception {
163            List<File> fileUploadList = new ArrayList<File>();
164            try {
165                // update properties with timestamp value if includeDTSinPrefix is true
166                Properties props = loadProperties(PROPS_LOCATION, DEFAULT_PROPS_LOCATION);
167                if(props.get("userIncludeDTSinPrefix") != null
168                        && "true".equalsIgnoreCase((String) props.get("userIncludeDTSinPrefix"))) {
169                    props.setProperty("userPrefix", "" + props.get("userPrefix") + AutomatedFunctionalTestUtils.DTS);
170                }
171                props = new PropertiesUtils().systemPropertiesOverride(props, "XMLIngester");
172    
173                // build files and add to array
174                fileUploadList.add(
175                        writeTemplateToFile(newTempFile("loadtest-users.xml"), cfg.getTemplate(TMPL_USER_CONTENT), props));
176                fileUploadList.add(
177                        writeTemplateToFile(newTempFile("loadtest-group.xml"), cfg.getTemplate(TMPL_GROUP_CONTENT), props));
178            } catch( Exception e) {
179                throw new Exception("Unable to generate files for upload " + e.getMessage(), e);
180            }
181    
182            return fileUploadList;
183        }
184    
185        protected List<File> buildUserFileUploadList() throws Exception {
186            List<File> fileUploadList = new ArrayList<File>();
187            try {
188                Properties props = loadProperties(PROPS_LOCATION, DEFAULT_PROPS_LOCATION);
189    
190                String usersArg = System.getProperty("xmlingester.user.list").replace(".", "").replace("-", "").toLowerCase();
191                List<XmlIngesterUser> xmlIngesterUsers = new LinkedList<XmlIngesterUser>();
192                StringTokenizer token = new StringTokenizer(usersArg, ",");
193                while (token.hasMoreTokens()) {
194                    xmlIngesterUsers.add(new XmlIngesterUser(token.nextToken()));
195                }
196    
197                props.put("xmlIngesterUsers", xmlIngesterUsers);
198    
199                cfg.setObjectWrapper(new DefaultObjectWrapper());
200    
201                // build files and add to array
202                fileUploadList.add(
203                        writeTemplateToFile(newTempFile("userlist-users.xml"), cfg.getTemplate("UserListIngestion.ftl"), props));
204    
205            } catch( Exception e) {
206                throw new Exception("Unable to generate files for upload " + e.getMessage(), e);
207            }
208    
209            return fileUploadList;
210        }
211    }
212