001 /**
002 * Copyright 2004-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 */
016 package org.kuali.hr.lm.leaveCalendar;
017
018 import java.math.BigDecimal;
019 import java.net.URLEncoder;
020
021 import org.apache.log4j.Logger;
022 import org.joda.time.DateTime;
023 import org.joda.time.Interval;
024 import org.kuali.hr.util.HtmlUnitUtil;
025 import org.kuali.kpme.core.assignment.Assignment;
026 import org.kuali.kpme.core.assignment.AssignmentDescriptionKey;
027 import org.kuali.kpme.core.earncode.EarnCode;
028 import org.kuali.kpme.core.util.HrConstants;
029 import org.kuali.kpme.core.util.TKUtils;
030 import org.kuali.kpme.tklm.leave.calendar.LeaveCalendarDocument;
031 import org.kuali.kpme.tklm.leave.calendar.web.LeaveCalendarWSForm;
032 import org.kuali.kpme.tklm.leave.summary.LeaveSummary;
033
034 import com.gargoylesoftware.htmlunit.WebClient;
035 import com.gargoylesoftware.htmlunit.html.HtmlForm;
036 import com.gargoylesoftware.htmlunit.html.HtmlPage;
037
038 public class LeaveCalendarTestUtils {
039
040 private static final Logger LOG = Logger.getLogger(LeaveCalendarTestUtils.class);
041
042 /**
043 * From the provided set of parameters, build an action form suitable for
044 * submitting to the TimeDetailAction servlet. In our case, we are mostly
045 * using it in a mock type of situation, the situation of leave block addition.
046 *
047 * @param leaveCalendarDocument
048 * @param assignment
049 * @param earnCode
050 * @param start
051 * @param end
052 * @param amount
053 *
054 * @return A populated TimeDetailActionFormBase object.
055 */
056 public static LeaveCalendarWSForm buildLeaveCalendarForm(LeaveCalendarDocument leaveCalendarDocument, Assignment assignment, EarnCode earnCode, DateTime start, DateTime end, BigDecimal amount, boolean spanningWeeks) {
057 LeaveCalendarWSForm lcf = new LeaveCalendarWSForm();
058
059 BigDecimal hours = null;
060 String startTimeS = null;
061 String endTimeS = null;
062 String startDateS;
063 String endDateS;
064 String selectedEarnCode;
065 String selectedAssignment;
066
067 if (amount == null) {
068 if (start != null && end != null) {
069 Interval se_i = new Interval(start, end);
070 hours = TKUtils.convertMillisToHours(se_i.toDurationMillis());
071 }
072
073 // the date/time format is defined in tk.calendar.js. For now, the format is 11/17/2010 8:0
074 startTimeS = start.toString("H:mm");
075 endTimeS = end.toString("H:mm");
076 } else {
077 hours = amount;
078 }
079
080 startDateS = start.toString("MM/dd/YYYY");
081 endDateS = end.toString("MM/dd/YYYY");
082
083 AssignmentDescriptionKey adk = new AssignmentDescriptionKey(assignment);
084 selectedAssignment = adk.toAssignmentKeyString();
085
086 selectedEarnCode = earnCode.getEarnCode();
087
088 //lcf.setAcrossDays(acrossDays ? "y" : "n");
089
090 lcf.setSpanningWeeks(spanningWeeks ? "y" : "n"); // KPME-1446
091
092 lcf.setLeaveAmount(hours);
093 //lcf.setHours(hours);
094 lcf.setStartDate(startDateS);
095 lcf.setEndDate(endDateS);
096 //lcf.setTkTimeBlockId(timeblockId);
097 lcf.setLeaveCalendarDocument(leaveCalendarDocument);
098 lcf.setSelectedAssignment(selectedAssignment);
099 lcf.setSelectedEarnCode(selectedEarnCode);
100 lcf.setMethodToCall("addLeaveBlock");
101
102 return lcf;
103 }
104
105 /**
106 * Builds a simple "mock" leave calendar form primed for action "approveLeaveCalendar".
107 * Suitable for testing logic LeaveCalendarSubmitAction actions.
108 *
109 * @param leaveCalendarDocument
110 * @param assignment
111 * @param earnCode
112 * @param start
113 * @param end
114 * @param amount
115 *
116 * @return A populated TimeDetailActionFormBase object.
117 */
118 public static LeaveCalendarWSForm buildLeaveCalendarFormForSubmission(LeaveCalendarDocument leaveCalendarDocument, LeaveSummary leaveSummary) {
119 LeaveCalendarWSForm lcf = new LeaveCalendarWSForm();
120
121 lcf.setMethodToCall("approveLeaveCalendar");
122 lcf.setLeaveSummary(leaveSummary);
123
124 return lcf;
125 }
126
127
128 /**
129 * Set the attributes on the provided html form to the values found in the provided
130 * ActionForm. Returns void, not a List<String> of errors.
131 *
132 * @param form The HtmlForm to populate.
133 * @param tdaf The ActionForm with values we will use to populate.
134 */
135 public static void setTimeBlockFormDetails(HtmlForm form, LeaveCalendarWSForm tdaf) {
136 //if (tdaf.getLeaveBlockId() != null) {
137 // form.setAttribute("leaveBlockId", tdaf.getLeaveBlockId().toString());
138 //}
139 form.setAttribute("startDate", tdaf.getStartDate());
140 form.setAttribute("endDate", tdaf.getEndDate());
141
142 if (tdaf.getLeaveAmount() != null) {
143 form.setAttribute("leaveAmount", tdaf.getLeaveAmount().toString());
144 }
145
146 form.setAttribute("selectedEarnCode", tdaf.getSelectedEarnCode());
147 form.setAttribute("selectedAssignment", tdaf.getSelectedAssignment());
148 //form.setAttribute("acrossDays", tdaf.getAcrossDays());
149 form.setAttribute("methodToCall", tdaf.getMethodToCall());
150 }
151
152 /**
153 * This is a 'hacker' method to get around the fact that in HtmlUnit you
154 * can no longer directly submit forms if there are no buttons. We
155 * simply add a button to the form, and click it!
156 *
157 * @param page The HtmlPage the form came from.
158 * @param form The HtmlForm you wish to submit.
159 * @return The return results from clicking .submit()
160 */
161 /*private static HtmlPage submitTimeDetailsDep(HtmlPage page, HtmlForm form) {
162 HtmlButton submitButton = null;
163
164 //ScriptResult sr = page.executeJavaScript("document.forms[\"TimeDetailActionForm\"].submit();");
165
166 if (submitButton == null) {
167 submitButton = (HtmlButton)page.createElement("button");
168 submitButton.setAttribute("type", "submit");
169 form.appendChild(submitButton);
170 }
171
172 HtmlPage newPage = null;
173 try {
174 submitButton.click();
175 } catch (Exception e) {
176 LOG.error("While submitting time detail form", e);
177 }
178
179 return newPage;
180 }*/
181
182
183 /**
184 * A method to wrap the submission of the time details.
185 * @param baseUrl
186 * @param tdaf
187 * @return
188 */
189 public static HtmlPage submitLeaveCalendar(WebClient webClient, String baseUrl, LeaveCalendarWSForm tdaf) {
190 // For now, until a more HtmlUnit based click method can be found
191 // workable, we're building a url-encoded string to directly
192 // post to the servlet.
193
194 String url = baseUrl + buildPostFromFormParams(tdaf);
195 HtmlPage page = null;
196
197 try {
198 page = HtmlUnitUtil.gotoPageAndLogin(webClient, url);
199 } catch (Exception e) {
200 LOG.error("Error while submitting form", e);
201 }
202
203 return page;
204 }
205
206 /**
207 * A method to wrap the submission of the time details.
208 * @param baseUrl
209 * @param tdaf
210 * @return
211 */
212 public static HtmlPage submitLeaveCalendar2(WebClient webClient, String baseUrl, LeaveCalendarWSForm tdaf) {
213 // For now, until a more HtmlUnit based click method can be found
214 // workable, we're building a url-encoded string to directly
215 // post to the servlet.
216
217 String url = baseUrl + buildPostActionRequested(tdaf);
218
219 HtmlPage page = null;
220
221 try {
222 page = HtmlUnitUtil.gotoPageAndLogin(webClient, url);
223 } catch (Exception e) {
224 LOG.error("Error while submitting form", e);
225 }
226
227 return page;
228 }
229
230 /**
231 * A method to wrap the submission of the time details.
232 * @param //baseUrl
233 * @param //tdaf
234 * @return
235 */
236 /*public static HtmlPage submitTimeDetails(String principalId, String baseUrl, TimeDetailActionFormBase tdaf) {
237 // For now, until a more HtmlUnit based click method can be found
238 // workable, we're building a url-encoded string to directly
239 // post to the servlet.
240
241 String url = baseUrl + buildPostFromFormParams(tdaf);
242 HtmlPage page = null;
243
244 try {
245 TestAutoLoginFilter.OVERRIDE_ID = principalId;
246 page = HtmlUnitUtil.gotoPageAndLogin(url);
247 TestAutoLoginFilter.OVERRIDE_ID = "";
248 } catch (Exception e) {
249 LOG.error("Error while submitting form", e);
250 }
251
252 return page;
253 }*/
254
255 /**
256 * This will build a form post for the addition of leave blocks on the current leave calendar.
257 * @param tdaf
258 * @return
259 */
260 private static String buildPostFromFormParams(LeaveCalendarWSForm tdaf) {
261 StringBuilder builder = new StringBuilder();
262
263 try {
264 builder.append("&methodToCall=").append(URLEncoder.encode(tdaf.getMethodToCall(), "UTF-8"));
265 //builder.append("&acrossDays=").append(URLEncoder.encode(tdaf.getAcrossDays(), "UTF-8"));
266 if (tdaf.getLeaveAmount() != null) {
267 builder.append("&leaveAmount=").append(URLEncoder.encode(tdaf.getLeaveAmount().toString(), "UTF-8"));
268 //} else {
269 //builder.append("&hours=").append(URLEncoder.encode(tdaf.getHours().toString(), "UTF-8"));
270 //builder.append("&startDate=").append(URLEncoder.encode(tdaf.getStartDate(), "UTF-8"));
271 //builder.append("&endDate=").append(URLEncoder.encode(tdaf.getEndDate(), "UTF-8"));
272 }
273 builder.append("&startDate=").append(URLEncoder.encode(tdaf.getStartDate(), "UTF-8"));
274 builder.append("&endDate=").append(URLEncoder.encode(tdaf.getEndDate(), "UTF-8"));
275 builder.append("&selectedAssignment=").append(URLEncoder.encode(tdaf.getSelectedAssignment(), "UTF-8"));
276 builder.append("&selectedEarnCode=").append(URLEncoder.encode(tdaf.getSelectedEarnCode(), "UTF-8"));
277 //if (tdaf.getTkTimeBlockId() != null) {
278 // builder.append("&tkTimeBlockId=").append(URLEncoder.encode(tdaf.getTkTimeBlockId().toString(), "UTF-8"));
279 //}
280 } catch (Exception e) {
281 LOG.error("Exception building Post String", e);
282 }
283
284 return builder.toString();
285 }
286
287 private static String buildPostActionRequested(LeaveCalendarWSForm tdaf) {
288 StringBuilder builder = new StringBuilder();
289
290 try {
291 builder.append("&action=").append(URLEncoder.encode(HrConstants.DOCUMENT_ACTIONS.ROUTE,"UTF-8"));
292 builder.append("&methodToCall=").append(URLEncoder.encode(tdaf.getMethodToCall(), "UTF-8"));
293 //add more post params.
294 } catch (Exception e) {
295 LOG.error("Exception building Post String", e);
296 }
297
298 return builder.toString();
299 }
300 }