1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package org.kuali.hr.time.clock.web;
17
18 import java.math.BigDecimal;
19 import java.util.ArrayList;
20 import java.util.Collection;
21 import java.util.Collections;
22 import java.util.Iterator;
23 import java.util.LinkedHashMap;
24 import java.util.List;
25 import java.util.Map;
26
27 import org.joda.time.DateTime;
28 import org.joda.time.DateTimeZone;
29 import org.joda.time.LocalDate;
30 import org.junit.Assert;
31 import org.junit.Ignore;
32 import org.junit.Test;
33 import org.kuali.hr.KPMEWebTestCase;
34 import org.kuali.hr.util.HtmlUnitUtil;
35 import org.kuali.kpme.core.FunctionalTest;
36 import org.kuali.kpme.core.service.HrServiceLocator;
37 import org.kuali.kpme.core.util.HrTestConstants;
38 import org.kuali.kpme.core.util.TKUtils;
39 import org.kuali.kpme.tklm.api.common.TkConstants;
40 import org.kuali.kpme.tklm.api.time.clocklog.ClockLog;
41 import org.kuali.kpme.tklm.api.time.timeblock.TimeBlock;
42 import org.kuali.kpme.tklm.time.clocklog.ClockLogBo;
43 import org.kuali.kpme.tklm.time.rules.graceperiod.GracePeriodRule;
44 import org.kuali.kpme.tklm.time.service.TkServiceLocator;
45 import org.kuali.kpme.tklm.time.timeblock.TimeBlockBo;
46 import org.kuali.kpme.tklm.time.timehourdetail.TimeHourDetailBo;
47 import org.kuali.kpme.tklm.time.timesheet.TimesheetDocument;
48 import org.kuali.kpme.tklm.time.workflow.TimesheetDocumentHeader;
49 import org.kuali.kpme.tklm.utils.TkTestConstants;
50 import org.kuali.rice.core.api.config.property.ConfigContext;
51 import org.kuali.rice.krad.service.KRADServiceLocator;
52
53 import com.gargoylesoftware.htmlunit.NicelyResynchronizingAjaxController;
54 import com.gargoylesoftware.htmlunit.WebClient;
55 import com.gargoylesoftware.htmlunit.html.HtmlElement;
56 import com.gargoylesoftware.htmlunit.html.HtmlPage;
57
58
59 @FunctionalTest
60 public class ClockWebTest extends KPMEWebTestCase {
61
62 private String tbId;
63
64 public Long maxDocumentId() {
65 Collection aCol = KRADServiceLocator.getBusinessObjectService().findAll(TimesheetDocumentHeader.class);
66 Long maxId = new Long(-1);
67 Iterator<TimesheetDocumentHeader> itr = aCol.iterator();
68 while (itr.hasNext()) {
69 TimesheetDocumentHeader tdh = itr.next();
70 Long temp = new Long(tdh.getDocumentId());
71 if (temp > maxId) {
72 maxId = temp;
73 }
74 }
75 return maxId;
76 }
77
78 public Long maxTimeBlockId() {
79 Collection aCol = KRADServiceLocator.getBusinessObjectService().findAll(TimeBlockBo.class);
80 Long maxId = new Long(-1);
81 Iterator<TimeBlockBo> itr = aCol.iterator();
82 while (itr.hasNext()) {
83 TimeBlockBo tb = itr.next();
84 Long temp = new Long(tb.getTkTimeBlockId());
85 if (temp > maxId) {
86 maxId = temp;
87 }
88 }
89 return maxId;
90 }
91
92 public void createTB() {
93 TimeBlockBo timeBlock = new TimeBlockBo();
94 timeBlock.setUserPrincipalId("admin");
95 timeBlock.setJobNumber(2L);
96 timeBlock.setWorkArea(1234L);
97 timeBlock.setTask(1L);
98 timeBlock.setEarnCode("RGN");
99 timeBlock.setBeginTimestamp(TKUtils.getCurrentTimestamp());
100 timeBlock.setEndTimestamp(TKUtils.getCurrentTimestamp());
101 TimeHourDetailBo timeHourDetail = new TimeHourDetailBo();
102 timeHourDetail.setEarnCode("RGN");
103 timeHourDetail.setHours(new BigDecimal(2.0));
104 timeBlock.getTimeHourDetails().add(timeHourDetail);
105 timeBlock.setHours(new BigDecimal(2.0));
106 List<TimeBlock> tbList = new ArrayList<TimeBlock>();
107 String documentId = this.maxDocumentId().toString();
108 timeBlock.setDocumentId(documentId);
109 tbList.add(TimeBlockBo.to(timeBlock));
110 TkServiceLocator.getTimeBlockService().saveTimeBlocks(tbList);
111
112 tbId = timeBlock.getTkTimeBlockId();
113 TimesheetDocument td = TkServiceLocator.getTimesheetService().getTimesheetDocument(documentId);
114 td.setTimeBlocks(tbList);
115
116 }
117
118 @Ignore
119 public void testDistributeTB() throws Exception {
120 String baseUrl = TkTestConstants.Urls.CLOCK_URL;
121 HtmlPage page = HtmlUnitUtil.gotoPageAndLogin(getWebClient(), baseUrl);
122 Assert.assertNotNull(page);
123 Assert.assertTrue("Clock Page contains Distribute Button", page.asText().contains("Distribute Time Blocks"));
124 this.createTB();
125 updateWebClient();
126 HtmlElement element = page.getElementByName("distributeTime");
127 Assert.assertNotNull(element);
128
129
130
131
132
133 String distributeUrl = baseUrl + "?methodToCall=distributeTimeBlocks";
134 HtmlPage page1 = HtmlUnitUtil.gotoPageAndLogin(getWebClient(), distributeUrl);
135 Assert.assertTrue("Distribute Page contains Close button", page1.asText().contains("Close"));
136 Assert.assertTrue("Distribute Page contains Close button", page1.asText().contains("Edit"));
137
138 element = page1.getElementByName("editTimeBlock");
139 Assert.assertNotNull(element);
140 Assert.assertTrue("Onclick attribute of Edit button contains", element.getAttribute("onclick").contains("Clock.do?methodToCall=editTimeBlock&editTimeBlockId="));
141
142 if (tbId == null) {
143 tbId = this.maxTimeBlockId().toString();
144 }
145
146
147 String editUrl = baseUrl + "?methodToCall=editTimeBlock&editTimeBlockId=" + tbId;
148 HtmlPage page3 = HtmlUnitUtil.gotoPageAndLogin(getWebClient(), editUrl);
149
150
151 Assert.assertTrue("Edit Time Blocks Page contains Cancel button", page3.asText().contains("Add"));
152 Assert.assertTrue("Edit Time Blocks Page contains Save button", page3.asText().contains("Save"));
153 Assert.assertTrue("Edit Time Blocks Page contains Cancel button", page3.asText().contains("Cancel"));
154
155 element = page3.getElementByName("addTimeBlock");
156 Assert.assertNotNull(element);
157 Assert.assertTrue("Onclick attribute of Add button contains", element.getAttribute("onclick").contains("javascript: addTimeBlockRow(this.form);"));
158
159 updateWebClient();
160
161
162
163
164 }
165
166 public void updateWebClient() {
167 WebClient webClient = getWebClient();
168 webClient.getOptions().setJavaScriptEnabled(true);
169 webClient.getOptions().setThrowExceptionOnScriptError(false);
170 webClient.setAjaxController(new NicelyResynchronizingAjaxController());
171 webClient.waitForBackgroundJavaScript(10000);
172 }
173
174
175
176
177
178
179
180
181 @Test
182 public void testClockActionWithoutGracePeriodRule() throws Exception {
183
184 GracePeriodRule gpr = TkServiceLocator.getGracePeriodService().getGracePeriodRule(LocalDate.now());
185 if (gpr != null && gpr.isActive()) {
186 gpr.setActive(false);
187 KRADServiceLocator.getBusinessObjectService().save(gpr);
188 }
189
190
191 clockIn();
192
193 ClockLog lastClockLog = TkServiceLocator.getClockLogService().getLastClockLog("admin");
194
195 Assert.assertTrue("The seconds on clock timestamp should be preserved", lastClockLog.getClockDateTime().getSecondOfMinute() != 0);
196 Assert.assertTrue("The seconds on timestamp should be preserved", lastClockLog.getCreateTime().getSecondOfMinute() != 0);
197
198
199 clockOut();
200
201 lastClockLog = TkServiceLocator.getClockLogService().getLastClockLog("admin");
202 Assert.assertTrue("The seconds on clock timestamp should be preserved", lastClockLog.getClockDateTime().getSecondOfMinute() != 0);
203 Assert.assertTrue("The seconds on timestamp should be preserved", lastClockLog.getCreateTime().getSecondOfMinute() != 0);
204 }
205
206 @Test
207 public void testClockActionWithGracePeriodRule() throws Exception {
208
209 KRADServiceLocator.getBusinessObjectService().deleteMatching(
210 ClockLogBo.class,
211 Collections.singletonMap("principalId", "admin"));
212 GracePeriodRule gpr = new GracePeriodRule();
213
214 gpr.setEffectiveLocalDate(new LocalDate(2010, 1, 1));
215 gpr.setHourFactor(new BigDecimal(3));
216 gpr.setTimestamp(TKUtils.getCurrentTimestamp());
217 gpr.setUserPrincipalId("admin");
218
219 gpr.setActive(true);
220 KRADServiceLocator.getBusinessObjectService().save(gpr);
221
222
223 clockIn();
224
225 ClockLog lastClockLog = TkServiceLocator.getClockLogService()
226 .getLastClockLog("admin");
227
228 Assert.assertTrue(
229 "The seconds on clock timestamp should NOT be preserved",
230 lastClockLog.getClockDateTime().getSecondOfMinute() == 0);
231 Assert.assertTrue("The seconds on timestamp should be preserved",
232 lastClockLog.getCreateTime().getSecondOfMinute() != 0);
233
234
235 clockOut();
236
237 lastClockLog = TkServiceLocator.getClockLogService().getLastClockLog(
238 "admin");
239 Assert.assertTrue(
240 "The seconds on clock timestamp should NOT be preserved",
241 lastClockLog.getClockDateTime().getSecondOfMinute() == 0);
242 Assert.assertTrue("The seconds on timestamp should be preserved",
243 lastClockLog.getCreateTime().getSecondOfMinute() != 0);
244 }
245
246
247 @Test
248 public void testClockInOutWithTimezone() throws Exception {
249 HtmlPage page = HtmlUnitUtil.gotoPageAndLogin(getWebClient(), TkTestConstants.Urls.CLOCK_URL,true);
250 Assert.assertNotNull(page);
251
252 Map<String, Object> criteria = new LinkedHashMap<String, Object>();
253 criteria.put("selectedAssignment", new String[]{HrTestConstants.FormElementTypes.DROPDOWN, "IU-IN_30_30_30"});
254
255 page = HtmlUnitUtil.fillOutForm(page, criteria);
256 Assert.assertNotNull(page);
257
258 page = HtmlUnitUtil.clickButton(page, "clockAction");
259
260 page = HtmlUnitUtil.clickButton(page, "clockAction");
261 HtmlUnitUtil.createTempFile(page);
262
263 DateTimeZone dateTimeZone = DateTimeZone.forID(HrServiceLocator.getTimezoneService().getUserTimezone());
264 DateTime dateTime = new DateTime().withZone(dateTimeZone);
265 String timeZone = dateTime.toString("zzzz");
266 Assert.assertTrue("Time zone information is incorrect", page.asText().contains(timeZone));
267 }
268
269 private HtmlPage clockIn() throws Exception {
270
271
272 HtmlPage page = clockAction(TkConstants.CLOCK_IN);
273
274
275 HtmlUnitUtil.createTempFile(page);
276 Assert.assertTrue("The clock out button should have displayed", page.asText().contains("Clock Out"));
277
278
279
280 return page;
281 }
282
283 private HtmlPage clockOut() throws Exception {
284 DateTime dateTime = new DateTime();
285 if (dateTime.getSecondOfMinute() >= 58
286 || dateTime.getSecondOfMinute() == 0) {
287 Thread.sleep(4000);
288 }
289
290 HtmlPage page = clockAction(TkConstants.CLOCK_OUT);
291
292
293 HtmlUnitUtil.createTempFile(page);
294 Assert.assertTrue("The clock out button should have displayed", page.asText().contains("Clock In"));
295
296 return page;
297 }
298
299
300
301
302
303
304
305
306
307 private HtmlPage clockAction(String clockAction) throws Exception {
308 DateTime dateTime = new DateTime();
309 if (dateTime.getSecondOfMinute() >= 58
310 || dateTime.getSecondOfMinute() == 0) {
311 Thread.sleep(4000);
312 }
313 String baseUrl = TkTestConstants.Urls.CLOCK_URL;
314 String actionUrl = baseUrl + "?methodToCall=clockAction&selectedAssignment=IU-IN_30_30_30¤tClockAction=" + clockAction;
315 HtmlPage page = HtmlUnitUtil.gotoPageAndLogin(getWebClient(), actionUrl);
316 Assert.assertNotNull("The login page shouldn't be null", page);
317 Thread.sleep(3000);
318 return page;
319 }
320
321
322 }