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